From 843b06d23b83aabaaa4cff48b1cbd658971e2019 Mon Sep 17 00:00:00 2001 From: xiaowei guan Date: Sat, 12 Mar 2022 04:39:19 +0800 Subject: [PATCH 1/4] Remove prepared media packet * After Tizen embedder create egl image, will notify plugin to destory media packet. No need wait for flutter engine destruct callback to destory media packet, so prepared media packet is extra. --- .../video_player/tizen/src/video_player.cc | 44 +++++-------------- .../video_player/tizen/src/video_player.h | 2 - 2 files changed, 10 insertions(+), 36 deletions(-) diff --git a/packages/video_player/tizen/src/video_player.cc b/packages/video_player/tizen/src/video_player.cc index 79af742e1..5844c16ab 100644 --- a/packages/video_player/tizen/src/video_player.cc +++ b/packages/video_player/tizen/src/video_player.cc @@ -49,37 +49,19 @@ static std::string StateToString(player_state_e state) { return ret; } -bool VideoPlayer::IsValidMediaPacket(media_packet_h media_packet) { - tbm_surface_h surface; - int ret = media_packet_get_tbm_surface(media_packet, &surface); - if (ret != MEDIA_PACKET_ERROR_NONE) { - LOG_ERROR("get tbm surface failed, error: %d", ret); - return false; - } - return true; -} - FlutterDesktopGpuBuffer *VideoPlayer::ObtainGpuBuffer(size_t width, size_t height) { std::lock_guard lock(mutex_); - if (prepared_media_packet_ && !IsValidMediaPacket(prepared_media_packet_)) { - media_packet_destroy(prepared_media_packet_); - prepared_media_packet_ = nullptr; - } - if (current_media_packet_ && !IsValidMediaPacket(current_media_packet_)) { - media_packet_destroy(current_media_packet_); - current_media_packet_ = nullptr; - } - if (!prepared_media_packet_ && !current_media_packet_) { + if (!current_media_packet_) { LOG_ERROR("No vaild media packet"); return nullptr; } - if (prepared_media_packet_ && !current_media_packet_) { - current_media_packet_ = prepared_media_packet_; - prepared_media_packet_ = nullptr; - } tbm_surface_h surface; - media_packet_get_tbm_surface(current_media_packet_, &surface); + int ret = media_packet_get_tbm_surface(current_media_packet_, &surface); + if (ret != MEDIA_PACKET_ERROR_NONE || surface == nullptr) { + LOG_ERROR("get tbm surface failed, error: %d", ret); + return nullptr; + } flutter_desktop_gpu_buffer_->buffer = surface; flutter_desktop_gpu_buffer_->width = width; flutter_desktop_gpu_buffer_->height = height; @@ -338,11 +320,6 @@ void VideoPlayer::dispose() { current_media_packet_ = nullptr; } - if (prepared_media_packet_) { - media_packet_destroy(prepared_media_packet_); - prepared_media_packet_ = nullptr; - } - if (texture_registrar_) { texture_registrar_->UnregisterTexture(texture_id_); texture_registrar_ = nullptr; @@ -557,12 +534,11 @@ void VideoPlayer::onErrorOccurred(int code, void *data) { void VideoPlayer::onVideoFrameDecoded(media_packet_h packet, void *data) { VideoPlayer *player = (VideoPlayer *)data; std::lock_guard lock(player->mutex_); - if (player->prepared_media_packet_) { - LOG_INFO("prepared packet not null, store new"); - media_packet_destroy(player->prepared_media_packet_); - player->prepared_media_packet_ = packet; + if (player->current_media_packet_) { + LOG_INFO("current media packet not null"); + media_packet_destroy(packet); return; } - player->prepared_media_packet_ = packet; + player->current_media_packet_ = packet; player->texture_registrar_->MarkTextureFrameAvailable(player->texture_id_); } diff --git a/packages/video_player/tizen/src/video_player.h b/packages/video_player/tizen/src/video_player.h index ddf0ddb76..84cd48cac 100644 --- a/packages/video_player/tizen/src/video_player.h +++ b/packages/video_player/tizen/src/video_player.h @@ -42,7 +42,6 @@ class VideoPlayer { void sendBufferingEnd(); FlutterDesktopGpuBuffer *ObtainGpuBuffer(size_t width, size_t height); void Destruct(void *buffer); - bool IsValidMediaPacket(media_packet_h media_packet); static void onPrepared(void *data); static void onBuffering(int percent, void *data); @@ -63,7 +62,6 @@ class VideoPlayer { std::unique_ptr flutter_desktop_gpu_buffer_; std::mutex mutex_; SeekCompletedCb on_seek_completed_; - media_packet_h prepared_media_packet_ = nullptr; media_packet_h current_media_packet_ = nullptr; }; From d02a7b36c81eca6f7c4bb43df4066215fe270cab Mon Sep 17 00:00:00 2001 From: xiaowei guan Date: Tue, 15 Mar 2022 21:13:06 +0800 Subject: [PATCH 2/4] Apply new release callback api --- .../video_player/tizen/src/video_player.cc | 22 ++++++++++--------- .../video_player/tizen/src/video_player.h | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/video_player/tizen/src/video_player.cc b/packages/video_player/tizen/src/video_player.cc index 5844c16ab..2ebecac74 100644 --- a/packages/video_player/tizen/src/video_player.cc +++ b/packages/video_player/tizen/src/video_player.cc @@ -49,6 +49,15 @@ static std::string StateToString(player_state_e state) { return ret; } +void VideoPlayer::ReleaseMediaPacket(void *data) { + VideoPlayer *player = (VideoPlayer *)data; + std::lock_guard lock(player->mutex_); + if (player->current_media_packet_) { + media_packet_destroy(player->current_media_packet_); + player->current_media_packet_ = nullptr; + } +} + FlutterDesktopGpuBuffer *VideoPlayer::ObtainGpuBuffer(size_t width, size_t height) { std::lock_guard lock(mutex_); @@ -65,17 +74,11 @@ FlutterDesktopGpuBuffer *VideoPlayer::ObtainGpuBuffer(size_t width, flutter_desktop_gpu_buffer_->buffer = surface; flutter_desktop_gpu_buffer_->width = width; flutter_desktop_gpu_buffer_->height = height; + flutter_desktop_gpu_buffer_->release_context = this; + flutter_desktop_gpu_buffer_->release_callback = ReleaseMediaPacket; return flutter_desktop_gpu_buffer_.get(); } -void VideoPlayer::Destruct(void *buffer) { - std::lock_guard lock(mutex_); - if (current_media_packet_) { - media_packet_destroy(current_media_packet_); - current_media_packet_ = nullptr; - } -} - VideoPlayer::VideoPlayer(flutter::PluginRegistrar *plugin_registrar, flutter::TextureRegistrar *texture_registrar, const std::string &uri, VideoPlayerOptions &options) { @@ -87,8 +90,7 @@ VideoPlayer::VideoPlayer(flutter::PluginRegistrar *plugin_registrar, [this](size_t width, size_t height) -> const FlutterDesktopGpuBuffer * { return this->ObtainGpuBuffer(width, height); - }, - [this](void *buffer) -> void { this->Destruct(buffer); })); + })); flutter_desktop_gpu_buffer_ = std::make_unique(); LOG_INFO("[VideoPlayer] register texture"); diff --git a/packages/video_player/tizen/src/video_player.h b/packages/video_player/tizen/src/video_player.h index 84cd48cac..b26db1d4f 100644 --- a/packages/video_player/tizen/src/video_player.h +++ b/packages/video_player/tizen/src/video_player.h @@ -41,7 +41,7 @@ class VideoPlayer { void sendBufferingUpdate(int position); // milliseconds void sendBufferingEnd(); FlutterDesktopGpuBuffer *ObtainGpuBuffer(size_t width, size_t height); - void Destruct(void *buffer); + static void ReleaseMediaPacket(void *packet); static void onPrepared(void *data); static void onBuffering(int percent, void *data); From 927a570c65dc6abcb3b2219acf4961d702bb5ac4 Mon Sep 17 00:00:00 2001 From: xiaowei guan Date: Fri, 25 Mar 2022 15:04:58 +0800 Subject: [PATCH 3/4] Update version --- packages/video_player/CHANGELOG.md | 4 ++++ packages/video_player/README.md | 2 +- packages/video_player/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/video_player/CHANGELOG.md b/packages/video_player/CHANGELOG.md index 2e8c0d9f9..9905bb637 100644 --- a/packages/video_player/CHANGELOG.md +++ b/packages/video_player/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.3.2 + +* Apply texture common release callback. + ## 2.3.1 * Show first frame after player is prepared. diff --git a/packages/video_player/README.md b/packages/video_player/README.md index 4a51806b8..1106b48b6 100644 --- a/packages/video_player/README.md +++ b/packages/video_player/README.md @@ -29,7 +29,7 @@ This package is not an _endorsed_ implementation of `video_player`. Therefore, y ```yaml dependencies: video_player: ^2.2.6 - video_player_tizen: ^2.3.1 + video_player_tizen: ^2.3.2 ``` Then you can import `video_player` in your Dart code: diff --git a/packages/video_player/pubspec.yaml b/packages/video_player/pubspec.yaml index 541cf5d59..3137d2d54 100644 --- a/packages/video_player/pubspec.yaml +++ b/packages/video_player/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for displaying inline video with other Flutter widgets on Tizen. homepage: https://github.com/flutter-tizen/plugins repository: https://github.com/flutter-tizen/plugins/tree/master/packages/video_player -version: 2.3.1 +version: 2.3.2 flutter: plugin: From 881f382065813203095497a4a48b36fa74a6f963 Mon Sep 17 00:00:00 2001 From: xiaowei guan Date: Fri, 8 Apr 2022 10:17:42 +0800 Subject: [PATCH 4/4] Need destory current_media_packet_ if get tbm surface failed. --- packages/video_player/tizen/src/video_player.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/video_player/tizen/src/video_player.cc b/packages/video_player/tizen/src/video_player.cc index 2ebecac74..c7820e731 100644 --- a/packages/video_player/tizen/src/video_player.cc +++ b/packages/video_player/tizen/src/video_player.cc @@ -69,6 +69,8 @@ FlutterDesktopGpuBuffer *VideoPlayer::ObtainGpuBuffer(size_t width, int ret = media_packet_get_tbm_surface(current_media_packet_, &surface); if (ret != MEDIA_PACKET_ERROR_NONE || surface == nullptr) { LOG_ERROR("get tbm surface failed, error: %d", ret); + media_packet_destroy(current_media_packet_); + current_media_packet_ = nullptr; return nullptr; } flutter_desktop_gpu_buffer_->buffer = surface;