From: Jan Schmidt Date: Wed, 25 Nov 2020 12:54:08 +0000 (+1100) Subject: xvimagesink: Add support for the XV_COLORSPACE attribute. X-Git-Tag: 1.19.3~511^2~362 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c1f91ba004000e6e97ec736796089c829f86ad9f;p=platform%2Fupstream%2Fgstreamer.git xvimagesink: Add support for the XV_COLORSPACE attribute. The XV_COLORSPACE attribute exists on some Xv adapters, with the same semantics as the XV_ITURBT_709 attribute that was already supported. A value of 0 is bt601, and 1 is for bt709 colorspace. Fixes color shifting issues displaying bt709 content on some Xv adapters. Part-of: --- diff --git a/sys/xvimage/xvcontext.c b/sys/xvimage/xvcontext.c index 7b2cc44..152746e 100644 --- a/sys/xvimage/xvcontext.c +++ b/sys/xvimage/xvcontext.c @@ -159,6 +159,7 @@ gst_xvcontext_get_xv_support (GstXvContext * context, static const char dbl_buffer[] = "XV_DOUBLE_BUFFER"; static const char colorkey[] = "XV_COLORKEY"; static const char iturbt709[] = "XV_ITURBT_709"; + static const char *xv_colorspace = "XV_COLORSPACE"; GST_DEBUG ("Checking %d Xv port attributes", count); @@ -166,6 +167,7 @@ gst_xvcontext_get_xv_support (GstXvContext * context, context->have_double_buffer = FALSE; context->have_colorkey = FALSE; context->have_iturbt709 = FALSE; + context->have_xvcolorspace = FALSE; for (i = 0; ((i < count) && todo); i++) { GST_DEBUG ("Got attribute %s", attr[i].name); @@ -234,6 +236,9 @@ gst_xvcontext_get_xv_support (GstXvContext * context, } else if (!strcmp (attr[i].name, iturbt709)) { todo--; context->have_iturbt709 = TRUE; + } else if (!strcmp (attr[i].name, xv_colorspace)) { + context->have_xvcolorspace = TRUE; + todo--; } } @@ -905,7 +910,7 @@ gst_xvcontext_set_colorimetry (GstXvContext * context, Atom prop_atom; int xv_value; - if (!context->have_iturbt709) + if (!context->have_iturbt709 && !context->have_xvcolorspace) return; switch (colorimetry->matrix) { @@ -919,10 +924,20 @@ gst_xvcontext_set_colorimetry (GstXvContext * context, } 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); + if (context->have_iturbt709) { + prop_atom = XInternAtom (context->disp, "XV_ITURBT_709", True); + if (prop_atom != None) { + XvSetPortAttribute (context->disp, + context->xv_port_id, prop_atom, xv_value); + } + } + + if (context->have_xvcolorspace) { + prop_atom = XInternAtom (context->disp, "XV_COLORSPACE", True); + if (prop_atom != None) { + XvSetPortAttribute (context->disp, + context->xv_port_id, prop_atom, xv_value); + } } g_mutex_unlock (&context->lock); } diff --git a/sys/xvimage/xvcontext.h b/sys/xvimage/xvcontext.h index 4efe3f0..68cbdb7 100644 --- a/sys/xvimage/xvcontext.h +++ b/sys/xvimage/xvcontext.h @@ -160,6 +160,7 @@ struct _GstXvContext gboolean have_colorkey; gboolean have_double_buffer; gboolean have_iturbt709; + gboolean have_xvcolorspace; GList *formats_list;