using System; using System.Runtime.InteropServices; using UnityEngine; namespace RenderHeads.Media.AVProVideo { public class AndroidMediaPlayer : BaseMediaPlayer { private enum AVPPluginEvent { Nop = 0, PlayerSetup = 1, PlayerUpdate = 2, PlayerDestroy = 3 } private static AndroidJavaObject s_ActivityContext; private static bool s_bInitialised; private static string s_Version = "Plug-in not yet initialised"; private static IntPtr _nativeFunction_RenderEvent; private AndroidJavaObject m_Video; private Texture2D m_Texture; private int m_TextureHandle; private float m_DurationMs; private int m_Width; private int m_Height; private int m_iPlayerIndex = -1; public AndroidMediaPlayer() { m_Video = new AndroidJavaObject("com.RenderHeads.AVProVideo.AVProMobileVideo"); if (m_Video != null) { m_Video.Call("Initialise", s_ActivityContext); m_iPlayerIndex = m_Video.Call("GetPlayerIndex", new object[0]); IssuePluginEvent(AVPPluginEvent.PlayerSetup, m_iPlayerIndex); } } [DllImport("AVProLocal")] private static extern IntPtr GetRenderEventFunc(); public static void InitialisePlatform() { if (s_ActivityContext == null) { AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); if (androidJavaClass != null) { s_ActivityContext = androidJavaClass.GetStatic("currentActivity"); } } if (!s_bInitialised) { s_bInitialised = true; AndroidJavaObject androidJavaObject = new AndroidJavaObject("com.RenderHeads.AVProVideo.AVProMobileVideo"); if (androidJavaObject != null) { s_Version = androidJavaObject.CallStatic("GetPluginVersion", new object[0]); _nativeFunction_RenderEvent = GetRenderEventFunc(); } } } private static void IssuePluginEvent(AVPPluginEvent type, int param) { int num = 0x5D5AC000 | ((int)type << 8); switch (type) { case AVPPluginEvent.PlayerSetup: case AVPPluginEvent.PlayerUpdate: case AVPPluginEvent.PlayerDestroy: num |= param & 0xFF; break; } GL.IssuePluginEvent(_nativeFunction_RenderEvent, num); } public override string GetVersion() { return s_Version; } public override bool OpenVideoFromFile(string path) { bool result = false; if (m_Video != null) { Debug.Log("OpenVideoFromFile videoFilename: " + path); result = m_Video.Call("OpenVideoFromFile", new object[1] { path }); } return result; } public override void CloseVideo() { if (m_Texture != null) { UnityEngine.Object.Destroy(m_Texture); m_Texture = null; } m_TextureHandle = 0; m_DurationMs = 0f; m_Width = 0; m_Height = 0; _lastError = ErrorCode.None; m_Video.Call("CloseVideo"); } public override void SetLooping(bool bLooping) { if (m_Video != null) { m_Video.Call("SetLooping", bLooping); } } public override bool IsLooping() { bool result = false; if (m_Video != null) { result = m_Video.Call("IsLooping", new object[0]); } return result; } public override bool HasVideo() { bool result = false; if (m_Video != null) { result = m_Video.Call("HasVideo", new object[0]); } return result; } public override bool HasAudio() { bool result = false; if (m_Video != null) { result = m_Video.Call("HasAudio", new object[0]); } return result; } public override bool HasMetaData() { bool result = false; if (m_DurationMs > 0f) { result = true; if (HasVideo()) { result = m_Width > 0 && m_Height > 0; } } return result; } public override bool CanPlay() { bool result = false; if (m_Video != null) { result = m_Video.Call("CanPlay", new object[0]); } return result; } public override void Play() { if (m_Video != null) { m_Video.Call("Play"); } } public override void Pause() { if (m_Video != null) { m_Video.Call("Pause"); } } public override void Stop() { if (m_Video != null) { m_Video.Call("Pause"); } } public override void Rewind() { Seek(0f); } public override void Seek(float timeMs) { if (m_Video != null) { m_Video.Call("Seek", Mathf.FloorToInt(timeMs)); } } public override void SeekFast(float timeMs) { if (m_Video != null) { m_Video.Call("Seek", Mathf.FloorToInt(timeMs)); } } public override float GetCurrentTimeMs() { float result = 0f; if (m_Video != null) { result = m_Video.Call("GetCurrentTimeMs", new object[0]); } return result; } public override void SetPlaybackRate(float rate) { if (m_Video != null) { m_Video.Call("SetPlaybackRate", rate); } } public override float GetPlaybackRate() { float result = 0f; if (m_Video != null) { result = m_Video.Call("GetPlaybackRate", new object[0]); } return result; } public override float GetDurationMs() { return m_DurationMs; } public override int GetVideoWidth() { return m_Width; } public override int GetVideoHeight() { return m_Height; } public override float GetVideoFrameRate() { float result = 0f; if (m_Video != null) { result = m_Video.Call("GetSourceVideoFrameRate", new object[0]); } return result; } public override float GetBufferingProgress() { float result = 0f; if (m_Video != null) { result = m_Video.Call("GetBufferingProgressPercent", new object[0]) * 0.01f; } return result; } public override float GetVideoDisplayRate() { float result = 0f; if (m_Video != null) { result = m_Video.Call("GetDisplayRate", new object[0]); } return result; } public override bool IsSeeking() { bool result = false; if (m_Video != null) { result = m_Video.Call("IsSeeking", new object[0]); } return result; } public override bool IsPlaying() { bool result = false; if (m_Video != null) { result = m_Video.Call("IsPlaying", new object[0]); } return result; } public override bool IsPaused() { bool result = false; if (m_Video != null) { result = m_Video.Call("IsPaused", new object[0]); } return result; } public override bool IsFinished() { bool result = false; if (m_Video != null) { result = m_Video.Call("IsFinished", new object[0]); } return result; } public override bool IsBuffering() { bool result = false; if (m_Video != null) { result = m_Video.Call("IsBuffering", new object[0]); } return result; } public override Texture GetTexture() { Texture result = null; if (GetTextureFrameCount() > 0) { result = m_Texture; } return result; } public override int GetTextureFrameCount() { int result = 0; if (m_Video != null) { result = m_Video.Call("GetFrameCount", new object[0]); } return result; } public override bool RequiresVerticalFlip() { return false; } public override void MuteAudio(bool bMuted) { if (m_Video != null) { m_Video.Call("MuteAudio", bMuted); } } public override bool IsMuted() { bool result = false; if (m_Video != null) { result = m_Video.Call("IsMuted", new object[0]); } return result; } public override void SetVolume(float volume) { if (m_Video != null) { m_Video.Call("SetVolume", volume); } } public override float GetVolume() { float result = 0f; if (m_Video != null) { result = m_Video.Call("GetVolume", new object[0]); } return result; } public override int GetAudioTrackCount() { int result = 0; if (m_Video != null) { result = m_Video.Call("GetNumberAudioTracks", new object[0]); } return result; } public override int GetCurrentAudioTrack() { int result = 0; if (m_Video != null) { result = m_Video.Call("GetCurrentAudioTrackIndex", new object[0]); } return result; } public override void SetAudioTrack(int index) { if (m_Video != null) { m_Video.Call("SetAudioTrack", index); } } public override void Render() { if (m_Video == null) { return; } IssuePluginEvent(AVPPluginEvent.PlayerUpdate, m_iPlayerIndex); if (m_Texture != null) { int num = m_Video.Call("GetWidth", new object[0]); int num2 = m_Video.Call("GetHeight", new object[0]); if (num != m_Width || num2 != m_Height) { m_Texture = null; m_TextureHandle = 0; } } int num3 = m_Video.Call("GetTextureHandle", new object[0]); if (num3 > 0 && num3 != m_TextureHandle) { int num4 = m_Video.Call("GetWidth", new object[0]); int num5 = m_Video.Call("GetHeight", new object[0]); if (Mathf.Max(num4, num5) > SystemInfo.maxTextureSize) { m_Width = num4; m_Height = num5; m_TextureHandle = num3; Debug.LogError("[AVProVideo] Video dimensions larger than maxTextureSize"); } else if (num4 > 0 && num5 > 0) { m_Width = num4; m_Height = num5; m_TextureHandle = num3; m_Texture = Texture2D.CreateExternalTexture(m_Width, m_Height, TextureFormat.RGBA32, false, false, new IntPtr(num3)); if (m_Texture != null) { ApplyTextureProperties(m_Texture); } Debug.Log("Texture ID: " + num3); } } if (m_DurationMs == 0f) { m_DurationMs = m_Video.Call("GetDurationMs", new object[0]); } } public override void Update() { if (m_Video != null) { _lastError = (ErrorCode)m_Video.Call("GetLastErrorCode", new object[0]); } } public override void Dispose() { Debug.LogError("DISPOSE"); IssuePluginEvent(AVPPluginEvent.PlayerDestroy, m_iPlayerIndex); if (m_Video != null) { m_Video.Call("SetDeinitialiseFlagged"); m_Video.Dispose(); m_Video = null; } if (m_Texture != null) { UnityEngine.Object.Destroy(m_Texture); m_Texture = null; } } } }