mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 09:10:36 +00:00
decoder: h264: detect incorrectly paired fields in frames.
When a DPB flush is required, e.g. at a natural and of stream or issued explicitly through an IDR, try to detect any frame left in the DPB that is interlaced but does not contain two decoded fields. In that case, mark the picture as having a single field only. This avoids a hang while decoding tv_cut.mkv.
This commit is contained in:
parent
a3e49d6d13
commit
b5f1bdd59a
1 changed files with 14 additions and 0 deletions
|
@ -894,6 +894,20 @@ dpb_clear(GstVaapiDecoderH264 *decoder, GstVaapiPictureH264 *picture)
|
|||
static void
|
||||
dpb_flush(GstVaapiDecoderH264 *decoder, GstVaapiPictureH264 *picture)
|
||||
{
|
||||
GstVaapiDecoderH264Private * const priv = &decoder->priv;
|
||||
guint i;
|
||||
|
||||
/* Detect broken frames and mark them as having a single field if
|
||||
needed */
|
||||
for (i = 0; i < priv->dpb_count; i++) {
|
||||
GstVaapiFrameStore * const fs = priv->dpb[i];
|
||||
if (!fs->output_needed || gst_vaapi_frame_store_is_complete(fs))
|
||||
continue;
|
||||
GST_VAAPI_PICTURE_FLAG_SET(fs->buffers[0],
|
||||
GST_VAAPI_PICTURE_FLAG_ONEFIELD);
|
||||
}
|
||||
|
||||
/* Output any frame remaining in DPB */
|
||||
while (dpb_bump(decoder, picture))
|
||||
;
|
||||
dpb_clear(decoder, picture);
|
||||
|
|
Loading…
Reference in a new issue