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