| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 | using System;using System.Runtime.InteropServices;namespace MediaBrowser.MediaInfo{    public enum StreamKind    {        General,        Video,        Audio,        Text,        Other,        Image,        Menu,    }    public enum InfoKind    {        Name,        Text,        Measure,        Options,        NameText,        MeasureText,        Info,        HowTo    }    public enum InfoOptions    {        ShowInInform,        Support,        ShowInSupported,        TypeOfValue    }    public enum InfoFileOptions    {        FileOption_Nothing = 0x00,        FileOption_NoRecursive = 0x01,        FileOption_CloseAll = 0x02,        FileOption_Max = 0x04    };    public enum Status    {        None = 0x00,        Accepted = 0x01,        Filled = 0x02,        Updated = 0x04,        Finalized = 0x08,    }    public class MediaInfo    {        //Import of DLL functions. DO NOT USE until you know what you do (MediaInfo DLL do NOT use CoTaskMemAlloc to allocate memory)        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfo_New();        [DllImport("MediaInfo")]        private static extern void MediaInfo_Delete(IntPtr Handle);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfo_Open(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string FileName);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoA_Open(IntPtr Handle, IntPtr FileName);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfo_Open_Buffer_Init(IntPtr Handle, Int64 File_Size, Int64 File_Offset);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoA_Open(IntPtr Handle, Int64 File_Size, Int64 File_Offset);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfo_Open_Buffer_Continue(IntPtr Handle, IntPtr Buffer, IntPtr Buffer_Size);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoA_Open_Buffer_Continue(IntPtr Handle, Int64 File_Size, byte[] Buffer, IntPtr Buffer_Size);        [DllImport("MediaInfo")]        private static extern Int64 MediaInfo_Open_Buffer_Continue_GoTo_Get(IntPtr Handle);        [DllImport("MediaInfo")]        private static extern Int64 MediaInfoA_Open_Buffer_Continue_GoTo_Get(IntPtr Handle);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfo_Open_Buffer_Finalize(IntPtr Handle);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoA_Open_Buffer_Finalize(IntPtr Handle);        [DllImport("MediaInfo")]        private static extern void MediaInfo_Close(IntPtr Handle);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfo_Inform(IntPtr Handle, IntPtr Reserved);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoA_Inform(IntPtr Handle, IntPtr Reserved);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfo_GetI(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoA_GetI(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfo_Get(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, [MarshalAs(UnmanagedType.LPWStr)] string Parameter, IntPtr KindOfInfo, IntPtr KindOfSearch);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoA_Get(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo, IntPtr KindOfSearch);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfo_Option(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string Option, [MarshalAs(UnmanagedType.LPWStr)] string Value);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoA_Option(IntPtr Handle, IntPtr Option, IntPtr Value);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfo_State_Get(IntPtr Handle);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfo_Count_Get(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber);        //MediaInfo class        public MediaInfo()        {            try            {                Handle = MediaInfo_New();            }            catch            {                Handle = (IntPtr)0;            }            if (Environment.OSVersion.ToString().IndexOf("Windows") == -1)                MustUseAnsi = true;            else                MustUseAnsi = false;        }        ~MediaInfo() { if (Handle == (IntPtr)0) return; MediaInfo_Delete(Handle); }        public int Open(String FileName)        {            if (Handle == (IntPtr)0)                return 0;            if (MustUseAnsi)            {                IntPtr FileName_Ptr = Marshal.StringToHGlobalAnsi(FileName);                int ToReturn = (int)MediaInfoA_Open(Handle, FileName_Ptr);                Marshal.FreeHGlobal(FileName_Ptr);                return ToReturn;            }            else                return (int)MediaInfo_Open(Handle, FileName);        }        public int Open_Buffer_Init(Int64 File_Size, Int64 File_Offset)        {            if (Handle == (IntPtr)0) return 0; return (int)MediaInfo_Open_Buffer_Init(Handle, File_Size, File_Offset);        }        public int Open_Buffer_Continue(IntPtr Buffer, IntPtr Buffer_Size)        {            if (Handle == (IntPtr)0) return 0; return (int)MediaInfo_Open_Buffer_Continue(Handle, Buffer, Buffer_Size);        }        public Int64 Open_Buffer_Continue_GoTo_Get()        {            if (Handle == (IntPtr)0) return 0; return (Int64)MediaInfo_Open_Buffer_Continue_GoTo_Get(Handle);        }        public int Open_Buffer_Finalize()        {            if (Handle == (IntPtr)0) return 0; return (int)MediaInfo_Open_Buffer_Finalize(Handle);        }        public void Close() { if (Handle == (IntPtr)0) return; MediaInfo_Close(Handle); }        public String Inform()        {            if (Handle == (IntPtr)0)                return "Unable to load MediaInfo library";            if (MustUseAnsi)                return Marshal.PtrToStringAnsi(MediaInfoA_Inform(Handle, (IntPtr)0));            else                return Marshal.PtrToStringUni(MediaInfo_Inform(Handle, (IntPtr)0));        }        public String Get(StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo, InfoKind KindOfSearch)        {            if (Handle == (IntPtr)0)                return "Unable to load MediaInfo library";            if (MustUseAnsi)            {                IntPtr Parameter_Ptr = Marshal.StringToHGlobalAnsi(Parameter);                String ToReturn = Marshal.PtrToStringAnsi(MediaInfoA_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, Parameter_Ptr, (IntPtr)KindOfInfo, (IntPtr)KindOfSearch));                Marshal.FreeHGlobal(Parameter_Ptr);                return ToReturn;            }            else                return Marshal.PtrToStringUni(MediaInfo_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, Parameter, (IntPtr)KindOfInfo, (IntPtr)KindOfSearch));        }        public String Get(StreamKind StreamKind, int StreamNumber, int Parameter, InfoKind KindOfInfo)        {            if (Handle == (IntPtr)0)                return "Unable to load MediaInfo library";            if (MustUseAnsi)                return Marshal.PtrToStringAnsi(MediaInfoA_GetI(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, (IntPtr)Parameter, (IntPtr)KindOfInfo));            else                return Marshal.PtrToStringUni(MediaInfo_GetI(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, (IntPtr)Parameter, (IntPtr)KindOfInfo));        }        public String Option(String Option, String Value)        {            if (Handle == (IntPtr)0)                return "Unable to load MediaInfo library";            if (MustUseAnsi)            {                IntPtr Option_Ptr = Marshal.StringToHGlobalAnsi(Option);                IntPtr Value_Ptr = Marshal.StringToHGlobalAnsi(Value);                String ToReturn = Marshal.PtrToStringAnsi(MediaInfoA_Option(Handle, Option_Ptr, Value_Ptr));                Marshal.FreeHGlobal(Option_Ptr);                Marshal.FreeHGlobal(Value_Ptr);                return ToReturn;            }            else                return Marshal.PtrToStringUni(MediaInfo_Option(Handle, Option, Value));        }        public int State_Get() { if (Handle == (IntPtr)0) return 0; return (int)MediaInfo_State_Get(Handle); }        public int Count_Get(StreamKind StreamKind, int StreamNumber) { if (Handle == (IntPtr)0) return 0; return (int)MediaInfo_Count_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber); }        private IntPtr Handle;        private bool MustUseAnsi;        //Default values, if you know how to set default values in C#, say me        public String Get(StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo) { return Get(StreamKind, StreamNumber, Parameter, KindOfInfo, InfoKind.Name); }        public String Get(StreamKind StreamKind, int StreamNumber, String Parameter) { return Get(StreamKind, StreamNumber, Parameter, InfoKind.Text, InfoKind.Name); }        public String Get(StreamKind StreamKind, int StreamNumber, int Parameter) { return Get(StreamKind, StreamNumber, Parameter, InfoKind.Text); }        public String Option(String Option_) { return Option(Option_, ""); }        public int Count_Get(StreamKind StreamKind) { return Count_Get(StreamKind, -1); }    }    public class MediaInfoList    {        //Import of DLL functions. DO NOT USE until you know what you do (MediaInfo DLL do NOT use CoTaskMemAlloc to allocate memory)        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoList_New();        [DllImport("MediaInfo")]        private static extern void MediaInfoList_Delete(IntPtr Handle);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoList_Open(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string FileName, IntPtr Options);        [DllImport("MediaInfo")]        private static extern void MediaInfoList_Close(IntPtr Handle, IntPtr FilePos);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoList_Inform(IntPtr Handle, IntPtr FilePos, IntPtr Reserved);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoList_GetI(IntPtr Handle, IntPtr FilePos, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoList_Get(IntPtr Handle, IntPtr FilePos, IntPtr StreamKind, IntPtr StreamNumber, [MarshalAs(UnmanagedType.LPWStr)] string Parameter, IntPtr KindOfInfo, IntPtr KindOfSearch);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoList_Option(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string Option, [MarshalAs(UnmanagedType.LPWStr)] string Value);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoList_State_Get(IntPtr Handle);        [DllImport("MediaInfo")]        private static extern IntPtr MediaInfoList_Count_Get(IntPtr Handle, IntPtr FilePos, IntPtr StreamKind, IntPtr StreamNumber);        //MediaInfo class        public MediaInfoList() { Handle = MediaInfoList_New(); }        ~MediaInfoList() { MediaInfoList_Delete(Handle); }        public int Open(String FileName, InfoFileOptions Options) { return (int)MediaInfoList_Open(Handle, FileName, (IntPtr)Options); }        public void Close(int FilePos) { MediaInfoList_Close(Handle, (IntPtr)FilePos); }        public String Inform(int FilePos) { return Marshal.PtrToStringUni(MediaInfoList_Inform(Handle, (IntPtr)FilePos, (IntPtr)0)); }        public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo, InfoKind KindOfSearch) { return Marshal.PtrToStringUni(MediaInfoList_Get(Handle, (IntPtr)FilePos, (IntPtr)StreamKind, (IntPtr)StreamNumber, Parameter, (IntPtr)KindOfInfo, (IntPtr)KindOfSearch)); }        public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, int Parameter, InfoKind KindOfInfo) { return Marshal.PtrToStringUni(MediaInfoList_GetI(Handle, (IntPtr)FilePos, (IntPtr)StreamKind, (IntPtr)StreamNumber, (IntPtr)Parameter, (IntPtr)KindOfInfo)); }        public String Option(String Option, String Value) { return Marshal.PtrToStringUni(MediaInfoList_Option(Handle, Option, Value)); }        public int State_Get() { return (int)MediaInfoList_State_Get(Handle); }        public int Count_Get(int FilePos, StreamKind StreamKind, int StreamNumber) { return (int)MediaInfoList_Count_Get(Handle, (IntPtr)FilePos, (IntPtr)StreamKind, (IntPtr)StreamNumber); }        private IntPtr Handle;        //Default values, if you know how to set default values in C#, say me        public void Open(String FileName) { Open(FileName, 0); }        public void Close() { Close(-1); }        public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo) { return Get(FilePos, StreamKind, StreamNumber, Parameter, KindOfInfo, InfoKind.Name); }        public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, String Parameter) { return Get(FilePos, StreamKind, StreamNumber, Parameter, InfoKind.Text, InfoKind.Name); }        public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, int Parameter) { return Get(FilePos, StreamKind, StreamNumber, Parameter, InfoKind.Text); }        public String Option(String Option_) { return Option(Option_, ""); }        public int Count_Get(int FilePos, StreamKind StreamKind) { return Count_Get(FilePos, StreamKind, -1); }    }}
 |