private void OnRenderObject() { if (mAppPaused) { return; } if (!mIsInited) { return; } if (!mIsPrepared) { pushMsg("!mIsPrepared...."); VideoPlayerHelper.MediaState state = mVideoPlayer.GetStatus(); if (state == VideoPlayerHelper.MediaState.ERROR) { pushMsg("Could not load video "); HandleStateChange(VideoPlayerHelper.MediaState.ERROR); this.enabled = false; } else if (state < VideoPlayerHelper.MediaState.NOT_READY) { // Video player is ready int videoWidth = mVideoPlayer.GetVideoWidth(); int videoHeight = mVideoPlayer.GetVideoHeight(); if (videoWidth > 0 && videoHeight > 0) { // Scale the video plane to match the video aspect ratio float aspect = videoHeight / (float)videoWidth; // Flip the plane as the video texture is mirrored on the horizontal transform.localScale = new Vector3(-0.1f, 0.1f, 0.1f * aspect); } // Video is prepared, ready for playback mIsPrepared = true; pushMsg("Video is prepared, ready for playback"); } } else { VideoPlayerHelper.MediaState state = mVideoPlayer.UpdateVideoData(); if (state == VideoPlayerHelper.MediaState.PLAYING) { GL.InvalidateState(); // Update Video Info UpdateVideoInfo(); } if (state != mCurrentState) { HandleStateChange(state); mCurrentState = state; } } }
// Initialize the video texture private void InitVideoTexture(bool isOpenGLRendering) { // Create texture whose content will be updated in native plugin code. // Note: width and height don't matter and may be zero for OpenGL textures, // as we update the texture content via glTexImage; // however they MUST be correctly initialized for iOS METAL and D3D textures; // similarly, the format must be correctly initialized to 4 bytes (BGRA32) per pixel int w = mVideoPlayer.GetVideoWidth(); int h = mVideoPlayer.GetVideoHeight(); Debug.Log("InitVideoTexture with size: " + w + " x " + h); mVideoTexture = isOpenGLRendering ? new Texture2D(0, 0, TextureFormat.RGB565, false) : new Texture2D(w, h, TextureFormat.BGRA32, false); mVideoTexture.filterMode = FilterMode.Bilinear; mVideoTexture.wrapMode = TextureWrapMode.Clamp; }
// Custom methods private void SetVideoTextureAndAspectRatio() { // Pass the video texture id to the video player // TODO: GetNativeTextureID() call needs to be moved to Awake method to work with Oculus SDK if MT rendering is enabled int nativeTextureID = mVideoTexture.GetNativeTextureID(); mVideoPlayer.SetVideoTextureID(nativeTextureID); // Get the video width and height int videoWidth = mVideoPlayer.GetVideoWidth(); int videoHeight = mVideoPlayer.GetVideoHeight(); if (videoWidth > 0 && videoHeight > 0) { // Scale the video plane to match the video aspect ratio float aspect = videoHeight / (float)videoWidth; // Flip the plane as the video texture is mirrored on the horizontal transform.localScale = new Vector3(-0.1f, 0.1f, 0.1f * aspect); } }
private IEnumerator PrepareVideo() { // Get the video player status VideoPlayerHelper.MediaState state = mVideoPlayer.GetStatus(); if (state == VideoPlayerHelper.MediaState.ERROR) { Debug.Log("Cannot prepare video, as the player is in error state."); HandleStateChange(VideoPlayerHelper.MediaState.ERROR); this.enabled = false; } else { // Not in error state, we can move on... while (mVideoPlayer.GetStatus() == VideoPlayerHelper.MediaState.NOT_READY) { // Wait one or few frames for video state to become ready yield return(new WaitForEndOfFrame()); } // Video player is ready Debug.Log("VideoPlayer ready."); // Initialize the video texture bool isOpenGLRendering = (VuforiaRenderer.Instance.GetRendererAPI() == VuforiaRenderer.RendererAPI.GL_20); InitVideoTexture(isOpenGLRendering); // Can we play this video on a texture? isPlayableOnTexture = mVideoPlayer.IsPlayableOnTexture(); if (isPlayableOnTexture) { // Pass the video texture id to the video player mVideoPlayer.SetVideoTexturePtr(mVideoTexture.GetNativeTexturePtr()); // Get the video width and height int videoWidth = mVideoPlayer.GetVideoWidth(); int videoHeight = mVideoPlayer.GetVideoHeight(); if (videoWidth > 0 && videoHeight > 0) { // Scale the video plane to match the video aspect ratio float aspect = videoHeight / (float)videoWidth; // Flip the plane as the video texture is mirrored on the horizontal transform.localScale = new Vector3(-0.1f, 0.1f, 0.1f * aspect); } // Seek ahead if necessary if (mSeekPosition > 0) { mVideoPlayer.SeekTo(mSeekPosition); } } else { // Handle the state change state = mVideoPlayer.GetStatus(); HandleStateChange(state); mCurrentState = state; } // Scale the icon ScaleIcon(); mIsInited = true; } mInitInProgess = false; yield return(new WaitForEndOfFrame()); }
void OnRenderObject() { if (mAppPaused) { return; } if (!mIsInited) { // Initialize the video player if (mVideoPlayer.Init() == false) { Debug.Log("Could not initialize video player"); HandleStateChange(VideoPlayerHelper.MediaState.ERROR); this.enabled = false; return; } // Initialize the video texture InitVideoTexture(); // Load the video if (mVideoPlayer.Load(m_path, mMediaType, false, 0) == false) { Debug.Log("Could not load video '" + m_path + "' for media type " + mMediaType); HandleStateChange(VideoPlayerHelper.MediaState.ERROR); this.enabled = false; return; } // Successfully initialized mIsInited = true; } else if (!mIsPrepared) { // Get the video player status VideoPlayerHelper.MediaState state = mVideoPlayer.GetStatus(); if (state == VideoPlayerHelper.MediaState.ERROR) { Debug.Log("Could not load video '" + m_path + "' for media type " + mMediaType); HandleStateChange(VideoPlayerHelper.MediaState.ERROR); this.enabled = false; } else if (state < VideoPlayerHelper.MediaState.NOT_READY) { // Video player is ready // Can we play this video on a texture? isPlayableOnTexture = mVideoPlayer.IsPlayableOnTexture(); if (isPlayableOnTexture) { // Pass the video texture id to the video player int nativeTextureID = mVideoTexture.GetNativeTextureID(); mVideoPlayer.SetVideoTextureID(nativeTextureID); // Get the video width and height int videoWidth = mVideoPlayer.GetVideoWidth(); int videoHeight = mVideoPlayer.GetVideoHeight(); if (videoWidth > 0 && videoHeight > 0) { // Scale the video plane to match the video aspect ratio float aspect = videoHeight / (float)videoWidth; // Flip the plane as the video texture is mirrored on the horizontal transform.localScale = new Vector3(-0.1f, 0.1f, 0.1f * aspect); } // Seek ahead if necessary if (mSeekPosition > 0) { mVideoPlayer.SeekTo(mSeekPosition); } } else { // Handle the state change state = mVideoPlayer.GetStatus(); HandleStateChange(state); mCurrentState = state; } // Scale the icon ScaleIcon(); // Video is prepared, ready for playback mIsPrepared = true; } } else { if (isPlayableOnTexture) { // Update the video texture with the latest video frame VideoPlayerHelper.MediaState state = mVideoPlayer.UpdateVideoData(); if ((state == VideoPlayerHelper.MediaState.PLAYING) || (state == VideoPlayerHelper.MediaState.PLAYING_FULLSCREEN)) { GL.InvalidateState(); } // Check for playback state change if (state != mCurrentState) { HandleStateChange(state); mCurrentState = state; } } else { // Get the current status VideoPlayerHelper.MediaState state = mVideoPlayer.GetStatus(); if ((state == VideoPlayerHelper.MediaState.PLAYING) || (state == VideoPlayerHelper.MediaState.PLAYING_FULLSCREEN)) { GL.InvalidateState(); } // Check for playback state change if (state != mCurrentState) { HandleStateChange(state); mCurrentState = state; } } } CheckIconPlaneVisibility(); }