Native.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace MediaBrowser.MediaInfo
  4. {
  5. public enum StreamKind
  6. {
  7. General,
  8. Video,
  9. Audio,
  10. Text,
  11. Other,
  12. Image,
  13. Menu,
  14. }
  15. public enum InfoKind
  16. {
  17. Name,
  18. Text,
  19. Measure,
  20. Options,
  21. NameText,
  22. MeasureText,
  23. Info,
  24. HowTo
  25. }
  26. public enum InfoOptions
  27. {
  28. ShowInInform,
  29. Support,
  30. ShowInSupported,
  31. TypeOfValue
  32. }
  33. public enum InfoFileOptions
  34. {
  35. FileOption_Nothing = 0x00,
  36. FileOption_NoRecursive = 0x01,
  37. FileOption_CloseAll = 0x02,
  38. FileOption_Max = 0x04
  39. };
  40. public enum Status
  41. {
  42. None = 0x00,
  43. Accepted = 0x01,
  44. Filled = 0x02,
  45. Updated = 0x04,
  46. Finalized = 0x08,
  47. }
  48. public class MediaInfo
  49. {
  50. //Import of DLL functions. DO NOT USE until you know what you do (MediaInfo DLL do NOT use CoTaskMemAlloc to allocate memory)
  51. [DllImport("MediaInfo")]
  52. private static extern IntPtr MediaInfo_New();
  53. [DllImport("MediaInfo")]
  54. private static extern void MediaInfo_Delete(IntPtr Handle);
  55. [DllImport("MediaInfo")]
  56. private static extern IntPtr MediaInfo_Open(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string FileName);
  57. [DllImport("MediaInfo")]
  58. private static extern IntPtr MediaInfoA_Open(IntPtr Handle, IntPtr FileName);
  59. [DllImport("MediaInfo")]
  60. private static extern IntPtr MediaInfo_Open_Buffer_Init(IntPtr Handle, Int64 File_Size, Int64 File_Offset);
  61. [DllImport("MediaInfo")]
  62. private static extern IntPtr MediaInfoA_Open(IntPtr Handle, Int64 File_Size, Int64 File_Offset);
  63. [DllImport("MediaInfo")]
  64. private static extern IntPtr MediaInfo_Open_Buffer_Continue(IntPtr Handle, IntPtr Buffer, IntPtr Buffer_Size);
  65. [DllImport("MediaInfo")]
  66. private static extern IntPtr MediaInfoA_Open_Buffer_Continue(IntPtr Handle, Int64 File_Size, byte[] Buffer, IntPtr Buffer_Size);
  67. [DllImport("MediaInfo")]
  68. private static extern Int64 MediaInfo_Open_Buffer_Continue_GoTo_Get(IntPtr Handle);
  69. [DllImport("MediaInfo")]
  70. private static extern Int64 MediaInfoA_Open_Buffer_Continue_GoTo_Get(IntPtr Handle);
  71. [DllImport("MediaInfo")]
  72. private static extern IntPtr MediaInfo_Open_Buffer_Finalize(IntPtr Handle);
  73. [DllImport("MediaInfo")]
  74. private static extern IntPtr MediaInfoA_Open_Buffer_Finalize(IntPtr Handle);
  75. [DllImport("MediaInfo")]
  76. private static extern void MediaInfo_Close(IntPtr Handle);
  77. [DllImport("MediaInfo")]
  78. private static extern IntPtr MediaInfo_Inform(IntPtr Handle, IntPtr Reserved);
  79. [DllImport("MediaInfo")]
  80. private static extern IntPtr MediaInfoA_Inform(IntPtr Handle, IntPtr Reserved);
  81. [DllImport("MediaInfo")]
  82. private static extern IntPtr MediaInfo_GetI(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo);
  83. [DllImport("MediaInfo")]
  84. private static extern IntPtr MediaInfoA_GetI(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo);
  85. [DllImport("MediaInfo")]
  86. private static extern IntPtr MediaInfo_Get(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, [MarshalAs(UnmanagedType.LPWStr)] string Parameter, IntPtr KindOfInfo, IntPtr KindOfSearch);
  87. [DllImport("MediaInfo")]
  88. private static extern IntPtr MediaInfoA_Get(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo, IntPtr KindOfSearch);
  89. [DllImport("MediaInfo")]
  90. private static extern IntPtr MediaInfo_Option(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string Option, [MarshalAs(UnmanagedType.LPWStr)] string Value);
  91. [DllImport("MediaInfo")]
  92. private static extern IntPtr MediaInfoA_Option(IntPtr Handle, IntPtr Option, IntPtr Value);
  93. [DllImport("MediaInfo")]
  94. private static extern IntPtr MediaInfo_State_Get(IntPtr Handle);
  95. [DllImport("MediaInfo")]
  96. private static extern IntPtr MediaInfo_Count_Get(IntPtr Handle, IntPtr StreamKind, IntPtr StreamNumber);
  97. //MediaInfo class
  98. public MediaInfo()
  99. {
  100. try
  101. {
  102. Handle = MediaInfo_New();
  103. }
  104. catch
  105. {
  106. Handle = (IntPtr)0;
  107. }
  108. if (Environment.OSVersion.ToString().IndexOf("Windows") == -1)
  109. MustUseAnsi = true;
  110. else
  111. MustUseAnsi = false;
  112. }
  113. ~MediaInfo() { if (Handle == (IntPtr)0) return; MediaInfo_Delete(Handle); }
  114. public int Open(String FileName)
  115. {
  116. if (Handle == (IntPtr)0)
  117. return 0;
  118. if (MustUseAnsi)
  119. {
  120. IntPtr FileName_Ptr = Marshal.StringToHGlobalAnsi(FileName);
  121. int ToReturn = (int)MediaInfoA_Open(Handle, FileName_Ptr);
  122. Marshal.FreeHGlobal(FileName_Ptr);
  123. return ToReturn;
  124. }
  125. else
  126. return (int)MediaInfo_Open(Handle, FileName);
  127. }
  128. public int Open_Buffer_Init(Int64 File_Size, Int64 File_Offset)
  129. {
  130. if (Handle == (IntPtr)0) return 0; return (int)MediaInfo_Open_Buffer_Init(Handle, File_Size, File_Offset);
  131. }
  132. public int Open_Buffer_Continue(IntPtr Buffer, IntPtr Buffer_Size)
  133. {
  134. if (Handle == (IntPtr)0) return 0; return (int)MediaInfo_Open_Buffer_Continue(Handle, Buffer, Buffer_Size);
  135. }
  136. public Int64 Open_Buffer_Continue_GoTo_Get()
  137. {
  138. if (Handle == (IntPtr)0) return 0; return (Int64)MediaInfo_Open_Buffer_Continue_GoTo_Get(Handle);
  139. }
  140. public int Open_Buffer_Finalize()
  141. {
  142. if (Handle == (IntPtr)0) return 0; return (int)MediaInfo_Open_Buffer_Finalize(Handle);
  143. }
  144. public void Close() { if (Handle == (IntPtr)0) return; MediaInfo_Close(Handle); }
  145. public String Inform()
  146. {
  147. if (Handle == (IntPtr)0)
  148. return "Unable to load MediaInfo library";
  149. if (MustUseAnsi)
  150. return Marshal.PtrToStringAnsi(MediaInfoA_Inform(Handle, (IntPtr)0));
  151. else
  152. return Marshal.PtrToStringUni(MediaInfo_Inform(Handle, (IntPtr)0));
  153. }
  154. public String Get(StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo, InfoKind KindOfSearch)
  155. {
  156. if (Handle == (IntPtr)0)
  157. return "Unable to load MediaInfo library";
  158. if (MustUseAnsi)
  159. {
  160. IntPtr Parameter_Ptr = Marshal.StringToHGlobalAnsi(Parameter);
  161. String ToReturn = Marshal.PtrToStringAnsi(MediaInfoA_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, Parameter_Ptr, (IntPtr)KindOfInfo, (IntPtr)KindOfSearch));
  162. Marshal.FreeHGlobal(Parameter_Ptr);
  163. return ToReturn;
  164. }
  165. else
  166. return Marshal.PtrToStringUni(MediaInfo_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, Parameter, (IntPtr)KindOfInfo, (IntPtr)KindOfSearch));
  167. }
  168. public String Get(StreamKind StreamKind, int StreamNumber, int Parameter, InfoKind KindOfInfo)
  169. {
  170. if (Handle == (IntPtr)0)
  171. return "Unable to load MediaInfo library";
  172. if (MustUseAnsi)
  173. return Marshal.PtrToStringAnsi(MediaInfoA_GetI(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, (IntPtr)Parameter, (IntPtr)KindOfInfo));
  174. else
  175. return Marshal.PtrToStringUni(MediaInfo_GetI(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber, (IntPtr)Parameter, (IntPtr)KindOfInfo));
  176. }
  177. public String Option(String Option, String Value)
  178. {
  179. if (Handle == (IntPtr)0)
  180. return "Unable to load MediaInfo library";
  181. if (MustUseAnsi)
  182. {
  183. IntPtr Option_Ptr = Marshal.StringToHGlobalAnsi(Option);
  184. IntPtr Value_Ptr = Marshal.StringToHGlobalAnsi(Value);
  185. String ToReturn = Marshal.PtrToStringAnsi(MediaInfoA_Option(Handle, Option_Ptr, Value_Ptr));
  186. Marshal.FreeHGlobal(Option_Ptr);
  187. Marshal.FreeHGlobal(Value_Ptr);
  188. return ToReturn;
  189. }
  190. else
  191. return Marshal.PtrToStringUni(MediaInfo_Option(Handle, Option, Value));
  192. }
  193. public int State_Get() { if (Handle == (IntPtr)0) return 0; return (int)MediaInfo_State_Get(Handle); }
  194. public int Count_Get(StreamKind StreamKind, int StreamNumber) { if (Handle == (IntPtr)0) return 0; return (int)MediaInfo_Count_Get(Handle, (IntPtr)StreamKind, (IntPtr)StreamNumber); }
  195. private IntPtr Handle;
  196. private bool MustUseAnsi;
  197. //Default values, if you know how to set default values in C#, say me
  198. public String Get(StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo) { return Get(StreamKind, StreamNumber, Parameter, KindOfInfo, InfoKind.Name); }
  199. public String Get(StreamKind StreamKind, int StreamNumber, String Parameter) { return Get(StreamKind, StreamNumber, Parameter, InfoKind.Text, InfoKind.Name); }
  200. public String Get(StreamKind StreamKind, int StreamNumber, int Parameter) { return Get(StreamKind, StreamNumber, Parameter, InfoKind.Text); }
  201. public String Option(String Option_) { return Option(Option_, ""); }
  202. public int Count_Get(StreamKind StreamKind) { return Count_Get(StreamKind, -1); }
  203. }
  204. public class MediaInfoList
  205. {
  206. //Import of DLL functions. DO NOT USE until you know what you do (MediaInfo DLL do NOT use CoTaskMemAlloc to allocate memory)
  207. [DllImport("MediaInfo")]
  208. private static extern IntPtr MediaInfoList_New();
  209. [DllImport("MediaInfo")]
  210. private static extern void MediaInfoList_Delete(IntPtr Handle);
  211. [DllImport("MediaInfo")]
  212. private static extern IntPtr MediaInfoList_Open(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string FileName, IntPtr Options);
  213. [DllImport("MediaInfo")]
  214. private static extern void MediaInfoList_Close(IntPtr Handle, IntPtr FilePos);
  215. [DllImport("MediaInfo")]
  216. private static extern IntPtr MediaInfoList_Inform(IntPtr Handle, IntPtr FilePos, IntPtr Reserved);
  217. [DllImport("MediaInfo")]
  218. private static extern IntPtr MediaInfoList_GetI(IntPtr Handle, IntPtr FilePos, IntPtr StreamKind, IntPtr StreamNumber, IntPtr Parameter, IntPtr KindOfInfo);
  219. [DllImport("MediaInfo")]
  220. private static extern IntPtr MediaInfoList_Get(IntPtr Handle, IntPtr FilePos, IntPtr StreamKind, IntPtr StreamNumber, [MarshalAs(UnmanagedType.LPWStr)] string Parameter, IntPtr KindOfInfo, IntPtr KindOfSearch);
  221. [DllImport("MediaInfo")]
  222. private static extern IntPtr MediaInfoList_Option(IntPtr Handle, [MarshalAs(UnmanagedType.LPWStr)] string Option, [MarshalAs(UnmanagedType.LPWStr)] string Value);
  223. [DllImport("MediaInfo")]
  224. private static extern IntPtr MediaInfoList_State_Get(IntPtr Handle);
  225. [DllImport("MediaInfo")]
  226. private static extern IntPtr MediaInfoList_Count_Get(IntPtr Handle, IntPtr FilePos, IntPtr StreamKind, IntPtr StreamNumber);
  227. //MediaInfo class
  228. public MediaInfoList() { Handle = MediaInfoList_New(); }
  229. ~MediaInfoList() { MediaInfoList_Delete(Handle); }
  230. public int Open(String FileName, InfoFileOptions Options) { return (int)MediaInfoList_Open(Handle, FileName, (IntPtr)Options); }
  231. public void Close(int FilePos) { MediaInfoList_Close(Handle, (IntPtr)FilePos); }
  232. public String Inform(int FilePos) { return Marshal.PtrToStringUni(MediaInfoList_Inform(Handle, (IntPtr)FilePos, (IntPtr)0)); }
  233. 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)); }
  234. 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)); }
  235. public String Option(String Option, String Value) { return Marshal.PtrToStringUni(MediaInfoList_Option(Handle, Option, Value)); }
  236. public int State_Get() { return (int)MediaInfoList_State_Get(Handle); }
  237. public int Count_Get(int FilePos, StreamKind StreamKind, int StreamNumber) { return (int)MediaInfoList_Count_Get(Handle, (IntPtr)FilePos, (IntPtr)StreamKind, (IntPtr)StreamNumber); }
  238. private IntPtr Handle;
  239. //Default values, if you know how to set default values in C#, say me
  240. public void Open(String FileName) { Open(FileName, 0); }
  241. public void Close() { Close(-1); }
  242. public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, String Parameter, InfoKind KindOfInfo) { return Get(FilePos, StreamKind, StreamNumber, Parameter, KindOfInfo, InfoKind.Name); }
  243. public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, String Parameter) { return Get(FilePos, StreamKind, StreamNumber, Parameter, InfoKind.Text, InfoKind.Name); }
  244. public String Get(int FilePos, StreamKind StreamKind, int StreamNumber, int Parameter) { return Get(FilePos, StreamKind, StreamNumber, Parameter, InfoKind.Text); }
  245. public String Option(String Option_) { return Option(Option_, ""); }
  246. public int Count_Get(int FilePos, StreamKind StreamKind) { return Count_Get(FilePos, StreamKind, -1); }
  247. }
  248. }