summaryrefslogtreecommitdiff
path: root/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
diff options
context:
space:
mode:
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-01-17 10:42:49 +0100
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-01-29 15:27:59 +0100
commit5a795b439c5009cb660d69191f9a1522f1618052 (patch)
tree7b5d34c2945f040f87c1c2f1f6917e287bcbf3ba /gst-libs/gst/vaapi/gstvaapidecoder_h264.c
parent6d61965531dc99d482676991e6fc07e212a4925a (diff)
h264: handle avcC format for decoding buffers.
Diffstat (limited to 'gst-libs/gst/vaapi/gstvaapidecoder_h264.c')
-rw-r--r--gst-libs/gst/vaapi/gstvaapidecoder_h264.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_h264.c b/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
index dd38108e..835c6607 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
+++ b/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
@@ -285,6 +285,7 @@ struct _GstVaapiDecoderH264Private {
gint32 prev_frame_num; // prevFrameNum
guint is_constructed : 1;
guint is_opened : 1;
+ guint is_avc : 1;
};
static gboolean
@@ -1769,11 +1770,20 @@ decode_buffer(GstVaapiDecoderH264 *decoder, GstBuffer *buffer)
buf_size = GST_BUFFER_SIZE(buffer);
ofs = 0;
do {
- result = gst_h264_parser_identify_nalu(
- priv->parser,
- buf, ofs, buf_size,
- &nalu
- );
+ if (priv->is_avc) {
+ result = gst_h264_parser_identify_nalu_avc(
+ priv->parser,
+ buf, ofs, buf_size, priv->nal_length_size,
+ &nalu
+ );
+ }
+ else {
+ result = gst_h264_parser_identify_nalu(
+ priv->parser,
+ buf, ofs, buf_size,
+ &nalu
+ );
+ }
status = get_status(result);
if (status == GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA) {
@@ -1807,7 +1817,7 @@ decode_buffer(GstVaapiDecoderH264 *decoder, GstBuffer *buffer)
status = GST_VAAPI_DECODER_STATUS_ERROR_BITSTREAM_PARSER;
break;
}
- } while (status == GST_VAAPI_DECODER_STATUS_SUCCESS);
+ } while (status == GST_VAAPI_DECODER_STATUS_SUCCESS && ofs < buf_size);
return status;
}
@@ -1872,6 +1882,8 @@ decode_codec_data(GstVaapiDecoderH264 *decoder, GstBuffer *buffer)
return status;
ofs = nalu.offset + nalu.size;
}
+
+ priv->is_avc = TRUE;
return status;
}
@@ -1977,6 +1989,7 @@ gst_vaapi_decoder_h264_init(GstVaapiDecoderH264 *decoder)
priv->prev_frame_num = 0;
priv->is_constructed = FALSE;
priv->is_opened = FALSE;
+ priv->is_avc = FALSE;
memset(priv->dpb, 0, sizeof(priv->dpb));
memset(priv->short_ref, 0, sizeof(priv->short_ref));