PlatformMediaPlayer+Native.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. //-----------------------------------------------------------------------------
  2. // Copyright 2015-2024 RenderHeads Ltd. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. #if UNITY_2017_2_OR_NEWER && (UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX || (!UNITY_EDITOR && (UNITY_IOS || UNITY_TVOS || UNITY_VISIONOS || UNITY_ANDROID)))
  5. using System;
  6. using System.Runtime.InteropServices;
  7. using UnityEngine;
  8. namespace RenderHeads.Media.AVProVideo
  9. {
  10. public sealed partial class PlatformMediaPlayer
  11. {
  12. internal partial struct Native
  13. {
  14. #if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
  15. private const string PluginName = "AVProVideo";
  16. #elif UNITY_IOS || UNITY_TVOS || UNITY_VISIONOS
  17. private const string PluginName = "__Internal";
  18. #elif UNITY_ANDROID
  19. private const string PluginName = "AVProVideo2Native";
  20. #endif
  21. internal const int kAVPPlayerRenderEventId = 0x5d5ac000;
  22. internal const int kAVPPlayerRenderEventMask = 0x7ffff000;
  23. internal const int kAVPPlayerRenderEventTypeMask = 0x00000f00;
  24. internal const int kAVPPlayerRenderEventTypeShift = 8;
  25. internal const int kAVPPlayerRenderEventDataPlayerIDMask = 0xffff;
  26. internal const int kAVPPlayerRenderEventDataPlayerIDShift = 0;
  27. internal const int kAVPPlayerRenderEventDataOptionsMask = 0xff;
  28. internal const int kAVPPlayerRenderEventDataOptionsShift = 16;
  29. internal enum AVPPluginRenderEvent: int
  30. {
  31. None,
  32. PlayerSetup,
  33. PlayerRender,
  34. PlayerFreeResources,
  35. }
  36. [Flags]
  37. internal enum AVPPlayerRenderEventPlayerSetupFlags: int
  38. {
  39. AndroidUseOESFastPath = 1 << 0,
  40. LinearColourSpace = 1 << 1,
  41. }
  42. // Video settings
  43. internal enum AVPPlayerVideoAPI: int
  44. {
  45. // Apple - just included for completeness
  46. AVFoundation,
  47. // Android - Matches Android.VideoApi
  48. MediaPlayer = Android.VideoApi.MediaPlayer,
  49. ExoPlayer = Android.VideoApi.ExoPlayer,
  50. }
  51. internal enum AVPPlayerVideoPixelFormat: int
  52. {
  53. Invalid,
  54. Bgra,
  55. YCbCr420
  56. }
  57. [Flags]
  58. internal enum AVPPlayerVideoOutputSettingsFlags: int
  59. {
  60. None = 0,
  61. LinearColorSpace = 1 << 0,
  62. GenerateMipmaps = 1 << 1,
  63. PreferSoftwareDecoder = 1 << 2,
  64. ForceEnableMediaCodecAsynchronousQueueing = 1 << 3,
  65. }
  66. // Audio settings
  67. internal enum AVPPlayerAudioOutputMode : int
  68. {
  69. SystemDirect,
  70. Unity,
  71. SystemDirectWithCapture,
  72. FacebookAudio360,
  73. }
  74. // Network settings
  75. [Flags]
  76. internal enum AVPPlayerNetworkSettingsFlags: int
  77. {
  78. None = 0,
  79. PlayWithoutBuffering = 1 << 0,
  80. UseSinglePlayerItem = 1 << 1,
  81. ForceStartHighestBitrate = 1 << 2,
  82. ForceRtpTCP = 1 << 3,
  83. }
  84. // NOTE: The layout of this structure is important - if adding anything put it at the end, make sure alignment is 4 bytes and DO NOT USE bool
  85. [StructLayout(LayoutKind.Sequential)]
  86. internal struct AVPPlayerSettings
  87. {
  88. // Video
  89. internal AVPPlayerVideoAPI videoApi;
  90. internal AVPPlayerVideoPixelFormat pixelFormat;
  91. internal AVPPlayerVideoOutputSettingsFlags videoFlags;
  92. internal float preferredMaximumResolution_width;
  93. internal float preferredMaximumResolution_height;
  94. internal float maximumPlaybackRate;
  95. // Audio
  96. internal AVPPlayerAudioOutputMode audioOutputMode;
  97. internal int sampleRate;
  98. internal int bufferLength;
  99. internal int audioFlags;
  100. internal Audio360ChannelMode audio360Channels;
  101. internal int audio360LatencyMS;
  102. // Network
  103. internal double preferredPeakBitRate;
  104. internal double preferredForwardBufferDuration;
  105. internal AVPPlayerNetworkSettingsFlags networkFlags;
  106. internal int minBufferMs;
  107. internal int maxBufferMs;
  108. internal int bufferForPlaybackMs;
  109. internal int bufferForPlaybackAfterRebufferMs;
  110. }
  111. internal enum AVPPlayerOpenOptionsForceFileFormat: int
  112. {
  113. Unknown,
  114. HLS,
  115. DASH,
  116. SmoothStreaming
  117. };
  118. [Flags]
  119. internal enum AVPPlayerOpenOptionsFlags: int
  120. {
  121. None = 0,
  122. };
  123. // NOTE: The layout of this structure is important - if adding anything put it at the end, make sure alignment is 4 bytes and DO NOT USE bool
  124. [StructLayout(LayoutKind.Sequential)]
  125. internal struct AVPPlayerOpenOptions
  126. {
  127. internal long fileOffset;
  128. internal AVPPlayerOpenOptionsForceFileFormat forceFileFormat;
  129. internal AVPPlayerOpenOptionsFlags flags;
  130. };
  131. [Flags]
  132. internal enum AVPPlayerStatus : int
  133. {
  134. Unknown = 0,
  135. ReadyToPlay = 1 << 0,
  136. Playing = 1 << 1,
  137. Paused = 1 << 2,
  138. Finished = 1 << 3,
  139. Seeking = 1 << 4,
  140. Buffering = 1 << 5,
  141. Stalled = 1 << 6,
  142. ExternalPlaybackActive = 1 << 7,
  143. Cached = 1 << 8,
  144. FinishedSeeking = 1 << 9,
  145. UpdatedAssetInfo = 1 << 16,
  146. UpdatedTexture = 1 << 17,
  147. UpdatedBufferedTimeRanges = 1 << 18,
  148. UpdatedSeekableTimeRanges = 1 << 19,
  149. UpdatedText = 1 << 20,
  150. UpdatedTextureTransform = 1 << 21,
  151. HasVideo = 1 << 24,
  152. HasAudio = 1 << 25,
  153. HasText = 1 << 26,
  154. HasMetadata = 1 << 27,
  155. Failed = 1 << 31
  156. }
  157. [Flags]
  158. internal enum AVPPlayerFlags : int
  159. {
  160. None = 0,
  161. Looping = 1 << 0,
  162. Muted = 1 << 1,
  163. AllowExternalPlayback = 1 << 2,
  164. ResumePlayback = 1 << 16, // iOS only, resumes playback after audio session route change
  165. Dirty = 1 << 31
  166. }
  167. internal enum AVPPlayerExternalPlaybackVideoGravity : int
  168. {
  169. Resize,
  170. ResizeAspect,
  171. ResizeAspectFill
  172. };
  173. [StructLayout(LayoutKind.Sequential)]
  174. internal struct AVPPlayerSize
  175. {
  176. internal float width;
  177. internal float height;
  178. }
  179. [StructLayout(LayoutKind.Sequential)]
  180. internal struct AVPAffineTransform
  181. {
  182. internal float a;
  183. internal float b;
  184. internal float c;
  185. internal float d;
  186. internal float tx;
  187. internal float ty;
  188. }
  189. [Flags]
  190. internal enum AVPPlayerAssetFlags : int
  191. {
  192. None = 0,
  193. CompatibleWithAirPlay = 1 << 0,
  194. };
  195. [StructLayout(LayoutKind.Sequential)]
  196. internal struct AVPPlayerAssetInfo
  197. {
  198. internal double duration;
  199. internal AVPPlayerSize dimensions;
  200. internal float frameRate;
  201. internal int videoTrackCount;
  202. internal int audioTrackCount;
  203. internal int textTrackCount;
  204. internal AVPPlayerAssetFlags flags;
  205. }
  206. [Flags]
  207. internal enum AVPPlayerTrackFlags: int
  208. {
  209. Default = 1 << 0,
  210. }
  211. internal enum AVPPlayerVideoTrackStereoMode: int
  212. {
  213. Unknown,
  214. Monoscopic,
  215. StereoscopicTopBottom,
  216. StereoscopicLeftRight,
  217. StereoscopicCustom,
  218. StereoscopicRightLeft,
  219. }
  220. [Flags]
  221. internal enum AVPPlayerVideoTrackFlags: int
  222. {
  223. HasAlpha = 1 << 0,
  224. }
  225. [StructLayout(LayoutKind.Sequential)]
  226. internal struct AVPPlayerVideoTrackInfo
  227. {
  228. [MarshalAs(UnmanagedType.LPWStr)] internal string name;
  229. [MarshalAs(UnmanagedType.LPWStr)] internal string language;
  230. internal int trackId;
  231. internal float estimatedDataRate;
  232. internal uint codecSubtype;
  233. internal AVPPlayerTrackFlags flags;
  234. internal AVPPlayerSize dimensions;
  235. internal float frameRate;
  236. internal AVPAffineTransform transform;
  237. internal AVPPlayerVideoTrackStereoMode stereoMode;
  238. internal int bitsPerComponent;
  239. internal AVPPlayerVideoTrackFlags videoTrackFlags;
  240. internal Matrix4x4 yCbCrTransform;
  241. }
  242. [StructLayout(LayoutKind.Sequential)]
  243. internal struct AVPPlayerAudioTrackInfo
  244. {
  245. [MarshalAs(UnmanagedType.LPWStr)] internal string name;
  246. [MarshalAs(UnmanagedType.LPWStr)] internal string language;
  247. internal int trackId;
  248. internal float estimatedDataRate;
  249. internal uint codecSubtype;
  250. internal AVPPlayerTrackFlags flags;
  251. internal double sampleRate;
  252. internal uint channelCount;
  253. internal uint channelLayoutTag;
  254. internal AudioChannelMaskFlags channelBitmap;
  255. }
  256. [StructLayout(LayoutKind.Sequential)]
  257. internal struct AVPPlayerTextTrackInfo
  258. {
  259. [MarshalAs(UnmanagedType.LPWStr)] internal string name;
  260. [MarshalAs(UnmanagedType.LPWStr)] internal string language;
  261. internal int trackId;
  262. internal float estimatedDataRate;
  263. internal uint codecSubtype;
  264. internal AVPPlayerTrackFlags flags;
  265. }
  266. [StructLayout(LayoutKind.Sequential)]
  267. internal struct AVPPlayerTimeRange
  268. {
  269. internal double start;
  270. internal double duration;
  271. };
  272. [StructLayout(LayoutKind.Sequential)]
  273. internal struct AVPPlayerState
  274. {
  275. internal AVPPlayerStatus status;
  276. internal double currentTime;
  277. internal double currentDate;
  278. internal int selectedVideoTrack;
  279. internal int selectedAudioTrack;
  280. internal int selectedTextTrack;
  281. internal int bufferedTimeRangesCount;
  282. internal int seekableTimeRangesCount;
  283. internal int audioCaptureBufferedSamplesCount;
  284. }
  285. internal enum AVPPlayerTextureFormat: int
  286. {
  287. Unknown,
  288. BGRA8,
  289. R8,
  290. RG8,
  291. BC1,
  292. BC3,
  293. BC4,
  294. BC5,
  295. BC7,
  296. BGR10A2,
  297. R16,
  298. RG16,
  299. BGR10XR,
  300. RGBA16Float,
  301. }
  302. [StructLayout(LayoutKind.Sequential)]
  303. internal struct AVPPlayerTexturePlane
  304. {
  305. internal IntPtr plane;
  306. internal int width;
  307. internal int height;
  308. internal AVPPlayerTextureFormat textureFormat;
  309. }
  310. [Flags]
  311. internal enum AVPPlayerTextureFlags: int
  312. {
  313. None = 0,
  314. Flipped = 1 << 0,
  315. Linear = 1 << 1,
  316. Mipmapped = 1 << 2,
  317. }
  318. internal enum AVPPlayerTextureYCbCrMatrix: int
  319. {
  320. Identity,
  321. ITU_R_601,
  322. ITU_R_709,
  323. }
  324. [StructLayout(LayoutKind.Sequential)]
  325. internal struct AVPPlayerTexture
  326. {
  327. [MarshalAs(UnmanagedType.ByValArray, SizeConst=2)]
  328. internal AVPPlayerTexturePlane[] planes;
  329. internal long itemTime;
  330. internal int frameCount;
  331. internal int planeCount;
  332. internal AVPPlayerTextureFlags flags;
  333. internal AVPPlayerTextureYCbCrMatrix YCbCrMatrix;
  334. };
  335. [StructLayout(LayoutKind.Sequential)]
  336. internal struct AVPPlayerText
  337. {
  338. internal IntPtr buffer;
  339. internal long itemTime;
  340. internal int length;
  341. internal int sequence;
  342. };
  343. internal enum AVPPlayerTrackType: int
  344. {
  345. Video,
  346. Audio,
  347. Text
  348. };
  349. internal static string GetPluginVersion()
  350. {
  351. return System.Runtime.InteropServices.Marshal.PtrToStringAnsi(AVPPluginGetVersionStringPointer());
  352. }
  353. #if !UNITY_EDITOR && (UNITY_IOS || UNITY_TVOS || UNITY_VISIONOS)
  354. [DllImport(PluginName)]
  355. internal static extern void AVPPluginBootstrap();
  356. #elif !UNITY_EDITOR && (UNITY_ANDROID)
  357. internal static void AVPPluginBootstrap()
  358. {
  359. AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  360. if (activityClass != null)
  361. {
  362. AndroidJavaObject activityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
  363. if (activityContext != null)
  364. {
  365. AndroidJavaObject avProVideoManager = new AndroidJavaObject("com.renderheads.AVPro.Video.Manager");
  366. if (avProVideoManager != null)
  367. {
  368. avProVideoManager.CallStatic("SetContext", activityContext);
  369. }
  370. }
  371. }
  372. // TODO: Handle failure?
  373. }
  374. #endif
  375. [DllImport(PluginName)]
  376. private static extern IntPtr AVPPluginGetVersionStringPointer();
  377. [DllImport(PluginName)]
  378. internal static extern IntPtr AVPPluginGetRenderEventFunction();
  379. [DllImport(PluginName)]
  380. internal static extern IntPtr AVPPluginMakePlayer(AVPPlayerSettings settings);
  381. [DllImport(PluginName)]
  382. internal static extern void AVPPlayerRelease(IntPtr player);
  383. [DllImport(PluginName)]
  384. internal static extern void AVPPlayerUpdate(IntPtr _player);
  385. [DllImport(PluginName)]
  386. internal static extern void AVPPlayerGetState(IntPtr player, ref AVPPlayerState state);
  387. [DllImport(PluginName)]
  388. internal static extern void AVPPlayerSetFlags(IntPtr player, int flags);
  389. [DllImport(PluginName)]
  390. internal static extern void AVPPlayerGetAssetInfo(IntPtr player, ref AVPPlayerAssetInfo info);
  391. [DllImport(PluginName)]
  392. internal static extern void AVPPlayerGetVideoTrackInfo(IntPtr player, int index, ref AVPPlayerVideoTrackInfo info);
  393. [DllImport(PluginName)]
  394. internal static extern void AVPPlayerGetAudioTrackInfo(IntPtr player, int index, ref AVPPlayerAudioTrackInfo info);
  395. [DllImport(PluginName)]
  396. internal static extern void AVPPlayerGetTextTrackInfo(IntPtr player, int index, ref AVPPlayerTextTrackInfo info);
  397. [DllImport(PluginName)]
  398. internal static extern void AVPPlayerGetBufferedTimeRanges(IntPtr player, AVPPlayerTimeRange[] ranges, int count);
  399. [DllImport(PluginName)]
  400. internal static extern void AVPPlayerGetSeekableTimeRanges(IntPtr player, AVPPlayerTimeRange[] ranges, int count);
  401. [DllImport(PluginName)]
  402. internal static extern void AVPPlayerGetTexture(IntPtr player, ref AVPPlayerTexture texture);
  403. [DllImport(PluginName)]
  404. internal static extern void AVPPlayerGetText(IntPtr player, ref AVPPlayerText text);
  405. [DllImport(PluginName)]
  406. internal static extern void AVPPlayerSetPlayerSettings(IntPtr player, AVPPlayerSettings settings);
  407. [DllImport(PluginName)]
  408. [return: MarshalAs(UnmanagedType.U1)]
  409. internal static extern bool AVPPlayerOpenURL(IntPtr player, string url, string headers, AVPPlayerOpenOptions options);
  410. [DllImport(PluginName)]
  411. internal static extern void AVPPlayerClose(IntPtr player);
  412. [DllImport(PluginName)]
  413. internal static extern int AVPPlayerGetAudio(IntPtr player, float[] buffer, int length);
  414. [DllImport(PluginName)]
  415. internal static extern void AVPPlayerSetAudioHeadRotation(IntPtr _player, float[] rotation);
  416. [DllImport(PluginName)]
  417. internal static extern void AVPPlayerSetPositionTrackingEnabled(IntPtr _player, bool enabled);
  418. [DllImport(PluginName)]
  419. internal static extern void AVPPlayerSetAudioFocusEnabled(IntPtr _player, bool enabled);
  420. [DllImport(PluginName)]
  421. internal static extern void AVPPlayerSetAudioFocusProperties(IntPtr _player, float offFocusLevel, float widthDegrees);
  422. [DllImport(PluginName)]
  423. internal static extern void AVPPlayerSetAudioFocusRotation(IntPtr _player, float[] rotation);
  424. [DllImport(PluginName)]
  425. internal static extern void AVPPlayerResetAudioFocus(IntPtr _player);
  426. [DllImport(PluginName)]
  427. internal static extern void AVPPlayerSetRate(IntPtr player, float rate);
  428. [DllImport(PluginName)]
  429. internal static extern void AVPPlayerSetVolume(IntPtr player, float volume);
  430. [DllImport(PluginName)]
  431. internal static extern void AVPPlayerSetExternalPlaybackVideoGravity(IntPtr player, AVPPlayerExternalPlaybackVideoGravity gravity);
  432. [DllImport(PluginName)]
  433. internal static extern void AVPPlayerSeek(IntPtr player, double toTime, double toleranceBefore, double toleranceAfter);
  434. [DllImport(PluginName)]
  435. internal static extern void AVPPlayerSetKeyServerAuthToken(IntPtr player, string token);
  436. [DllImport(PluginName)]
  437. internal static extern void AVPPlayerSetKeyServerURL(IntPtr player, string url);
  438. [DllImport(PluginName)]
  439. internal static extern void AVPPlayerSetDecryptionKey(IntPtr player, byte[] key, int length);
  440. [DllImport(PluginName)]
  441. [return: MarshalAs(UnmanagedType.I1)]
  442. internal static extern bool AVPPlayerSetTrack(IntPtr player, AVPPlayerTrackType type, int index);
  443. public struct MediaCachingOptions
  444. {
  445. public double minimumRequiredBitRate;
  446. public float minimumRequiredResolution_width;
  447. public float minimumRequiredResolution_height;
  448. public string title;
  449. public IntPtr artwork;
  450. public int artworkLength;
  451. }
  452. [DllImport(PluginName)]
  453. public static extern void AVPPluginCacheMediaForURL(IntPtr player, string url, string headers, MediaCachingOptions options);
  454. [DllImport(PluginName)]
  455. public static extern void AVPPluginCancelDownloadOfMediaForURL(IntPtr player, string url);
  456. [DllImport(PluginName)]
  457. public static extern void AVPPluginRemoveCachedMediaForURL(IntPtr player, string url);
  458. [DllImport(PluginName)]
  459. public static extern int AVPPluginGetCachedMediaStatusForURL(IntPtr player, string url, ref float progress);
  460. }
  461. }
  462. }
  463. #endif