1 /*  Copyright (c) MediaArea.net SARL. All Rights Reserved.
2  *
3  *  Use of this source code is governed by a BSD-style license that can
4  *  be found in the License.html file in the root of the source tree.
5  */
6 
7 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8 //
9 // Public DLL interface implementation
10 //
11 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12 
13 //---------------------------------------------------------------------------
14 // For user: you can disable or enable it
15 //#define MEDIAINFO_DEBUG
16 //---------------------------------------------------------------------------
17 
18 //---------------------------------------------------------------------------
19 #include "ZenLib/Conf.h"
20 #ifdef __BORLANDC__
21     #pragma hdrstop
22 #endif
23 #ifdef UNICODE //DLL C Interface is currently done only in UNICODE mode
24 //---------------------------------------------------------------------------
25 //---------------------------------------------------------------------------
26 //#if defined(MUST_INCLUDE_STDAFX) //Windows ATL for Shell Extension request stdafx.h
27 //    #include "stdafx.h"
28 //#endif //MUST_INCLUDE_STDAFX
29 #include "MediaInfo/MediaInfoList.h"
30 #include "MediaInfo/MediaInfo.h"
31 #define MEDIAINFO_DLL_EXPORT
32 #include "MediaInfoDLL_Static.h"
33 #include "ZenLib/Ztring.h"
34 #include "ZenLib/CriticalSection.h"
35 #include <map>
36 #include <vector>
37 #include <clocale>
38 using namespace MediaInfoLib;
39 using namespace ZenLib;
40 //---------------------------------------------------------------------------
41 
42 //***************************************************************************
43 //
44 //***************************************************************************
45 
46 //---------------------------------------------------------------------------
47 struct mi_output
48 {
49     std::string  Ansi;    //One-Byte-sized characters
50     std::wstring Unicode; //Unicode characters
51 };
52 typedef std::map<void*, mi_output*> mi_outputs;
53 
54 struct mi_input
55 {
56     Ztring Unicode[3];  //Unicode characters multiple times
57 };
58 typedef std::map<void*, mi_input*> mi_inputs;
59 
60 mi_outputs MI_Outputs;
61 mi_inputs MI_Inputs;
62 
63 static CriticalSection Critical;
64 static bool utf8=false;
65 
66 //---------------------------------------------------------------------------
MI_Outputs_Find(void * Handle)67 static mi_outputs::iterator MI_Outputs_Find(void* Handle)
68 {
69     //Coherancy
70     Critical.Enter();
71     mi_outputs::iterator MI_Output=MI_Outputs.find(Handle);
72     if (MI_Output==MI_Outputs.end())
73     {
74         MI_Output=MI_Outputs.insert(std::make_pair(Handle,new mi_output)).first; //Generic Handle
75     }
76     Critical.Leave();
77     return MI_Output;
78 }
79 //---------------------------------------------------------------------------
WC2MB(void * Handle,const wchar_t * Text)80 static const char* WC2MB(void* Handle, const wchar_t* Text)
81 {
82     mi_outputs::iterator MI_Output=MI_Outputs_Find(Handle);
83 
84     //Adaptation
85     if (utf8)
86         MI_Output->second->Ansi=Ztring(Text).To_UTF8();
87     else
88         MI_Output->second->Ansi=Ztring(Text).To_Local();
89     return  MI_Output->second->Ansi.c_str();
90 }
91 
92 //---------------------------------------------------------------------------
MB2WC(void * Handle,size_t Pos,const char * Text)93 static const wchar_t* MB2WC(void* Handle, size_t Pos, const char* Text)
94 {
95     //Coherancy
96     Critical.Enter();
97     mi_inputs::iterator MI_Input=MI_Inputs.find(Handle);
98     if (MI_Input==MI_Inputs.end())
99     {
100         MI_Input=MI_Inputs.insert(std::make_pair(Handle, new mi_input)).first;
101     }
102     Critical.Leave();
103 
104     //Adaptation
105     if (utf8)
106         return MI_Input->second->Unicode[Pos].From_UTF8(Text).c_str();
107     else
108         return MI_Input->second->Unicode[Pos].From_Local(Text).c_str();
109 }
110 
111 //***************************************************************************
112 //
113 //***************************************************************************
114 
115 //---------------------------------------------------------------------------
116 // For Widgets with DEBUG in BCB
117 // Here only because this is useful in all MediaInfo
118 #ifdef _DEBUG
wxOnAssert(const wchar_t *,int,const char *,const wchar_t *,const wchar_t *)119     void wxOnAssert(const wchar_t*, int, const char*, const wchar_t*, const wchar_t*) {}
120 #endif //_DEBUG
121 
122 //---------------------------------------------------------------------------
123 // Debug
124 #ifdef MEDIAINFO_DEBUG
125     #include <stdio.h>
126     #include <windows.h>
127     namespace MediaInfoDLL_Debug
128     {
129         FILE* F;
130         std::string Debug;
131         SYSTEMTIME st_In;
132 
Debug_Open(bool Out)133         void Debug_Open(bool Out)
134         {
135             F=fopen("C:\\Temp\\MediaInfo_Debug.txt", "a+t");
136             Debug.clear();
137             SYSTEMTIME st;
138             GetLocalTime( &st );
139 
140             char Duration[100];
141             if (Out)
142             {
143                 FILETIME ft_In;
144                 if (SystemTimeToFileTime(&st_In, &ft_In))
145                 {
146                     FILETIME ft_Out;
147                     if (SystemTimeToFileTime(&st, &ft_Out))
148                     {
149                         ULARGE_INTEGER UI_In;
150                         UI_In.HighPart=ft_In.dwHighDateTime;
151                         UI_In.LowPart=ft_In.dwLowDateTime;
152 
153                         ULARGE_INTEGER UI_Out;
154                         UI_Out.HighPart=ft_Out.dwHighDateTime;
155                         UI_Out.LowPart=ft_Out.dwLowDateTime;
156 
157                         ULARGE_INTEGER UI_Diff;
158                         UI_Diff.QuadPart=UI_Out.QuadPart-UI_In.QuadPart;
159 
160                         FILETIME ft_Diff;
161                         ft_Diff.dwHighDateTime=UI_Diff.HighPart;
162                         ft_Diff.dwLowDateTime=UI_Diff.LowPart;
163 
164                         SYSTEMTIME st_Diff;
165                         if (FileTimeToSystemTime(&ft_Diff, &st_Diff))
166                         {
167                             sprintf(Duration, "%02hd:%02hd:%02hd.%03hd", st_Diff.wHour, st_Diff.wMinute, st_Diff.wSecond, st_Diff.wMilliseconds);
168                         }
169                         else
170                             strcpy(Duration, "            ");
171                     }
172                     else
173                         strcpy(Duration, "            ");
174 
175                 }
176                 else
177                     strcpy(Duration, "            ");
178             }
179             else
180             {
181                 st_In=st;
182                 strcpy(Duration, "            ");
183             }
184 
185             fprintf(F,"%02hd:%02hd:%02hd.%03hd %s", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, Duration);
186         }
187 
Debug_Close()188         void Debug_Close()
189         {
190             Debug += "\r\n";
191             fwrite(Debug.c_str(), Debug.size(), 1, F); \
192             fclose(F);
193         }
194     }
195     using namespace MediaInfoDLL_Debug;
196 
197     #define MEDIAINFO_DEBUG1(_NAME,_TOAPPEND) \
198         Debug_Open(false); \
199         { \
200         Ztring HandleTemp=Ztring::ToZtring((size_t)Handle, 16); \
201         while (HandleTemp.size()<8) \
202             HandleTemp.insert(0, 1, __T('0')); \
203         Debug+=", H=";Debug+=HandleTemp.To_UTF8(); \
204         } \
205         Debug+=", ";Debug+=_NAME; \
206         _TOAPPEND; \
207         Debug_Close();
208 
209     #define MEDIAINFO_DEBUG2(_NAME,_TOAPPEND) \
210         Debug_Open(true); \
211         { \
212         Ztring HandleTemp=Ztring::ToZtring((size_t)Handle, 16); \
213         while (HandleTemp.size()<8) \
214             HandleTemp.insert(0, 1, __T('0')); \
215         Debug+=", H=";Debug+=HandleTemp.To_UTF8(); \
216         } \
217         Debug+=", ";Debug+=_NAME; \
218         _TOAPPEND; \
219         Debug_Close();
220 #else // MEDIAINFO_DEBUG
221     #define MEDIAINFO_DEBUG1(_NAME,_TOAPPEND)
222     #define MEDIAINFO_DEBUG2(_NAME,_TOAPPEND)
223 #endif // MEDIAINFO_DEBUG
224 
225 //---------------------------------------------------------------------------
226 //To clarify the code
227 #define INTEGRITY_VOID(_NAME,_DEBUGA) \
228     MEDIAINFO_DEBUG1(_NAME,_DEBUGA) \
229     Critical.Enter(); \
230     mi_outputs::iterator MI_Output=MI_Outputs.find(Handle); \
231     const bool MI_Output_IsOk=MI_Output!=MI_Outputs.end(); \
232     Critical.Leave(); \
233     if (Handle==NULL || !MI_Output_IsOk) \
234     { \
235         MEDIAINFO_DEBUG2(_NAME,Debug+="Handle error") \
236         return; \
237     } \
238 
239 #define INTEGRITY_SIZE_T(_NAME,_DEBUGA) \
240     MEDIAINFO_DEBUG1(_NAME,_DEBUGA) \
241     Critical.Enter(); \
242     mi_outputs::iterator MI_Output=MI_Outputs.find(Handle); \
243     const bool MI_Output_IsOk=MI_Output!=MI_Outputs.end(); \
244     Critical.Leave(); \
245     if (Handle==NULL || !MI_Output_IsOk) \
246     { \
247         MEDIAINFO_DEBUG2(_NAME, Debug+="Handle error") \
248         return 0; \
249     } \
250 
251 #define INTEGRITY_INT64U(_NAME,_DEBUGA) \
252     MEDIAINFO_DEBUG1(_NAME,_DEBUGA) \
253     Critical.Enter(); \
254     mi_outputs::iterator MI_Output=MI_Outputs.find(Handle); \
255     const bool MI_Output_IsOk=MI_Output!=MI_Outputs.end(); \
256     Critical.Leave(); \
257     if (Handle==NULL || !MI_Output_IsOk) \
258     { \
259         MEDIAINFO_DEBUG2(_NAME, Debug+="Handle error") \
260         return 0; \
261     } \
262 
263 #define INTEGRITY_STRING(_NAME,_DEBUGA) \
264     MEDIAINFO_DEBUG1(_NAME,_DEBUGA) \
265     Critical.Enter(); \
266     mi_outputs::iterator MI_Output=MI_Outputs.find(Handle); \
267     const bool MI_Output_IsOk=MI_Output!=MI_Outputs.end(); \
268     Critical.Leave(); \
269     if (Handle==NULL || !MI_Output_IsOk) \
270     { \
271         MEDIAINFO_DEBUG2(_NAME, Debug+="Handle error") \
272         Critical.Enter(); \
273         MI_Output=MI_Outputs.find(NULL); \
274         if (MI_Output==MI_Outputs.end()) \
275         { \
276             MI_Outputs[NULL]=new mi_output; \
277             MI_Output=MI_Outputs.find(NULL); \
278         } \
279         Critical.Leave(); \
280         MI_Output->second->Unicode=L"Note to developer : you must create an object before"; \
281         return MI_Output->second->Unicode.c_str(); \
282     } \
283 
284 #ifndef MEDIAINFO_DEBUG
285 #define EXECUTE_VOID(_NAME,_CLASS,_METHOD) \
286     try \
287     { \
288         ((_CLASS*)Handle)->_METHOD; \
289     } catch (...) {return;}
290 #else //MEDIAINFO_DEBUG
291 #define EXECUTE_VOID(_NAME,_CLASS,_METHOD) \
292     try \
293     { \
294         ((_CLASS*)Handle)->_METHOD; \
295         MEDIAINFO_DEBUG2(_NAME, "") \
296     } catch (...) {return;}
297 #endif //MEDIAINFO_DEBUG
298 
299 #ifndef MEDIAINFO_DEBUG
300 #define EXECUTE_SIZE_T(_NAME,_CLASS,_METHOD) \
301     try \
302     { \
303         return ((_CLASS*)Handle)->_METHOD; \
304     } catch (...) {return (size_t)-1;}
305 #else //MEDIAINFO_DEBUG
306 #define EXECUTE_SIZE_T(_NAME,_CLASS,_METHOD) \
307     try \
308     { \
309         size_t ToReturn=((_CLASS*)Handle)->_METHOD; \
310         MEDIAINFO_DEBUG2(_NAME, Debug+=", returns ";Debug+=Ztring::ToZtring((size_t)ToReturn).To_UTF8();) \
311         return ToReturn; \
312     } catch (...) {MEDIAINFO_DEBUG2(_NAME, Debug+="!!!Exception thrown!!!";) return (size_t)-1;}
313 #endif //MEDIAINFO_DEBUG
314 
315 #ifndef MEDIAINFO_DEBUG
316 #define EXECUTE_INT64U(_NAME,_CLASS,_METHOD) \
317     try \
318     { \
319         return ((_CLASS*)Handle)->_METHOD; \
320     } catch (...) {return (size_t)-1;}
321 #else //MEDIAINFO_DEBUG
322 #define EXECUTE_INT64U(_NAME,_CLASS,_METHOD) \
323     try \
324     { \
325         int64u ToReturn=((_CLASS*)Handle)->_METHOD; \
326         MEDIAINFO_DEBUG2(_NAME, Debug+=", returns ";Debug+=Ztring::ToZtring((size_t)ToReturn).To_UTF8();) \
327         return ToReturn; \
328     } catch (...) {MEDIAINFO_DEBUG2(_NAME, Debug+="!!!Exception thrown!!!";) return (size_t)-1;}
329 #endif //MEDIAINFO_DEBUG
330 
331 #ifndef MEDIAINFO_DEBUG
332 #define EXECUTE_STRING(_NAME,_CLASS,_METHOD) \
333     try \
334     { \
335         MI_Output->second->Unicode=((_CLASS*)Handle)->_METHOD; \
336     } catch (...) {MI_Output->second->Unicode.clear();} \
337     return MI_Output->second->Unicode.c_str();
338 #else //MEDIAINFO_DEBUG
339 #define EXECUTE_STRING(_NAME,_CLASS,_METHOD) \
340     try \
341     { \
342         MI_Output->second->Unicode=((_CLASS*)Handle)->_METHOD; \
343     } catch (...) {MEDIAINFO_DEBUG2(_NAME, Debug+="!!!Exception thrown!!!";) MI_Output->second->Unicode.clear();} \
344     Ztring ToReturn=MI_Output->second->Unicode; \
345     MEDIAINFO_DEBUG2(_NAME, Debug+=", returns ";Debug+=ToReturn.To_UTF8();) \
346     return MI_Output->second->Unicode.c_str();
347 #endif //MEDIAINFO_DEBUG
348 
349 #define MANAGE_VOID(_NAME,_CLASS,_METHOD,_DEBUGA) \
350     INTEGRITY_VOID(_NAME,_DEBUGA)       EXECUTE_VOID(_NAME,_CLASS,_METHOD)
351 
352 #define MANAGE_SIZE_T(_NAME,_CLASS,_METHOD,_DEBUGA) \
353     INTEGRITY_SIZE_T(_NAME,_DEBUGA)     EXECUTE_SIZE_T(_NAME,_CLASS,_METHOD)
354 
355 #define MANAGE_INT64U(_NAME,_CLASS,_METHOD,_DEBUGA) \
356     INTEGRITY_INT64U(_NAME,_DEBUGA)     EXECUTE_INT64U(_NAME,_CLASS,_METHOD)
357 
358 #define MANAGE_STRING(_NAME,_CLASS,_METHOD,_DEBUGA) \
359     INTEGRITY_STRING(_NAME,_DEBUGA)     EXECUTE_STRING(_NAME,_CLASS,_METHOD)
360 
361 //***************************************************************************
362 //
363 //***************************************************************************
364 
365 //---------------------------------------------------------------------------
366 
MediaInfoA_New()367 void*           __stdcall MediaInfoA_New ()
368 {
369     return MediaInfo_New();
370 }
371 
MediaInfoA_New_Quick(const char * File,const char * Options)372 void*           __stdcall MediaInfoA_New_Quick (const char* File, const char* Options)
373 {
374     return MediaInfo_New_Quick(MB2WC(NULL, 0, File), MB2WC(NULL, 1, Options));
375 }
376 
MediaInfoA_Delete(void * Handle)377 void            __stdcall MediaInfoA_Delete (void* Handle)
378 {
379     MediaInfo_Delete(Handle);
380 }
381 
MediaInfoA_Open(void * Handle,const char * File)382 size_t          __stdcall MediaInfoA_Open (void* Handle, const char* File)
383 {
384     return MediaInfo_Open(Handle, MB2WC(Handle, 0, File));
385 }
386 
MediaInfoA_Open_Buffer(void * Handle,const unsigned char * Begin,size_t Begin_Size,const unsigned char * End,size_t End_Size)387 size_t          __stdcall MediaInfoA_Open_Buffer (void* Handle, const unsigned char* Begin, size_t  Begin_Size, const unsigned char* End, size_t  End_Size)
388 {
389     return MediaInfo_Open_Buffer(Handle, Begin, Begin_Size, End, End_Size);
390 }
391 
MediaInfoA_Open_Buffer_Init(void * Handle,MediaInfo_int64u File_Size,MediaInfo_int64u File_Offset)392 size_t          __stdcall MediaInfoA_Open_Buffer_Init (void* Handle, MediaInfo_int64u File_Size, MediaInfo_int64u File_Offset)
393 {
394     return MediaInfo_Open_Buffer_Init(Handle, File_Size, File_Offset);
395 }
396 
MediaInfoA_Open_Buffer_Continue(void * Handle,MediaInfo_int8u * Buffer,size_t Buffer_Size)397 size_t          __stdcall MediaInfoA_Open_Buffer_Continue (void* Handle, MediaInfo_int8u* Buffer, size_t Buffer_Size)
398 {
399     return MediaInfo_Open_Buffer_Continue(Handle, Buffer, Buffer_Size);
400 }
401 
MediaInfoA_Open_Buffer_Continue_GoTo_Get(void * Handle)402 MediaInfo_int64u __stdcall MediaInfoA_Open_Buffer_Continue_GoTo_Get (void* Handle)
403 {
404     return MediaInfo_Open_Buffer_Continue_GoTo_Get(Handle);
405 }
406 
MediaInfoA_Open_Buffer_Finalize(void * Handle)407 size_t          __stdcall MediaInfoA_Open_Buffer_Finalize (void* Handle)
408 {
409     return MediaInfo_Open_Buffer_Finalize(Handle);
410 }
411 
MediaInfoA_Open_NextPacket(void * Handle)412 size_t          __stdcall MediaInfoA_Open_NextPacket (void* Handle)
413 {
414     return MediaInfo_Open_NextPacket(Handle);
415 }
416 
MediaInfoA_Save(void * Handle)417 size_t          __stdcall MediaInfoA_Save (void* Handle)
418 {
419     return MediaInfo_Save(Handle);
420 }
421 
MediaInfoA_Close(void * Handle)422 void            __stdcall MediaInfoA_Close (void* Handle)
423 {
424     MediaInfo_Close(Handle);
425 }
426 
MediaInfoA_Inform(void * Handle,size_t Reserved)427 const char*     __stdcall MediaInfoA_Inform (void* Handle, size_t Reserved)
428 {
429         return WC2MB(Handle, MediaInfo_Inform(Handle, 0));
430 }
431 
MediaInfoA_GetI(void * Handle,MediaInfo_stream_t StreamKind,size_t StreamNumber,size_t Parameter,MediaInfo_info_C KindOfInfo)432 const char*     __stdcall MediaInfoA_GetI (void* Handle, MediaInfo_stream_t StreamKind, size_t StreamNumber, size_t  Parameter, MediaInfo_info_C KindOfInfo)
433 {
434     return WC2MB(Handle, MediaInfo_GetI(Handle, StreamKind, StreamNumber, Parameter, KindOfInfo));
435 }
436 
MediaInfoA_Get(void * Handle,MediaInfo_stream_t StreamKind,size_t StreamNumber,const char * Parameter,MediaInfo_info_C KindOfInfo,MediaInfo_info_C KindOfSearch)437 const char*     __stdcall MediaInfoA_Get (void* Handle, MediaInfo_stream_t StreamKind, size_t StreamNumber, const char* Parameter, MediaInfo_info_C KindOfInfo, MediaInfo_info_C KindOfSearch)
438 {
439     return WC2MB(Handle, MediaInfo_Get(Handle, StreamKind, StreamNumber, MB2WC(Handle, 0, Parameter), KindOfInfo, KindOfSearch));
440 }
441 
MediaInfoA_SetI(void * Handle,const char * ToSet,MediaInfo_stream_t StreamKind,size_t StreamNumber,size_t Parameter,const char * OldParameter)442 size_t          __stdcall MediaInfoA_SetI (void* Handle, const char* ToSet, MediaInfo_stream_t StreamKind, size_t StreamNumber, size_t  Parameter, const char* OldParameter)
443 {
444     return MediaInfo_SetI(Handle, MB2WC(Handle, 0, ToSet), StreamKind, StreamNumber, Parameter, MB2WC(Handle, 1, OldParameter));
445 }
446 
MediaInfoA_Set(void * Handle,const char * ToSet,MediaInfo_stream_t StreamKind,size_t StreamNumber,const char * Parameter,const char * OldParameter)447 size_t          __stdcall MediaInfoA_Set (void* Handle, const char* ToSet, MediaInfo_stream_t StreamKind, size_t StreamNumber, const char* Parameter, const char* OldParameter)
448 {
449     return MediaInfo_Set(Handle, MB2WC(Handle, 0, ToSet), StreamKind, StreamNumber, MB2WC(Handle, 1, Parameter), MB2WC(Handle, 2, OldParameter));
450 }
451 
MediaInfoA_Output_Buffer_Get(void * Handle,const char * Value)452 size_t          __stdcall MediaInfoA_Output_Buffer_Get (void* Handle, const char* Value)
453 {
454     return MediaInfo_Output_Buffer_Get(Handle, MB2WC(Handle, 0, Value));
455 }
456 
MediaInfoA_Output_Buffer_GetI(void * Handle,size_t Pos)457 size_t          __stdcall MediaInfoA_Output_Buffer_GetI (void* Handle, size_t Pos)
458 {
459     return MediaInfo_Output_Buffer_GetI(Handle, Pos);
460 }
461 
MediaInfoA_Option(void * Handle,const char * Option,const char * Value)462 const char*     __stdcall MediaInfoA_Option (void* Handle, const char* Option, const char* Value)
463 {
464     return WC2MB(Handle, MediaInfo_Option(Handle, MB2WC(Handle, 0, Option), MB2WC(Handle, 1, Value)));
465 }
466 
MediaInfoA_State_Get(void * Handle)467 size_t          __stdcall MediaInfoA_State_Get(void* Handle)
468 {
469     return MediaInfo_State_Get(Handle);
470 }
471 
MediaInfoA_Count_Get(void * Handle,MediaInfo_stream_t StreamKind,size_t StreamNumber)472 size_t          __stdcall MediaInfoA_Count_Get(void* Handle, MediaInfo_stream_t StreamKind, size_t StreamNumber)
473 {
474     return MediaInfo_Count_Get(Handle, StreamKind, StreamNumber);
475 }
476 
477 //---------------------------------------------------------------------------
478 
MediaInfoListA_New()479 void*           __stdcall MediaInfoListA_New ()
480 {
481     return MediaInfoList_New();
482 }
483 
MediaInfoListA_New_Quick(const char * File,const char * Options)484 void*           __stdcall MediaInfoListA_New_Quick (const char* File, const char* Options)
485 {
486     return MediaInfoList_New_Quick(MB2WC(NULL, 0, File), MB2WC(NULL, 1, Options));
487 }
488 
MediaInfoListA_Delete(void * Handle)489 void            __stdcall MediaInfoListA_Delete (void* Handle)
490 {
491     MediaInfoList_Delete(Handle);
492 }
493 
MediaInfoListA_Open(void * Handle,const char * File,const MediaInfo_fileoptions_C Options)494 size_t          __stdcall MediaInfoListA_Open (void* Handle, const char* File, const MediaInfo_fileoptions_C Options)
495 {
496     return MediaInfoList_Open(Handle, MB2WC(Handle, 0, File), Options);
497 }
498 
MediaInfoListA_Open_Buffer(void * Handle,const unsigned char * Begin,size_t Begin_Size,const unsigned char * End,size_t End_Size)499 size_t          __stdcall MediaInfoListA_Open_Buffer (void* Handle, const unsigned char* Begin, size_t  Begin_Size, const unsigned char* End, size_t  End_Size)
500 {
501     return MediaInfoList_Open_Buffer(Handle, Begin, Begin_Size, End, End_Size);
502 }
503 
MediaInfoListA_Save(void * Handle,size_t FilePos)504 size_t          __stdcall MediaInfoListA_Save (void* Handle, size_t  FilePos)
505 {
506     return MediaInfoList_Save(Handle, FilePos);
507 }
508 
MediaInfoListA_Close(void * Handle,size_t FilePos)509 void            __stdcall MediaInfoListA_Close (void* Handle, size_t  FilePos)
510 {
511     MediaInfoList_Close(Handle, FilePos);
512 }
513 
MediaInfoListA_Inform(void * Handle,size_t FilePos,size_t Reserved)514 const char*     __stdcall MediaInfoListA_Inform (void* Handle, size_t  FilePos, size_t Reserved)
515 {
516     return WC2MB(Handle, MediaInfoList_Inform(Handle, FilePos, 0));
517 }
518 
MediaInfoListA_GetI(void * Handle,size_t FilePos,MediaInfo_stream_t StreamKind,size_t StreamNumber,size_t Parameter,MediaInfo_info_C KindOfInfo)519 const char*     __stdcall MediaInfoListA_GetI (void* Handle, size_t  FilePos, MediaInfo_stream_t StreamKind, size_t StreamNumber, size_t  Parameter, MediaInfo_info_C KindOfInfo)
520 {
521     return WC2MB(Handle, MediaInfoList_GetI(Handle, FilePos, StreamKind, StreamNumber, Parameter, KindOfInfo));
522 }
523 
MediaInfoListA_Get(void * Handle,size_t FilePos,MediaInfo_stream_t StreamKind,size_t StreamNumber,const char * Parameter,MediaInfo_info_C KindOfInfo,MediaInfo_info_C KindOfSearch)524 const char*     __stdcall MediaInfoListA_Get (void* Handle, size_t  FilePos, MediaInfo_stream_t StreamKind, size_t StreamNumber, const char* Parameter, MediaInfo_info_C KindOfInfo, MediaInfo_info_C KindOfSearch)
525 {
526     return WC2MB(Handle, MediaInfoList_Get(Handle, FilePos, StreamKind, StreamNumber, MB2WC(Handle, 1, Parameter), KindOfInfo, KindOfSearch));
527 }
528 
MediaInfoListA_SetI(void * Handle,const char * ToSet,size_t FilePos,MediaInfo_stream_t StreamKind,size_t StreamNumber,size_t Parameter,const char * OldParameter)529 size_t          __stdcall MediaInfoListA_SetI (void* Handle, const char* ToSet, size_t  FilePos, MediaInfo_stream_t StreamKind, size_t StreamNumber, size_t  Parameter, const char* OldParameter)
530 {
531     return MediaInfoList_SetI(Handle, MB2WC(Handle, 0, ToSet), FilePos, StreamKind, StreamNumber, Parameter, MB2WC(Handle, 1, OldParameter));
532 }
533 
MediaInfoListA_Set(void * Handle,const char * ToSet,size_t FilePos,MediaInfo_stream_t StreamKind,size_t StreamNumber,const char * Parameter,const char * OldParameter)534 size_t          __stdcall MediaInfoListA_Set (void* Handle, const char* ToSet, size_t  FilePos, MediaInfo_stream_t StreamKind, size_t StreamNumber, const char* Parameter, const char* OldParameter)
535 {
536     return MediaInfoList_Set(Handle, MB2WC(Handle, 0, ToSet), FilePos, StreamKind, StreamNumber, MB2WC(Handle, 1, Parameter), MB2WC(Handle, 2, OldParameter));
537 }
538 
MediaInfoListA_Option(void * Handle,const char * Option,const char * Value)539 const char*     __stdcall MediaInfoListA_Option (void* Handle, const char* Option, const char* Value)
540 {
541     return WC2MB(Handle, MediaInfoList_Option(Handle, MB2WC(Handle, 0, Option), MB2WC(Handle, 1, Value)));
542 }
543 
MediaInfoListA_State_Get(void * Handle)544 size_t          __stdcall MediaInfoListA_State_Get(void* Handle)
545 {
546     return MediaInfoList_State_Get(Handle);
547 }
548 
MediaInfoListA_Count_Get(void * Handle,size_t FilePos,MediaInfo_stream_t StreamKind,size_t StreamNumber)549 size_t          __stdcall MediaInfoListA_Count_Get(void* Handle, size_t  FilePos, MediaInfo_stream_t StreamKind, size_t StreamNumber)
550 {
551     return MediaInfoList_Count_Get(Handle, FilePos, StreamKind, StreamNumber);
552 }
553 
MediaInfoListA_Count_Get_Files(void * Handle)554 size_t          __stdcall MediaInfoListA_Count_Get_Files(void* Handle)
555 {
556     return MediaInfoList_Count_Get_Files(Handle);
557 }
558 
559 //---------------------------------------------------------------------------
560 
MediaInfo_New()561 void*           __stdcall MediaInfo_New ()
562 {
563     #ifdef MEDIAINFO_DEBUG
564         Debug_Open(false);
565         Debug+=",             New, Build="; Debug+=__DATE__; Debug+=' '; Debug+=__TIME__;
566         Debug_Close();
567     #endif //MEDIAINFO_DEBUG
568 
569     //First init
570     Critical.Enter();
571     if (MI_Outputs.find(NULL)==MI_Outputs.end())
572     {
573         MI_Outputs[NULL]=new mi_output; //Generic Handle
574     }
575     Critical.Leave();
576 
577     //New
578     MediaInfo* Handle=NULL;
579     try
580     {
581         Handle=new MediaInfo;
582     }
583     catch(...)
584     {
585         MEDIAINFO_DEBUG2(   "New",
586                             Debug+="!!!Exception thrown!!!";)
587 
588         delete Handle;
589         return NULL;
590     }
591 
592     Critical.Enter();
593     MI_Outputs[Handle]=new mi_output;
594     Critical.Leave();
595 
596     MEDIAINFO_DEBUG2(   "New",
597                         Debug+=", returns ";Debug+=Ztring::ToZtring((size_t)Handle).To_UTF8();)
598 
599     return Handle;
600 }
601 
MediaInfo_New_Quick(const wchar_t * File,const wchar_t * Options)602 void*           __stdcall MediaInfo_New_Quick (const wchar_t* File, const wchar_t* Options)
603 {
604     MediaInfo_Option(NULL, L"QuickInit", Options);
605     void* Handle=MediaInfo_New();
606     if (MediaInfo_Open(Handle, File)==0)
607     {
608         //No valid files, return NULL
609         delete (MediaInfo*)Handle;
610         return NULL;
611     }
612     return Handle;
613 }
614 
MediaInfo_Delete(void * Handle)615 void            __stdcall MediaInfo_Delete (void* Handle)
616 {
617     INTEGRITY_VOID(     "Delete"
618                         ,)
619 
620     //Delete the object
621     delete (MediaInfo*)Handle;
622 
623     //Delete strings
624     Critical.Enter();
625     delete MI_Outputs[Handle];
626     MI_Outputs.erase(Handle);
627     if (MI_Outputs.size()==1 && MI_Outputs.find(NULL)!=MI_Outputs.end()) //In case of the last object : delete the NULL object, no more need
628     {
629         delete MI_Outputs[NULL];
630         MI_Outputs.erase(NULL);
631     }
632 
633     if (MI_Inputs.find(Handle)!=MI_Inputs.end())
634     {
635         delete MI_Inputs[Handle];
636         MI_Inputs.erase(Handle);
637     }
638     Critical.Leave();
639 
640     MEDIAINFO_DEBUG2(   "Delete",
641                         )
642 }
643 
MediaInfo_Open(void * Handle,const wchar_t * File)644 size_t          __stdcall MediaInfo_Open (void* Handle, const wchar_t* File)
645 {
646     MANAGE_SIZE_T(  "Open",
647                     MediaInfo,
648                     Open(File),
649                     Debug+=", File=";Debug+=Ztring(File).To_UTF8();)
650 }
651 
MediaInfo_Open_Buffer(void * Handle,const unsigned char * Begin,size_t Begin_Size,const unsigned char * End,size_t End_Size)652 size_t          __stdcall MediaInfo_Open_Buffer (void* Handle, const unsigned char* Begin, size_t  Begin_Size, const unsigned char* End, size_t  End_Size)
653 {
654     MANAGE_SIZE_T(  "Open_Buffer",
655                     MediaInfo,
656                     Open(Begin, Begin_Size, End, End_Size),
657                     Debug+=", Begin_Size=";Debug+=Ztring::ToZtring(Begin_Size).To_UTF8();Debug+=", End_Size=";Debug+=Ztring::ToZtring(End_Size).To_UTF8();)
658 }
659 
MediaInfo_Open_Buffer_Init(void * Handle,MediaInfo_int64u File_Size,MediaInfo_int64u File_Offset)660 size_t          __stdcall MediaInfo_Open_Buffer_Init (void* Handle, MediaInfo_int64u File_Size, MediaInfo_int64u File_Offset)
661 {
662     MANAGE_SIZE_T(  "Open_Buffer_Init",
663                     MediaInfo,
664                     Open_Buffer_Init(File_Size, File_Offset),
665                     Debug+=", File_Size=";Debug+=Ztring::ToZtring(File_Size).To_UTF8();Debug+=", File_Offset=";Debug+=Ztring::ToZtring(File_Offset).To_UTF8();)
666 }
667 
MediaInfo_Open_Buffer_Continue(void * Handle,MediaInfo_int8u * Buffer,size_t Buffer_Size)668 size_t          __stdcall MediaInfo_Open_Buffer_Continue (void* Handle, MediaInfo_int8u* Buffer, size_t Buffer_Size)
669 {
670     MANAGE_SIZE_T(  "Open_Buffer_Continue",
671                     MediaInfo,
672                     Open_Buffer_Continue(Buffer, Buffer_Size),
673                     Debug+=", Buffer_Size=";Debug+=Ztring::ToZtring(Buffer_Size).To_UTF8();)
674 }
675 
MediaInfo_Open_Buffer_Continue_GoTo_Get(void * Handle)676 MediaInfo_int64u __stdcall MediaInfo_Open_Buffer_Continue_GoTo_Get (void* Handle)
677 {
678     MANAGE_INT64U(  "Open_Buffer_Continue_GoTo_Get",
679                     MediaInfo,
680                     Open_Buffer_Continue_GoTo_Get(),
681                     )
682 }
683 
MediaInfo_Open_Buffer_Finalize(void * Handle)684 size_t          __stdcall MediaInfo_Open_Buffer_Finalize (void* Handle)
685 {
686     MANAGE_SIZE_T(  "Open_Buffer_Finalize",
687                     MediaInfo,
688                     Open_Buffer_Finalize(),
689                     )
690 }
691 
MediaInfo_Open_NextPacket(void * Handle)692 size_t          __stdcall MediaInfo_Open_NextPacket (void* Handle)
693 {
694     MANAGE_SIZE_T(  "Open_NextPacket",
695                     MediaInfo,
696                     Open_NextPacket(),
697                     )
698 }
699 
MediaInfo_Save(void * Handle)700 size_t          __stdcall MediaInfo_Save (void* Handle)
701 {
702     MANAGE_SIZE_T(  "Save",
703                     MediaInfo,
704                     Save(),
705                     )
706 }
707 
MediaInfo_Close(void * Handle)708 void            __stdcall MediaInfo_Close (void* Handle)
709 {
710     MANAGE_VOID(    "Close",
711                     MediaInfo,
712                     Close(),
713                     )
714 }
715 
MediaInfo_Inform(void * Handle,size_t Reserved)716 const wchar_t*  __stdcall MediaInfo_Inform (void* Handle, size_t Reserved)
717 {
718     MANAGE_STRING(  "Inform",
719                     MediaInfo,
720                     Inform(),
721                     )
722 }
723 
MediaInfo_GetI(void * Handle,MediaInfo_stream_t StreamKind,size_t StreamNumber,size_t Parameter,MediaInfo_info_C KindOfInfo)724 const wchar_t*  __stdcall MediaInfo_GetI (void* Handle, MediaInfo_stream_t StreamKind, size_t StreamNumber, size_t  Parameter, MediaInfo_info_C KindOfInfo)
725 {
726     StreamKind=(MediaInfo_stream_t)(((size_t)StreamKind)&0xFF);
727     KindOfInfo=(MediaInfo_info_C)  (((size_t)KindOfInfo)&0xFF);
728     MANAGE_STRING(  "GetI",
729                     MediaInfo,
730                     Get((stream_t)StreamKind, StreamNumber, Parameter, (info_t)KindOfInfo),
731                     Debug+=", StreamKind=";Debug+=Ztring::ToZtring((size_t)StreamKind).To_UTF8();Debug+=", StreamNumber=";Debug+=Ztring::ToZtring(StreamNumber).To_UTF8();Debug+=", Parameter=";Debug+=Ztring::ToZtring(Parameter).To_UTF8();Debug+=", KindOfInfo=";Debug+=Ztring::ToZtring(KindOfInfo).To_UTF8();)
732 }
733 
MediaInfo_Get(void * Handle,MediaInfo_stream_t StreamKind,size_t StreamNumber,const wchar_t * Parameter,MediaInfo_info_C KindOfInfo,MediaInfo_info_C KindOfSearch)734 const wchar_t*  __stdcall MediaInfo_Get (void* Handle, MediaInfo_stream_t StreamKind, size_t StreamNumber, const wchar_t* Parameter, MediaInfo_info_C KindOfInfo, MediaInfo_info_C KindOfSearch)
735 {
736     StreamKind=(MediaInfo_stream_t)(((size_t)StreamKind)&0xFF);
737     KindOfInfo=(MediaInfo_info_C)  (((size_t)KindOfInfo)&0xFF);
738     KindOfSearch=(MediaInfo_info_C)(((size_t)KindOfSearch)&0xFF);
739     MANAGE_STRING(  "Get",
740                     MediaInfo,
741                     Get((stream_t)StreamKind, StreamNumber, Parameter, (info_t)KindOfInfo, (info_t)KindOfSearch),
742                     Debug+=", StreamKind=";Debug+=Ztring::ToZtring((size_t)StreamKind).To_UTF8();Debug+=", StreamNumber=";Debug+=Ztring::ToZtring(StreamNumber).To_UTF8();Debug+=", Parameter=";Debug+=Ztring(Parameter).To_UTF8();Debug+=", KindOfInfo=";Debug+=Ztring::ToZtring(KindOfInfo).To_UTF8();Debug+=", KindOfSearch=";Debug+=Ztring::ToZtring(KindOfSearch).To_UTF8();)
743 }
744 
MediaInfo_SetI(void * Handle,const wchar_t * ToSet,MediaInfo_stream_t StreamKind,size_t StreamNumber,size_t Parameter,const wchar_t * OldParameter)745 size_t          __stdcall MediaInfo_SetI (void* Handle, const wchar_t* ToSet, MediaInfo_stream_t StreamKind, size_t StreamNumber, size_t  Parameter, const wchar_t* OldParameter)
746 {
747     StreamKind=(MediaInfo_stream_t)(((size_t)StreamKind)&0xFF);
748     MANAGE_SIZE_T(  "SetI",
749                     MediaInfo,
750                     Set(ToSet, (stream_t)StreamKind, StreamNumber, Parameter, OldParameter),
751                     Debug+=", ToSet=";Debug+=Ztring(ToSet).To_UTF8();Debug+=", StreamKind=";Debug+=Ztring::ToZtring((size_t)StreamKind).To_UTF8();Debug+=", StreamNumber=";Debug+=Ztring::ToZtring(StreamNumber).To_UTF8();Debug+=", Parameter=";Debug+=Ztring::ToZtring(Parameter).To_UTF8();)
752 }
753 
MediaInfo_Set(void * Handle,const wchar_t * ToSet,MediaInfo_stream_t StreamKind,size_t StreamNumber,const wchar_t * Parameter,const wchar_t * OldParameter)754 size_t          __stdcall MediaInfo_Set (void* Handle, const wchar_t* ToSet, MediaInfo_stream_t StreamKind, size_t StreamNumber, const wchar_t* Parameter, const wchar_t* OldParameter)
755 {
756     StreamKind=(MediaInfo_stream_t)(((size_t)StreamKind)&0xFF);
757     MANAGE_SIZE_T(  "Set",
758                     MediaInfo,
759                     Set(ToSet, (stream_t)StreamKind, StreamNumber, Parameter, OldParameter),
760                     Debug+=", ToSet=";Debug+=Ztring(ToSet).To_UTF8();Debug+=", StreamKind=";Debug+=Ztring::ToZtring((size_t)StreamKind).To_UTF8();Debug+=", StreamNumber=";Debug+=Ztring::ToZtring(StreamNumber).To_UTF8();Debug+=", Parameter=";Debug+=Ztring(Parameter).To_UTF8();)
761 }
762 
MediaInfo_Output_Buffer_Get(void * Handle,const wchar_t * Value)763 size_t          __stdcall MediaInfo_Output_Buffer_Get (void* Handle, const wchar_t* Value)
764 {
765     MANAGE_SIZE_T(  "Output_Buffer_Get",
766                     MediaInfo,
767                     Output_Buffer_Get(Value),
768                     Debug+=", Value=";Debug+=Ztring(Value).To_UTF8();)
769 }
770 
MediaInfo_Output_Buffer_GetI(void * Handle,size_t Pos)771 size_t          __stdcall MediaInfo_Output_Buffer_GetI (void* Handle, size_t Pos)
772 {
773     MANAGE_SIZE_T(  "Output_Buffer_GetI",
774                     MediaInfo,
775                     Output_Buffer_Get(Pos),
776                     Debug+=", Pos=";Debug+=Ztring::ToZtring(Pos).To_UTF8();)
777 }
778 
MediaInfo_Option(void * Handle,const wchar_t * Option,const wchar_t * Value)779 const wchar_t*     __stdcall MediaInfo_Option (void* Handle, const wchar_t* Option, const wchar_t* Value)
780 {
781     //DLL only option
782     if (Ztring(Option).Compare(L"CharSet", L"=="))
783     {
784         MEDIAINFO_DEBUG1(   "Option",
785                             Debug+=", Option=";Debug+=Ztring(Option).To_UTF8();Debug+=", Value=";Debug+=Ztring(Value).To_UTF8();)
786 
787         //Coherancy
788         mi_outputs::iterator MI_Output=MI_Outputs_Find(NULL);
789 
790         if (Ztring(Value).Compare(L"UTF-8", L"=="))
791             utf8=true;
792         else
793             utf8=false;
794         MI_Output->second->Unicode.clear();
795 
796         MEDIAINFO_DEBUG2(   "CharSet",
797                             )
798 
799        return MI_Output->second->Unicode.c_str();
800     }
801     if (Ztring(Option).Compare(L"setlocale_LC_CTYPE", L"=="))
802     {
803         //Coherancy
804         mi_outputs::iterator MI_Output=MI_Outputs_Find(NULL);
805 
806         setlocale(LC_CTYPE, utf8?Ztring(Value).To_UTF8().c_str():Ztring(Value).To_Local().c_str());
807         MI_Output->second->Unicode.clear();
808 
809         MEDIAINFO_DEBUG2(   "setlocale_LC_CTYPE",
810                             )
811 
812         return MI_Output->second->Unicode.c_str();
813     }
814 
815     if (Handle)
816     {
817         MANAGE_STRING(  "Option",
818                         MediaInfo,
819                         Option(Option, Value),
820                         )
821     }
822     else
823     {
824         //MANAGE_STRING
825         mi_outputs::iterator MI_Output=MI_Outputs_Find(NULL);
826 
827         EXECUTE_STRING( "Option_Static",
828                         MediaInfo,
829                         Option_Static(Option, Value));
830     }
831 }
832 
MediaInfo_State_Get(void * Handle)833 size_t          __stdcall MediaInfo_State_Get(void* Handle)
834 {
835     MANAGE_SIZE_T(  "State_Get",
836                     MediaInfo,
837                     State_Get(),
838                     )
839 }
840 
MediaInfo_Count_Get(void * Handle,MediaInfo_stream_t StreamKind,size_t StreamNumber)841 size_t          __stdcall MediaInfo_Count_Get(void* Handle, MediaInfo_stream_t StreamKind, size_t StreamNumber)
842 {
843     StreamKind=(MediaInfo_stream_t)(((size_t)StreamKind)&0xFF);
844     MANAGE_SIZE_T(  "Count_Get",
845                     MediaInfo,
846                     Count_Get((stream_t)StreamKind, StreamNumber),
847                     Debug+=", StreamKind=";Debug+=Ztring::ToZtring((size_t)StreamKind).To_UTF8();Debug+=", StreamNumber=";Debug+=Ztring::ToZtring((size_t)StreamNumber).To_UTF8();)
848 }
849 
850 //---------------------------------------------------------------------------
851 
MediaInfoList_New()852 void*           __stdcall MediaInfoList_New ()
853 {
854     #ifdef MEDIAINFO_DEBUG
855         Debug_Open(false);
856         Debug+=",             New, Build="; Debug+=__DATE__; Debug+=' '; Debug+=__TIME__;
857         Debug_Close();
858     #endif //MEDIAINFO_DEBUG
859 
860     //First init
861     Critical.Enter();
862     if (MI_Outputs.find(NULL)==MI_Outputs.end())
863     {
864         MI_Outputs[NULL]=new mi_output; //Generic Handle
865     }
866     Critical.Leave();
867 
868     //New
869     MediaInfoList* Handle=NULL;
870     try
871     {
872         Handle=new MediaInfoList;
873     }
874     catch(...)
875     {
876         MEDIAINFO_DEBUG2(   "New",
877                             Debug+="!!!Exception thrown!!!";)
878 
879         delete Handle;
880         return NULL;
881     }
882 
883     Critical.Enter();
884     MI_Outputs[Handle]=new mi_output;
885     Critical.Leave();
886 
887     MEDIAINFO_DEBUG2(   "New",
888                         Debug+=", returns ";Debug+=Ztring::ToZtring((size_t)Handle).To_UTF8();)
889 
890     return Handle;
891 }
892 
MediaInfoList_New_Quick(const wchar_t * File,const wchar_t * Options)893 void*           __stdcall MediaInfoList_New_Quick (const wchar_t* File, const wchar_t* Options)
894 {
895     MediaInfoList_Option(NULL, L"QuickInit", Options);
896     void* Handle=MediaInfoList_New();
897     if (MediaInfoList_Open(Handle, File, MediaInfo_FileOption_Nothing)==0)
898     {
899         //No valid files, return NULL
900         delete (MediaInfoList*)Handle;
901         return NULL;
902     }
903     return Handle;
904 }
905 
MediaInfoList_Delete(void * Handle)906 void            __stdcall MediaInfoList_Delete (void* Handle)
907 {
908     INTEGRITY_VOID(     "Delete"
909                         ,)
910 
911     //Delete the object
912     delete (MediaInfoList*)Handle;
913 
914     //Delete strings
915     Critical.Enter();
916     delete MI_Outputs[Handle];
917     MI_Outputs.erase(Handle);
918     if (MI_Outputs.size()==1 && MI_Outputs.find(NULL)!=MI_Outputs.end()) //In case of the last object : delete the NULL object, no more need
919     {
920         delete MI_Outputs[NULL];
921         MI_Outputs.erase(NULL);
922     }
923 
924     if (MI_Inputs.find(Handle)!=MI_Inputs.end())
925     {
926         delete MI_Inputs[Handle];
927         MI_Inputs.erase(Handle);
928     }
929     Critical.Leave();
930 
931     MEDIAINFO_DEBUG2(   "Delete",
932                         )
933 }
934 
MediaInfoList_Open(void * Handle,const wchar_t * File,const MediaInfo_fileoptions_C Options)935 size_t          __stdcall MediaInfoList_Open (void* Handle, const wchar_t* File, const MediaInfo_fileoptions_C Options)
936 {
937     MANAGE_SIZE_T(  "Open",
938                     MediaInfoList,
939                     Open(File),
940                     Debug+=", File=";Debug+=Ztring(File).To_UTF8();)
941 }
942 
MediaInfoList_Open_Buffer(void * Handle,const unsigned char * Begin,size_t Begin_Size,const unsigned char * End,size_t End_Size)943 size_t          __stdcall MediaInfoList_Open_Buffer (void* Handle, const unsigned char* Begin, size_t  Begin_Size, const unsigned char* End, size_t  End_Size)
944 {
945     return 0; // Not implemented
946 }
947 
MediaInfoList_Save(void * Handle,size_t FilePos)948 size_t          __stdcall MediaInfoList_Save (void* Handle, size_t  FilePos)
949 {
950     MANAGE_SIZE_T(  "Save",
951                     MediaInfoList,
952                     Save(FilePos),
953                     )
954 }
955 
MediaInfoList_Close(void * Handle,size_t FilePos)956 void            __stdcall MediaInfoList_Close (void* Handle, size_t  FilePos)
957 {
958     MANAGE_VOID(    "Close",
959                     MediaInfoList,
960                     Close(FilePos),
961                     )
962 }
963 
MediaInfoList_Inform(void * Handle,size_t FilePos,size_t Reserved)964 const wchar_t*  __stdcall MediaInfoList_Inform (void* Handle, size_t  FilePos, size_t Reserved)
965 {
966     MANAGE_STRING(  "Inform",
967                     MediaInfoList,
968                     Inform(FilePos),
969                     )
970 }
971 
MediaInfoList_GetI(void * Handle,size_t FilePos,MediaInfo_stream_t StreamKind,size_t StreamNumber,size_t Parameter,MediaInfo_info_C KindOfInfo)972 const wchar_t*  __stdcall MediaInfoList_GetI (void* Handle, size_t  FilePos, MediaInfo_stream_t StreamKind, size_t StreamNumber, size_t  Parameter, MediaInfo_info_C KindOfInfo)
973 {
974     StreamKind=(MediaInfo_stream_t)(((size_t)StreamKind)&0xFF);
975     KindOfInfo=(MediaInfo_info_C)  (((size_t)KindOfInfo)&0xFF);
976     MANAGE_STRING(  "GetI",
977                     MediaInfoList,
978                     Get(FilePos, (stream_t)StreamKind, StreamNumber, Parameter, (info_t)KindOfInfo),
979                     Debug+=", StreamKind=";Debug+=Ztring::ToZtring((size_t)StreamKind).To_UTF8();Debug+=", StreamNumber=";Debug+=Ztring::ToZtring(StreamNumber).To_UTF8();Debug+=", Parameter=";Debug+=Ztring::ToZtring(Parameter).To_UTF8();Debug+=", KindOfInfo=";Debug+=Ztring::ToZtring(KindOfInfo).To_UTF8();)
980 }
981 
MediaInfoList_Get(void * Handle,size_t FilePos,MediaInfo_stream_t StreamKind,size_t StreamNumber,const wchar_t * Parameter,MediaInfo_info_C KindOfInfo,MediaInfo_info_C KindOfSearch)982 const wchar_t*  __stdcall MediaInfoList_Get (void* Handle, size_t  FilePos, MediaInfo_stream_t StreamKind, size_t StreamNumber, const wchar_t* Parameter, MediaInfo_info_C KindOfInfo, MediaInfo_info_C KindOfSearch)
983 {
984     StreamKind=(MediaInfo_stream_t)(((size_t)StreamKind)&0xFF);
985     KindOfInfo=(MediaInfo_info_C)  (((size_t)KindOfInfo)&0xFF);
986     MANAGE_STRING(  "Get",
987                     MediaInfoList,
988                     Get(FilePos, (stream_t)StreamKind, StreamNumber, Parameter, (info_t)KindOfInfo, (info_t)KindOfSearch),
989                     Debug+=", StreamKind=";Debug+=Ztring::ToZtring((size_t)StreamKind).To_UTF8();Debug+=", StreamNumber=";Debug+=Ztring::ToZtring(StreamNumber).To_UTF8();Debug+=", Parameter=";Debug+=Ztring(Parameter).To_UTF8();Debug+=", KindOfInfo=";Debug+=Ztring::ToZtring(KindOfInfo).To_UTF8();Debug+=", KindOfSearch=";Debug+=Ztring::ToZtring(KindOfSearch).To_UTF8();)
990 }
991 
MediaInfoList_SetI(void * Handle,const wchar_t * ToSet,size_t FilePos,MediaInfo_stream_t StreamKind,size_t StreamNumber,size_t Parameter,const wchar_t * OldParameter)992 size_t          __stdcall MediaInfoList_SetI (void* Handle, const wchar_t* ToSet, size_t  FilePos, MediaInfo_stream_t StreamKind, size_t StreamNumber, size_t  Parameter, const wchar_t* OldParameter)
993 {
994     StreamKind=(MediaInfo_stream_t)(((size_t)StreamKind)&0xFF);
995     MANAGE_SIZE_T(  "SetI",
996                     MediaInfoList,
997                     Set(ToSet, FilePos, (stream_t)StreamKind, StreamNumber, Parameter),
998                     Debug+=", ToSet=";Debug+=Ztring(ToSet).To_UTF8();Debug+=", StreamKind=";Debug+=Ztring::ToZtring((size_t)StreamKind).To_UTF8();Debug+=", StreamNumber=";Debug+=Ztring::ToZtring(StreamNumber).To_UTF8();Debug+=", Parameter=";Debug+=Ztring::ToZtring(Parameter).To_UTF8();)
999 }
1000 
MediaInfoList_Set(void * Handle,const wchar_t * ToSet,size_t FilePos,MediaInfo_stream_t StreamKind,size_t StreamNumber,const wchar_t * Parameter,const wchar_t * OldParameter)1001 size_t          __stdcall MediaInfoList_Set (void* Handle, const wchar_t* ToSet, size_t  FilePos, MediaInfo_stream_t StreamKind, size_t StreamNumber, const wchar_t* Parameter, const wchar_t* OldParameter)
1002 {
1003     StreamKind=(MediaInfo_stream_t)(((size_t)StreamKind)&0xFF);
1004     MANAGE_SIZE_T(  "Set",
1005                     MediaInfoList,
1006                     Set(ToSet, FilePos, (stream_t)StreamKind, StreamNumber, Parameter, OldParameter),
1007                     Debug+=", ToSet=";Debug+=Ztring(ToSet).To_UTF8();Debug+=", StreamKind=";Debug+=Ztring::ToZtring((size_t)StreamKind).To_UTF8();Debug+=", StreamNumber=";Debug+=Ztring::ToZtring(StreamNumber).To_UTF8();Debug+=", Parameter=";Debug+=Ztring(Parameter).To_UTF8();)
1008 }
1009 
MediaInfoList_Option(void * Handle,const wchar_t * Option,const wchar_t * Value)1010 const wchar_t*     __stdcall MediaInfoList_Option (void* Handle, const wchar_t* Option, const wchar_t* Value)
1011 {
1012     //DLL only option
1013     if (Ztring(Option).Compare(L"CharSet", L"=="))
1014     {
1015         MEDIAINFO_DEBUG1(   "Option",
1016                             Debug+=", Option=";Debug+=Ztring(Option).To_UTF8();Debug+=", Value=";Debug+=Ztring(Value).To_UTF8();)
1017 
1018         //Coherancy
1019         mi_outputs::iterator MI_Output=MI_Outputs_Find(NULL);
1020 
1021         if (Ztring(Value).Compare(L"UTF-8", L"=="))
1022             utf8=true;
1023         else
1024             utf8=false;
1025         MI_Output->second->Unicode.clear();
1026 
1027         MEDIAINFO_DEBUG2(   "CharSet",
1028                             )
1029 
1030        return MI_Output->second->Unicode.c_str();
1031     }
1032     if (Ztring(Option).Compare(L"setlocale_LC_CTYPE", L"=="))
1033     {
1034         //Coherancy
1035         mi_outputs::iterator MI_Output=MI_Outputs_Find(NULL);
1036 
1037         setlocale(LC_CTYPE, utf8?Ztring(Value).To_UTF8().c_str():Ztring(Value).To_Local().c_str());
1038         MI_Output->second->Unicode.clear();
1039 
1040         MEDIAINFO_DEBUG2(   "setlocale_LC_CTYPE",
1041                             )
1042 
1043         return MI_Output->second->Unicode.c_str();
1044     }
1045 
1046     if (Handle)
1047     {
1048         MANAGE_STRING(  "Option",
1049                         MediaInfoList,
1050                         Option(Option, Value),
1051                         )
1052     }
1053     else
1054     {
1055         //MANAGE_STRING
1056         mi_outputs::iterator MI_Output=MI_Outputs_Find(NULL);
1057 
1058         EXECUTE_STRING( "Option_Static",
1059                         MediaInfoList,
1060                         Option_Static(Option, Value));
1061     }
1062 }
1063 
MediaInfoList_State_Get(void * Handle)1064 size_t          __stdcall MediaInfoList_State_Get(void* Handle)
1065 {
1066     MANAGE_SIZE_T(  "State_Get",
1067                     MediaInfoList,
1068                     State_Get(),
1069                     )
1070 }
1071 
MediaInfoList_Count_Get(void * Handle,size_t FilePos,MediaInfo_stream_t StreamKind,size_t StreamNumber)1072 size_t          __stdcall MediaInfoList_Count_Get(void* Handle, size_t  FilePos, MediaInfo_stream_t StreamKind, size_t StreamNumber)
1073 {
1074     StreamKind=(MediaInfo_stream_t)(((size_t)StreamKind)&0xFF);
1075     MANAGE_SIZE_T(  "Count_Get",
1076                     MediaInfoList,
1077                     Count_Get(FilePos, (stream_t)StreamKind, StreamNumber),
1078                     Debug+=", StreamKind=";Debug+=Ztring::ToZtring((size_t)StreamKind).To_UTF8();Debug+=", StreamNumber=";Debug+=Ztring::ToZtring((size_t)StreamNumber).To_UTF8();)
1079 }
1080 
MediaInfoList_Count_Get_Files(void * Handle)1081 size_t          __stdcall MediaInfoList_Count_Get_Files(void* Handle)
1082 {
1083     MANAGE_SIZE_T(  "Count_Get",
1084                     MediaInfoList,
1085                     Count_Get(),
1086                     )
1087 }
1088 
1089 //---------------------------------------------------------------------------
1090 
MediaInfo_Info_Version()1091 const char*     __stdcall MediaInfo_Info_Version()
1092 {
1093     #ifdef MEDIAINFO_DEBUG
1094         Debug_Open(false);
1095         Debug+=",             MediaInfo_Info_Version";
1096         Debug_Close();
1097     #endif //MEDIAINFO_DEBUG
1098 
1099     #ifdef MEDIAINFO_DEBUG
1100         Debug_Open(true);
1101         Debug+=",             MediaInfo_Info_Version";
1102         Debug_Close();
1103     #endif //MEDIAINFO_DEBUG
1104 
1105     return "Your software uses an outdated interface, You must use MediaInfo.DLL 0.4.1.1 instead";
1106     //wchar_t* MediaInfo_wChar=new wchar_t[1000];
1107     //GetModuleFileNameW (NULL, MediaInfo_wChar, 1000);
1108     //return WC2MB(MediaInfo_wChar);
1109 }
1110 
1111 //***************************************************************************
1112 //
1113 //***************************************************************************
1114 
1115 #endif //UNICODE
1116