File mpv_PR6206.patch of Package mpv

From 87b35687c2b435a7ff2d91645f32cd9904a3c68c Mon Sep 17 00:00:00 2001
From: slatchurie <slatchurie@gmail.com>
Date: Thu, 11 Oct 2018 14:19:19 +0200
Subject: [PATCH 1/2] x11: retrieve the icc profile from colord

Most desktop environments do not support the _ICC_PROFILE Atom well,
especially if there are multiple displays.

Retrieving and using the icc profile from the colord server, if
available.
---
 video/out/x11_common.c | 65 +++++++++++++++++++++++++++++++++++++-----
 wscript                |  3 +-
 2 files changed, 60 insertions(+), 8 deletions(-)

diff --git a/video/out/x11_common.c b/video/out/x11_common.c
index 25325e760c..5c32ee8c54 100644
--- a/video/out/x11_common.c
+++ b/video/out/x11_common.c
@@ -24,6 +24,7 @@
 #include <poll.h>
 #include <string.h>
 #include <assert.h>
+#include <colord.h>
 
 #include <X11/Xmd.h>
 #include <X11/Xlib.h>
@@ -1751,6 +1752,52 @@ static void vo_x11_fullscreen(struct vo *vo)
     vo_x11_update_composition_hint(vo);
 }
 
+static bool vo_x11_get_icc_profile_colord(struct vo *vo, int screen,
+                                          bstr *out_icc)
+{
+    struct vo_x11_state *x11 = vo->x11;
+    bool ret_loaded = false;
+    CdDevice *dev = NULL;
+    CdProfile *prof = NULL;
+    CdIcc *icc = NULL;
+    GBytes *icc_bytes = NULL;
+    CdClient *cli = cd_client_new();
+    if (!cli || !cd_client_connect_sync(cli, NULL, NULL))
+        goto out;
+    dev = cd_client_find_device_by_property_sync(cli,
+                                                 CD_DEVICE_METADATA_XRANDR_NAME,
+                                                 x11->displays[screen].name,
+                                                 NULL, NULL);
+    if (!dev || !cd_device_connect_sync(dev, NULL, NULL))
+        goto out;
+    prof = cd_device_get_default_profile(dev);
+    if (!prof || !cd_profile_connect_sync(prof, NULL, NULL))
+        goto out;
+    icc = cd_profile_load_icc(prof, CD_ICC_LOAD_FLAGS_NONE, NULL, NULL);
+    if (!icc)
+        goto out;
+    MP_VERBOSE(x11, "Using profile %s\n", g_strdup(cd_icc_get_filename(icc)));
+    icc_bytes = cd_icc_save_data(icc, CD_ICC_SAVE_FLAGS_NONE, NULL);
+    if (!icc_bytes)
+        goto out;
+    int len = g_bytes_get_size(icc_bytes);
+    char *data = (char *)g_bytes_get_data(icc_bytes, NULL);
+    *out_icc = bstrdup(NULL, (bstr){data, len});
+    ret_loaded = true;
+out:
+    if (icc_bytes)
+        g_bytes_unref(icc_bytes);
+    if (icc)
+        g_object_unref(icc);
+    if (prof)
+        g_object_unref(prof);
+    if (dev)
+        g_object_unref(dev);
+    if (cli)
+        g_object_unref(cli);
+    return ret_loaded;
+}
+
 int vo_x11_control(struct vo *vo, int *events, int request, void *arg)
 {
     struct mp_vo_opts *opts = vo->opts;
@@ -1844,14 +1891,18 @@ int vo_x11_control(struct vo *vo, int *events, int request, void *arg)
         if (screen > 0)
             mp_snprintf_cat(prop, sizeof(prop), "_%d", screen);
         x11->icc_profile_property = XAs(x11, prop);
-        int len;
         MP_VERBOSE(x11, "Retrieving ICC profile for display: %d\n", screen);
-        void *icc = x11_get_property(x11, x11->rootwin, x11->icc_profile_property,
-                                     XA_CARDINAL, 8, &len);
-        if (!icc)
-            return VO_FALSE;
-        *(bstr *)arg = bstrdup(NULL, (bstr){icc, len});
-        XFree(icc);
+        bstr icc_data;
+        if (!vo_x11_get_icc_profile_colord(vo, screen, &icc_data)) {
+            int len;
+            void *icc = x11_get_property(x11, x11->rootwin, x11->icc_profile_property,
+                                         XA_CARDINAL, 8, &len);
+            if (!icc)
+                return VO_FALSE;
+            icc_data = bstrdup(NULL, (bstr){icc, len});
+            XFree(icc);
+        }
+        *(bstr *)arg = icc_data;
         // Watch x11->icc_profile_property
         XSelectInput(x11->display, x11->rootwin, PropertyChangeMask);
         return VO_TRUE;
diff --git a/wscript b/wscript
index b299a27a1a..271d90dd94 100644
--- a/wscript
+++ b/wscript
@@ -587,7 +587,8 @@ video_output_features = [
                                  'xscrnsaver',  '>= 1.0.0',
                                  'xext',        '>= 1.0.0',
                                  'xinerama',    '>= 1.0.0',
-                                 'xrandr',      '>= 1.2.0'),
+                                 'xrandr',      '>= 1.2.0',
+                                 'colord',      '>= 1.0.2'),
     } , {
         'name': '--xv',
         'desc': 'Xv video output',

From 6c61e66d626ada0cfae87c5bc1b42cb95558f9ef Mon Sep 17 00:00:00 2001
From: slatchurie <slatchurie@gmail.com>
Date: Fri, 12 Oct 2018 16:42:58 +0200
Subject: [PATCH 2/2] x11: make colord optional at build time

---
 video/out/x11_common.c | 20 ++++++++++++--------
 wscript                |  8 ++++++--
 2 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/video/out/x11_common.c b/video/out/x11_common.c
index 5c32ee8c54..ebeec79484 100644
--- a/video/out/x11_common.c
+++ b/video/out/x11_common.c
@@ -15,6 +15,7 @@
  * with mpv.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include "config.h"
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
@@ -24,7 +25,9 @@
 #include <poll.h>
 #include <string.h>
 #include <assert.h>
+#if HAVE_COLORD
 #include <colord.h>
+#endif
 
 #include <X11/Xmd.h>
 #include <X11/Xlib.h>
@@ -39,7 +42,6 @@
 #include <X11/extensions/Xinerama.h>
 #include <X11/extensions/Xrandr.h>
 
-#include "config.h"
 #include "misc/bstr.h"
 #include "options/options.h"
 #include "options/m_config.h"
@@ -1752,11 +1754,11 @@ static void vo_x11_fullscreen(struct vo *vo)
     vo_x11_update_composition_hint(vo);
 }
 
