mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 15:08:53 +00:00
decoder: add first-field flag to picture.
Add first-field (FF) flag to GstVaapiPicture, thus not requiring is_first_field member in each decoder. Rather, when a GstVaapiPicture is created, it is considered as the first field. Any subsequent allocated field will become the second field.
This commit is contained in:
parent
195a61fa02
commit
b56ac16224
3 changed files with 9 additions and 7 deletions
|
@ -80,7 +80,6 @@ struct _GstVaapiDecoderMpeg2Private {
|
||||||
GstClockTime pts_diff;
|
GstClockTime pts_diff;
|
||||||
guint is_constructed : 1;
|
guint is_constructed : 1;
|
||||||
guint is_opened : 1;
|
guint is_opened : 1;
|
||||||
guint is_first_field : 1;
|
|
||||||
guint has_seq_ext : 1;
|
guint has_seq_ext : 1;
|
||||||
guint has_seq_scalable_ext : 1;
|
guint has_seq_scalable_ext : 1;
|
||||||
guint has_pic_ext : 1;
|
guint has_pic_ext : 1;
|
||||||
|
@ -499,8 +498,6 @@ decode_gop(GstVaapiDecoderMpeg2 *decoder, guchar *buf, guint buf_size)
|
||||||
priv->gop_pts = pts;
|
priv->gop_pts = pts;
|
||||||
if (!priv->pts_diff)
|
if (!priv->pts_diff)
|
||||||
priv->pts_diff = priv->seq_pts - priv->gop_pts;
|
priv->pts_diff = priv->seq_pts - priv->gop_pts;
|
||||||
|
|
||||||
priv->is_first_field = FALSE;
|
|
||||||
return GST_VAAPI_DECODER_STATUS_SUCCESS;
|
return GST_VAAPI_DECODER_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -596,7 +593,6 @@ decode_picture_ext(GstVaapiDecoderMpeg2 *decoder, guchar *buf, guint buf_size)
|
||||||
pic_ext->picture_structure = GST_MPEG_VIDEO_PICTURE_STRUCTURE_FRAME;
|
pic_ext->picture_structure = GST_MPEG_VIDEO_PICTURE_STRUCTURE_FRAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->is_first_field ^= 1;
|
|
||||||
switch (pic_ext->picture_structure) {
|
switch (pic_ext->picture_structure) {
|
||||||
case GST_MPEG_VIDEO_PICTURE_STRUCTURE_TOP_FIELD:
|
case GST_MPEG_VIDEO_PICTURE_STRUCTURE_TOP_FIELD:
|
||||||
picture->structure = GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD;
|
picture->structure = GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD;
|
||||||
|
@ -606,7 +602,6 @@ decode_picture_ext(GstVaapiDecoderMpeg2 *decoder, guchar *buf, guint buf_size)
|
||||||
break;
|
break;
|
||||||
case GST_MPEG_VIDEO_PICTURE_STRUCTURE_FRAME:
|
case GST_MPEG_VIDEO_PICTURE_STRUCTURE_FRAME:
|
||||||
picture->structure = GST_VAAPI_PICTURE_STRUCTURE_FRAME;
|
picture->structure = GST_VAAPI_PICTURE_STRUCTURE_FRAME;
|
||||||
priv->is_first_field = TRUE;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return GST_VAAPI_DECODER_STATUS_SUCCESS;
|
return GST_VAAPI_DECODER_STATUS_SUCCESS;
|
||||||
|
@ -643,7 +638,7 @@ fill_picture(GstVaapiDecoderMpeg2 *decoder, GstVaapiPicture *picture)
|
||||||
#define COPY_FIELD(a, b, f) \
|
#define COPY_FIELD(a, b, f) \
|
||||||
pic_param->a.b.f = pic_ext->f
|
pic_param->a.b.f = pic_ext->f
|
||||||
pic_param->picture_coding_extension.value = 0;
|
pic_param->picture_coding_extension.value = 0;
|
||||||
pic_param->picture_coding_extension.bits.is_first_field = priv->is_first_field;
|
pic_param->picture_coding_extension.bits.is_first_field = GST_VAAPI_PICTURE_IS_FIRST_FIELD(picture);
|
||||||
COPY_FIELD(picture_coding_extension, bits, intra_dc_precision);
|
COPY_FIELD(picture_coding_extension, bits, intra_dc_precision);
|
||||||
COPY_FIELD(picture_coding_extension, bits, picture_structure);
|
COPY_FIELD(picture_coding_extension, bits, picture_structure);
|
||||||
COPY_FIELD(picture_coding_extension, bits, top_field_first);
|
COPY_FIELD(picture_coding_extension, bits, top_field_first);
|
||||||
|
@ -945,7 +940,6 @@ gst_vaapi_decoder_mpeg2_init(GstVaapiDecoderMpeg2 *decoder)
|
||||||
priv->pts_diff = 0;
|
priv->pts_diff = 0;
|
||||||
priv->is_constructed = FALSE;
|
priv->is_constructed = FALSE;
|
||||||
priv->is_opened = FALSE;
|
priv->is_opened = FALSE;
|
||||||
priv->is_first_field = FALSE;
|
|
||||||
priv->has_seq_ext = FALSE;
|
priv->has_seq_ext = FALSE;
|
||||||
priv->has_seq_scalable_ext = FALSE;
|
priv->has_seq_scalable_ext = FALSE;
|
||||||
priv->has_pic_ext = FALSE;
|
priv->has_pic_ext = FALSE;
|
||||||
|
|
|
@ -114,6 +114,7 @@ gst_vaapi_picture_create(
|
||||||
(GST_VAAPI_PICTURE_FLAG_SKIPPED |
|
(GST_VAAPI_PICTURE_FLAG_SKIPPED |
|
||||||
GST_VAAPI_PICTURE_FLAG_REFERENCE |
|
GST_VAAPI_PICTURE_FLAG_REFERENCE |
|
||||||
GST_VAAPI_PICTURE_FLAG_INTERLACED |
|
GST_VAAPI_PICTURE_FLAG_INTERLACED |
|
||||||
|
GST_VAAPI_PICTURE_FLAG_FF |
|
||||||
GST_VAAPI_PICTURE_FLAG_TFF)
|
GST_VAAPI_PICTURE_FLAG_TFF)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -128,6 +129,7 @@ gst_vaapi_picture_create(
|
||||||
picture->structure = GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD;
|
picture->structure = GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
GST_VAAPI_PICTURE_FLAG_UNSET(picture, GST_VAAPI_PICTURE_FLAG_FF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -141,6 +143,7 @@ gst_vaapi_picture_create(
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
picture->structure = GST_VAAPI_PICTURE_STRUCTURE_FRAME;
|
picture->structure = GST_VAAPI_PICTURE_STRUCTURE_FRAME;
|
||||||
|
GST_VAAPI_PICTURE_FLAG_SET(picture, GST_VAAPI_PICTURE_FLAG_FF);
|
||||||
}
|
}
|
||||||
picture->surface_id = gst_vaapi_surface_get_id(picture->surface);
|
picture->surface_id = gst_vaapi_surface_get_id(picture->surface);
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,7 @@ enum _GstVaapiPictureType {
|
||||||
* @GST_VAAPI_PICTURE_FLAG_REFERENCE: reference frame
|
* @GST_VAAPI_PICTURE_FLAG_REFERENCE: reference frame
|
||||||
* @GST_VAAPI_PICTURE_FLAG_OUTPUT: frame was output
|
* @GST_VAAPI_PICTURE_FLAG_OUTPUT: frame was output
|
||||||
* @GST_VAAPI_PICTURE_FLAG_INTERLACED: interlaced frame
|
* @GST_VAAPI_PICTURE_FLAG_INTERLACED: interlaced frame
|
||||||
|
* @GST_VAAPI_PICTURE_FLAG_FF: first-field
|
||||||
* @GST_VAAPI_PICTURE_FLAG_TFF: top-field-first
|
* @GST_VAAPI_PICTURE_FLAG_TFF: top-field-first
|
||||||
* @GST_VAAPI_PICTURE_FLAG_LAST: first flag that can be used by subclasses
|
* @GST_VAAPI_PICTURE_FLAG_LAST: first flag that can be used by subclasses
|
||||||
*
|
*
|
||||||
|
@ -91,6 +92,7 @@ enum {
|
||||||
GST_VAAPI_PICTURE_FLAG_REFERENCE = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 1),
|
GST_VAAPI_PICTURE_FLAG_REFERENCE = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 1),
|
||||||
GST_VAAPI_PICTURE_FLAG_OUTPUT = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 2),
|
GST_VAAPI_PICTURE_FLAG_OUTPUT = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 2),
|
||||||
GST_VAAPI_PICTURE_FLAG_INTERLACED = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 3),
|
GST_VAAPI_PICTURE_FLAG_INTERLACED = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 3),
|
||||||
|
GST_VAAPI_PICTURE_FLAG_FF = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 4),
|
||||||
GST_VAAPI_PICTURE_FLAG_TFF = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 5),
|
GST_VAAPI_PICTURE_FLAG_TFF = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 5),
|
||||||
GST_VAAPI_PICTURE_FLAG_LAST = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 6),
|
GST_VAAPI_PICTURE_FLAG_LAST = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 6),
|
||||||
};
|
};
|
||||||
|
@ -112,6 +114,9 @@ enum {
|
||||||
#define GST_VAAPI_PICTURE_IS_INTERLACED(picture) \
|
#define GST_VAAPI_PICTURE_IS_INTERLACED(picture) \
|
||||||
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_INTERLACED)
|
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_INTERLACED)
|
||||||
|
|
||||||
|
#define GST_VAAPI_PICTURE_IS_FIRST_FIELD(picture) \
|
||||||
|
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_FF)
|
||||||
|
|
||||||
#define GST_VAAPI_PICTURE_IS_TFF(picture) \
|
#define GST_VAAPI_PICTURE_IS_TFF(picture) \
|
||||||
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_TFF)
|
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_TFF)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue