diff --git a/sys/xvimage/xvcontext.c b/sys/xvimage/xvcontext.c index b524644e26..d89ea48572 100644 --- a/sys/xvimage/xvcontext.c +++ b/sys/xvimage/xvcontext.c @@ -884,6 +884,32 @@ gst_xvcontext_get_format_from_info (GstXvContext * context, GstVideoInfo * info) return -1; } +void +gst_xvcontext_set_colorimetry (GstXvContext * context, + GstVideoColorimetry * colorimetry) +{ + Atom prop_atom; + int xv_value; + + switch (colorimetry->matrix) { + case GST_VIDEO_COLOR_MATRIX_SMPTE240M: + case GST_VIDEO_COLOR_MATRIX_BT709: + xv_value = 1; + break; + default: + xv_value = 0; + break; + } + + g_mutex_lock (&context->lock); + prop_atom = XInternAtom (context->disp, "XV_ITURBT_709", True); + if (prop_atom != None) { + XvSetPortAttribute (context->disp, + context->xv_port_id, prop_atom, xv_value); + } + g_mutex_unlock (&context->lock); +} + GstXWindow * gst_xvcontext_create_xwindow (GstXvContext * context, gint width, gint height) { diff --git a/sys/xvimage/xvcontext.h b/sys/xvimage/xvcontext.h index 228978767c..1bd0d978d8 100644 --- a/sys/xvimage/xvcontext.h +++ b/sys/xvimage/xvcontext.h @@ -198,6 +198,8 @@ void gst_xvcontext_set_synchronous (GstXvContext * xvcontex gboolean synchronous); void gst_xvcontext_update_colorbalance (GstXvContext * xvcontext, GstXvContextConfig * config); +void gst_xvcontext_set_colorimetry (GstXvContext * xvcontext, + GstVideoColorimetry *colorimetry); typedef struct _GstXWindow GstXWindow; diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c index d62f111957..de1c1f9c3e 100644 --- a/sys/xvimage/xvimagesink.c +++ b/sys/xvimage/xvimagesink.c @@ -693,6 +693,8 @@ gst_xvimagesink_setcaps (GstBaseSink * bsink, GstCaps * caps) if (im_format == -1) goto invalid_format; + gst_xvcontext_set_colorimetry (context, &info.colorimetry); + size = info.size; /* get aspect ratio from caps if it's present, and