diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-01-17 10:42:49 +0100 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-01-29 15:27:59 +0100 |
commit | 5a795b439c5009cb660d69191f9a1522f1618052 (patch) | |
tree | 7b5d34c2945f040f87c1c2f1f6917e287bcbf3ba /gst-libs/gst/vaapi/gstvaapidecoder_h264.c | |
parent | 6d61965531dc99d482676991e6fc07e212a4925a (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.c | 25 |
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)); |