From 9e63fbbe7cc89286398492dc456cd68793e04bb4 Mon Sep 17 00:00:00 2001 From: nam <36914158+aferin@users.noreply.github.com> Date: Tue, 17 Sep 2019 13:36:35 +0900 Subject: [PATCH] [MediaPlayer] add API to export video frames (#983) * [MediaPlayer] add API to export video frames --- .../Player/Player.Events.cs | 42 +----------- src/Tizen.Multimedia.MediaPlayer/Player/Player.cs | 78 ++++++++++++++++++++-- 2 files changed, 75 insertions(+), 45 deletions(-) diff --git a/src/Tizen.Multimedia.MediaPlayer/Player/Player.Events.cs b/src/Tizen.Multimedia.MediaPlayer/Player/Player.Events.cs index e7ba765..158fa46 100644 --- a/src/Tizen.Multimedia.MediaPlayer/Player/Player.Events.cs +++ b/src/Tizen.Multimedia.MediaPlayer/Player/Player.Events.cs @@ -171,10 +171,6 @@ namespace Tizen.Multimedia } #region VideoFrameDecoded event - private EventHandler _videoFrameDecoded; - - private NativePlayer.VideoFrameDecodedCallback _videoFrameDecodedCallback; - /// /// Occurs when a video frame is decoded. /// @@ -186,42 +182,8 @@ namespace Tizen.Multimedia /// The required feature is not supported. /// /// 3 - public event EventHandler VideoFrameDecoded - { - add - { - ValidationUtil.ValidateFeatureSupported(PlayerFeatures.RawVideo); - - _videoFrameDecoded += value; - } - remove - { - ValidationUtil.ValidateFeatureSupported(PlayerFeatures.RawVideo); - - _videoFrameDecoded -= value; - } - } - - 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"); - } + public event EventHandler VideoFrameDecoded; + private NativePlayer.VideoFrameDecodedCallback _videoFrameDecodedCallback; #endregion #region AudioFrameDecoded event diff --git a/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs b/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs index fd7557e..e1693a1 100644 --- a/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs +++ b/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs @@ -94,11 +94,6 @@ namespace Tizen.Multimedia _audioEffect = new AudioEffect(this); } - if (Features.IsSupported(PlayerFeatures.RawVideo)) - { - RegisterVideoFrameDecodedCallback(); - } - RegisterEvents(); _displaySettings = PlayerDisplaySettings.Create(this); @@ -1027,5 +1022,78 @@ namespace Tizen.Multimedia _audioFrameDecodedCallback = null; } + + /// + /// Enables to decode a video data for every frame. + /// + /// The player must be in the state. + /// And, must not be set. + /// A event is called in a separate thread(not in the main loop). + /// The video frame can be retrieved using a event as a media packet. + /// So if you change the media packet in the event, it will be displayed on the device. + /// The callback function holds the same buffer that will be drawn on the display device. + /// and the is available until it's destroyed by . + /// The packet has to be destroyed as quickly as possible after rendering the data + /// and all the packets have to be destroyed before is called. + /// http://tizen.org/feature/multimedia.raw_video + /// The required feature is not supported. + /// The player has already been disposed of. + /// + /// Operation failed; internal error. + /// -or-
+ /// The player is not in the valid state. + ///
+ /// + /// 6 + 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"); + } + + /// + /// Disables to decode a video data. + /// + /// The player must be in the or + /// state. + /// http://tizen.org/feature/multimedia.raw_video + /// The required feature is not supported. + /// The player has already been disposed of. + /// The player is not in the valid state. + /// + /// 6 + public void DisableExportingVideoFrame() + { + ValidationUtil.ValidateFeatureSupported(PlayerFeatures.RawVideo); + ValidatePlayerState(PlayerState.Idle, PlayerState.Ready); + + NativePlayer.UnsetVideoFrameDecodedCb(Handle). + ThrowIfFailed(this, "Failed to unset the VideoFrameDecoded"); + + _videoFrameDecodedCallback = null; + } } } -- 2.7.4