xvimagesink: configure colorimetry
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 14 Mar 2013 14:46:59 +0000 (15:46 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Thu, 14 Mar 2013 14:46:59 +0000 (15:46 +0100)
Use the XV_ITURBT_709 attribute to configure the 601 or 709 matrix
depending on the color matrix of the input video frame.

sys/xvimage/xvcontext.c
sys/xvimage/xvcontext.h
sys/xvimage/xvimagesink.c

index b524644..d89ea48 100644 (file)
@@ -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)
 {
index 2289787..1bd0d97 100644 (file)
@@ -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;
index d62f111..de1c1f9 100644 (file)
@@ -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