mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
decoder: rework picture field flags.
Add top-field-first (TFF) and interlaced flags to GstVaapiPicture so they could be propagated to the surface proxy when it is pushed for rendering. Besides, top and bottom fields are now expressed with picture structure flags from GstVaapiSurfaceRenderFlags.
This commit is contained in:
parent
e8756ae427
commit
c27385aa8d
3 changed files with 21 additions and 20 deletions
|
@ -599,12 +599,13 @@ decode_picture_ext(GstVaapiDecoderMpeg2 *decoder, guchar *buf, guint buf_size)
|
|||
priv->is_first_field ^= 1;
|
||||
switch (pic_ext->picture_structure) {
|
||||
case GST_MPEG_VIDEO_PICTURE_STRUCTURE_TOP_FIELD:
|
||||
GST_VAAPI_PICTURE_FLAG_SET(picture, GST_VAAPI_PICTURE_FLAG_TOP_FIELD);
|
||||
picture->structure = GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD;
|
||||
break;
|
||||
case GST_MPEG_VIDEO_PICTURE_STRUCTURE_BOTTOM_FIELD:
|
||||
GST_VAAPI_PICTURE_FLAG_SET(picture, GST_VAAPI_PICTURE_FLAG_BOTTOM_FIELD);
|
||||
picture->structure = GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD;
|
||||
break;
|
||||
case GST_MPEG_VIDEO_PICTURE_STRUCTURE_FRAME:
|
||||
picture->structure = GST_VAAPI_PICTURE_STRUCTURE_FRAME;
|
||||
priv->is_first_field = TRUE;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -98,6 +98,7 @@ gst_vaapi_picture_create(
|
|||
if (!picture->surface)
|
||||
return FALSE;
|
||||
picture->surface_id = gst_vaapi_surface_get_id(picture->surface);
|
||||
picture->structure = GST_VAAPI_PICTURE_STRUCTURE_FRAME;
|
||||
|
||||
picture->proxy =
|
||||
gst_vaapi_surface_proxy_new(GET_CONTEXT(picture), picture->surface);
|
||||
|
@ -253,6 +254,10 @@ gst_vaapi_picture_output(GstVaapiPicture *picture)
|
|||
if (!GST_VAAPI_PICTURE_IS_SKIPPED(picture)) {
|
||||
proxy = g_object_ref(picture->proxy);
|
||||
gst_vaapi_surface_proxy_set_timestamp(proxy, picture->pts);
|
||||
if (GST_VAAPI_PICTURE_IS_INTERLACED(picture))
|
||||
gst_vaapi_surface_proxy_set_interlaced(proxy, TRUE);
|
||||
if (GST_VAAPI_PICTURE_IS_TFF(picture))
|
||||
gst_vaapi_surface_proxy_set_tff(proxy, TRUE);
|
||||
gst_vaapi_decoder_push_surface_proxy(GET_DECODER(picture), proxy);
|
||||
}
|
||||
GST_VAAPI_PICTURE_FLAG_SET(picture, GST_VAAPI_PICTURE_FLAG_OUTPUT);
|
||||
|
|
|
@ -79,23 +79,20 @@ enum _GstVaapiPictureType {
|
|||
* Picture flags:
|
||||
* @GST_VAAPI_PICTURE_FLAG_SKIPPED: skipped frame
|
||||
* @GST_VAAPI_PICTURE_FLAG_REFERENCE: reference frame
|
||||
* @GST_VAAPI_PICTURE_FLAG_BOTTOM_FIELD: bottom field
|
||||
* @GST_VAAPI_PICTURE_FLAG_TOP_FIELD: top field
|
||||
* @GST_VAAPI_PICTURE_FLAG_OUTPUT: frame was output
|
||||
* @GST_VAAPI_PICTURE_FLAG_INTERLACED: interlaced frame
|
||||
* @GST_VAAPI_PICTURE_FLAG_TFF: top-field-first
|
||||
* @GST_VAAPI_PICTURE_FLAG_LAST: first flag that can be used by subclasses
|
||||
*
|
||||
* Enum values used for #GstVaapiPicture flags.
|
||||
*/
|
||||
enum {
|
||||
GST_VAAPI_PICTURE_FLAG_SKIPPED = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 0),
|
||||
GST_VAAPI_PICTURE_FLAG_REFERENCE = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 1),
|
||||
GST_VAAPI_PICTURE_FLAG_BOTTOM_FIELD = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 2),
|
||||
GST_VAAPI_PICTURE_FLAG_TOP_FIELD = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 3),
|
||||
GST_VAAPI_PICTURE_FLAG_OUTPUT = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 4),
|
||||
GST_VAAPI_PICTURE_FLAG_LAST = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 5),
|
||||
|
||||
GST_VAAPI_PICTURE_MASK_STRUCTURE = (GST_VAAPI_PICTURE_FLAG_TOP_FIELD |
|
||||
GST_VAAPI_PICTURE_FLAG_BOTTOM_FIELD)
|
||||
GST_VAAPI_PICTURE_FLAG_SKIPPED = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 0),
|
||||
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_INTERLACED = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 3),
|
||||
GST_VAAPI_PICTURE_FLAG_TFF = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 5),
|
||||
GST_VAAPI_PICTURE_FLAG_LAST = (GST_VAAPI_CODEC_OBJECT_FLAG_LAST << 6),
|
||||
};
|
||||
|
||||
#define GST_VAAPI_PICTURE_FLAGS GST_MINI_OBJECT_FLAGS
|
||||
|
@ -112,14 +109,11 @@ enum {
|
|||
#define GST_VAAPI_PICTURE_IS_OUTPUT(picture) \
|
||||
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_OUTPUT)
|
||||
|
||||
#define GST_VAAPI_PICTURE_IS_TOP_FIELD(picture) \
|
||||
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_TOP_FIELD)
|
||||
#define GST_VAAPI_PICTURE_IS_INTERLACED(picture) \
|
||||
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_INTERLACED)
|
||||
|
||||
#define GST_VAAPI_PICTURE_IS_BOTTOM_FIELD(picture) \
|
||||
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_BOTTOM_FIELD)
|
||||
|
||||
#define GST_VAAPI_PICTURE_IS_FRAME(picture) \
|
||||
((GST_VAAPI_PICTURE_FLAGS(picture) & GST_VAAPI_PICTURE_MASK_STRUCTURE) == 0)
|
||||
#define GST_VAAPI_PICTURE_IS_TFF(picture) \
|
||||
GST_VAAPI_PICTURE_FLAG_IS_SET(picture, GST_VAAPI_PICTURE_FLAG_TFF)
|
||||
|
||||
/**
|
||||
* GstVaapiPicture:
|
||||
|
@ -141,6 +135,7 @@ struct _GstVaapiPicture {
|
|||
GstVaapiIqMatrix *iq_matrix;
|
||||
GstVaapiBitPlane *bitplane;
|
||||
GstClockTime pts;
|
||||
guint structure;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue