@@ -49,22 +49,37 @@ static std::string StateToString(player_state_e state) {
49
49
return ret;
50
50
}
51
51
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
+
52
62
FlutterDesktopGpuBuffer *VideoPlayer::ObtainGpuBuffer (size_t width,
53
63
size_t height) {
54
64
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 ;
58
68
}
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 " ) ;
65
75
return nullptr ;
66
76
}
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);
68
83
flutter_desktop_gpu_buffer_->buffer = surface;
69
84
flutter_desktop_gpu_buffer_->width = width;
70
85
flutter_desktop_gpu_buffer_->height = height;
@@ -73,9 +88,9 @@ FlutterDesktopGpuBuffer *VideoPlayer::ObtainGpuBuffer(size_t width,
73
88
74
89
void VideoPlayer::Destruct (void *buffer) {
75
90
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 ;
79
94
}
80
95
}
81
96
@@ -308,6 +323,16 @@ void VideoPlayer::dispose() {
308
323
player_ = 0 ;
309
324
}
310
325
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
+
311
336
if (texture_registrar_) {
312
337
texture_registrar_->UnregisterTexture (texture_id_);
313
338
texture_registrar_ = nullptr ;
@@ -522,11 +547,12 @@ void VideoPlayer::onErrorOccurred(int code, void *data) {
522
547
void VideoPlayer::onVideoFrameDecoded (media_packet_h packet, void *data) {
523
548
VideoPlayer *player = (VideoPlayer *)data;
524
549
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;
528
554
return ;
529
555
}
530
- player->media_packet_ = packet;
556
+ player->prepared_media_packet_ = packet;
531
557
player->texture_registrar_ ->MarkTextureFrameAvailable (player->texture_id_ );
532
558
}
0 commit comments