24#if defined(__NT__) || defined(_WIN32) || defined(WIN32)
38#if defined(_WIN64) || defined(WIN64)
52#if defined(WIN32) || defined(WIN64)
66#if defined(UNIX) || defined(_UNIX) || defined(__UNIX__) || defined(__unix) || defined(__unix__) || defined(____SVR4____) || defined(__LINUX__) || defined(__sgi) || defined(__hpux) || defined(sun) || defined(__SUN__) || defined(_AIX) || defined(__EMX__) || defined(__VMS) || defined(__BEOS__)
94#if defined(__APPLE__) && defined(__MACH__)
107#if defined(WINDOWS) && defined(UNIX) && defined(MACOS) && defined(MACOSX)
108#pragma message Multiple platforms ? ? ?
111#if !defined(WIN32) && !defined(UNIX) && !defined(MACOS) && !defined(MACOSX)
112#pragma message No known platforms, assume default
116#if defined(_WIN32) || defined(WIN32)
118#ifndef MEDIAINFODLL_NAME
119#define MEDIAINFODLL_NAME L"MediaInfo.dll"
122#ifndef MEDIAINFODLL_NAME
123#define MEDIAINFODLL_NAME "MediaInfo.dll"
126#elif defined(__APPLE__) && defined(__MACH__)
127#ifndef MEDIAINFODLL_NAME
128#define MEDIAINFODLL_NAME "libmediainfo.0.dylib"
137#ifndef MEDIAINFODLL_NAME
138#define MEDIAINFODLL_NAME "libmediainfo.so.0"
146#define __T(__x) __T(__x)
147#if defined(UNICODE) || defined(_UNICODE)
150#define __T(__x) L##__x
151#define MEDIAINFO_Ansi ""
156#define MEDIAINFO_Ansi "A"
167#if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__UNIX__) || defined(__MACOSX__)
169#define MAXTYPE_INT 64
170typedef unsigned long long MediaInfo_int64u;
171#elif defined(__WIN32__) || defined(_WIN32)
173#define MAXTYPE_INT 64
174typedef unsigned __int64 MediaInfo_int64u;
176#pragma message This machine has no 64 - bit integer type ?
238#ifdef MEDIAINFO_GLIBC
240 static GModule *MediaInfo_Module =
NULL;
241#elif defined(_WIN32) || defined(WIN32)
243static HMODULE MediaInfo_Module =
NULL;
246#include <CoreFoundation/CFBundle.h>
250static void *MediaInfo_Module =
NULL;
252 static size_t Module_Count = 0;
254#ifdef MEDIAINFO_GLIBC
255#define MEDIAINFO_ASSIGN(_Name, _Name2) \
256 if (!g_module_symbol(MediaInfo_Module, "MediaInfo" MEDIAINFO_Ansi "_" _Name2, (gpointer *)&MediaInfo_##_Name)) \
258#define MEDIAINFOLIST_ASSIGN(_Name, _Name2) \
259 if (!g_module_symbol(MediaInfo_Module, "MediaInfoList" MEDIAINFO_Ansi "_" _Name2, (gpointer *)&MediaInfoList_##_Name)) \
261#elif defined(_WIN32) || defined(WIN32)
262#define MEDIAINFO_ASSIGN(_Name, _Name2) \
263 MediaInfo_##_Name = (MEDIAINFO_##_Name)GetProcAddress(MediaInfo_Module, "MediaInfo" MEDIAINFO_Ansi "_" _Name2); \
264 if (MediaInfo_##_Name == NULL) \
266#define MEDIAINFOLIST_ASSIGN(_Name, _Name2) \
267 MediaInfoList_##_Name = (MEDIAINFOLIST_##_Name)GetProcAddress(MediaInfo_Module, "MediaInfoList" MEDIAINFO_Ansi "_" _Name2); \
268 if (MediaInfoList_##_Name == NULL) \
271#define MEDIAINFO_ASSIGN(_Name, _Name2) \
272 MediaInfo_##_Name = (MEDIAINFO_##_Name)dlsym(MediaInfo_Module, "MediaInfo" MEDIAINFO_Ansi "_" _Name2); \
273 if (MediaInfo_##_Name == NULL) \
275#define MEDIAINFOLIST_ASSIGN(_Name, _Name2) \
276 MediaInfoList_##_Name = (MEDIAINFOLIST_##_Name)dlsym(MediaInfo_Module, "MediaInfoList" MEDIAINFO_Ansi "_" _Name2); \
277 if (MediaInfoList_##_Name == NULL) \
340 static size_t MediaInfoDLL_Load()
344 if (Module_Count > 0)
351#ifdef MEDIAINFO_GLIBC
353#elif defined(_WIN32) || defined(WIN32)
358 if (!MediaInfo_Module)
360 CFBundleRef mainBundle = CFBundleGetMainBundle();
363 CFURLRef app_url = CFBundleCopyExecutableURL(mainBundle);
364 CFURLRef app_path_url = CFURLCreateCopyDeletingLastPathComponent(
NULL, app_url);
366 CFStringRef app_path = CFURLCopyFileSystemPath(app_path_url, kCFURLPOSIXPathStyle);
368 CFMutableStringRef mut_app_path = CFStringCreateMutableCopy(
NULL,
NULL, app_path);
369 CFStringAppend(mut_app_path, CFSTR(
"/"));
371 CFStringEncoding encodingMethod = CFStringGetSystemEncoding();
372 const char *fullPath = CFStringGetCStringPtr(mut_app_path, encodingMethod);
374 MediaInfo_Module = dlopen(fullPath, RTLD_LAZY);
377 CFRelease(app_path_url);
379 CFRelease(mut_app_path);
383 if (!MediaInfo_Module)
385 if (!MediaInfo_Module)
387 if (!MediaInfo_Module)
389 if (!MediaInfo_Module)
391 if (!MediaInfo_Module)
393 if (!MediaInfo_Module)
396 if (!MediaInfo_Module)
408 MEDIAINFO_ASSIGN(Open_Buffer_Continue_GoTo_Get,
"Open_Buffer_Continue_GoTo_Get")
431#ifdef MEDIAINFO_GLIBC
432 g_module_close(MediaInfo_Module);
433#elif defined(_WIN32) || defined(WIN32)
434 FreeLibrary(MediaInfo_Module);
436 dlclose(MediaInfo_Module);
438 MediaInfo_Module =
NULL;
446 static size_t MediaInfoDLL_IsLoaded()
448 if (MediaInfo_Module)
454 static void MediaInfoDLL_UnLoad()
457 if (Module_Count > 0)
460#ifdef MEDIAINFO_GLIBC
461 g_module_close(MediaInfo_Module);
462#elif defined(_WIN32) || defined(WIN32)
463 FreeLibrary(MediaInfo_Module);
465 dlclose(MediaInfo_Module);
467 MediaInfo_Module =
NULL;
486namespace MediaInfoDLL
492#define __T(__x) __T(__x)
493#if defined(UNICODE) || defined(_UNICODE)
494 typedef wchar_t Char;
496#define __T(__x) L##__x
503 typedef std::basic_string<Char> String;
504 typedef std::basic_stringstream<Char> StringStream;
505 typedef std::basic_istringstream<Char> iStringStream;
506 typedef std::basic_ostringstream<Char> oStringStream;
507 typedef std::basic_istringstream<Char> tiStringStream;
508 typedef std::basic_ostringstream<Char> toStringStream;
510 const size_t Error = (size_t)(-1);
547 InfoOption_ShowInInform,
549 InfoOption_ShowInSupported,
550 InfoOption_TypeOfValue,
557 FileOption_Nothing = 0x00,
558 FileOption_NoRecursive = 0x01,
559 FileOption_CloseAll = 0x02,
560 FileOption_Max = 0x04
564#define MEDIAINFO_TEST_VOID \
565 if (!MediaInfo_Module) \
567 MediaInfoDLL_Load(); \
568 if (!MediaInfo_Module) \
571#define MEDIAINFO_TEST_INT \
572 if (!MediaInfo_Module) \
574 MediaInfoDLL_Load(); \
575 if (!MediaInfo_Module) \
578#define MEDIAINFO_TEST_STRING \
579 if (!MediaInfo_Module) \
581 MediaInfoDLL_Load(); \
582 if (!MediaInfo_Module) \
583 return Unable_Load_DLL; \
585#define MEDIAINFO_TEST_STRING_STATIC \
586 if (!MediaInfo_Module) \
588 MediaInfoDLL_Load(); \
589 if (!MediaInfo_Module) \
590 return Unable_Load_DLL; \
600 if (!MediaInfo_Module)
602 if (!MediaInfo_Module)
607 Handle = MediaInfo_New();
612 MediaInfo_Delete(Handle);
616 size_t Open(
const String &File)
619 return MediaInfo_Open(Handle, File.c_str());
621 size_t Open_Buffer_Init(MediaInfo_int64u File_Size = (MediaInfo_int64u)-1, MediaInfo_int64u File_Offset = 0)
624 return MediaInfo_Open_Buffer_Init(Handle, File_Size, File_Offset);
626 size_t Open_Buffer_Continue(
MediaInfo_int8u *Buffer,
size_t Buffer_Size)
629 return MediaInfo_Open_Buffer_Continue(Handle, Buffer, Buffer_Size);
631 MediaInfo_int64u Open_Buffer_Continue_GoTo_Get()
634 return MediaInfo_Open_Buffer_Continue_GoTo_Get(Handle);
636 size_t Open_Buffer_Finalize()
639 return MediaInfo_Open_Buffer_Finalize(Handle);
641 size_t Open_NextPacket()
644 return MediaInfo_Open_NextPacket(Handle);
650 return MediaInfo_Close(Handle);
656 MEDIAINFO_TEST_STRING;
657 return MediaInfo_Inform(Handle, 0);
659 String Get(stream_t StreamKind,
size_t StreamNumber,
size_t Parameter, info_t InfoKind = Info_Text)
661 MEDIAINFO_TEST_STRING;
664 String Get(stream_t StreamKind,
size_t StreamNumber,
const String &Parameter, info_t InfoKind = Info_Text, info_t SearchKind = Info_Name)
666 MEDIAINFO_TEST_STRING;
671 size_t Output_Buffer_Get(
const String &Value) {
return MediaInfo_Output_Buffer_Get(Handle, Value.c_str()); }
672 size_t Output_Buffer_Get(
size_t Pos) {
return MediaInfo_Output_Buffer_GetI(Handle, Pos); }
673 String Option(
const String &Option,
const String &Value =
__T(
""))
675 MEDIAINFO_TEST_STRING;
676 return MediaInfo_Option(Handle, Option.c_str(), Value.c_str());
678 static String Option_Static(
const String &Option,
const String &Value =
__T(
""))
680 if (!MediaInfo_Module)
682 MEDIAINFO_TEST_STRING_STATIC;
683 return MediaInfo_Option(
NULL, Option.c_str(), Value.c_str());
688 return MediaInfo_State_Get(Handle);
690 size_t Count_Get(stream_t StreamKind,
size_t StreamNumber = (
size_t)-1)
696 bool IsReady() {
return (Handle !=
nullptr && MediaInfo_Module !=
nullptr); }
708 if (!MediaInfoDLL_IsLoaded())
713 Handle = MediaInfoList_New();
718 MediaInfoList_Delete(Handle);
719 MediaInfoDLL_UnLoad();
723 size_t Open(
const String &File,
const fileoptions_t Options = FileOption_Nothing)
729 void Close(
size_t FilePos = (
size_t)-1)
732 return MediaInfoList_Close(Handle, FilePos);
736 String Inform(
size_t FilePos = (
size_t)-1)
738 MEDIAINFO_TEST_STRING;
739 return MediaInfoList_Inform(Handle, FilePos, 0);
741 String Get(
size_t FilePos, stream_t StreamKind,
size_t StreamNumber,
size_t Parameter, info_t InfoKind = Info_Text)
743 MEDIAINFO_TEST_STRING;
746 String Get(
size_t FilePos, stream_t StreamKind,
size_t StreamNumber,
const String &Parameter, info_t InfoKind = Info_Text, info_t SearchKind = Info_Name)
748 MEDIAINFO_TEST_STRING;
753 String Option(
const String &Option,
const String &Value =
__T(
""))
755 MEDIAINFO_TEST_STRING;
756 return MediaInfoList_Option(Handle, Option.c_str(), Value.c_str());
758 static String Option_Static(
const String &Option,
const String &Value =
__T(
""))
760 MEDIAINFO_TEST_STRING_STATIC;
761 return MediaInfoList_Option(
NULL, Option.c_str(), Value.c_str());
766 return MediaInfoList_State_Get(Handle);
768 size_t Count_Get(
size_t FilePos, stream_t StreamKind,
size_t StreamNumber = (
size_t)-1)
771 return MediaInfoList_Count_Get(Handle, FilePos, (
MediaInfo_stream_C)StreamKind, StreamNumber);
776 return MediaInfoList_Count_Get_Files(Handle);
779 bool IsReady() {
return (Handle && MediaInfo_Module) ? true :
false; }