diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c b/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c index abd0e06dd8..5a77b7deb0 100644 --- a/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c +++ b/gst-libs/gst/vaapi/gstvaapidecoder_mpeg2.c @@ -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; } diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_objects.c b/gst-libs/gst/vaapi/gstvaapidecoder_objects.c index 79f8a1646d..29832dd0f1 100644 --- a/gst-libs/gst/vaapi/gstvaapidecoder_objects.c +++ b/gst-libs/gst/vaapi/gstvaapidecoder_objects.c @@ -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); diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_objects.h b/gst-libs/gst/vaapi/gstvaapidecoder_objects.h index cb64611e91..90009c777a 100644 --- a/gst-libs/gst/vaapi/gstvaapidecoder_objects.h +++ b/gst-libs/gst/vaapi/gstvaapidecoder_objects.h @@ -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; }; /**