/// <summary> /// Enables to decode a video data for every frame. /// </summary> /// <remarks><para>The player must be in the <see cref="PlayerState.Idle"/> state, /// but <see cref="Multimedia.Display"/> must not be set.</para> /// <para>A <see cref="VideoFrameDecoded"/> event is called in a separate thread, not called in the main loop.</para> /// <para>The video frame can be retrieved using a <see cref="VideoFrameDecoded"/> event with a media packet parameter. /// If you change the media packet in the <see cref="VideoFrameDecoded"/> event, it will be displayed on the device. /// The callback function holds the same buffer that is drawn on the display device. /// and the <see cref="MediaPacket"/> is available until it is destroyed by <see cref="MediaPacket.Dispose()"/>. /// It is recommended to destroy the packet as quickly as possible after the decoded data is rendered on the display. /// All the packets have to be destroyed before <see cref="Unprepare"/> is called.</para></remarks> /// <feature>http://tizen.org/feature/multimedia.raw_video</feature> /// <exception cref="NotSupportedException">The required feature is not supported.</exception> /// <exception cref="ObjectDisposedException">The player has already been disposed of.</exception> /// <exception cref="InvalidOperationException"> /// Operation failed; internal error. /// -or-<br/> /// The player is not in the valid state. /// </exception> /// <seealso cref="DisableExportingVideoFrame"/> /// <since_tizen> 6 </since_tizen> public void EnableExportingVideoFrame() { ValidationUtil.ValidateFeatureSupported(PlayerFeatures.RawVideo); ValidatePlayerState(PlayerState.Idle); if (Display != null) { throw new InvalidOperationException("Display must be none."); } _videoFrameDecodedCallback = (packetHandle, _) => { var handler = VideoFrameDecoded; if (handler != null) { Log.Debug(PlayerLog.Tag, "packet : " + packetHandle); handler.Invoke(this, new VideoFrameDecodedEventArgs(MediaPacket.From(packetHandle))); } else { MediaPacket.From(packetHandle).Dispose(); } }; NativePlayer.SetVideoFrameDecodedCb(Handle, _videoFrameDecodedCallback). ThrowIfFailed(this, "Failed to register the VideoFrameDecoded"); }
private void RegisterVideoFrameDecodedCallback() { _videoFrameDecodedCallback = (packetHandle, _) => { var handler = _videoFrameDecoded; if (handler != null) { Log.Debug(PlayerLog.Tag, "packet : " + packetHandle); handler.Invoke(this, new VideoFrameDecodedEventArgs(MediaPacket.From(packetHandle))); } else { MediaPacket.From(packetHandle).Dispose(); } }; NativePlayer.SetVideoFrameDecodedCb(Handle, _videoFrameDecodedCallback). ThrowIfFailed(this, "Failed to register the VideoFrameDecoded"); }