h264: start decoding slices after first SPS/PPS activation.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Wed, 14 Nov 2012 17:40:47 +0000 (18:40 +0100)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Wed, 14 Nov 2012 17:55:05 +0000 (18:55 +0100)
Only start decoding slices when at least one SPS and PPS got activated.
This fixes cases when a source represents a substream of another stream
and no SPS and PPS was inserted before the first slice of the generated
substream.

gst-libs/gst/vaapi/gstvaapidecoder_h264.c

index 8e88220..6a0e07e 100644 (file)
@@ -547,6 +547,8 @@ struct _GstVaapiDecoderH264Private {
     guint                       is_constructed          : 1;
     guint                       is_opened               : 1;
     guint                       is_avc                  : 1;
+    guint                       got_sps                 : 1;
+    guint                       got_pps                 : 1;
     guint                       has_context             : 1;
     guint                       progressive_sequence    : 1;
 };
@@ -1168,6 +1170,7 @@ decode_sps(GstVaapiDecoderH264 *decoder, GstH264NalUnit *nalu)
     if (result != GST_H264_PARSER_OK)
         return get_status(result);
 
+    priv->got_pps = TRUE;
     return GST_VAAPI_DECODER_STATUS_SUCCESS;
 }
 
@@ -1185,6 +1188,7 @@ decode_pps(GstVaapiDecoderH264 *decoder, GstH264NalUnit *nalu)
     if (result != GST_H264_PARSER_OK)
         return get_status(result);
 
+    priv->got_sps = TRUE;
     return GST_VAAPI_DECODER_STATUS_SUCCESS;
 }
 
@@ -2910,12 +2914,15 @@ scan_for_start_code(GstAdapter *adapter, guint ofs, guint size, guint32 *scp)
 static GstVaapiDecoderStatus
 decode_nalu(GstVaapiDecoderH264 *decoder, GstH264NalUnit *nalu)
 {
+    GstVaapiDecoderH264Private * const priv = decoder->priv;
     GstVaapiDecoderStatus status;
 
     switch (nalu->type) {
     case GST_H264_NAL_SLICE_IDR:
         /* fall-through. IDR specifics are handled in init_picture() */
     case GST_H264_NAL_SLICE:
+        if (!priv->got_sps || !priv->got_pps)
+            return GST_VAAPI_DECODER_STATUS_SUCCESS;
         status = decode_slice(decoder, nalu);
         break;
     case GST_H264_NAL_SPS: