From b5f1bdd59af69ce7eac569df8f7d474c4f8060bd Mon Sep 17 00:00:00 2001 From: Gwenole Beauchesne Date: Thu, 3 Jul 2014 13:48:48 +0200 Subject: [PATCH] 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. --- gst-libs/gst/vaapi/gstvaapidecoder_h264.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_h264.c b/gst-libs/gst/vaapi/gstvaapidecoder_h264.c index 8297e780eb..6b57fa6ac8 100644 --- a/gst-libs/gst/vaapi/gstvaapidecoder_h264.c +++ b/gst-libs/gst/vaapi/gstvaapidecoder_h264.c @@ -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);