Skip to content

Commit 2095128

Browse files
authored
Fix video player plugin freeze issue (#258)
* Fix video player plugin freeze issue When flutter engine upgrade to 2.5.1, only call mark frame available API can triggle previous frame destruction callback. * Rename IsValidMediaPacket to isValidMediaPacket * Rename using_media_packet_ to current_media_packet_ * Make isValidMediaPacket method name start with uppercase letter * When frame decode callback speed is faster than flutter renderer speed, skip old one and store new one.
1 parent 51dd319 commit 2095128

File tree

2 files changed

+46
-18
lines changed

2 files changed

+46
-18
lines changed

packages/video_player/tizen/src/video_player.cc

+43-17
Original file line numberDiff line numberDiff line change
@@ -49,22 +49,37 @@ static std::string StateToString(player_state_e state) {
4949
return ret;
5050
}
5151

52+
bool VideoPlayer::IsValidMediaPacket(media_packet_h media_packet) {
53+
tbm_surface_h surface;
54+
int ret = media_packet_get_tbm_surface(media_packet, &surface);
55+
if (ret != MEDIA_PACKET_ERROR_NONE) {
56+
LOG_ERROR("get tbm surface failed, error: %d", ret);
57+
return false;
58+
}
59+
return true;
60+
}
61+
5262
FlutterDesktopGpuBuffer *VideoPlayer::ObtainGpuBuffer(size_t width,
5363
size_t height) {
5464
std::lock_guard<std::mutex> lock(mutex_);
55-
if (media_packet_ == nullptr) {
56-
LOG_ERROR("Media packet is null");
57-
return nullptr;
65+
if (prepared_media_packet_ && !IsValidMediaPacket(prepared_media_packet_)) {
66+
media_packet_destroy(prepared_media_packet_);
67+
prepared_media_packet_ = nullptr;
5868
}
59-
tbm_surface_h surface;
60-
int ret = media_packet_get_tbm_surface(media_packet_, &surface);
61-
if (ret != MEDIA_PACKET_ERROR_NONE) {
62-
LOG_ERROR("media_packet_get_tbm_surface failed, error: %d", ret);
63-
media_packet_destroy(media_packet_);
64-
media_packet_ = nullptr;
69+
if (current_media_packet_ && !IsValidMediaPacket(current_media_packet_)) {
70+
media_packet_destroy(current_media_packet_);
71+
current_media_packet_ = nullptr;
72+
}
73+
if (!prepared_media_packet_ && !current_media_packet_) {
74+
LOG_ERROR("No vaild media packet");
6575
return nullptr;
6676
}
67-
77+
if (prepared_media_packet_ && !current_media_packet_) {
78+
current_media_packet_ = prepared_media_packet_;
79+
prepared_media_packet_ = nullptr;
80+
}
81+
tbm_surface_h surface;
82+
media_packet_get_tbm_surface(current_media_packet_, &surface);
6883
flutter_desktop_gpu_buffer_->buffer = surface;
6984
flutter_desktop_gpu_buffer_->width = width;
7085
flutter_desktop_gpu_buffer_->height = height;
@@ -73,9 +88,9 @@ FlutterDesktopGpuBuffer *VideoPlayer::ObtainGpuBuffer(size_t width,
7388

7489
void VideoPlayer::Destruct(void *buffer) {
7590
std::lock_guard<std::mutex> lock(mutex_);
76-
if (media_packet_) {
77-
media_packet_destroy(media_packet_);
78-
media_packet_ = nullptr;
91+
if (current_media_packet_) {
92+
media_packet_destroy(current_media_packet_);
93+
current_media_packet_ = nullptr;
7994
}
8095
}
8196

@@ -308,6 +323,16 @@ void VideoPlayer::dispose() {
308323
player_ = 0;
309324
}
310325

326+
if (current_media_packet_) {
327+
media_packet_destroy(current_media_packet_);
328+
current_media_packet_ = nullptr;
329+
}
330+
331+
if (prepared_media_packet_) {
332+
media_packet_destroy(prepared_media_packet_);
333+
prepared_media_packet_ = nullptr;
334+
}
335+
311336
if (texture_registrar_) {
312337
texture_registrar_->UnregisterTexture(texture_id_);
313338
texture_registrar_ = nullptr;
@@ -522,11 +547,12 @@ void VideoPlayer::onErrorOccurred(int code, void *data) {
522547
void VideoPlayer::onVideoFrameDecoded(media_packet_h packet, void *data) {
523548
VideoPlayer *player = (VideoPlayer *)data;
524549
std::lock_guard<std::mutex> lock(player->mutex_);
525-
if (player->media_packet_) {
526-
LOG_INFO("Render not finished");
527-
media_packet_destroy(packet);
550+
if (player->prepared_media_packet_) {
551+
LOG_INFO("prepared packet not null, store new");
552+
media_packet_destroy(player->prepared_media_packet_);
553+
player->prepared_media_packet_ = packet;
528554
return;
529555
}
530-
player->media_packet_ = packet;
556+
player->prepared_media_packet_ = packet;
531557
player->texture_registrar_->MarkTextureFrameAvailable(player->texture_id_);
532558
}

packages/video_player/tizen/src/video_player.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class VideoPlayer {
4040
void sendBufferingEnd();
4141
FlutterDesktopGpuBuffer *ObtainGpuBuffer(size_t width, size_t height);
4242
void Destruct(void *buffer);
43+
bool IsValidMediaPacket(media_packet_h media_packet);
4344

4445
static void onPrepared(void *data);
4546
static void onBuffering(int percent, void *data);
@@ -59,8 +60,9 @@ class VideoPlayer {
5960
std::unique_ptr<flutter::TextureVariant> texture_variant_;
6061
std::unique_ptr<FlutterDesktopGpuBuffer> flutter_desktop_gpu_buffer_;
6162
std::mutex mutex_;
62-
media_packet_h media_packet_ = nullptr;
6363
SeekCompletedCb on_seek_completed_;
64+
media_packet_h prepared_media_packet_ = nullptr;
65+
media_packet_h current_media_packet_ = nullptr;
6466
};
6567

6668
#endif // VIDEO_PLAYER_H_

0 commit comments

Comments
 (0)