summaryrefslogtreecommitdiff
path: root/gst-libs/gst
diff options
context:
space:
mode:
Diffstat (limited to 'gst-libs/gst')
-rw-r--r--gst-libs/gst/vaapi/gstvaapidecoder_h264.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_h264.c b/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
index 34eccdf2..de9e035a 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
+++ b/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
@@ -121,6 +121,7 @@ enum {
struct _GstVaapiPictureH264 {
GstVaapiPicture base;
GstH264PPS *pps;
+ guint structure;
gint32 field_poc[2];
gint32 frame_num; // Original frame_num from slice_header()
gint32 frame_num_wrap; // Temporary for ref pic marking: FrameNumWrap
@@ -370,7 +371,7 @@ gst_vaapi_frame_store_new(GstVaapiPictureH264 *picture)
if (!fs)
return NULL;
- fs->structure = picture->base.structure;
+ fs->structure = picture->structure;
fs->buffers[0] = gst_vaapi_picture_ref(picture);
fs->num_buffers = 1;
fs->output_needed = picture->output_needed;
@@ -1111,7 +1112,7 @@ init_picture_poc_0(
priv->poc_msb = priv->prev_poc_msb;
temp_poc = priv->poc_msb + priv->poc_lsb;
- switch (picture->base.structure) {
+ switch (picture->structure) {
case GST_VAAPI_PICTURE_STRUCTURE_FRAME:
// (8-4, 8-5)
priv->field_poc[TOP_FIELD] = temp_poc;
@@ -1192,7 +1193,7 @@ init_picture_poc_1(
expected_poc += sps->offset_for_non_ref_pic;
// (8-10)
- switch (picture->base.structure) {
+ switch (picture->structure) {
case GST_VAAPI_PICTURE_STRUCTURE_FRAME:
priv->field_poc[TOP_FIELD] = expected_poc +
slice_hdr->delta_pic_order_cnt[0];
@@ -1250,9 +1251,9 @@ init_picture_poc_2(
temp_poc = 2 * (priv->frame_num_offset + priv->frame_num);
// (8-13)
- if (picture->base.structure != GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD)
+ if (picture->structure != GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD)
priv->field_poc[TOP_FIELD] = temp_poc;
- if (picture->base.structure != GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD)
+ if (picture->structure != GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD)
priv->field_poc[BOTTOM_FIELD] = temp_poc;
}
@@ -1280,9 +1281,9 @@ init_picture_poc(
break;
}
- if (picture->base.structure != GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD)
+ if (picture->structure != GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD)
picture->field_poc[TOP_FIELD] = priv->field_poc[TOP_FIELD];
- if (picture->base.structure != GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD)
+ if (picture->structure != GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD)
picture->field_poc[BOTTOM_FIELD] = priv->field_poc[BOTTOM_FIELD];
picture->base.poc = MIN(picture->field_poc[0], picture->field_poc[1]);
}
@@ -1370,7 +1371,7 @@ init_picture_refs_pic_num(
if (GST_VAAPI_PICTURE_IS_FRAME(picture))
pic->pic_num = pic->frame_num_wrap;
else {
- if (pic->base.structure == picture->base.structure)
+ if (pic->structure == picture->structure)
pic->pic_num = 2 * pic->frame_num_wrap + 1;
else
pic->pic_num = 2 * pic->frame_num_wrap;
@@ -1384,7 +1385,7 @@ init_picture_refs_pic_num(
if (GST_VAAPI_PICTURE_IS_FRAME(picture))
pic->long_term_pic_num = pic->long_term_frame_idx;
else {
- if (pic->base.structure == picture->base.structure)
+ if (pic->structure == picture->structure)
pic->long_term_pic_num = 2 * pic->long_term_frame_idx + 1;
else
pic->long_term_pic_num = 2 * pic->long_term_frame_idx;
@@ -1822,6 +1823,7 @@ init_picture_ref_lists(GstVaapiDecoderH264 *decoder)
priv->short_ref[short_ref_count++] = picture;
else if (GST_VAAPI_PICTURE_IS_LONG_TERM_REFERENCE(picture))
priv->long_ref[long_ref_count++] = picture;
+ picture->structure = GST_VAAPI_PICTURE_STRUCTURE_FRAME;
}
}
@@ -1936,6 +1938,7 @@ init_picture(
base_picture->structure = GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD;
else
base_picture->structure = GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD;
+ picture->structure = base_picture->structure;
/* Initialize reference flags */
if (nalu->ref_idc) {
@@ -2116,9 +2119,9 @@ exec_ref_pic_marking_adaptive_mmco_5(
picture->frame_num = 0;
/* Update TopFieldOrderCnt and BottomFieldOrderCnt (8.2.1) */
- if (picture->base.structure != GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD)
+ if (picture->structure != GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD)
picture->field_poc[TOP_FIELD] -= picture->base.poc;
- if (picture->base.structure != GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD)
+ if (picture->structure != GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD)
picture->field_poc[BOTTOM_FIELD] -= picture->base.poc;
picture->base.poc = 0;
}
@@ -2186,7 +2189,7 @@ exec_ref_pic_marking(GstVaapiDecoderH264 *decoder, GstVaapiPictureH264 *picture)
GstVaapiDecoderH264Private * const priv = decoder->priv;
priv->prev_pic_has_mmco5 = FALSE;
- priv->prev_pic_structure = picture->base.structure;
+ priv->prev_pic_structure = picture->structure;
if (!GST_VAAPI_PICTURE_IS_REFERENCE(picture))
return TRUE;
@@ -2234,7 +2237,7 @@ vaapi_fill_picture(VAPictureH264 *pic, GstVaapiPictureH264 *picture)
pic->frame_idx = picture->frame_num;
}
- switch (picture->base.structure) {
+ switch (picture->structure) {
case GST_VAAPI_PICTURE_STRUCTURE_FRAME:
pic->TopFieldOrderCnt = picture->field_poc[TOP_FIELD];
pic->BottomFieldOrderCnt = picture->field_poc[BOTTOM_FIELD];