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:
Gwenole Beauchesne 2012-03-28 16:07:44 +02:00
parent e8756ae427
commit c27385aa8d
3 changed files with 21 additions and 20 deletions

View file

@ -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;
}

View file

@ -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);

View file

@ -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;
};
/**