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:
Gwenole Beauchesne 2014-07-03 13:48:48 +02:00
parent a3e49d6d13
commit b5f1bdd59a

View file

@ -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);