mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 17:50:36 +00:00
v4l2videodec: replace multiple decoder bug warnings with single one
Achieve this by dropping frames after a drain if the driver failed to so. This works around RaspberryPi driver issue [1]. [1] https://github.com/raspberrypi/linux/issues/5059#issuecomment- Fixes #1103 Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2710>
This commit is contained in:
parent
1eef7bbc22
commit
acde6ff8be
1 changed files with 25 additions and 1 deletions
|
@ -412,6 +412,7 @@ gst_v4l2_video_dec_finish (GstVideoDecoder * decoder)
|
||||||
GstV4l2VideoDec *self = GST_V4L2_VIDEO_DEC (decoder);
|
GstV4l2VideoDec *self = GST_V4L2_VIDEO_DEC (decoder);
|
||||||
GstFlowReturn ret = GST_FLOW_OK;
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
GstBuffer *buffer;
|
GstBuffer *buffer;
|
||||||
|
GList *pending_frames = NULL;
|
||||||
|
|
||||||
if (gst_pad_get_task_state (decoder->srcpad) != GST_TASK_STARTED)
|
if (gst_pad_get_task_state (decoder->srcpad) != GST_TASK_STARTED)
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -464,7 +465,30 @@ gst_v4l2_video_dec_finish (GstVideoDecoder * decoder)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (decoder, "Done draining buffers");
|
GST_DEBUG_OBJECT (decoder, "Done draining buffers");
|
||||||
|
|
||||||
/* TODO Shall we cleanup any reffed frame to workaround broken decoders ? */
|
/* Draining of the capture buffer has completed.
|
||||||
|
* If any pending frames remain at this point there is a decoder error.
|
||||||
|
* This has been observed as a driver bug, where eos is sent too early.
|
||||||
|
* These frames will never be rendered, so drop them now with a warning */
|
||||||
|
|
||||||
|
pending_frames = gst_video_decoder_get_frames (decoder);
|
||||||
|
if (pending_frames) {
|
||||||
|
int counter = 0;
|
||||||
|
guint32 first, last;
|
||||||
|
for (GList * g = pending_frames; g; g = g->next) {
|
||||||
|
GstVideoCodecFrame *frame = g->data;
|
||||||
|
g->data = NULL;
|
||||||
|
last = frame->system_frame_number;
|
||||||
|
if (!counter)
|
||||||
|
first = last;
|
||||||
|
counter++;
|
||||||
|
gst_video_decoder_drop_frame (decoder, frame);
|
||||||
|
}
|
||||||
|
g_warning
|
||||||
|
("%s: %i frames %u-%u left undrained after CMD_STOP, eos sent too early: bug in decoder -- please file a bug",
|
||||||
|
GST_ELEMENT_NAME (decoder), counter, first, last);
|
||||||
|
if (pending_frames)
|
||||||
|
g_list_free (pending_frames);
|
||||||
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in a new issue