v4l2videodec: release decode only frame buffer from decoder input frame list

1. AV1 parse split every sub frame buffer and send to v4l2 video decoder,
there are decode only frames and show frames, v4l2 video decoder only dequeue
show frames, so the decode only frames are still in decoder input frame list,
which lead warning log 'Too old frames, bug in decoder -- please file a bug'.

2.Release these decode only frames when dequeue next show frame.
This commit is contained in:
jeri.li 2023-04-21 16:35:01 +08:00
parent 3811894d9c
commit c22208c469
2 changed files with 16 additions and 3 deletions

View file

@ -2446,6 +2446,10 @@ gst_video_decoder_chain_forward (GstVideoDecoder * decoder,
priv->input_offset += gst_buffer_get_size (buf);
if (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DECODE_ONLY)) {
GST_VIDEO_CODEC_FRAME_SET_DECODE_ONLY (priv->current_frame);
}
if (priv->packetized) {
GstVideoCodecFrame *frame;
gboolean was_keyframe = FALSE;

View file

@ -790,9 +790,18 @@ gst_v4l2_video_dec_loop (GstVideoDecoder * decoder)
gboolean warned = FALSE;
/* Garbage collect old frames in case of codec bugs */
while ((oldest_frame = gst_video_decoder_get_oldest_frame (decoder)) &&
check_system_frame_number_too_old (frame->system_frame_number,
oldest_frame->system_frame_number)) {
while ((oldest_frame = gst_video_decoder_get_oldest_frame (decoder))) {
if (frame->system_frame_number > oldest_frame->system_frame_number &&
GST_VIDEO_CODEC_FRAME_IS_DECODE_ONLY (oldest_frame)) {
gst_video_decoder_finish_frame (decoder, oldest_frame);
oldest_frame = NULL;
continue;
}
if (G_LIKELY (!check_system_frame_number_too_old (frame->system_frame_number,
oldest_frame->system_frame_number)))
break;
if (oldest_frame->system_frame_number > 0) {
gst_video_decoder_drop_frame (decoder, oldest_frame);
oldest_frame = NULL;