-static bool vo_x11_get_icc_profile_colord(struct vo *vo, int screen,
-                                          bstr *out_icc)
+#if HAVE_COLORD
+static void vo_x11_get_icc_profile_colord(struct vo *vo, int screen,
+                                          struct bstr *out_icc)
 {
     struct vo_x11_state *x11 = vo->x11;
-    bool ret_loaded = false;
     CdDevice *dev = NULL;
     CdProfile *prof = NULL;
     CdIcc *icc = NULL;
@@ -1783,7 +1785,6 @@ static bool vo_x11_get_icc_profile_colord(struct vo *vo, int screen,
     int len = g_bytes_get_size(icc_bytes);
     char *data = (char *)g_bytes_get_data(icc_bytes, NULL);
     *out_icc = bstrdup(NULL, (bstr){data, len});
-    ret_loaded = true;
 out:
     if (icc_bytes)
         g_bytes_unref(icc_bytes);
@@ -1795,8 +1796,8 @@ static bool vo_x11_get_icc_profile_colord(struct vo *vo, int screen,
         g_object_unref(dev);
     if (cli)
         g_object_unref(cli);
-    return ret_loaded;
 }
+#endif
 
 int vo_x11_control(struct vo *vo, int *events, int request, void *arg)
 {
@@ -1892,8 +1893,11 @@ int vo_x11_control(struct vo *vo, int *events, int request, void *arg)
             mp_snprintf_cat(prop, sizeof(prop), "_%d", screen);
         x11->icc_profile_property = XAs(x11, prop);
         MP_VERBOSE(x11, "Retrieving ICC profile for display: %d\n", screen);
-        bstr icc_data;
-        if (!vo_x11_get_icc_profile_colord(vo, screen, &icc_data)) {
+        bstr icc_data = {0};
+#if HAVE_COLORD
+        vo_x11_get_icc_profile_colord(vo, screen, &icc_data);
+#endif
+        if (!icc_data.len) {
             int len;
             void *icc = x11_get_property(x11, x11->rootwin, x11->icc_profile_property,
                                          XA_CARDINAL, 8, &len);
diff --git a/wscript b/wscript
index 271d90dd94..4d43fb607a 100644
--- a/wscript
+++ b/wscript
@@ -587,8 +587,12 @@ video_output_features = [
                                  'xscrnsaver',  '>= 1.0.0',
                                  'xext',        '>= 1.0.0',
                                  'xinerama',    '>= 1.0.0',
-                                 'xrandr',      '>= 1.2.0',
-                                 'colord',      '>= 1.0.2'),
+                                 'xrandr',      '>= 1.2.0'),
+    } , {
+        'name': '--colord',
+        'desc': 'colord',
+        'deps': 'x11',
+        'func': check_pkg_config('colord', '>= 1.0.2'),
     } , {
         'name': '--xv',
         'desc': 'Xv video output',
openSUSE Build Service is sponsored by