return do_flush(decoder);
}
+
+GstVaapiDecoderStatus
+gst_vaapi_decoder_decode_codec_data(GstVaapiDecoder *decoder)
+{
+ GstVaapiDecoderClass * const klass = GST_VAAPI_DECODER_GET_CLASS(decoder);
+ GstBuffer * const codec_data = GST_VAAPI_DECODER_CODEC_DATA(decoder);
+ GstVaapiDecoderStatus status;
+ const guchar *buf;
+ guint buf_size;
+
+ if (!codec_data)
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
+
+ /* FIXME: add a meaningful error code? */
+ if (!klass->decode_codec_data)
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
+
+ buf = GST_BUFFER_DATA(codec_data);
+ buf_size = GST_BUFFER_SIZE(codec_data);
+ if (!buf || buf_size == 0)
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
+
+ status = klass->decode_codec_data(decoder, buf, buf_size);
+ return status;
+}
struct _GstVaapiDecoderUnit *unit);
GstVaapiDecoderStatus (*end_frame)(GstVaapiDecoder *decoder);
GstVaapiDecoderStatus (*flush)(GstVaapiDecoder *decoder);
+ GstVaapiDecoderStatus (*decode_codec_data)(GstVaapiDecoder *decoder,
+ const guchar *buf, guint buf_size);
};
GType
}
static GstVaapiDecoderStatus
-decode_codec_data(GstVaapiDecoderH264 *decoder, GstBuffer *buffer)
+gst_vaapi_decoder_h264_decode_codec_data(GstVaapiDecoder *base_decoder,
+ const guchar *buf, guint buf_size)
{
+ GstVaapiDecoderH264 * const decoder =
+ GST_VAAPI_DECODER_H264_CAST(base_decoder);
GstVaapiDecoderH264Private * const priv = decoder->priv;
GstVaapiDecoderStatus status;
GstVaapiDecoderUnit unit;
GstVaapiParserInfoH264 pi;
GstH264ParserResult result;
- guchar *buf;
- guint buf_size;
guint i, ofs, num_sps, num_pps;
unit.parsed_info = π
- buf = GST_BUFFER_DATA(buffer);
- buf_size = GST_BUFFER_SIZE(buffer);
- if (!buf || buf_size == 0)
- return GST_VAAPI_DECODER_STATUS_SUCCESS;
-
if (buf_size < 8)
return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
{
GstVaapiDecoderH264Private * const priv = decoder->priv;
GstVaapiDecoderStatus status;
- GstBuffer *codec_data;
g_return_val_if_fail(priv->is_constructed,
GST_VAAPI_DECODER_STATUS_ERROR_INIT_FAILED);
if (!priv->is_opened)
return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_CODEC;
- codec_data = GST_VAAPI_DECODER_CODEC_DATA(decoder);
- if (codec_data) {
- status = decode_codec_data(decoder, codec_data);
- if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
- return status;
- }
+ status = gst_vaapi_decoder_decode_codec_data(
+ GST_VAAPI_DECODER_CAST(decoder));
+ if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
+ return status;
}
return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
decoder_class->start_frame = gst_vaapi_decoder_h264_start_frame;
decoder_class->end_frame = gst_vaapi_decoder_h264_end_frame;
decoder_class->flush = gst_vaapi_decoder_h264_flush;
+
+ decoder_class->decode_codec_data =
+ gst_vaapi_decoder_h264_decode_codec_data;
}
static void
gst_vaapi_decoder_mpeg4,
GST_VAAPI_TYPE_DECODER)
+#define GST_VAAPI_DECODER_MPEG4_CAST(decoder) \
+ ((GstVaapiDecoderMpeg4 *)(decoder))
+
#define GST_VAAPI_DECODER_MPEG4_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE((obj), \
GST_VAAPI_TYPE_DECODER_MPEG4, \
}
static GstVaapiDecoderStatus
-decode_codec_data(GstVaapiDecoderMpeg4 *decoder, GstBuffer *buffer)
+gst_vaapi_decoder_mpeg4_decode_codec_data(GstVaapiDecoder *base_decoder,
+ const guchar *_buf, guint _buf_size)
{
+ GstVaapiDecoderMpeg4 * const decoder =
+ GST_VAAPI_DECODER_MPEG4_CAST(base_decoder);
GstVaapiDecoderStatus status;
- guchar *buf, *_buf;
- guint pos, buf_size, _buf_size;
+ guchar *buf;
+ guint pos, buf_size;
- _buf = GST_BUFFER_DATA(buffer);
- _buf_size = GST_BUFFER_SIZE(buffer);
// add additional 0x000001b2 to enclose the last header
buf_size = _buf_size + 4;
buf = malloc(buf_size);
{
GstVaapiDecoderMpeg4Private * const priv = decoder->priv;
GstVaapiDecoderStatus status;
- GstBuffer *codec_data;
g_return_val_if_fail(priv->is_constructed,
GST_VAAPI_DECODER_STATUS_ERROR_INIT_FAILED);
if (!priv->is_opened)
return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_CODEC;
- codec_data = GST_VAAPI_DECODER_CODEC_DATA(decoder);
- if (codec_data) {
- status = decode_codec_data(decoder, codec_data);
- if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
- return status;
- }
+ status = gst_vaapi_decoder_decode_codec_data(
+ GST_VAAPI_DECODER_CAST(decoder));
+ if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
+ return status;
}
return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
decoder_class->parse = gst_vaapi_decoder_mpeg4_parse;
decoder_class->decode = gst_vaapi_decoder_mpeg4_decode;
+
+ decoder_class->decode_codec_data =
+ gst_vaapi_decoder_mpeg4_decode_codec_data;
}
static void
GstVaapiDecoderStatus
gst_vaapi_decoder_check_status(GstVaapiDecoder *decoder);
+G_GNUC_INTERNAL
+GstVaapiDecoderStatus
+gst_vaapi_decoder_decode_codec_data(GstVaapiDecoder *decoder);
+
G_END_DECLS
#endif /* GST_VAAPI_DECODER_PRIV_H */
gst_vaapi_decoder_vc1,
GST_VAAPI_TYPE_DECODER)
+#define GST_VAAPI_DECODER_VC1_CAST(decoder) \
+ ((GstVaapiDecoderVC1 *)(decoder))
+
#define GST_VAAPI_DECODER_VC1_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE((obj), \
GST_VAAPI_TYPE_DECODER_VC1, \
}
static GstVaapiDecoderStatus
-decode_codec_data(GstVaapiDecoderVC1 *decoder, GstBuffer *buffer)
+gst_vaapi_decoder_vc1_decode_codec_data(GstVaapiDecoder *base_decoder,
+ const guchar *buf, guint buf_size)
{
+ GstVaapiDecoderVC1 * const decoder =
+ GST_VAAPI_DECODER_VC1_CAST(base_decoder);
GstVaapiDecoderVC1Private * const priv = decoder->priv;
GstVC1SeqHdr * const seq_hdr = &priv->seq_hdr;
GstVaapiDecoderStatus status;
GstVC1BDU ebdu;
GstCaps *caps;
GstStructure *structure;
- guchar *buf;
- guint buf_size, ofs;
+ guint ofs;
gint width, height;
guint32 format;
gint version;
- buf = GST_BUFFER_DATA(buffer);
- buf_size = GST_BUFFER_SIZE(buffer);
- if (!buf || buf_size == 0)
- return GST_VAAPI_DECODER_STATUS_SUCCESS;
+ priv->has_codec_data = TRUE;
width = GST_VAAPI_DECODER_WIDTH(decoder);
height = GST_VAAPI_DECODER_HEIGHT(decoder);
ebdu.size = buf_size;
ebdu.sc_offset = 0;
ebdu.offset = 0;
- ebdu.data = buf;
+ ebdu.data = (guint8 *)buf;
return decode_ebdu(decoder, &ebdu);
}
{
GstVaapiDecoderVC1Private * const priv = decoder->priv;
GstVaapiDecoderStatus status;
- GstBuffer *codec_data;
g_return_val_if_fail(priv->is_constructed,
GST_VAAPI_DECODER_STATUS_ERROR_INIT_FAILED);
if (!priv->is_opened)
return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_CODEC;
- codec_data = GST_VAAPI_DECODER_CODEC_DATA(decoder);
- if (codec_data) {
- status = decode_codec_data(decoder, codec_data);
- if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
- return status;
- priv->has_codec_data = TRUE;
- }
+ status = gst_vaapi_decoder_decode_codec_data(
+ GST_VAAPI_DECODER_CAST(decoder));
+ if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
+ return status;
}
return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
decoder_class->start_frame = gst_vaapi_decoder_vc1_start_frame;
decoder_class->end_frame = gst_vaapi_decoder_vc1_end_frame;
decoder_class->flush = gst_vaapi_decoder_vc1_flush;
+
+ decoder_class->decode_codec_data =
+ gst_vaapi_decoder_vc1_decode_codec_data;
}
static void