surface: rework render flags.

Pack render flags per category and provide more flags into the color
standard category. In particular, cover for SMPTE-240M.
This commit is contained in:
Gwenole Beauchesne 2012-03-28 15:05:26 +02:00
parent 467bf95c09
commit 751aa05937
3 changed files with 52 additions and 23 deletions

View file

@ -110,19 +110,32 @@ typedef enum {
* uses ITU-R BT.601 standard for color space conversion * uses ITU-R BT.601 standard for color space conversion
* @GST_VAAPI_COLOR_STANDARD_ITUR_BT_709: * @GST_VAAPI_COLOR_STANDARD_ITUR_BT_709:
* uses ITU-R BT.709 standard for color space conversion * uses ITU-R BT.709 standard for color space conversion
* @GST_VAAPI_COLOR_STANDARD_ITUR_BT_470M:
* uses ITU-R BT.470-2 System M standard for color space conversion
* @GST_VAAPI_COLOR_STANDARD_ITUR_BT_470BG:
* uses ITU-R BT.470-2 System B, G standard for color space conversion
* @GST_VAAPI_COLOR_STANDARD_SMPTE_170M:
* uses SMPTE-170M standard for color space conversion
* @GST_VAAPI_COLOR_STANDARD_SMPTE_240M:
* uses SMPTE-240M standard for color space conversion
* *
* The set of all render flags for gst_vaapi_window_put_surface(). * The set of all render flags for gst_vaapi_window_put_surface().
*/ */
typedef enum { typedef enum {
GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD = 1 << 0, /* Picture structure */
GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD = 1 << 1, GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD = 0x01 << 0,
GST_VAAPI_PICTURE_STRUCTURE_FRAME = GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD = 0x02 << 0,
( GST_VAAPI_PICTURE_STRUCTURE_FRAME = 0x03 << 0,
GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD | GST_VAAPI_PICTURE_STRUCTURE_MASK = 0x00000003, /* 2 bits */
GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD
), /* Color standard */
GST_VAAPI_COLOR_STANDARD_ITUR_BT_601 = 1 << 2, GST_VAAPI_COLOR_STANDARD_ITUR_BT_601 = 0x01 << 2,
GST_VAAPI_COLOR_STANDARD_ITUR_BT_709 = 1 << 3, GST_VAAPI_COLOR_STANDARD_ITUR_BT_709 = 0x02 << 2,
GST_VAAPI_COLOR_STANDARD_ITUR_BT_470M = 0x03 << 2,
GST_VAAPI_COLOR_STANDARD_ITUR_BT_470BG = 0x04 << 2,
GST_VAAPI_COLOR_STANDARD_SMPTE_170M = 0x05 << 2,
GST_VAAPI_COLOR_STANDARD_SMPTE_240M = 0x06 << 2,
GST_VAAPI_COLOR_STANDARD_MASK = 0x0000003c, /* 4 bits */
} GstVaapiSurfaceRenderFlags; } GstVaapiSurfaceRenderFlags;
#define GST_VAAPI_SURFACE(obj) \ #define GST_VAAPI_SURFACE(obj) \

View file

@ -366,24 +366,42 @@ to_GstVideoOverlayFormatFlags(guint flags)
guint guint
from_GstVaapiSurfaceRenderFlags(guint flags) from_GstVaapiSurfaceRenderFlags(guint flags)
{ {
guint va_fields = 0, va_csc = 0; guint va_fields, va_csc;
if (flags & GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD) /* Picture structure */
va_fields |= VA_TOP_FIELD; switch (flags & GST_VAAPI_PICTURE_STRUCTURE_MASK) {
if (flags & GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD) case GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD:
va_fields |= VA_BOTTOM_FIELD; va_fields = VA_TOP_FIELD;
if ((va_fields ^ (VA_TOP_FIELD|VA_BOTTOM_FIELD)) == 0) break;
va_fields = VA_FRAME_PICTURE; case GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD:
va_fields = VA_BOTTOM_FIELD;
break;
default:
va_fields = VA_FRAME_PICTURE;
break;
}
/* Color standard */
switch (flags & GST_VAAPI_COLOR_STANDARD_MASK) {
#ifdef VA_SRC_BT601 #ifdef VA_SRC_BT601
if (flags & GST_VAAPI_COLOR_STANDARD_ITUR_BT_601) case GST_VAAPI_COLOR_STANDARD_ITUR_BT_601:
va_csc = VA_SRC_BT601; va_csc = VA_SRC_BT601;
break;
#endif #endif
#ifdef VA_SRC_BT709 #ifdef VA_SRC_BT709
if (flags & GST_VAAPI_COLOR_STANDARD_ITUR_BT_709) case GST_VAAPI_COLOR_STANDARD_ITUR_BT_709:
va_csc = VA_SRC_BT709; va_csc = VA_SRC_BT709;
break;
#endif #endif
#ifdef VA_SRC_SMPTE_240
case GST_VAAPI_COLOR_STANDARD_SMPTE_240M:
va_csc = VA_SRC_SMPTE_240;
break;
#endif
default:
va_csc = 0;
break;
}
return va_fields|va_csc; return va_fields|va_csc;
} }

View file

@ -489,8 +489,7 @@ gst_vaapipostproc_process_vpp(GstBaseTransform *trans, GstBuffer *inbuf,
ds->tff = tff; ds->tff = tff;
flags = gst_vaapi_video_meta_get_render_flags(inbuf_meta) & flags = gst_vaapi_video_meta_get_render_flags(inbuf_meta) &
~(GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD| ~GST_VAAPI_PICTURE_STRUCTURE_MASK;
GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD);
/* First field */ /* First field */
deint_method = postproc->deinterlace_method; deint_method = postproc->deinterlace_method;
@ -652,8 +651,7 @@ gst_vaapipostproc_process(GstBaseTransform *trans, GstBuffer *inbuf,
deint = is_interlaced_buffer(postproc, inbuf); deint = is_interlaced_buffer(postproc, inbuf);
flags = gst_vaapi_video_meta_get_render_flags(meta) & flags = gst_vaapi_video_meta_get_render_flags(meta) &
~(GST_VAAPI_PICTURE_STRUCTURE_TOP_FIELD| ~GST_VAAPI_PICTURE_STRUCTURE_MASK;
GST_VAAPI_PICTURE_STRUCTURE_BOTTOM_FIELD);
/* First field */ /* First field */
fieldbuf = create_output_buffer(postproc); fieldbuf = create_output_buffer(postproc);