mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-02 04:22:27 +00:00
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: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/941>
This commit is contained in:
parent
0dc419197f
commit
c1f91ba004
2 changed files with 21 additions and 5 deletions
|
@ -159,6 +159,7 @@ gst_xvcontext_get_xv_support (GstXvContext * context,
|
||||||
static const char dbl_buffer[] = "XV_DOUBLE_BUFFER";
|
static const char dbl_buffer[] = "XV_DOUBLE_BUFFER";
|
||||||
static const char colorkey[] = "XV_COLORKEY";
|
static const char colorkey[] = "XV_COLORKEY";
|
||||||
static const char iturbt709[] = "XV_ITURBT_709";
|
static const char iturbt709[] = "XV_ITURBT_709";
|
||||||
|
static const char *xv_colorspace = "XV_COLORSPACE";
|
||||||
|
|
||||||
GST_DEBUG ("Checking %d Xv port attributes", count);
|
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_double_buffer = FALSE;
|
||||||
context->have_colorkey = FALSE;
|
context->have_colorkey = FALSE;
|
||||||
context->have_iturbt709 = FALSE;
|
context->have_iturbt709 = FALSE;
|
||||||
|
context->have_xvcolorspace = FALSE;
|
||||||
|
|
||||||
for (i = 0; ((i < count) && todo); i++) {
|
for (i = 0; ((i < count) && todo); i++) {
|
||||||
GST_DEBUG ("Got attribute %s", attr[i].name);
|
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)) {
|
} else if (!strcmp (attr[i].name, iturbt709)) {
|
||||||
todo--;
|
todo--;
|
||||||
context->have_iturbt709 = TRUE;
|
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;
|
Atom prop_atom;
|
||||||
int xv_value;
|
int xv_value;
|
||||||
|
|
||||||
if (!context->have_iturbt709)
|
if (!context->have_iturbt709 && !context->have_xvcolorspace)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (colorimetry->matrix) {
|
switch (colorimetry->matrix) {
|
||||||
|
@ -919,10 +924,20 @@ gst_xvcontext_set_colorimetry (GstXvContext * context,
|
||||||
}
|
}
|
||||||
|
|
||||||
g_mutex_lock (&context->lock);
|
g_mutex_lock (&context->lock);
|
||||||
prop_atom = XInternAtom (context->disp, "XV_ITURBT_709", True);
|
if (context->have_iturbt709) {
|
||||||
if (prop_atom != None) {
|
prop_atom = XInternAtom (context->disp, "XV_ITURBT_709", True);
|
||||||
XvSetPortAttribute (context->disp,
|
if (prop_atom != None) {
|
||||||
context->xv_port_id, prop_atom, xv_value);
|
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);
|
g_mutex_unlock (&context->lock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,6 +160,7 @@ struct _GstXvContext
|
||||||
gboolean have_colorkey;
|
gboolean have_colorkey;
|
||||||
gboolean have_double_buffer;
|
gboolean have_double_buffer;
|
||||||
gboolean have_iturbt709;
|
gboolean have_iturbt709;
|
||||||
|
gboolean have_xvcolorspace;
|
||||||
|
|
||||||
GList *formats_list;
|
GList *formats_list;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue