summaryrefslogtreecommitdiff
path: root/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst-libs/gst/vaapi/gstvaapidecoder_vc1.c')
-rw-r--r--gst-libs/gst/vaapi/gstvaapidecoder_vc1.c2218
1 files changed, 1110 insertions, 1108 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c b/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c
index 1aabe13d..9289eac9 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c
+++ b/gst-libs/gst/vaapi/gstvaapidecoder_vc1.c
@@ -42,37 +42,38 @@
#define GST_VAAPI_DECODER_VC1_CAST(decoder) \
((GstVaapiDecoderVC1 *)(decoder))
-typedef struct _GstVaapiDecoderVC1Private GstVaapiDecoderVC1Private;
-typedef struct _GstVaapiDecoderVC1Class GstVaapiDecoderVC1Class;
+typedef struct _GstVaapiDecoderVC1Private GstVaapiDecoderVC1Private;
+typedef struct _GstVaapiDecoderVC1Class GstVaapiDecoderVC1Class;
/**
* GstVaapiDecoderVC1:
*
* A decoder based on VC1.
*/
-struct _GstVaapiDecoderVC1Private {
- GstVaapiProfile profile;
- guint width;
- guint height;
- GstVC1SeqHdr seq_hdr;
- GstVC1EntryPointHdr entrypoint_hdr;
- GstVC1FrameHdr frame_hdr;
- GstVC1BitPlanes *bitplanes;
- GstVaapiPicture *current_picture;
- GstVaapiPicture *last_non_b_picture;
- GstVaapiDpb *dpb;
- gint32 next_poc;
- guint8 *rbdu_buffer;
- guint8 rndctrl;
- guint rbdu_buffer_size;
- guint is_opened : 1;
- guint is_first_field : 1;
- guint has_codec_data : 1;
- guint has_entrypoint : 1;
- guint size_changed : 1;
- guint profile_changed : 1;
- guint closed_entry : 1;
- guint broken_link : 1;
+struct _GstVaapiDecoderVC1Private
+{
+ GstVaapiProfile profile;
+ guint width;
+ guint height;
+ GstVC1SeqHdr seq_hdr;
+ GstVC1EntryPointHdr entrypoint_hdr;
+ GstVC1FrameHdr frame_hdr;
+ GstVC1BitPlanes *bitplanes;
+ GstVaapiPicture *current_picture;
+ GstVaapiPicture *last_non_b_picture;
+ GstVaapiDpb *dpb;
+ gint32 next_poc;
+ guint8 *rbdu_buffer;
+ guint8 rndctrl;
+ guint rbdu_buffer_size;
+ guint is_opened:1;
+ guint is_first_field:1;
+ guint has_codec_data:1;
+ guint has_entrypoint:1;
+ guint size_changed:1;
+ guint profile_changed:1;
+ guint closed_entry:1;
+ guint broken_link:1;
};
/**
@@ -80,10 +81,11 @@ struct _GstVaapiDecoderVC1Private {
*
* A decoder based on VC1.
*/
-struct _GstVaapiDecoderVC1 {
- /*< private >*/
- GstVaapiDecoder parent_instance;
- GstVaapiDecoderVC1Private priv;
+struct _GstVaapiDecoderVC1
+{
+ /*< private > */
+ GstVaapiDecoder parent_instance;
+ GstVaapiDecoderVC1Private priv;
};
/**
@@ -91,1339 +93,1339 @@ struct _GstVaapiDecoderVC1 {
*
* A decoder class based on VC1.
*/
-struct _GstVaapiDecoderVC1Class {
- /*< private >*/
- GstVaapiDecoderClass parent_class;
+struct _GstVaapiDecoderVC1Class
+{
+ /*< private > */
+ GstVaapiDecoderClass parent_class;
};
static GstVaapiDecoderStatus
-get_status(GstVC1ParserResult result)
+get_status (GstVC1ParserResult result)
{
- GstVaapiDecoderStatus status;
+ GstVaapiDecoderStatus status;
- switch (result) {
+ switch (result) {
case GST_VC1_PARSER_OK:
- status = GST_VAAPI_DECODER_STATUS_SUCCESS;
- break;
+ status = GST_VAAPI_DECODER_STATUS_SUCCESS;
+ break;
case GST_VC1_PARSER_NO_BDU_END:
- status = GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
- break;
+ status = GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
+ break;
case GST_VC1_PARSER_ERROR:
- status = GST_VAAPI_DECODER_STATUS_ERROR_BITSTREAM_PARSER;
- break;
+ status = GST_VAAPI_DECODER_STATUS_ERROR_BITSTREAM_PARSER;
+ break;
default:
- status = GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
- break;
- }
- return status;
+ status = GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
+ break;
+ }
+ return status;
}
static void
-gst_vaapi_decoder_vc1_close(GstVaapiDecoderVC1 *decoder)
+gst_vaapi_decoder_vc1_close (GstVaapiDecoderVC1 * decoder)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
- gst_vaapi_picture_replace(&priv->last_non_b_picture, NULL);
- gst_vaapi_picture_replace(&priv->current_picture, NULL);
- gst_vaapi_dpb_replace(&priv->dpb, NULL);
+ gst_vaapi_picture_replace (&priv->last_non_b_picture, NULL);
+ gst_vaapi_picture_replace (&priv->current_picture, NULL);
+ gst_vaapi_dpb_replace (&priv->dpb, NULL);
- if (priv->bitplanes) {
- gst_vc1_bitplanes_free(priv->bitplanes);
- priv->bitplanes = NULL;
- }
+ if (priv->bitplanes) {
+ gst_vc1_bitplanes_free (priv->bitplanes);
+ priv->bitplanes = NULL;
+ }
}
static gboolean
-gst_vaapi_decoder_vc1_open(GstVaapiDecoderVC1 *decoder)
+gst_vaapi_decoder_vc1_open (GstVaapiDecoderVC1 * decoder)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
- gst_vaapi_decoder_vc1_close(decoder);
+ gst_vaapi_decoder_vc1_close (decoder);
- priv->dpb = gst_vaapi_dpb_new(2);
- if (!priv->dpb)
- return FALSE;
+ priv->dpb = gst_vaapi_dpb_new (2);
+ if (!priv->dpb)
+ return FALSE;
- priv->bitplanes = gst_vc1_bitplanes_new();
- if (!priv->bitplanes)
- return FALSE;
- return TRUE;
+ priv->bitplanes = gst_vc1_bitplanes_new ();
+ if (!priv->bitplanes)
+ return FALSE;
+ return TRUE;
}
static void
-gst_vaapi_decoder_vc1_destroy(GstVaapiDecoder *base_decoder)
+gst_vaapi_decoder_vc1_destroy (GstVaapiDecoder * base_decoder)
{
- GstVaapiDecoderVC1 * const decoder =
- GST_VAAPI_DECODER_VC1_CAST(base_decoder);
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
+ GstVaapiDecoderVC1 *const decoder = GST_VAAPI_DECODER_VC1_CAST (base_decoder);
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
- gst_vaapi_decoder_vc1_close(decoder);
+ gst_vaapi_decoder_vc1_close (decoder);
- if (priv->rbdu_buffer) {
- g_free(priv->rbdu_buffer);
- priv->rbdu_buffer = NULL;
- priv->rbdu_buffer_size = 0;
- }
+ if (priv->rbdu_buffer) {
+ g_free (priv->rbdu_buffer);
+ priv->rbdu_buffer = NULL;
+ priv->rbdu_buffer_size = 0;
+ }
}
static gboolean
-gst_vaapi_decoder_vc1_create(GstVaapiDecoder *base_decoder)
+gst_vaapi_decoder_vc1_create (GstVaapiDecoder * base_decoder)
{
- GstVaapiDecoderVC1 * const decoder =
- GST_VAAPI_DECODER_VC1_CAST(base_decoder);
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
+ GstVaapiDecoderVC1 *const decoder = GST_VAAPI_DECODER_VC1_CAST (base_decoder);
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
- priv->profile = (GstVaapiProfile)0;
- priv->rndctrl = 0;
- return TRUE;
+ priv->profile = (GstVaapiProfile) 0;
+ priv->rndctrl = 0;
+ return TRUE;
}
static GstVaapiDecoderStatus
-ensure_context(GstVaapiDecoderVC1 *decoder)
+ensure_context (GstVaapiDecoderVC1 * decoder)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVaapiProfile profiles[2];
- GstVaapiEntrypoint entrypoint = GST_VAAPI_ENTRYPOINT_VLD;
- guint i, n_profiles = 0;
- gboolean reset_context = FALSE;
-
- if (priv->profile_changed) {
- GST_DEBUG("profile changed");
- priv->profile_changed = FALSE;
- reset_context = TRUE;
-
- profiles[n_profiles++] = priv->profile;
- if (priv->profile == GST_VAAPI_PROFILE_VC1_SIMPLE)
- profiles[n_profiles++] = GST_VAAPI_PROFILE_VC1_MAIN;
-
- for (i = 0; i < n_profiles; i++) {
- if (gst_vaapi_display_has_decoder(GST_VAAPI_DECODER_DISPLAY(decoder),
- profiles[i], entrypoint))
- break;
- }
- if (i == n_profiles)
- return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_PROFILE;
- priv->profile = profiles[i];
- }
-
- if (priv->size_changed) {
- GST_DEBUG("size changed");
- priv->size_changed = FALSE;
- reset_context = TRUE;
- }
-
- if (reset_context) {
- GstVaapiContextInfo info;
-
- info.profile = priv->profile;
- info.entrypoint = entrypoint;
- info.chroma_type = GST_VAAPI_CHROMA_TYPE_YUV420;
- info.width = priv->width;
- info.height = priv->height;
- info.ref_frames = 2;
- reset_context = gst_vaapi_decoder_ensure_context(
- GST_VAAPI_DECODER(decoder),
- &info
- );
- if (!reset_context)
- return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVaapiProfile profiles[2];
+ GstVaapiEntrypoint entrypoint = GST_VAAPI_ENTRYPOINT_VLD;
+ guint i, n_profiles = 0;
+ gboolean reset_context = FALSE;
+
+ if (priv->profile_changed) {
+ GST_DEBUG ("profile changed");
+ priv->profile_changed = FALSE;
+ reset_context = TRUE;
+
+ profiles[n_profiles++] = priv->profile;
+ if (priv->profile == GST_VAAPI_PROFILE_VC1_SIMPLE)
+ profiles[n_profiles++] = GST_VAAPI_PROFILE_VC1_MAIN;
+
+ for (i = 0; i < n_profiles; i++) {
+ if (gst_vaapi_display_has_decoder (GST_VAAPI_DECODER_DISPLAY (decoder),
+ profiles[i], entrypoint))
+ break;
}
- return GST_VAAPI_DECODER_STATUS_SUCCESS;
+ if (i == n_profiles)
+ return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_PROFILE;
+ priv->profile = profiles[i];
+ }
+
+ if (priv->size_changed) {
+ GST_DEBUG ("size changed");
+ priv->size_changed = FALSE;
+ reset_context = TRUE;
+ }
+
+ if (reset_context) {
+ GstVaapiContextInfo info;
+
+ info.profile = priv->profile;
+ info.entrypoint = entrypoint;
+ info.chroma_type = GST_VAAPI_CHROMA_TYPE_YUV420;
+ info.width = priv->width;
+ info.height = priv->height;
+ info.ref_frames = 2;
+ reset_context =
+ gst_vaapi_decoder_ensure_context (GST_VAAPI_DECODER (decoder), &info);
+ if (!reset_context)
+ return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
+ }
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
static GstVaapiDecoderStatus
-decode_current_picture(GstVaapiDecoderVC1 *decoder)
+decode_current_picture (GstVaapiDecoderVC1 * decoder)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVaapiPicture * const picture = priv->current_picture;
-
- if (!picture)
- return GST_VAAPI_DECODER_STATUS_SUCCESS;
-
- if (!gst_vaapi_picture_decode(picture))
- goto error;
- if (GST_VAAPI_PICTURE_IS_COMPLETE(picture)) {
- if (!gst_vaapi_dpb_add(priv->dpb, picture))
- goto error;
- gst_vaapi_picture_replace(&priv->current_picture, NULL);
- }
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVaapiPicture *const picture = priv->current_picture;
+
+ if (!picture)
return GST_VAAPI_DECODER_STATUS_SUCCESS;
+ if (!gst_vaapi_picture_decode (picture))
+ goto error;
+ if (GST_VAAPI_PICTURE_IS_COMPLETE (picture)) {
+ if (!gst_vaapi_dpb_add (priv->dpb, picture))
+ goto error;
+ gst_vaapi_picture_replace (&priv->current_picture, NULL);
+ }
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
+
error:
- /* XXX: fix for cases where first field failed to be decoded */
- gst_vaapi_picture_replace(&priv->current_picture, NULL);
- return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
+ /* XXX: fix for cases where first field failed to be decoded */
+ gst_vaapi_picture_replace (&priv->current_picture, NULL);
+ return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
}
static GstVaapiDecoderStatus
-decode_sequence(GstVaapiDecoderVC1 *decoder, GstVC1BDU *rbdu, GstVC1BDU *ebdu)
+decode_sequence (GstVaapiDecoderVC1 * decoder, GstVC1BDU * rbdu,
+ GstVC1BDU * ebdu)
{
- GstVaapiDecoder * const base_decoder = GST_VAAPI_DECODER(decoder);
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVC1SeqHdr * const seq_hdr = &priv->seq_hdr;
- GstVC1AdvancedSeqHdr * const adv_hdr = &seq_hdr->advanced;
- GstVC1SeqStructC * const structc = &seq_hdr->struct_c;
- GstVC1ParserResult result;
- GstVaapiProfile profile;
- guint width, height, fps_n, fps_d, par_n, par_d;
-
- result = gst_vc1_parse_sequence_header(
- rbdu->data + rbdu->offset,
- rbdu->size,
- seq_hdr
- );
- if (result != GST_VC1_PARSER_OK) {
- GST_ERROR("failed to parse sequence layer");
- return get_status(result);
- }
-
- priv->has_entrypoint = FALSE;
-
- /* Reset POC */
- if (priv->last_non_b_picture) {
- if (priv->last_non_b_picture->poc == priv->next_poc)
- priv->next_poc++;
- gst_vaapi_picture_replace(&priv->last_non_b_picture, NULL);
- }
-
- /* Validate profile */
- switch (seq_hdr->profile) {
+ GstVaapiDecoder *const base_decoder = GST_VAAPI_DECODER (decoder);
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVC1SeqHdr *const seq_hdr = &priv->seq_hdr;
+ GstVC1AdvancedSeqHdr *const adv_hdr = &seq_hdr->advanced;
+ GstVC1SeqStructC *const structc = &seq_hdr->struct_c;
+ GstVC1ParserResult result;
+ GstVaapiProfile profile;
+ guint width, height, fps_n, fps_d, par_n, par_d;
+
+ result = gst_vc1_parse_sequence_header (rbdu->data + rbdu->offset,
+ rbdu->size, seq_hdr);
+ if (result != GST_VC1_PARSER_OK) {
+ GST_ERROR ("failed to parse sequence layer");
+ return get_status (result);
+ }
+
+ priv->has_entrypoint = FALSE;
+
+ /* Reset POC */
+ if (priv->last_non_b_picture) {
+ if (priv->last_non_b_picture->poc == priv->next_poc)
+ priv->next_poc++;
+ gst_vaapi_picture_replace (&priv->last_non_b_picture, NULL);
+ }
+
+ /* Validate profile */
+ switch (seq_hdr->profile) {
case GST_VC1_PROFILE_SIMPLE:
case GST_VC1_PROFILE_MAIN:
case GST_VC1_PROFILE_ADVANCED:
- break;
+ break;
default:
- GST_ERROR("unsupported profile %d", seq_hdr->profile);
- return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_PROFILE;
- }
-
- fps_n = 0;
- fps_d = 0;
- par_n = 0;
- par_d = 0;
- switch (seq_hdr->profile) {
+ GST_ERROR ("unsupported profile %d", seq_hdr->profile);
+ return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_PROFILE;
+ }
+
+ fps_n = 0;
+ fps_d = 0;
+ par_n = 0;
+ par_d = 0;
+ switch (seq_hdr->profile) {
case GST_VC1_PROFILE_SIMPLE:
case GST_VC1_PROFILE_MAIN:
- if (structc->wmvp) {
- fps_n = structc->framerate;
- fps_d = 1;
- }
- break;
+ if (structc->wmvp) {
+ fps_n = structc->framerate;
+ fps_d = 1;
+ }
+ break;
case GST_VC1_PROFILE_ADVANCED:
- fps_n = adv_hdr->fps_n;
- fps_d = adv_hdr->fps_d;
- par_n = adv_hdr->par_n;
- par_d = adv_hdr->par_d;
- break;
+ fps_n = adv_hdr->fps_n;
+ fps_d = adv_hdr->fps_d;
+ par_n = adv_hdr->par_n;
+ par_d = adv_hdr->par_d;
+ break;
default:
- g_assert(0 && "XXX: we already validated the profile above");
- break;
- }
+ g_assert (0 && "XXX: we already validated the profile above");
+ break;
+ }
- if (fps_n && fps_d)
- gst_vaapi_decoder_set_framerate(base_decoder, fps_n, fps_d);
+ if (fps_n && fps_d)
+ gst_vaapi_decoder_set_framerate (base_decoder, fps_n, fps_d);
- if (par_n > 0 && par_d > 0)
- gst_vaapi_decoder_set_pixel_aspect_ratio(base_decoder, par_n, par_d);
+ if (par_n > 0 && par_d > 0)
+ gst_vaapi_decoder_set_pixel_aspect_ratio (base_decoder, par_n, par_d);
- switch (seq_hdr->profile) {
+ switch (seq_hdr->profile) {
case GST_VC1_PROFILE_SIMPLE:
case GST_VC1_PROFILE_MAIN:
- width = seq_hdr->struct_c.coded_width;
- height = seq_hdr->struct_c.coded_height;
- break;
+ width = seq_hdr->struct_c.coded_width;
+ height = seq_hdr->struct_c.coded_height;
+ break;
case GST_VC1_PROFILE_ADVANCED:
- width = seq_hdr->advanced.max_coded_width;
- height = seq_hdr->advanced.max_coded_height;
- break;
+ width = seq_hdr->advanced.max_coded_width;
+ height = seq_hdr->advanced.max_coded_height;
+ break;
default:
- g_assert(0 && "XXX: we already validated the profile above");
- break;
- }
+ g_assert (0 && "XXX: we already validated the profile above");
+ break;
+ }
- if (priv->width != width) {
- priv->width = width;
- priv->size_changed = TRUE;
- }
+ if (priv->width != width) {
+ priv->width = width;
+ priv->size_changed = TRUE;
+ }
- if (priv->height != height) {
- priv->height = height;
- priv->size_changed = TRUE;
- }
+ if (priv->height != height) {
+ priv->height = height;
+ priv->size_changed = TRUE;
+ }
- switch (seq_hdr->profile) {
+ switch (seq_hdr->profile) {
case GST_VC1_PROFILE_SIMPLE:
- profile = GST_VAAPI_PROFILE_VC1_SIMPLE;
- break;
+ profile = GST_VAAPI_PROFILE_VC1_SIMPLE;
+ break;
case GST_VC1_PROFILE_MAIN:
- profile = GST_VAAPI_PROFILE_VC1_MAIN;
- break;
+ profile = GST_VAAPI_PROFILE_VC1_MAIN;
+ break;
case GST_VC1_PROFILE_ADVANCED:
- profile = GST_VAAPI_PROFILE_VC1_ADVANCED;
- break;
+ profile = GST_VAAPI_PROFILE_VC1_ADVANCED;
+ break;
default:
- g_assert(0 && "XXX: we already validated the profile above");
- break;
- }
- if (priv->profile != profile) {
- priv->profile = profile;
- priv->profile_changed = TRUE;
- }
- return GST_VAAPI_DECODER_STATUS_SUCCESS;
+ g_assert (0 && "XXX: we already validated the profile above");
+ break;
+ }
+ if (priv->profile != profile) {
+ priv->profile = profile;
+ priv->profile_changed = TRUE;
+ }
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
static GstVaapiDecoderStatus
-decode_sequence_end(GstVaapiDecoderVC1 *decoder)
+decode_sequence_end (GstVaapiDecoderVC1 * decoder)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVaapiDecoderStatus status;
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVaapiDecoderStatus status;
- status = decode_current_picture(decoder);
- if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
- return status;
+ status = decode_current_picture (decoder);
+ if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
+ return status;
- gst_vaapi_dpb_flush(priv->dpb);
- return GST_VAAPI_DECODER_STATUS_SUCCESS;
+ gst_vaapi_dpb_flush (priv->dpb);
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
static GstVaapiDecoderStatus
-decode_entry_point(GstVaapiDecoderVC1 *decoder, GstVC1BDU *rbdu, GstVC1BDU *ebdu)
+decode_entry_point (GstVaapiDecoderVC1 * decoder, GstVC1BDU * rbdu,
+ GstVC1BDU * ebdu)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVC1SeqHdr * const seq_hdr = &priv->seq_hdr;
- GstVC1EntryPointHdr * const entrypoint_hdr = &priv->entrypoint_hdr;
- GstVC1ParserResult result;
-
- result = gst_vc1_parse_entry_point_header(
- rbdu->data + rbdu->offset,
- rbdu->size,
- entrypoint_hdr,
- seq_hdr
- );
- if (result != GST_VC1_PARSER_OK) {
- GST_ERROR("failed to parse entrypoint layer");
- return get_status(result);
- }
-
- if (entrypoint_hdr->coded_size_flag) {
- priv->width = entrypoint_hdr->coded_width;
- priv->height = entrypoint_hdr->coded_height;
- priv->size_changed = TRUE;
- }
-
- priv->has_entrypoint = TRUE;
- priv->closed_entry = entrypoint_hdr->closed_entry;
- priv->broken_link = entrypoint_hdr->broken_link;
- return GST_VAAPI_DECODER_STATUS_SUCCESS;
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVC1SeqHdr *const seq_hdr = &priv->seq_hdr;
+ GstVC1EntryPointHdr *const entrypoint_hdr = &priv->entrypoint_hdr;
+ GstVC1ParserResult result;
+
+ result = gst_vc1_parse_entry_point_header (rbdu->data + rbdu->offset,
+ rbdu->size, entrypoint_hdr, seq_hdr);
+ if (result != GST_VC1_PARSER_OK) {
+ GST_ERROR ("failed to parse entrypoint layer");
+ return get_status (result);
+ }
+
+ if (entrypoint_hdr->coded_size_flag) {
+ priv->width = entrypoint_hdr->coded_width;
+ priv->height = entrypoint_hdr->coded_height;
+ priv->size_changed = TRUE;
+ }
+
+ priv->has_entrypoint = TRUE;
+ priv->closed_entry = entrypoint_hdr->closed_entry;
+ priv->broken_link = entrypoint_hdr->broken_link;
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
/* Reconstruct bitstream PTYPE (7.1.1.4, index into Table-35) */
static guint
-get_PTYPE(guint ptype)
+get_PTYPE (guint ptype)
{
- switch (ptype) {
- case GST_VC1_PICTURE_TYPE_I: return 0;
- case GST_VC1_PICTURE_TYPE_P: return 1;
- case GST_VC1_PICTURE_TYPE_B: return 2;
- case GST_VC1_PICTURE_TYPE_BI: return 3;
- }
- return 4; /* skipped P-frame */
+ switch (ptype) {
+ case GST_VC1_PICTURE_TYPE_I:
+ return 0;
+ case GST_VC1_PICTURE_TYPE_P:
+ return 1;
+ case GST_VC1_PICTURE_TYPE_B:
+ return 2;
+ case GST_VC1_PICTURE_TYPE_BI:
+ return 3;
+ }
+ return 4; /* skipped P-frame */
}
/* Reconstruct bitstream BFRACTION (7.1.1.14, index into Table-40) */
static guint
-get_BFRACTION(guint bfraction)
+get_BFRACTION (guint bfraction)
{
- guint i;
+ guint i;
+
+ static const struct
+ {
+ guint16 index;
+ guint16 value;
+ }
+ bfraction_map[] = {
+ {
+ 0, GST_VC1_BFRACTION_BASIS / 2}, {
+ 1, GST_VC1_BFRACTION_BASIS / 3}, {
+ 2, (GST_VC1_BFRACTION_BASIS * 2) / 3}, {
+ 3, GST_VC1_BFRACTION_BASIS / 4}, {
+ 4, (GST_VC1_BFRACTION_BASIS * 3) / 4}, {
+ 5, GST_VC1_BFRACTION_BASIS / 5}, {
+ 6, (GST_VC1_BFRACTION_BASIS * 2) / 5}, {
+ 7, (GST_VC1_BFRACTION_BASIS * 3) / 5}, {
+ 8, (GST_VC1_BFRACTION_BASIS * 4) / 5}, {
+ 9, GST_VC1_BFRACTION_BASIS / 6}, {
+ 10, (GST_VC1_BFRACTION_BASIS * 5) / 6}, {
+ 11, GST_VC1_BFRACTION_BASIS / 7}, {
+ 12, (GST_VC1_BFRACTION_BASIS * 2) / 7}, {
+ 13, (GST_VC1_BFRACTION_BASIS * 3) / 7}, {
+ 14, (GST_VC1_BFRACTION_BASIS * 4) / 7}, {
+ 15, (GST_VC1_BFRACTION_BASIS * 5) / 7}, {
+ 16, (GST_VC1_BFRACTION_BASIS * 6) / 7}, {
+ 17, GST_VC1_BFRACTION_BASIS / 8}, {
+ 18, (GST_VC1_BFRACTION_BASIS * 3) / 8}, {
+ 19, (GST_VC1_BFRACTION_BASIS * 5) / 8}, {
+ 20, (GST_VC1_BFRACTION_BASIS * 7) / 8}, {
+ 21, GST_VC1_BFRACTION_RESERVED}, {
+ 22, GST_VC1_BFRACTION_PTYPE_BI}
+ };
+
+ if (!bfraction)
+ return 0;
- static const struct {
- guint16 index;
- guint16 value;
- }
- bfraction_map[] = {
- { 0, GST_VC1_BFRACTION_BASIS / 2 },
- { 1, GST_VC1_BFRACTION_BASIS / 3 },
- { 2, (GST_VC1_BFRACTION_BASIS * 2) / 3 },
- { 3, GST_VC1_BFRACTION_BASIS / 4 },
- { 4, (GST_VC1_BFRACTION_BASIS * 3) / 4 },
- { 5, GST_VC1_BFRACTION_BASIS / 5 },
- { 6, (GST_VC1_BFRACTION_BASIS * 2) / 5 },
- { 7, (GST_VC1_BFRACTION_BASIS * 3) / 5 },
- { 8, (GST_VC1_BFRACTION_BASIS * 4) / 5 },
- { 9, GST_VC1_BFRACTION_BASIS / 6 },
- { 10, (GST_VC1_BFRACTION_BASIS * 5) / 6 },
- { 11, GST_VC1_BFRACTION_BASIS / 7 },
- { 12, (GST_VC1_BFRACTION_BASIS * 2) / 7 },
- { 13, (GST_VC1_BFRACTION_BASIS * 3) / 7 },
- { 14, (GST_VC1_BFRACTION_BASIS * 4) / 7 },
- { 15, (GST_VC1_BFRACTION_BASIS * 5) / 7 },
- { 16, (GST_VC1_BFRACTION_BASIS * 6) / 7 },
- { 17, GST_VC1_BFRACTION_BASIS / 8 },
- { 18, (GST_VC1_BFRACTION_BASIS * 3) / 8 },
- { 19, (GST_VC1_BFRACTION_BASIS * 5) / 8 },
- { 20, (GST_VC1_BFRACTION_BASIS * 7) / 8 },
- { 21, GST_VC1_BFRACTION_RESERVED },
- { 22, GST_VC1_BFRACTION_PTYPE_BI }
- };
-
- if (!bfraction)
- return 0;
-
- for (i = 0; i < G_N_ELEMENTS(bfraction_map); i++) {
- if (bfraction_map[i].value == bfraction)
- return bfraction_map[i].index;
- }
- return 21; /* RESERVED */
+ for (i = 0; i < G_N_ELEMENTS (bfraction_map); i++) {
+ if (bfraction_map[i].value == bfraction)
+ return bfraction_map[i].index;
+ }
+ return 21; /* RESERVED */
}
/* Translate GStreamer MV modes to VA-API */
static guint
-get_VAMvModeVC1(guint mvmode)
+get_VAMvModeVC1 (guint mvmode)
{
- switch (mvmode) {
- case GST_VC1_MVMODE_1MV_HPEL_BILINEAR: return VAMvMode1MvHalfPelBilinear;
- case GST_VC1_MVMODE_1MV: return VAMvMode1Mv;
- case GST_VC1_MVMODE_1MV_HPEL: return VAMvMode1MvHalfPel;
- case GST_VC1_MVMODE_MIXED_MV: return VAMvModeMixedMv;
- case GST_VC1_MVMODE_INTENSITY_COMP: return VAMvModeIntensityCompensation;
- }
- return 0;
+ switch (mvmode) {
+ case GST_VC1_MVMODE_1MV_HPEL_BILINEAR:
+ return VAMvMode1MvHalfPelBilinear;
+ case GST_VC1_MVMODE_1MV:
+ return VAMvMode1Mv;
+ case GST_VC1_MVMODE_1MV_HPEL:
+ return VAMvMode1MvHalfPel;
+ case GST_VC1_MVMODE_MIXED_MV:
+ return VAMvModeMixedMv;
+ case GST_VC1_MVMODE_INTENSITY_COMP:
+ return VAMvModeIntensityCompensation;
+ }
+ return 0;
}
/* Reconstruct bitstream MVMODE (7.1.1.32) */
static guint
-get_MVMODE(GstVC1FrameHdr *frame_hdr)
+get_MVMODE (GstVC1FrameHdr * frame_hdr)
{
- guint mvmode;
+ guint mvmode;
- if (frame_hdr->profile == GST_VC1_PROFILE_ADVANCED)
- mvmode = frame_hdr->pic.advanced.mvmode;
- else
- mvmode = frame_hdr->pic.simple.mvmode;
+ if (frame_hdr->profile == GST_VC1_PROFILE_ADVANCED)
+ mvmode = frame_hdr->pic.advanced.mvmode;
+ else
+ mvmode = frame_hdr->pic.simple.mvmode;
- if (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_P ||
- frame_hdr->ptype == GST_VC1_PICTURE_TYPE_B)
- return get_VAMvModeVC1(mvmode);
- return 0;
+ if (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_P ||
+ frame_hdr->ptype == GST_VC1_PICTURE_TYPE_B)
+ return get_VAMvModeVC1 (mvmode);
+ return 0;
}
/* Reconstruct bitstream MVMODE2 (7.1.1.33) */
static guint
-get_MVMODE2(GstVC1FrameHdr *frame_hdr)
+get_MVMODE2 (GstVC1FrameHdr * frame_hdr)
{
- guint mvmode, mvmode2;
-
- if (frame_hdr->profile == GST_VC1_PROFILE_ADVANCED) {
- mvmode = frame_hdr->pic.advanced.mvmode;
- mvmode2 = frame_hdr->pic.advanced.mvmode2;
- }
- else {
- mvmode = frame_hdr->pic.simple.mvmode;
- mvmode2 = frame_hdr->pic.simple.mvmode2;
- }
-
- if (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_P &&
- mvmode == GST_VC1_MVMODE_INTENSITY_COMP)
- return get_VAMvModeVC1(mvmode2);
- return 0;
+ guint mvmode, mvmode2;
+
+ if (frame_hdr->profile == GST_VC1_PROFILE_ADVANCED) {
+ mvmode = frame_hdr->pic.advanced.mvmode;
+ mvmode2 = frame_hdr->pic.advanced.mvmode2;
+ } else {
+ mvmode = frame_hdr->pic.simple.mvmode;
+ mvmode2 = frame_hdr->pic.simple.mvmode2;
+ }
+
+ if (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_P &&
+ mvmode == GST_VC1_MVMODE_INTENSITY_COMP)
+ return get_VAMvModeVC1 (mvmode2);
+ return 0;
}
static inline int
-has_MVTYPEMB_bitplane(GstVaapiDecoderVC1 *decoder)
+has_MVTYPEMB_bitplane (GstVaapiDecoderVC1 * decoder)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVC1SeqHdr * const seq_hdr = &priv->seq_hdr;
- GstVC1FrameHdr * const frame_hdr = &priv->frame_hdr;
- guint mvmode, mvmode2;
-
- if (seq_hdr->profile == GST_VC1_PROFILE_ADVANCED) {
- GstVC1PicAdvanced * const pic = &frame_hdr->pic.advanced;
- if (pic->mvtypemb)
- return 0;
- mvmode = pic->mvmode;
- mvmode2 = pic->mvmode2;
- }
- else {
- GstVC1PicSimpleMain * const pic = &frame_hdr->pic.simple;
- if (pic->mvtypemb)
- return 0;
- mvmode = pic->mvmode;
- mvmode2 = pic->mvmode2;
- }
- return (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_P &&
- (mvmode == GST_VC1_MVMODE_MIXED_MV ||
- (mvmode == GST_VC1_MVMODE_INTENSITY_COMP &&
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVC1SeqHdr *const seq_hdr = &priv->seq_hdr;
+ GstVC1FrameHdr *const frame_hdr = &priv->frame_hdr;
+ guint mvmode, mvmode2;
+
+ if (seq_hdr->profile == GST_VC1_PROFILE_ADVANCED) {
+ GstVC1PicAdvanced *const pic = &frame_hdr->pic.advanced;
+ if (pic->mvtypemb)
+ return 0;
+ mvmode = pic->mvmode;
+ mvmode2 = pic->mvmode2;
+ } else {
+ GstVC1PicSimpleMain *const pic = &frame_hdr->pic.simple;
+ if (pic->mvtypemb)
+ return 0;
+ mvmode = pic->mvmode;
+ mvmode2 = pic->mvmode2;
+ }
+ return (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_P &&
+ (mvmode == GST_VC1_MVMODE_MIXED_MV ||
+ (mvmode == GST_VC1_MVMODE_INTENSITY_COMP &&
mvmode2 == GST_VC1_MVMODE_MIXED_MV)));
}
static inline int
-has_SKIPMB_bitplane(GstVaapiDecoderVC1 *decoder)
+has_SKIPMB_bitplane (GstVaapiDecoderVC1 * decoder)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVC1SeqHdr * const seq_hdr = &priv->seq_hdr;
- GstVC1FrameHdr * const frame_hdr = &priv->frame_hdr;
-
- if (seq_hdr->profile == GST_VC1_PROFILE_ADVANCED) {
- GstVC1PicAdvanced * const pic = &frame_hdr->pic.advanced;
- if (pic->skipmb)
- return 0;
- }
- else {
- GstVC1PicSimpleMain * const pic = &frame_hdr->pic.simple;
- if (pic->skipmb)
- return 0;
- }
- return (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_P ||
- frame_hdr->ptype == GST_VC1_PICTURE_TYPE_B);
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVC1SeqHdr *const seq_hdr = &priv->seq_hdr;
+ GstVC1FrameHdr *const frame_hdr = &priv->frame_hdr;
+
+ if (seq_hdr->profile == GST_VC1_PROFILE_ADVANCED) {
+ GstVC1PicAdvanced *const pic = &frame_hdr->pic.advanced;
+ if (pic->skipmb)
+ return 0;
+ } else {
+ GstVC1PicSimpleMain *const pic = &frame_hdr->pic.simple;
+ if (pic->skipmb)
+ return 0;
+ }
+ return (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_P ||
+ frame_hdr->ptype == GST_VC1_PICTURE_TYPE_B);
}
static inline int
-has_DIRECTMB_bitplane(GstVaapiDecoderVC1 *decoder)
+has_DIRECTMB_bitplane (GstVaapiDecoderVC1 * decoder)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVC1SeqHdr * const seq_hdr = &priv->seq_hdr;
- GstVC1FrameHdr * const frame_hdr = &priv->frame_hdr;
-
- if (seq_hdr->profile == GST_VC1_PROFILE_ADVANCED) {
- GstVC1PicAdvanced * const pic = &frame_hdr->pic.advanced;
- if (pic->directmb)
- return 0;
- }
- else {
- GstVC1PicSimpleMain * const pic = &frame_hdr->pic.simple;
- if (pic->directmb)
- return 0;
- }
- return frame_hdr->ptype == GST_VC1_PICTURE_TYPE_B;
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVC1SeqHdr *const seq_hdr = &priv->seq_hdr;
+ GstVC1FrameHdr *const frame_hdr = &priv->frame_hdr;
+
+ if (seq_hdr->profile == GST_VC1_PROFILE_ADVANCED) {
+ GstVC1PicAdvanced *const pic = &frame_hdr->pic.advanced;
+ if (pic->directmb)
+ return 0;
+ } else {
+ GstVC1PicSimpleMain *const pic = &frame_hdr->pic.simple;
+ if (pic->directmb)
+ return 0;
+ }
+ return frame_hdr->ptype == GST_VC1_PICTURE_TYPE_B;
}
static inline int
-has_ACPRED_bitplane(GstVaapiDecoderVC1 *decoder)
+has_ACPRED_bitplane (GstVaapiDecoderVC1 * decoder)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVC1SeqHdr * const seq_hdr = &priv->seq_hdr;
- GstVC1FrameHdr * const frame_hdr = &priv->frame_hdr;
- GstVC1PicAdvanced * const pic = &frame_hdr->pic.advanced;
-
- if (seq_hdr->profile != GST_VC1_PROFILE_ADVANCED)
- return 0;
- if (pic->acpred)
- return 0;
- return (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_I ||
- frame_hdr->ptype == GST_VC1_PICTURE_TYPE_BI);
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVC1SeqHdr *const seq_hdr = &priv->seq_hdr;
+ GstVC1FrameHdr *const frame_hdr = &priv->frame_hdr;
+ GstVC1PicAdvanced *const pic = &frame_hdr->pic.advanced;
+
+ if (seq_hdr->profile != GST_VC1_PROFILE_ADVANCED)
+ return 0;
+ if (pic->acpred)
+ return 0;
+ return (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_I ||
+ frame_hdr->ptype == GST_VC1_PICTURE_TYPE_BI);
}
static inline int
-has_OVERFLAGS_bitplane(GstVaapiDecoderVC1 *decoder)
+has_OVERFLAGS_bitplane (GstVaapiDecoderVC1 * decoder)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVC1SeqHdr * const seq_hdr = &priv->seq_hdr;
- GstVC1EntryPointHdr * const entrypoint_hdr = &priv->entrypoint_hdr;
- GstVC1FrameHdr * const frame_hdr = &priv->frame_hdr;
- GstVC1PicAdvanced * const pic = &frame_hdr->pic.advanced;
-
- if (seq_hdr->profile != GST_VC1_PROFILE_ADVANCED)
- return 0;
- if (pic->overflags)
- return 0;
- return ((frame_hdr->ptype == GST_VC1_PICTURE_TYPE_I ||
- frame_hdr->ptype == GST_VC1_PICTURE_TYPE_BI) &&
- (entrypoint_hdr->overlap && frame_hdr->pquant <= 8) &&
- pic->condover == GST_VC1_CONDOVER_SELECT);
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVC1SeqHdr *const seq_hdr = &priv->seq_hdr;
+ GstVC1EntryPointHdr *const entrypoint_hdr = &priv->entrypoint_hdr;
+ GstVC1FrameHdr *const frame_hdr = &priv->frame_hdr;
+ GstVC1PicAdvanced *const pic = &frame_hdr->pic.advanced;
+
+ if (seq_hdr->profile != GST_VC1_PROFILE_ADVANCED)
+ return 0;
+ if (pic->overflags)
+ return 0;
+ return ((frame_hdr->ptype == GST_VC1_PICTURE_TYPE_I ||
+ frame_hdr->ptype == GST_VC1_PICTURE_TYPE_BI) &&
+ (entrypoint_hdr->overlap && frame_hdr->pquant <= 8) &&
+ pic->condover == GST_VC1_CONDOVER_SELECT);
}
static inline void
-pack_bitplanes(GstVaapiBitPlane *bitplane, guint n, const guint8 *bitplanes[3], guint x, guint y, guint stride)
+pack_bitplanes (GstVaapiBitPlane * bitplane, guint n,
+ const guint8 * bitplanes[3], guint x, guint y, guint stride)
{
- const guint dst_index = n / 2;
- const guint src_index = y * stride + x;
- guint8 v = 0;
-
- if (bitplanes[0])
- v |= bitplanes[0][src_index];
- if (bitplanes[1])
- v |= bitplanes[1][src_index] << 1;
- if (bitplanes[2])
- v |= bitplanes[2][src_index] << 2;
- bitplane->data[dst_index] = (bitplane->data[dst_index] << 4) | v;
+ const guint dst_index = n / 2;
+ const guint src_index = y * stride + x;
+ guint8 v = 0;
+
+ if (bitplanes[0])
+ v |= bitplanes[0][src_index];
+ if (bitplanes[1])
+ v |= bitplanes[1][src_index] << 1;
+ if (bitplanes[2])
+ v |= bitplanes[2][src_index] << 2;
+ bitplane->data[dst_index] = (bitplane->data[dst_index] << 4) | v;
}
static gboolean
-fill_picture_structc(GstVaapiDecoderVC1 *decoder, GstVaapiPicture *picture)
+fill_picture_structc (GstVaapiDecoderVC1 * decoder, GstVaapiPicture * picture)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- VAPictureParameterBufferVC1 * const pic_param = picture->param;
- GstVC1SeqStructC * const structc = &priv->seq_hdr.struct_c;
- GstVC1FrameHdr * const frame_hdr = &priv->frame_hdr;
- GstVC1PicSimpleMain * const pic = &frame_hdr->pic.simple;
-
- /* Fill in VAPictureParameterBufferVC1 (simple/main profile bits) */
- pic_param->sequence_fields.bits.finterpflag = structc->finterpflag;
- pic_param->sequence_fields.bits.multires = structc->multires;
- pic_param->sequence_fields.bits.overlap = structc->overlap;
- pic_param->sequence_fields.bits.syncmarker = structc->syncmarker;
- pic_param->sequence_fields.bits.rangered = structc->rangered;
- pic_param->sequence_fields.bits.max_b_frames = structc->maxbframes;
- pic_param->conditional_overlap_flag = 0; /* advanced profile only */
- pic_param->fast_uvmc_flag = structc->fastuvmc;
- pic_param->b_picture_fraction = get_BFRACTION(pic->bfraction);
- pic_param->cbp_table = pic->cbptab;
- pic_param->mb_mode_table = 0; /* XXX: interlaced frame */
- pic_param->range_reduction_frame = pic->rangeredfrm;
- pic_param->post_processing = 0; /* advanced profile only */
- pic_param->picture_resolution_index = pic->respic;
- pic_param->luma_scale = pic->lumscale;
- pic_param->luma_shift = pic->lumshift;
- pic_param->raw_coding.flags.mv_type_mb = pic->mvtypemb;
- pic_param->raw_coding.flags.direct_mb = pic->directmb;
- pic_param->raw_coding.flags.skip_mb = pic->skipmb;
- pic_param->bitplane_present.flags.bp_mv_type_mb = has_MVTYPEMB_bitplane(decoder);
- pic_param->bitplane_present.flags.bp_direct_mb = has_DIRECTMB_bitplane(decoder);
- pic_param->bitplane_present.flags.bp_skip_mb = has_SKIPMB_bitplane(decoder);
- pic_param->mv_fields.bits.mv_table = pic->mvtab;
- pic_param->mv_fields.bits.extended_mv_flag = structc->extended_mv;
- pic_param->mv_fields.bits.extended_mv_range = pic->mvrange;
- pic_param->transform_fields.bits.variable_sized_transform_flag = structc->vstransform;
- pic_param->transform_fields.bits.mb_level_transform_type_flag = pic->ttmbf;
- pic_param->transform_fields.bits.frame_level_transform_type = pic->ttfrm;
- pic_param->transform_fields.bits.transform_ac_codingset_idx2 = pic->transacfrm2;
-
- /* Refer to 8.3.7 Rounding control for Simple and Main Profile */
- if (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_I ||
- frame_hdr->ptype == GST_VC1_PICTURE_TYPE_BI)
- priv->rndctrl = 1;
- else if (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_P)
- priv->rndctrl ^= 1;
-
- pic_param->rounding_control = priv->rndctrl;
-
- return TRUE;
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ VAPictureParameterBufferVC1 *const pic_param = picture->param;
+ GstVC1SeqStructC *const structc = &priv->seq_hdr.struct_c;
+ GstVC1FrameHdr *const frame_hdr = &priv->frame_hdr;
+ GstVC1PicSimpleMain *const pic = &frame_hdr->pic.simple;
+
+ /* Fill in VAPictureParameterBufferVC1 (simple/main profile bits) */
+ pic_param->sequence_fields.bits.finterpflag = structc->finterpflag;
+ pic_param->sequence_fields.bits.multires = structc->multires;
+ pic_param->sequence_fields.bits.overlap = structc->overlap;
+ pic_param->sequence_fields.bits.syncmarker = structc->syncmarker;
+ pic_param->sequence_fields.bits.rangered = structc->rangered;
+ pic_param->sequence_fields.bits.max_b_frames = structc->maxbframes;
+ pic_param->conditional_overlap_flag = 0; /* advanced profile only */
+ pic_param->fast_uvmc_flag = structc->fastuvmc;
+ pic_param->b_picture_fraction = get_BFRACTION (pic->bfraction);
+ pic_param->cbp_table = pic->cbptab;
+ pic_param->mb_mode_table = 0; /* XXX: interlaced frame */
+ pic_param->range_reduction_frame = pic->rangeredfrm;
+ pic_param->post_processing = 0; /* advanced profile only */
+ pic_param->picture_resolution_index = pic->respic;
+ pic_param->luma_scale = pic->lumscale;
+ pic_param->luma_shift = pic->lumshift;
+ pic_param->raw_coding.flags.mv_type_mb = pic->mvtypemb;
+ pic_param->raw_coding.flags.direct_mb = pic->directmb;
+ pic_param->raw_coding.flags.skip_mb = pic->skipmb;
+ pic_param->bitplane_present.flags.bp_mv_type_mb =
+ has_MVTYPEMB_bitplane (decoder);
+ pic_param->bitplane_present.flags.bp_direct_mb =
+ has_DIRECTMB_bitplane (decoder);
+ pic_param->bitplane_present.flags.bp_skip_mb = has_SKIPMB_bitplane (decoder);
+ pic_param->mv_fields.bits.mv_table = pic->mvtab;
+ pic_param->mv_fields.bits.extended_mv_flag = structc->extended_mv;
+ pic_param->mv_fields.bits.extended_mv_range = pic->mvrange;
+ pic_param->transform_fields.bits.variable_sized_transform_flag =
+ structc->vstransform;
+ pic_param->transform_fields.bits.mb_level_transform_type_flag = pic->ttmbf;
+ pic_param->transform_fields.bits.frame_level_transform_type = pic->ttfrm;
+ pic_param->transform_fields.bits.transform_ac_codingset_idx2 =
+ pic->transacfrm2;
+
+ /* Refer to 8.3.7 Rounding control for Simple and Main Profile */
+ if (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_I ||
+ frame_hdr->ptype == GST_VC1_PICTURE_TYPE_BI)
+ priv->rndctrl = 1;
+ else if (frame_hdr->ptype == GST_VC1_PICTURE_TYPE_P)
+ priv->rndctrl ^= 1;
+
+ pic_param->rounding_control = priv->rndctrl;
+
+ return TRUE;
}
static gboolean
-fill_picture_advanced(GstVaapiDecoderVC1 *decoder, GstVaapiPicture *picture)
+fill_picture_advanced (GstVaapiDecoderVC1 * decoder, GstVaapiPicture * picture)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- VAPictureParameterBufferVC1 * const pic_param = picture->param;
- GstVC1AdvancedSeqHdr * const adv_hdr = &priv->seq_hdr.advanced;
- GstVC1EntryPointHdr * const entrypoint_hdr = &priv->entrypoint_hdr;
- GstVC1FrameHdr * const frame_hdr = &priv->frame_hdr;
- GstVC1PicAdvanced * const pic = &frame_hdr->pic.advanced;
-
- if (!priv->has_entrypoint)
- return FALSE;
-
- /* Fill in VAPictureParameterBufferVC1 (advanced profile bits) */
- pic_param->sequence_fields.bits.pulldown = adv_hdr->pulldown;
- pic_param->sequence_fields.bits.interlace = adv_hdr->interlace;
- pic_param->sequence_fields.bits.tfcntrflag = adv_hdr->tfcntrflag;
- pic_param->sequence_fields.bits.finterpflag = adv_hdr->finterpflag;
- pic_param->sequence_fields.bits.psf = adv_hdr->psf;
- pic_param->sequence_fields.bits.overlap = entrypoint_hdr->overlap;
- pic_param->entrypoint_fields.bits.broken_link = entrypoint_hdr->broken_link;
- pic_param->entrypoint_fields.bits.closed_entry = entrypoint_hdr->closed_entry;
- pic_param->entrypoint_fields.bits.panscan_flag = entrypoint_hdr->panscan_flag;
- pic_param->entrypoint_fields.bits.loopfilter = entrypoint_hdr->loopfilter;
- pic_param->conditional_overlap_flag = pic->condover;
- pic_param->fast_uvmc_flag = entrypoint_hdr->fastuvmc;
- pic_param->range_mapping_fields.bits.luma_flag = entrypoint_hdr->range_mapy_flag;
- pic_param->range_mapping_fields.bits.luma = entrypoint_hdr->range_mapy;
- pic_param->range_mapping_fields.bits.chroma_flag = entrypoint_hdr->range_mapuv_flag;
- pic_param->range_mapping_fields.bits.chroma = entrypoint_hdr->range_mapuv;
- pic_param->b_picture_fraction = get_BFRACTION(pic->bfraction);
- pic_param->cbp_table = pic->cbptab;
- pic_param->mb_mode_table = 0; /* XXX: interlaced frame */
- pic_param->range_reduction_frame = 0; /* simple/main profile only */
- pic_param->rounding_control = pic->rndctrl;
- pic_param->post_processing = pic->postproc;
- pic_param->picture_resolution_index = 0; /* simple/main profile only */
- pic_param->luma_scale = pic->lumscale;
- pic_param->luma_shift = pic->lumshift;
- pic_param->picture_fields.bits.frame_coding_mode = pic->fcm;
- pic_param->picture_fields.bits.top_field_first = pic->tff;
- pic_param->picture_fields.bits.is_first_field = pic->fcm == 0; /* XXX: interlaced frame */
- pic_param->picture_fields.bits.intensity_compensation = pic->mvmode == GST_VC1_MVMODE_INTENSITY_COMP;
- pic_param->raw_coding.flags.mv_type_mb = pic->mvtypemb;
- pic_param->raw_coding.flags.direct_mb = pic->directmb;
- pic_param->raw_coding.flags.skip_mb = pic->skipmb;
- pic_param->raw_coding.flags.ac_pred = pic->acpred;
- pic_param->raw_coding.flags.overflags = pic->overflags;
- pic_param->bitplane_present.flags.bp_mv_type_mb = has_MVTYPEMB_bitplane(decoder);
- pic_param->bitplane_present.flags.bp_direct_mb = has_DIRECTMB_bitplane(decoder);
- pic_param->bitplane_present.flags.bp_skip_mb = has_SKIPMB_bitplane(decoder);
- pic_param->bitplane_present.flags.bp_ac_pred = has_ACPRED_bitplane(decoder);
- pic_param->bitplane_present.flags.bp_overflags = has_OVERFLAGS_bitplane(decoder);
- pic_param->reference_fields.bits.reference_distance_flag = entrypoint_hdr->refdist_flag;
- pic_param->mv_fields.bits.mv_table = pic->mvtab;
- pic_param->mv_fields.bits.extended_mv_flag = entrypoint_hdr->extended_mv;
- pic_param->mv_fields.bits.extended_mv_range = pic->mvrange;
- pic_param->mv_fields.bits.extended_dmv_flag = entrypoint_hdr->extended_dmv;
- pic_param->pic_quantizer_fields.bits.dquant = entrypoint_hdr->dquant;
- pic_param->pic_quantizer_fields.bits.quantizer = entrypoint_hdr->quantizer;
- pic_param->transform_fields.bits.variable_sized_transform_flag = entrypoint_hdr->vstransform;
- pic_param->transform_fields.bits.mb_level_transform_type_flag = pic->ttmbf;
- pic_param->transform_fields.bits.frame_level_transform_type = pic->ttfrm;
- pic_param->transform_fields.bits.transform_ac_codingset_idx2 = pic->transacfrm2;
- return TRUE;
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ VAPictureParameterBufferVC1 *const pic_param = picture->param;
+ GstVC1AdvancedSeqHdr *const adv_hdr = &priv->seq_hdr.advanced;
+ GstVC1EntryPointHdr *const entrypoint_hdr = &priv->entrypoint_hdr;
+ GstVC1FrameHdr *const frame_hdr = &priv->frame_hdr;
+ GstVC1PicAdvanced *const pic = &frame_hdr->pic.advanced;
+
+ if (!priv->has_entrypoint)
+ return FALSE;
+
+ /* Fill in VAPictureParameterBufferVC1 (advanced profile bits) */
+ pic_param->sequence_fields.bits.pulldown = adv_hdr->pulldown;
+ pic_param->sequence_fields.bits.interlace = adv_hdr->interlace;
+ pic_param->sequence_fields.bits.tfcntrflag = adv_hdr->tfcntrflag;
+ pic_param->sequence_fields.bits.finterpflag = adv_hdr->finterpflag;
+ pic_param->sequence_fields.bits.psf = adv_hdr->psf;
+ pic_param->sequence_fields.bits.overlap = entrypoint_hdr->overlap;
+ pic_param->entrypoint_fields.bits.broken_link = entrypoint_hdr->broken_link;
+ pic_param->entrypoint_fields.bits.closed_entry = entrypoint_hdr->closed_entry;
+ pic_param->entrypoint_fields.bits.panscan_flag = entrypoint_hdr->panscan_flag;
+ pic_param->entrypoint_fields.bits.loopfilter = entrypoint_hdr->loopfilter;
+ pic_param->conditional_overlap_flag = pic->condover;
+ pic_param->fast_uvmc_flag = entrypoint_hdr->fastuvmc;
+ pic_param->range_mapping_fields.bits.luma_flag =
+ entrypoint_hdr->range_mapy_flag;
+ pic_param->range_mapping_fields.bits.luma = entrypoint_hdr->range_mapy;
+ pic_param->range_mapping_fields.bits.chroma_flag =
+ entrypoint_hdr->range_mapuv_flag;
+ pic_param->range_mapping_fields.bits.chroma = entrypoint_hdr->range_mapuv;
+ pic_param->b_picture_fraction = get_BFRACTION (pic->bfraction);
+ pic_param->cbp_table = pic->cbptab;
+ pic_param->mb_mode_table = 0; /* XXX: interlaced frame */
+ pic_param->range_reduction_frame = 0; /* simple/main profile only */
+ pic_param->rounding_control = pic->rndctrl;
+ pic_param->post_processing = pic->postproc;
+ pic_param->picture_resolution_index = 0; /* simple/main profile only */
+ pic_param->luma_scale = pic->lumscale;
+ pic_param->luma_shift = pic->lumshift;
+ pic_param->picture_fields.bits.frame_coding_mode = pic->fcm;
+ pic_param->picture_fields.bits.top_field_first = pic->tff;
+ pic_param->picture_fields.bits.is_first_field = pic->fcm == 0; /* XXX: interlaced frame */
+ pic_param->picture_fields.bits.intensity_compensation =
+ pic->mvmode == GST_VC1_MVMODE_INTENSITY_COMP;
+ pic_param->raw_coding.flags.mv_type_mb = pic->mvtypemb;
+ pic_param->raw_coding.flags.direct_mb = pic->directmb;
+ pic_param->raw_coding.flags.skip_mb = pic->skipmb;
+ pic_param->raw_coding.flags.ac_pred = pic->acpred;
+ pic_param->raw_coding.flags.overflags = pic->overflags;
+ pic_param->bitplane_present.flags.bp_mv_type_mb =
+ has_MVTYPEMB_bitplane (decoder);
+ pic_param->bitplane_present.flags.bp_direct_mb =
+ has_DIRECTMB_bitplane (decoder);
+ pic_param->bitplane_present.flags.bp_skip_mb = has_SKIPMB_bitplane (decoder);
+ pic_param->bitplane_present.flags.bp_ac_pred = has_ACPRED_bitplane (decoder);
+ pic_param->bitplane_present.flags.bp_overflags =
+ has_OVERFLAGS_bitplane (decoder);
+ pic_param->reference_fields.bits.reference_distance_flag =
+ entrypoint_hdr->refdist_flag;
+ pic_param->mv_fields.bits.mv_table = pic->mvtab;
+ pic_param->mv_fields.bits.extended_mv_flag = entrypoint_hdr->extended_mv;
+ pic_param->mv_fields.bits.extended_mv_range = pic->mvrange;
+ pic_param->mv_fields.bits.extended_dmv_flag = entrypoint_hdr->extended_dmv;
+ pic_param->pic_quantizer_fields.bits.dquant = entrypoint_hdr->dquant;
+ pic_param->pic_quantizer_fields.bits.quantizer = entrypoint_hdr->quantizer;
+ pic_param->transform_fields.bits.variable_sized_transform_flag =
+ entrypoint_hdr->vstransform;
+ pic_param->transform_fields.bits.mb_level_transform_type_flag = pic->ttmbf;
+ pic_param->transform_fields.bits.frame_level_transform_type = pic->ttfrm;
+ pic_param->transform_fields.bits.transform_ac_codingset_idx2 =
+ pic->transacfrm2;
+ return TRUE;
}
static gboolean
-fill_picture(GstVaapiDecoderVC1 *decoder, GstVaapiPicture *picture)
+fill_picture (GstVaapiDecoderVC1 * decoder, GstVaapiPicture * picture)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- VAPictureParameterBufferVC1 * const pic_param = picture->param;
- GstVC1SeqHdr * const seq_hdr = &priv->seq_hdr;
- GstVC1FrameHdr * const frame_hdr = &priv->frame_hdr;
- GstVC1VopDquant * const vopdquant = &frame_hdr->vopdquant;
- GstVaapiPicture *prev_picture, *next_picture;
-
- /* Fill in VAPictureParameterBufferVC1 (common fields) */
- pic_param->forward_reference_picture = VA_INVALID_ID;
- pic_param->backward_reference_picture = VA_INVALID_ID;
- pic_param->inloop_decoded_picture = VA_INVALID_ID;
- pic_param->sequence_fields.value = 0;
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ VAPictureParameterBufferVC1 *const pic_param = picture->param;
+ GstVC1SeqHdr *const seq_hdr = &priv->seq_hdr;
+ GstVC1FrameHdr *const frame_hdr = &priv->frame_hdr;
+ GstVC1VopDquant *const vopdquant = &frame_hdr->vopdquant;
+ GstVaapiPicture *prev_picture, *next_picture;
+
+ /* Fill in VAPictureParameterBufferVC1 (common fields) */
+ pic_param->forward_reference_picture = VA_INVALID_ID;
+ pic_param->backward_reference_picture = VA_INVALID_ID;
+ pic_param->inloop_decoded_picture = VA_INVALID_ID;
+ pic_param->sequence_fields.value = 0;
#if VA_CHECK_VERSION(0,32,0)
- pic_param->sequence_fields.bits.profile = seq_hdr->profile;
+ pic_param->sequence_fields.bits.profile = seq_hdr->profile;
#endif
- pic_param->coded_width = priv->width;
- pic_param->coded_height = priv->height;
- pic_param->entrypoint_fields.value = 0;
- pic_param->range_mapping_fields.value = 0;
- pic_param->picture_fields.value = 0;
- pic_param->picture_fields.bits.picture_type = get_PTYPE(frame_hdr->ptype);
- pic_param->raw_coding.value = 0;
- pic_param->bitplane_present.value = 0;
- pic_param->reference_fields.value = 0;
- pic_param->mv_fields.value = 0;
- pic_param->mv_fields.bits.mv_mode = get_MVMODE(frame_hdr);
- pic_param->mv_fields.bits.mv_mode2 = get_MVMODE2(frame_hdr);
- pic_param->pic_quantizer_fields.value = 0;
- pic_param->pic_quantizer_fields.bits.half_qp = frame_hdr->halfqp;
- pic_param->pic_quantizer_fields.bits.pic_quantizer_scale = frame_hdr->pquant;
- pic_param->pic_quantizer_fields.bits.pic_quantizer_type = frame_hdr->pquantizer;
- pic_param->pic_quantizer_fields.bits.dq_frame = vopdquant->dquantfrm;
- pic_param->pic_quantizer_fields.bits.dq_profile = vopdquant->dqprofile;
- pic_param->pic_quantizer_fields.bits.dq_sb_edge = vopdquant->dqprofile == GST_VC1_DQPROFILE_SINGLE_EDGE ? vopdquant->dqbedge : 0;
- pic_param->pic_quantizer_fields.bits.dq_db_edge = vopdquant->dqprofile == GST_VC1_DQPROFILE_DOUBLE_EDGES ? vopdquant->dqbedge : 0;
- pic_param->pic_quantizer_fields.bits.dq_binary_level = vopdquant->dqbilevel;
- pic_param->pic_quantizer_fields.bits.alt_pic_quantizer = vopdquant->altpquant;
- pic_param->transform_fields.value = 0;
- pic_param->transform_fields.bits.transform_ac_codingset_idx1 = frame_hdr->transacfrm;
- pic_param->transform_fields.bits.intra_transform_dc_table = frame_hdr->transdctab;
-
- if (seq_hdr->profile == GST_VC1_PROFILE_ADVANCED) {
- if (!fill_picture_advanced(decoder, picture))
- return FALSE;
- }
- else {
- if (!fill_picture_structc(decoder, picture))
- return FALSE;
- }
+ pic_param->coded_width = priv->width;
+ pic_param->coded_height = priv->height;
+ pic_param->entrypoint_fields.value = 0;
+ pic_param->range_mapping_fields.value = 0;
+ pic_param->picture_fields.value = 0;
+ pic_param->picture_fields.bits.picture_type = get_PTYPE (frame_hdr->ptype);
+ pic_param->raw_coding.value = 0;
+ pic_param->bitplane_present.value = 0;
+ pic_param->reference_fields.value = 0;
+ pic_param->mv_fields.value = 0;
+ pic_param->mv_fields.bits.mv_mode = get_MVMODE (frame_hdr);
+ pic_param->mv_fields.bits.mv_mode2 = get_MVMODE2 (frame_hdr);
+ pic_param->pic_quantizer_fields.value = 0;
+ pic_param->pic_quantizer_fields.bits.half_qp = frame_hdr->halfqp;
+ pic_param->pic_quantizer_fields.bits.pic_quantizer_scale = frame_hdr->pquant;
+ pic_param->pic_quantizer_fields.bits.pic_quantizer_type =
+ frame_hdr->pquantizer;
+ pic_param->pic_quantizer_fields.bits.dq_frame = vopdquant->dquantfrm;
+ pic_param->pic_quantizer_fields.bits.dq_profile = vopdquant->dqprofile;
+ pic_param->pic_quantizer_fields.bits.dq_sb_edge =
+ vopdquant->dqprofile ==
+ GST_VC1_DQPROFILE_SINGLE_EDGE ? vopdquant->dqbedge : 0;
+ pic_param->pic_quantizer_fields.bits.dq_db_edge =
+ vopdquant->dqprofile ==
+ GST_VC1_DQPROFILE_DOUBLE_EDGES ? vopdquant->dqbedge : 0;
+ pic_param->pic_quantizer_fields.bits.dq_binary_level = vopdquant->dqbilevel;
+ pic_param->pic_quantizer_fields.bits.alt_pic_quantizer = vopdquant->altpquant;
+ pic_param->transform_fields.value = 0;
+ pic_param->transform_fields.bits.transform_ac_codingset_idx1 =
+ frame_hdr->transacfrm;
+ pic_param->transform_fields.bits.intra_transform_dc_table =
+ frame_hdr->transdctab;
+
+ if (seq_hdr->profile == GST_VC1_PROFILE_ADVANCED) {
+ if (!fill_picture_advanced (decoder, picture))
+ return FALSE;
+ } else {
+ if (!fill_picture_structc (decoder, picture))
+ return FALSE;
+ }
+
+ gst_vaapi_dpb_get_neighbours (priv->dpb, picture,
+ &prev_picture, &next_picture);
+
+ switch (picture->type) {
+ case GST_VAAPI_PICTURE_TYPE_B:
+ if (next_picture)
+ pic_param->backward_reference_picture = next_picture->surface_id;
+ if (prev_picture)
+ pic_param->forward_reference_picture = prev_picture->surface_id;
+ else if (!priv->closed_entry)
+ GST_VAAPI_PICTURE_FLAG_SET (picture, GST_VAAPI_PICTURE_FLAG_SKIPPED);
+ break;
+ case GST_VAAPI_PICTURE_TYPE_P:
+ if (prev_picture)
+ pic_param->forward_reference_picture = prev_picture->surface_id;
+ break;
+ default:
+ break;
+ }
- gst_vaapi_dpb_get_neighbours(priv->dpb, picture,
- &prev_picture, &next_picture);
+ if (pic_param->bitplane_present.value) {
+ const guint8 *bitplanes[3];
+ guint x, y, n;
switch (picture->type) {
- case GST_VAAPI_PICTURE_TYPE_B:
- if (next_picture)
- pic_param->backward_reference_picture = next_picture->surface_id;
- if (prev_picture)
- pic_param->forward_reference_picture = prev_picture->surface_id;
- else if (!priv->closed_entry)
- GST_VAAPI_PICTURE_FLAG_SET(picture, GST_VAAPI_PICTURE_FLAG_SKIPPED);
+ case GST_VAAPI_PICTURE_TYPE_P:
+ bitplanes[0] = pic_param->bitplane_present.flags.bp_direct_mb ?
+ priv->bitplanes->directmb : NULL;
+ bitplanes[1] = pic_param->bitplane_present.flags.bp_skip_mb ?
+ priv->bitplanes->skipmb : NULL;
+ bitplanes[2] = pic_param->bitplane_present.flags.bp_mv_type_mb ?
+ priv->bitplanes->mvtypemb : NULL;
break;
- case GST_VAAPI_PICTURE_TYPE_P:
- if (prev_picture)
- pic_param->forward_reference_picture = prev_picture->surface_id;
+ case GST_VAAPI_PICTURE_TYPE_B:
+ bitplanes[0] = pic_param->bitplane_present.flags.bp_direct_mb ?
+ priv->bitplanes->directmb : NULL;
+ bitplanes[1] = pic_param->bitplane_present.flags.bp_skip_mb ?
+ priv->bitplanes->skipmb : NULL;
+ bitplanes[2] = NULL; /* XXX: interlaced frame (FORWARD plane) */
break;
- default:
+ case GST_VAAPI_PICTURE_TYPE_BI:
+ case GST_VAAPI_PICTURE_TYPE_I:
+ bitplanes[0] = NULL; /* XXX: interlaced frame (FIELDTX plane) */
+ bitplanes[1] = pic_param->bitplane_present.flags.bp_ac_pred ?
+ priv->bitplanes->acpred : NULL;
+ bitplanes[2] = pic_param->bitplane_present.flags.bp_overflags ?
+ priv->bitplanes->overflags : NULL;
+ break;
+ default:
+ bitplanes[0] = NULL;
+ bitplanes[1] = NULL;
+ bitplanes[2] = NULL;
break;
}
- if (pic_param->bitplane_present.value) {
- const guint8 *bitplanes[3];
- guint x, y, n;
-
- switch (picture->type) {
- case GST_VAAPI_PICTURE_TYPE_P:
- bitplanes[0] = pic_param->bitplane_present.flags.bp_direct_mb ? priv->bitplanes->directmb : NULL;
- bitplanes[1] = pic_param->bitplane_present.flags.bp_skip_mb ? priv->bitplanes->skipmb : NULL;
- bitplanes[2] = pic_param->bitplane_present.flags.bp_mv_type_mb ? priv->bitplanes->mvtypemb : NULL;
- break;
- case GST_VAAPI_PICTURE_TYPE_B:
- bitplanes[0] = pic_param->bitplane_present.flags.bp_direct_mb ? priv->bitplanes->directmb : NULL;
- bitplanes[1] = pic_param->bitplane_present.flags.bp_skip_mb ? priv->bitplanes->skipmb : NULL;
- bitplanes[2] = NULL; /* XXX: interlaced frame (FORWARD plane) */
- break;
- case GST_VAAPI_PICTURE_TYPE_BI:
- case GST_VAAPI_PICTURE_TYPE_I:
- bitplanes[0] = NULL; /* XXX: interlaced frame (FIELDTX plane) */
- bitplanes[1] = pic_param->bitplane_present.flags.bp_ac_pred ? priv->bitplanes->acpred : NULL;
- bitplanes[2] = pic_param->bitplane_present.flags.bp_overflags ? priv->bitplanes->overflags : NULL;
- break;
- default:
- bitplanes[0] = NULL;
- bitplanes[1] = NULL;
- bitplanes[2] = NULL;
- break;
- }
-
- picture->bitplane = GST_VAAPI_BITPLANE_NEW(
- decoder,
- (seq_hdr->mb_width * seq_hdr->mb_height + 1) / 2
- );
- if (!picture->bitplane)
- return FALSE;
-
- n = 0;
- for (y = 0; y < seq_hdr->mb_height; y++)
- for (x = 0; x < seq_hdr->mb_width; x++, n++)
- pack_bitplanes(picture->bitplane, n, bitplanes, x, y, seq_hdr->mb_stride);
- if (n & 1) /* move last nibble to the high order */
- picture->bitplane->data[n/2] <<= 4;
- }
- return TRUE;
+ picture->bitplane = GST_VAAPI_BITPLANE_NEW (decoder,
+ (seq_hdr->mb_width * seq_hdr->mb_height + 1) / 2);
+ if (!picture->bitplane)
+ return FALSE;
+
+ n = 0;
+ for (y = 0; y < seq_hdr->mb_height; y++)
+ for (x = 0; x < seq_hdr->mb_width; x++, n++)
+ pack_bitplanes (picture->bitplane, n, bitplanes, x, y,
+ seq_hdr->mb_stride);
+ if (n & 1) /* move last nibble to the high order */
+ picture->bitplane->data[n / 2] <<= 4;
+ }
+ return TRUE;
}
static GstVaapiDecoderStatus
-decode_slice_chunk(GstVaapiDecoderVC1 *decoder, GstVC1BDU *ebdu,
+decode_slice_chunk (GstVaapiDecoderVC1 * decoder, GstVC1BDU * ebdu,
guint slice_addr, guint header_size)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVaapiPicture * const picture = priv->current_picture;
- GstVaapiSlice *slice;
- VASliceParameterBufferVC1 *slice_param;
-
- slice = GST_VAAPI_SLICE_NEW(VC1, decoder,
- ebdu->data + ebdu->sc_offset,
- ebdu->size + ebdu->offset - ebdu->sc_offset);
- if (!slice) {
- GST_ERROR("failed to allocate slice");
- return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
- }
- gst_vaapi_picture_add_slice(picture, slice);
-
- /* Fill in VASliceParameterBufferVC1 */
- slice_param = slice->param;
- slice_param->macroblock_offset = 8 * (ebdu->offset - ebdu->sc_offset) +
- header_size;
- slice_param->slice_vertical_position = slice_addr;
- return GST_VAAPI_DECODER_STATUS_SUCCESS;
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVaapiPicture *const picture = priv->current_picture;
+ GstVaapiSlice *slice;
+ VASliceParameterBufferVC1 *slice_param;
+
+ slice = GST_VAAPI_SLICE_NEW (VC1, decoder,
+ ebdu->data + ebdu->sc_offset,
+ ebdu->size + ebdu->offset - ebdu->sc_offset);
+ if (!slice) {
+ GST_ERROR ("failed to allocate slice");
+ return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
+ }
+ gst_vaapi_picture_add_slice (picture, slice);
+
+ /* Fill in VASliceParameterBufferVC1 */
+ slice_param = slice->param;
+ slice_param->macroblock_offset = 8 * (ebdu->offset - ebdu->sc_offset) +
+ header_size;
+ slice_param->slice_vertical_position = slice_addr;
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
static GstVaapiDecoderStatus
-decode_frame(GstVaapiDecoderVC1 *decoder, GstVC1BDU *rbdu, GstVC1BDU *ebdu)
+decode_frame (GstVaapiDecoderVC1 * decoder, GstVC1BDU * rbdu, GstVC1BDU * ebdu)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVC1FrameHdr * const frame_hdr = &priv->frame_hdr;
- GstVC1ParserResult result;
- GstVaapiPicture * const picture = priv->current_picture;
-
- memset(frame_hdr, 0, sizeof(*frame_hdr));
- result = gst_vc1_parse_frame_header(
- rbdu->data + rbdu->offset,
- rbdu->size,
- frame_hdr,
- &priv->seq_hdr,
- priv->bitplanes
- );
- if (result != GST_VC1_PARSER_OK) {
- GST_ERROR("failed to parse frame layer");
- return get_status(result);
- }
-
- switch (frame_hdr->ptype) {
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVC1FrameHdr *const frame_hdr = &priv->frame_hdr;
+ GstVC1ParserResult result;
+ GstVaapiPicture *const picture = priv->current_picture;
+
+ memset (frame_hdr, 0, sizeof (*frame_hdr));
+ result = gst_vc1_parse_frame_header (rbdu->data + rbdu->offset,
+ rbdu->size, frame_hdr, &priv->seq_hdr, priv->bitplanes);
+ if (result != GST_VC1_PARSER_OK) {
+ GST_ERROR ("failed to parse frame layer");
+ return get_status (result);
+ }
+
+ switch (frame_hdr->ptype) {
case GST_VC1_PICTURE_TYPE_I:
- picture->type = GST_VAAPI_PICTURE_TYPE_I;
- GST_VAAPI_PICTURE_FLAG_SET(picture, GST_VAAPI_PICTURE_FLAG_REFERENCE);
- break;
+ picture->type = GST_VAAPI_PICTURE_TYPE_I;
+ GST_VAAPI_PICTURE_FLAG_SET (picture, GST_VAAPI_PICTURE_FLAG_REFERENCE);
+ break;
case GST_VC1_PICTURE_TYPE_SKIPPED:
case GST_VC1_PICTURE_TYPE_P:
- picture->type = GST_VAAPI_PICTURE_TYPE_P;
- GST_VAAPI_PICTURE_FLAG_SET(picture, GST_VAAPI_PICTURE_FLAG_REFERENCE);
- break;
+ picture->type = GST_VAAPI_PICTURE_TYPE_P;
+ GST_VAAPI_PICTURE_FLAG_SET (picture, GST_VAAPI_PICTURE_FLAG_REFERENCE);
+ break;
case GST_VC1_PICTURE_TYPE_B:
- picture->type = GST_VAAPI_PICTURE_TYPE_B;
- break;
+ picture->type = GST_VAAPI_PICTURE_TYPE_B;
+ break;
case GST_VC1_PICTURE_TYPE_BI:
- picture->type = GST_VAAPI_PICTURE_TYPE_BI;
- break;
+ picture->type = GST_VAAPI_PICTURE_TYPE_BI;
+ break;
default:
- GST_ERROR("unsupported picture type %d", frame_hdr->ptype);
- return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
- }
-
- /* Update presentation time */
- if (GST_VAAPI_PICTURE_IS_REFERENCE(picture)) {
- picture->poc = priv->last_non_b_picture ?
- (priv->last_non_b_picture->poc + 1) : priv->next_poc;
- priv->next_poc = picture->poc + 1;
- gst_vaapi_picture_replace(&priv->last_non_b_picture, picture);
- }
- else if (!priv->last_non_b_picture)
- picture->poc = priv->next_poc++;
- else { /* B or BI */
- picture->poc = priv->last_non_b_picture->poc++;
- priv->next_poc = priv->last_non_b_picture->poc + 1;
- }
- picture->pts = GST_VAAPI_DECODER_CODEC_FRAME(decoder)->pts;
-
- if (!fill_picture(decoder, picture))
- return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
- return decode_slice_chunk(decoder, ebdu, 0, frame_hdr->header_size);
+ GST_ERROR ("unsupported picture type %d", frame_hdr->ptype);
+ return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
+ }
+
+ /* Update presentation time */
+ if (GST_VAAPI_PICTURE_IS_REFERENCE (picture)) {
+ picture->poc = priv->last_non_b_picture ?
+ (priv->last_non_b_picture->poc + 1) : priv->next_poc;
+ priv->next_poc = picture->poc + 1;
+ gst_vaapi_picture_replace (&priv->last_non_b_picture, picture);
+ } else if (!priv->last_non_b_picture)
+ picture->poc = priv->next_poc++;
+ else { /* B or BI */
+ picture->poc = priv->last_non_b_picture->poc++;
+ priv->next_poc = priv->last_non_b_picture->poc + 1;
+ }
+ picture->pts = GST_VAAPI_DECODER_CODEC_FRAME (decoder)->pts;
+
+ if (!fill_picture (decoder, picture))
+ return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
+ return decode_slice_chunk (decoder, ebdu, 0, frame_hdr->header_size);
}
static GstVaapiDecoderStatus
-decode_slice(GstVaapiDecoderVC1 *decoder, GstVC1BDU *rbdu, GstVC1BDU *ebdu)
+decode_slice (GstVaapiDecoderVC1 * decoder, GstVC1BDU * rbdu, GstVC1BDU * ebdu)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVC1SliceHdr slice_hdr;
- GstVC1ParserResult result;
-
- memset(&slice_hdr, 0, sizeof(slice_hdr));
- result = gst_vc1_parse_slice_header(
- rbdu->data + rbdu->offset,
- rbdu->size,
- &slice_hdr,
- &priv->seq_hdr
- );
- if (result != GST_VC1_PARSER_OK) {
- GST_ERROR("failed to parse slice layer");
- return get_status(result);
- }
- return decode_slice_chunk(decoder, ebdu, slice_hdr.slice_addr,
- slice_hdr.header_size);
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVC1SliceHdr slice_hdr;
+ GstVC1ParserResult result;
+
+ memset (&slice_hdr, 0, sizeof (slice_hdr));
+ result = gst_vc1_parse_slice_header (rbdu->data + rbdu->offset,
+ rbdu->size, &slice_hdr, &priv->seq_hdr);
+ if (result != GST_VC1_PARSER_OK) {
+ GST_ERROR ("failed to parse slice layer");
+ return get_status (result);
+ }
+ return decode_slice_chunk (decoder, ebdu, slice_hdr.slice_addr,
+ slice_hdr.header_size);
}
static gboolean
-decode_rbdu(GstVaapiDecoderVC1 *decoder, GstVC1BDU *rbdu, GstVC1BDU *ebdu)
+decode_rbdu (GstVaapiDecoderVC1 * decoder, GstVC1BDU * rbdu, GstVC1BDU * ebdu)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- guint8 *rbdu_buffer;
- guint i, j, rbdu_buffer_size;
-
- /* BDU are encapsulated in advanced profile mode only */
- if (priv->profile != GST_VAAPI_PROFILE_VC1_ADVANCED) {
- memcpy(rbdu, ebdu, sizeof(*rbdu));
- return TRUE;
- }
-
- /* Reallocate unescaped bitstream buffer */
- rbdu_buffer = priv->rbdu_buffer;
- if (!rbdu_buffer || ebdu->size > priv->rbdu_buffer_size) {
- rbdu_buffer = g_realloc(priv->rbdu_buffer, ebdu->size);
- if (!rbdu_buffer)
- return FALSE;
- priv->rbdu_buffer = rbdu_buffer;
- priv->rbdu_buffer_size = ebdu->size;
- }
-
- /* Unescape bitstream buffer */
- if (ebdu->size < 4) {
- memcpy(rbdu_buffer, ebdu->data + ebdu->offset, ebdu->size);
- rbdu_buffer_size = ebdu->size;
- }
- else {
- guint8 * const bdu_buffer = ebdu->data + ebdu->offset;
- for (i = 0, j = 0; i < ebdu->size; i++) {
- if (i >= 2 && i < ebdu->size - 1 &&
- bdu_buffer[i - 1] == 0x00 &&
- bdu_buffer[i - 2] == 0x00 &&
- bdu_buffer[i ] == 0x03 &&
- bdu_buffer[i + 1] <= 0x03)
- i++;
- rbdu_buffer[j++] = bdu_buffer[i];
- }
- rbdu_buffer_size = j;
- }
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ guint8 *rbdu_buffer;
+ guint i, j, rbdu_buffer_size;
- /* Reconstruct RBDU */
- rbdu->type = ebdu->type;
- rbdu->size = rbdu_buffer_size;
- rbdu->sc_offset = 0;
- rbdu->offset = 0;
- rbdu->data = rbdu_buffer;
+ /* BDU are encapsulated in advanced profile mode only */
+ if (priv->profile != GST_VAAPI_PROFILE_VC1_ADVANCED) {
+ memcpy (rbdu, ebdu, sizeof (*rbdu));
return TRUE;
+ }
+
+ /* Reallocate unescaped bitstream buffer */
+ rbdu_buffer = priv->rbdu_buffer;
+ if (!rbdu_buffer || ebdu->size > priv->rbdu_buffer_size) {
+ rbdu_buffer = g_realloc (priv->rbdu_buffer, ebdu->size);
+ if (!rbdu_buffer)
+ return FALSE;
+ priv->rbdu_buffer = rbdu_buffer;
+ priv->rbdu_buffer_size = ebdu->size;
+ }
+
+ /* Unescape bitstream buffer */
+ if (ebdu->size < 4) {
+ memcpy (rbdu_buffer, ebdu->data + ebdu->offset, ebdu->size);
+ rbdu_buffer_size = ebdu->size;
+ } else {
+ guint8 *const bdu_buffer = ebdu->data + ebdu->offset;
+ for (i = 0, j = 0; i < ebdu->size; i++) {
+ if (i >= 2 && i < ebdu->size - 1 &&
+ bdu_buffer[i - 1] == 0x00 &&
+ bdu_buffer[i - 2] == 0x00 &&
+ bdu_buffer[i] == 0x03 && bdu_buffer[i + 1] <= 0x03)
+ i++;
+ rbdu_buffer[j++] = bdu_buffer[i];
+ }
+ rbdu_buffer_size = j;
+ }
+
+ /* Reconstruct RBDU */
+ rbdu->type = ebdu->type;
+ rbdu->size = rbdu_buffer_size;
+ rbdu->sc_offset = 0;
+ rbdu->offset = 0;
+ rbdu->data = rbdu_buffer;
+ return TRUE;
}
static GstVaapiDecoderStatus
-decode_ebdu(GstVaapiDecoderVC1 *decoder, GstVC1BDU *ebdu)
+decode_ebdu (GstVaapiDecoderVC1 * decoder, GstVC1BDU * ebdu)
{
- GstVaapiDecoderStatus status;
- GstVC1BDU rbdu;
+ GstVaapiDecoderStatus status;
+ GstVC1BDU rbdu;
- if (!decode_rbdu(decoder, &rbdu, ebdu))
- return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
+ if (!decode_rbdu (decoder, &rbdu, ebdu))
+ return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
- switch (ebdu->type) {
+ switch (ebdu->type) {
case GST_VC1_SEQUENCE:
- status = decode_sequence(decoder, &rbdu, ebdu);
- break;
+ status = decode_sequence (decoder, &rbdu, ebdu);
+ break;
case GST_VC1_ENTRYPOINT:
- status = decode_entry_point(decoder, &rbdu, ebdu);
- break;
+ status = decode_entry_point (decoder, &rbdu, ebdu);
+ break;
case GST_VC1_FRAME:
- status = decode_frame(decoder, &rbdu, ebdu);
- break;
+ status = decode_frame (decoder, &rbdu, ebdu);
+ break;
case GST_VC1_SLICE:
- status = decode_slice(decoder, &rbdu, ebdu);
- break;
+ status = decode_slice (decoder, &rbdu, ebdu);
+ break;
case GST_VC1_END_OF_SEQ:
- status = decode_sequence_end(decoder);
- break;
+ status = decode_sequence_end (decoder);
+ break;
case GST_VC1_FIELD_USER:
case GST_VC1_FRAME_USER:
case GST_VC1_ENTRY_POINT_USER:
case GST_VC1_SEQUENCE_USER:
- /* Let's just ignore them */
- status = GST_VAAPI_DECODER_STATUS_SUCCESS;
- break;
+ /* Let's just ignore them */
+ status = GST_VAAPI_DECODER_STATUS_SUCCESS;
+ break;
default:
- GST_WARNING("unsupported BDU type %d", ebdu->type);
- status = GST_VAAPI_DECODER_STATUS_ERROR_BITSTREAM_PARSER;
- break;
- }
- return status;
+ GST_WARNING ("unsupported BDU type %d", ebdu->type);
+ status = GST_VAAPI_DECODER_STATUS_ERROR_BITSTREAM_PARSER;
+ break;
+ }
+ return status;
}
static GstVaapiDecoderStatus
-decode_buffer(GstVaapiDecoderVC1 *decoder, guchar *buf, guint buf_size)
+decode_buffer (GstVaapiDecoderVC1 * decoder, guchar * buf, guint buf_size)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVC1BDU ebdu;
-
- if (priv->has_codec_data) {
- ebdu.type = GST_VC1_FRAME;
- ebdu.sc_offset = 0;
- ebdu.offset = 0;
- }
- else {
- ebdu.type = buf[3];
- ebdu.sc_offset = 0;
- ebdu.offset = 4;
- }
- ebdu.data = buf;
- ebdu.size = buf_size - ebdu.offset;
- return decode_ebdu(decoder, &ebdu);
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVC1BDU ebdu;
+
+ if (priv->has_codec_data) {
+ ebdu.type = GST_VC1_FRAME;
+ ebdu.sc_offset = 0;
+ ebdu.offset = 0;
+ } else {
+ ebdu.type = buf[3];
+ ebdu.sc_offset = 0;
+ ebdu.offset = 4;
+ }
+ ebdu.data = buf;
+ ebdu.size = buf_size - ebdu.offset;
+ return decode_ebdu (decoder, &ebdu);
}
static GstVaapiDecoderStatus
-gst_vaapi_decoder_vc1_decode_codec_data(GstVaapiDecoder *base_decoder,
- const guchar *buf, guint buf_size)
+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;
- GstVC1ParserResult result;
- GstVC1BDU ebdu;
- GstCaps *caps;
- GstStructure *structure;
- guint ofs;
- gint width, height;
- guint32 format;
- gint version;
- const gchar *s;
-
- priv->has_codec_data = TRUE;
-
- width = GST_VAAPI_DECODER_WIDTH(decoder);
- height = GST_VAAPI_DECODER_HEIGHT(decoder);
- if (!width || !height) {
- GST_ERROR("failed to parse size from codec-data");
- return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
- }
-
- caps = GST_VAAPI_DECODER_CODEC_STATE(decoder)->caps;
- structure = gst_caps_get_structure(caps, 0);
- s = gst_structure_get_string(structure, "format");
- if (s && strlen(s) == 4) {
- format = GST_MAKE_FOURCC(s[0], s[1], s[2], s[3]);
- } else {
- /* Try to determine format from "wmvversion" property */
- if (gst_structure_get_int(structure, "wmvversion", &version))
- format = (version >= 1 && version <= 3) ?
- GST_MAKE_FOURCC('W','M','V',('0'+version)) : 0;
- else
- format = 0;
- }
- if (!format) {
- GST_ERROR("failed to parse profile from codec-data");
- return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_CODEC;
- }
+ GstVaapiDecoderVC1 *const decoder = GST_VAAPI_DECODER_VC1_CAST (base_decoder);
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVC1SeqHdr *const seq_hdr = &priv->seq_hdr;
+ GstVaapiDecoderStatus status;
+ GstVC1ParserResult result;
+ GstVC1BDU ebdu;
+ GstCaps *caps;
+ GstStructure *structure;
+ guint ofs;
+ gint width, height;
+ guint32 format;
+ gint version;
+ const gchar *s;
+
+ priv->has_codec_data = TRUE;
+
+ width = GST_VAAPI_DECODER_WIDTH (decoder);
+ height = GST_VAAPI_DECODER_HEIGHT (decoder);
+ if (!width || !height) {
+ GST_ERROR ("failed to parse size from codec-data");
+ return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
+ }
+
+ caps = GST_VAAPI_DECODER_CODEC_STATE (decoder)->caps;
+ structure = gst_caps_get_structure (caps, 0);
+ s = gst_structure_get_string (structure, "format");
+ if (s && strlen (s) == 4) {
+ format = GST_MAKE_FOURCC (s[0], s[1], s[2], s[3]);
+ } else {
+ /* Try to determine format from "wmvversion" property */
+ if (gst_structure_get_int (structure, "wmvversion", &version))
+ format = (version >= 1 && version <= 3) ?
+ GST_MAKE_FOURCC ('W', 'M', 'V', ('0' + version)) : 0;
+ else
+ format = 0;
+ }
+ if (!format) {
+ GST_ERROR ("failed to parse profile from codec-data");
+ return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_CODEC;
+ }
+
+ /* WMV3 -- expecting sequence header */
+ if (format == GST_MAKE_FOURCC ('W', 'M', 'V', '3')) {
+ seq_hdr->struct_c.coded_width = width;
+ seq_hdr->struct_c.coded_height = height;
+ ebdu.type = GST_VC1_SEQUENCE;
+ ebdu.size = buf_size;
+ ebdu.sc_offset = 0;
+ ebdu.offset = 0;
+ ebdu.data = (guint8 *) buf;
+ return decode_ebdu (decoder, &ebdu);
+ }
+
+ /* WVC1 -- expecting bitstream data units */
+ if (format != GST_MAKE_FOURCC ('W', 'V', 'C', '1'))
+ return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_PROFILE;
+ seq_hdr->advanced.max_coded_width = width;
+ seq_hdr->advanced.max_coded_height = height;
+
+ ofs = 0;
+ do {
+ result = gst_vc1_identify_next_bdu (buf + ofs, buf_size - ofs, &ebdu);
- /* WMV3 -- expecting sequence header */
- if (format == GST_MAKE_FOURCC('W','M','V','3')) {
- seq_hdr->struct_c.coded_width = width;
- seq_hdr->struct_c.coded_height = height;
- ebdu.type = GST_VC1_SEQUENCE;
- ebdu.size = buf_size;
- ebdu.sc_offset = 0;
- ebdu.offset = 0;
- ebdu.data = (guint8 *)buf;
- return decode_ebdu(decoder, &ebdu);
+ switch (result) {
+ case GST_VC1_PARSER_NO_BDU_END:
+ /* Assume the EBDU is complete within codec-data bounds */
+ ebdu.size = buf_size - ofs - ebdu.offset;
+ // fall-through
+ case GST_VC1_PARSER_OK:
+ status = decode_ebdu (decoder, &ebdu);
+ ofs += ebdu.offset + ebdu.size;
+ break;
+ default:
+ status = get_status (result);
+ break;
}
-
- /* WVC1 -- expecting bitstream data units */
- if (format != GST_MAKE_FOURCC('W','V','C','1'))
- return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_PROFILE;
- seq_hdr->advanced.max_coded_width = width;
- seq_hdr->advanced.max_coded_height = height;
-
- ofs = 0;
- do {
- result = gst_vc1_identify_next_bdu(
- buf + ofs,
- buf_size - ofs,
- &ebdu
- );
-
- switch (result) {
- case GST_VC1_PARSER_NO_BDU_END:
- /* Assume the EBDU is complete within codec-data bounds */
- ebdu.size = buf_size - ofs - ebdu.offset;
- // fall-through
- case GST_VC1_PARSER_OK:
- status = decode_ebdu(decoder, &ebdu);
- ofs += ebdu.offset + ebdu.size;
- break;
- default:
- status = get_status(result);
- break;
- }
- } while (status == GST_VAAPI_DECODER_STATUS_SUCCESS && ofs < buf_size);
- return status;
+ } while (status == GST_VAAPI_DECODER_STATUS_SUCCESS && ofs < buf_size);
+ return status;
}
static GstVaapiDecoderStatus
-ensure_decoder(GstVaapiDecoderVC1 *decoder)
+ensure_decoder (GstVaapiDecoderVC1 * decoder)
{
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVaapiDecoderStatus status;
-
- if (!priv->is_opened) {
- priv->is_opened = gst_vaapi_decoder_vc1_open(decoder);
- if (!priv->is_opened)
- return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_CODEC;
-
- 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;
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVaapiDecoderStatus status;
+
+ if (!priv->is_opened) {
+ priv->is_opened = gst_vaapi_decoder_vc1_open (decoder);
+ if (!priv->is_opened)
+ return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_CODEC;
+
+ 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;
}
static inline gint
-scan_for_start_code(GstAdapter *adapter, guint ofs, guint size, guint32 *scp)
+scan_for_start_code (GstAdapter * adapter, guint ofs, guint size, guint32 * scp)
{
- return (gint)gst_adapter_masked_scan_uint32_peek(adapter,
- 0xffffff00, 0x00000100, ofs, size, scp);
+ return (gint) gst_adapter_masked_scan_uint32_peek (adapter,
+ 0xffffff00, 0x00000100, ofs, size, scp);
}
static GstVaapiDecoderStatus
-gst_vaapi_decoder_vc1_parse(GstVaapiDecoder *base_decoder,
- GstAdapter *adapter, gboolean at_eos, GstVaapiDecoderUnit *unit)
+gst_vaapi_decoder_vc1_parse (GstVaapiDecoder * base_decoder,
+ GstAdapter * adapter, gboolean at_eos, GstVaapiDecoderUnit * unit)
{
- GstVaapiDecoderVC1 * const decoder =
- GST_VAAPI_DECODER_VC1_CAST(base_decoder);
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVaapiDecoderStatus status;
- guint8 bdu_type;
- guint size, buf_size, flags = 0;
- gint ofs;
-
- status = ensure_decoder(decoder);
- if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
- return status;
-
- size = gst_adapter_available(adapter);
+ GstVaapiDecoderVC1 *const decoder = GST_VAAPI_DECODER_VC1_CAST (base_decoder);
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVaapiDecoderStatus status;
+ guint8 bdu_type;
+ guint size, buf_size, flags = 0;
+ gint ofs;
+
+ status = ensure_decoder (decoder);
+ if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
+ return status;
- if (priv->has_codec_data) {
- // Assume demuxer sends out plain frames
- if (size < 1)
- return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
- buf_size = size;
- bdu_type = GST_VC1_FRAME;
- }
- else {
- if (size < 4)
- return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
-
- ofs = scan_for_start_code(adapter, 0, size, NULL);
- if (ofs < 0)
- return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
- gst_adapter_flush(adapter, ofs);
- size -= ofs;
-
- ofs = G_UNLIKELY(size < 8) ? -1 :
- scan_for_start_code(adapter, 4, size - 4, NULL);
- if (ofs < 0) {
- // Assume the whole packet is present if end-of-stream
- if (!at_eos)
- return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
- ofs = size;
- }
- buf_size = ofs;
- gst_adapter_copy(adapter, &bdu_type, 3, 1);
+ size = gst_adapter_available (adapter);
+
+ if (priv->has_codec_data) {
+ // Assume demuxer sends out plain frames
+ if (size < 1)
+ return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
+ buf_size = size;
+ bdu_type = GST_VC1_FRAME;
+ } else {
+ if (size < 4)
+ return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
+
+ ofs = scan_for_start_code (adapter, 0, size, NULL);
+ if (ofs < 0)
+ return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
+ gst_adapter_flush (adapter, ofs);
+ size -= ofs;
+
+ ofs = G_UNLIKELY (size < 8) ? -1 :
+ scan_for_start_code (adapter, 4, size - 4, NULL);
+ if (ofs < 0) {
+ // Assume the whole packet is present if end-of-stream
+ if (!at_eos)
+ return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
+ ofs = size;
}
+ buf_size = ofs;
+ gst_adapter_copy (adapter, &bdu_type, 3, 1);
+ }
- unit->size = buf_size;
+ unit->size = buf_size;
- /* Check for new picture layer */
- switch (bdu_type) {
+ /* Check for new picture layer */
+ switch (bdu_type) {
case GST_VC1_END_OF_SEQ:
- flags |= GST_VAAPI_DECODER_UNIT_FLAG_FRAME_END;
- flags |= GST_VAAPI_DECODER_UNIT_FLAG_STREAM_END;
- break;
+ flags |= GST_VAAPI_DECODER_UNIT_FLAG_FRAME_END;
+ flags |= GST_VAAPI_DECODER_UNIT_FLAG_STREAM_END;
+ break;
case GST_VC1_SEQUENCE:
case GST_VC1_ENTRYPOINT:
- flags |= GST_VAAPI_DECODER_UNIT_FLAG_FRAME_START;
- break;
+ flags |= GST_VAAPI_DECODER_UNIT_FLAG_FRAME_START;
+ break;
case GST_VC1_FRAME:
- flags |= GST_VAAPI_DECODER_UNIT_FLAG_FRAME_START;
- flags |= GST_VAAPI_DECODER_UNIT_FLAG_SLICE;
- break;
+ flags |= GST_VAAPI_DECODER_UNIT_FLAG_FRAME_START;
+ flags |= GST_VAAPI_DECODER_UNIT_FLAG_SLICE;
+ break;
case GST_VC1_SLICE:
- flags |= GST_VAAPI_DECODER_UNIT_FLAG_SLICE;
- break;
- }
- GST_VAAPI_DECODER_UNIT_FLAG_SET(unit, flags);
- return GST_VAAPI_DECODER_STATUS_SUCCESS;
+ flags |= GST_VAAPI_DECODER_UNIT_FLAG_SLICE;
+ break;
+ }
+ GST_VAAPI_DECODER_UNIT_FLAG_SET (unit, flags);
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
static GstVaapiDecoderStatus
-gst_vaapi_decoder_vc1_decode(GstVaapiDecoder *base_decoder,
- GstVaapiDecoderUnit *unit)
+gst_vaapi_decoder_vc1_decode (GstVaapiDecoder * base_decoder,
+ GstVaapiDecoderUnit * unit)
{
- GstVaapiDecoderVC1 * const decoder =
- GST_VAAPI_DECODER_VC1_CAST(base_decoder);
- GstVaapiDecoderStatus status;
- GstBuffer * const buffer =
- GST_VAAPI_DECODER_CODEC_FRAME(decoder)->input_buffer;
- GstMapInfo map_info;
-
- status = ensure_decoder(decoder);
- if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
- return status;
+ GstVaapiDecoderVC1 *const decoder = GST_VAAPI_DECODER_VC1_CAST (base_decoder);
+ GstVaapiDecoderStatus status;
+ GstBuffer *const buffer =
+ GST_VAAPI_DECODER_CODEC_FRAME (decoder)->input_buffer;
+ GstMapInfo map_info;
+
+ status = ensure_decoder (decoder);
+ if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
+ return status;
- if (!gst_buffer_map(buffer, &map_info, GST_MAP_READ)) {
- GST_ERROR("failed to map buffer");
- return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
- }
+ if (!gst_buffer_map (buffer, &map_info, GST_MAP_READ)) {
+ GST_ERROR ("failed to map buffer");
+ return GST_VAAPI_DECODER_STATUS_ERROR_UNKNOWN;
+ }
- status = decode_buffer(decoder, map_info.data + unit->offset, unit->size);
- gst_buffer_unmap(buffer, &map_info);
- if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
- return status;
- return GST_VAAPI_DECODER_STATUS_SUCCESS;
+ status = decode_buffer (decoder, map_info.data + unit->offset, unit->size);
+ gst_buffer_unmap (buffer, &map_info);
+ if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
+ return status;
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
static GstVaapiDecoderStatus
-gst_vaapi_decoder_vc1_start_frame(GstVaapiDecoder *base_decoder,
- GstVaapiDecoderUnit *unit)
+gst_vaapi_decoder_vc1_start_frame (GstVaapiDecoder * base_decoder,
+ GstVaapiDecoderUnit * unit)
{
- GstVaapiDecoderVC1 * const decoder =
- GST_VAAPI_DECODER_VC1_CAST(base_decoder);
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
- GstVaapiDecoderStatus status;
- GstVaapiPicture *picture;
-
- status = ensure_context(decoder);
- if (status != GST_VAAPI_DECODER_STATUS_SUCCESS) {
- GST_ERROR("failed to reset context");
- return status;
- }
-
- picture = GST_VAAPI_PICTURE_NEW(VC1, decoder);
- if (!picture) {
- GST_ERROR("failed to allocate picture");
- return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
- }
- gst_vaapi_picture_replace(&priv->current_picture, picture);
- gst_vaapi_picture_unref(picture);
-
- /* Update cropping rectangle */
- do {
- GstVC1AdvancedSeqHdr *adv_hdr;
- GstVaapiRectangle crop_rect;
-
- if (priv->profile != GST_VAAPI_PROFILE_VC1_ADVANCED)
- break;
-
- adv_hdr = &priv->seq_hdr.advanced;
- if (!adv_hdr->display_ext)
- break;
-
- crop_rect.x = 0;
- crop_rect.y = 0;
- crop_rect.width = adv_hdr->disp_horiz_size;
- crop_rect.height = adv_hdr->disp_vert_size;
- if (crop_rect.width <= priv->width && crop_rect.height <= priv->height)
- gst_vaapi_picture_set_crop_rect(picture, &crop_rect);
- } while (0);
-
- if (!gst_vc1_bitplanes_ensure_size(priv->bitplanes, &priv->seq_hdr)) {
- GST_ERROR("failed to allocate bitplanes");
- return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
- }
- return GST_VAAPI_DECODER_STATUS_SUCCESS;
+ GstVaapiDecoderVC1 *const decoder = GST_VAAPI_DECODER_VC1_CAST (base_decoder);
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
+ GstVaapiDecoderStatus status;
+ GstVaapiPicture *picture;
+
+ status = ensure_context (decoder);
+ if (status != GST_VAAPI_DECODER_STATUS_SUCCESS) {
+ GST_ERROR ("failed to reset context");
+ return status;
+ }
+
+ picture = GST_VAAPI_PICTURE_NEW (VC1, decoder);
+ if (!picture) {
+ GST_ERROR ("failed to allocate picture");
+ return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
+ }
+ gst_vaapi_picture_replace (&priv->current_picture, picture);
+ gst_vaapi_picture_unref (picture);
+
+ /* Update cropping rectangle */
+ do {
+ GstVC1AdvancedSeqHdr *adv_hdr;
+ GstVaapiRectangle crop_rect;
+
+ if (priv->profile != GST_VAAPI_PROFILE_VC1_ADVANCED)
+ break;
+
+ adv_hdr = &priv->seq_hdr.advanced;
+ if (!adv_hdr->display_ext)
+ break;
+
+ crop_rect.x = 0;
+ crop_rect.y = 0;
+ crop_rect.width = adv_hdr->disp_horiz_size;
+ crop_rect.height = adv_hdr->disp_vert_size;
+ if (crop_rect.width <= priv->width && crop_rect.height <= priv->height)
+ gst_vaapi_picture_set_crop_rect (picture, &crop_rect);
+ } while (0);
+
+ if (!gst_vc1_bitplanes_ensure_size (priv->bitplanes, &priv->seq_hdr)) {
+ GST_ERROR ("failed to allocate bitplanes");
+ return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
+ }
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
static GstVaapiDecoderStatus
-gst_vaapi_decoder_vc1_end_frame(GstVaapiDecoder *base_decoder)
+gst_vaapi_decoder_vc1_end_frame (GstVaapiDecoder * base_decoder)
{
- GstVaapiDecoderVC1 * const decoder =
- GST_VAAPI_DECODER_VC1_CAST(base_decoder);
+ GstVaapiDecoderVC1 *const decoder = GST_VAAPI_DECODER_VC1_CAST (base_decoder);
- return decode_current_picture(decoder);
+ return decode_current_picture (decoder);
}
static GstVaapiDecoderStatus
-gst_vaapi_decoder_vc1_flush(GstVaapiDecoder *base_decoder)
+gst_vaapi_decoder_vc1_flush (GstVaapiDecoder * base_decoder)
{
- GstVaapiDecoderVC1 * const decoder =
- GST_VAAPI_DECODER_VC1_CAST(base_decoder);
- GstVaapiDecoderVC1Private * const priv = &decoder->priv;
+ GstVaapiDecoderVC1 *const decoder = GST_VAAPI_DECODER_VC1_CAST (base_decoder);
+ GstVaapiDecoderVC1Private *const priv = &decoder->priv;
- gst_vaapi_dpb_flush(priv->dpb);
- return GST_VAAPI_DECODER_STATUS_SUCCESS;
+ gst_vaapi_dpb_flush (priv->dpb);
+ return GST_VAAPI_DECODER_STATUS_SUCCESS;
}
static void
-gst_vaapi_decoder_vc1_class_init(GstVaapiDecoderVC1Class *klass)
+gst_vaapi_decoder_vc1_class_init (GstVaapiDecoderVC1Class * klass)
{
- GstVaapiMiniObjectClass * const object_class =
- GST_VAAPI_MINI_OBJECT_CLASS(klass);
- GstVaapiDecoderClass * const decoder_class = GST_VAAPI_DECODER_CLASS(klass);
-
- object_class->size = sizeof(GstVaapiDecoderVC1);
- object_class->finalize = (GDestroyNotify)gst_vaapi_decoder_finalize;
-
- decoder_class->create = gst_vaapi_decoder_vc1_create;
- decoder_class->destroy = gst_vaapi_decoder_vc1_destroy;
- decoder_class->parse = gst_vaapi_decoder_vc1_parse;
- decoder_class->decode = gst_vaapi_decoder_vc1_decode;
- 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;
+ GstVaapiMiniObjectClass *const object_class =
+ GST_VAAPI_MINI_OBJECT_CLASS (klass);
+ GstVaapiDecoderClass *const decoder_class = GST_VAAPI_DECODER_CLASS (klass);
+
+ object_class->size = sizeof (GstVaapiDecoderVC1);
+ object_class->finalize = (GDestroyNotify) gst_vaapi_decoder_finalize;
+
+ decoder_class->create = gst_vaapi_decoder_vc1_create;
+ decoder_class->destroy = gst_vaapi_decoder_vc1_destroy;
+ decoder_class->parse = gst_vaapi_decoder_vc1_parse;
+ decoder_class->decode = gst_vaapi_decoder_vc1_decode;
+ 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 inline const GstVaapiDecoderClass *
-gst_vaapi_decoder_vc1_class(void)
+gst_vaapi_decoder_vc1_class (void)
{
- static GstVaapiDecoderVC1Class g_class;
- static gsize g_class_init = FALSE;
-
- if (g_once_init_enter(&g_class_init)) {
- gst_vaapi_decoder_vc1_class_init(&g_class);
- g_once_init_leave(&g_class_init, TRUE);
- }
- return GST_VAAPI_DECODER_CLASS(&g_class);
+ static GstVaapiDecoderVC1Class g_class;
+ static gsize g_class_init = FALSE;
+
+ if (g_once_init_enter (&g_class_init)) {
+ gst_vaapi_decoder_vc1_class_init (&g_class);
+ g_once_init_leave (&g_class_init, TRUE);
+ }
+ return GST_VAAPI_DECODER_CLASS (&g_class);
}
/**
@@ -1437,7 +1439,7 @@ gst_vaapi_decoder_vc1_class(void)
* Return value: the newly allocated #GstVaapiDecoder object
*/
GstVaapiDecoder *
-gst_vaapi_decoder_vc1_new(GstVaapiDisplay *display, GstCaps *caps)
+gst_vaapi_decoder_vc1_new (GstVaapiDisplay * display, GstCaps * caps)
{
- return gst_vaapi_decoder_new(gst_vaapi_decoder_vc1_class(), display, caps);
+ return gst_vaapi_decoder_new (gst_vaapi_decoder_vc1_class (), display, caps);
}