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