d3d11screencapturesrc: Fix wrong color with HDR enabled
authorSeungha Yang <seungha@centricular.com>
Wed, 15 Nov 2023 13:41:47 +0000 (22:41 +0900)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Thu, 16 Nov 2023 12:53:31 +0000 (12:53 +0000)
Even if IDXGIOutput6 says current display colorspace is HDR,
captured texture via IDXGIOutputDuplication::AcquireNextFrame()
is converted frame by OS unless we use IDXGIOutput5::DuplicateOutput1()
with DXGI_FORMAT_R16G16B16A16_FLOAT format, in order for captured
frame to be scRGB color space. Then application should perform
tonemap operation based on reported display white level, color primaries, etc.

Since we don't have any tonemapping implementation, ignores colorimetry
reported by IDXGIOutput6.

Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3128
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5679>

subprojects/gst-plugins-bad/sys/d3d11/gstd3d11dxgicapture.cpp
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapture.cpp
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapture.h
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapturedevice.cpp
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapturesrc.cpp
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11winrtcapture.cpp

index fbdf8f6..07186d8 100644 (file)
@@ -1529,9 +1529,6 @@ gst_d3d11_dxgi_capture_prepare (GstD3D11ScreenCapture * capture);
 static gboolean
 gst_d3d11_dxgi_capture_get_size (GstD3D11ScreenCapture * capture,
     guint * width, guint * height);
-static gboolean
-gst_d3d11_dxgi_capture_get_colorimetry (GstD3D11ScreenCapture * capture,
-    GstVideoColorimetry * colorimetry);
 static GstFlowReturn
 gst_d3d11_dxgi_capture_do_capture (GstD3D11ScreenCapture * capture,
     GstD3D11Device * device, ID3D11Texture2D * texture,
@@ -1570,8 +1567,6 @@ gst_d3d11_dxgi_capture_class_init (GstD3D11DxgiCaptureClass * klass)
 
   capture_class->prepare = GST_DEBUG_FUNCPTR (gst_d3d11_dxgi_capture_prepare);
   capture_class->get_size = GST_DEBUG_FUNCPTR (gst_d3d11_dxgi_capture_get_size);
-  capture_class->get_colorimetry =
-      GST_DEBUG_FUNCPTR (gst_d3d11_dxgi_capture_get_colorimetry);
   capture_class->do_capture =
       GST_DEBUG_FUNCPTR (gst_d3d11_dxgi_capture_do_capture);
 }
@@ -1862,38 +1857,6 @@ gst_d3d11_dxgi_capture_get_size (GstD3D11ScreenCapture * capture,
   return gst_d3d11_dxgi_capture_get_size_unlocked (self, width, height);
 }
 
-static gboolean
-gst_d3d11_dxgi_capture_get_colorimetry (GstD3D11ScreenCapture * capture,
-    GstVideoColorimetry * colorimetry)
-{
-  GstD3D11DxgiCapture *self = GST_D3D11_DXGI_CAPTURE (capture);
-  DXGI_COLOR_SPACE_TYPE dxgi_cs;
-  GstVideoInfo info;
-
-  dxgi_cs = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
-
-  if (self->output) {
-    ComPtr < IDXGIOutput6 > output;
-    HRESULT hr;
-    DXGI_OUTPUT_DESC1 desc;
-
-    hr = self->output->QueryInterface (IID_PPV_ARGS (&output));
-    if (SUCCEEDED (hr))
-      hr = output->GetDesc1 (&desc);
-
-    if (SUCCEEDED (hr))
-      dxgi_cs = desc.ColorSpace;
-  }
-
-  gst_video_info_set_format (&info, GST_VIDEO_FORMAT_BGRA, 16, 16);
-  if (gst_video_info_apply_dxgi_color_space (dxgi_cs, &info)) {
-    *colorimetry = info.colorimetry;
-    return TRUE;
-  }
-
-  return FALSE;
-}
-
 static GstFlowReturn
 gst_d3d11_dxgi_capture_do_capture (GstD3D11ScreenCapture * capture,
     GstD3D11Device * device, ID3D11Texture2D * texture,
index 2506253..74af9b4 100644 (file)
@@ -79,21 +79,6 @@ gst_d3d11_screen_capture_get_size (GstD3D11ScreenCapture * capture,
 }
 
 gboolean
-gst_d3d11_screen_capture_get_colorimetry (GstD3D11ScreenCapture * capture,
-    GstVideoColorimetry * colorimetry)
-{
-  GstD3D11ScreenCaptureClass *klass;
-
-  g_return_val_if_fail (GST_IS_D3D11_SCREEN_CAPTURE (capture), FALSE);
-  g_return_val_if_fail (colorimetry != nullptr, FALSE);
-
-  klass = GST_D3D11_SCREEN_CAPTURE_GET_CLASS (capture);
-  g_assert (klass->get_colorimetry);
-
-  return klass->get_colorimetry (capture, colorimetry);
-}
-
-gboolean
 gst_d3d11_screen_capture_unlock (GstD3D11ScreenCapture * capture)
 {
   GstD3D11ScreenCaptureClass *klass;
index dbaef64..5705834 100644 (file)
@@ -56,9 +56,6 @@ struct _GstD3D11ScreenCaptureClass
                              guint * width,
                              guint * height);
 
-  gboolean      (*get_colorimetry) (GstD3D11ScreenCapture * capture,
-                                    GstVideoColorimetry * colorimetry);
-
   gboolean      (*unlock)          (GstD3D11ScreenCapture * capture);
 
   gboolean      (*unlock_stop)     (GstD3D11ScreenCapture * capture);
@@ -87,9 +84,6 @@ gboolean        gst_d3d11_screen_capture_get_size (GstD3D11ScreenCapture * captu
                                                    guint * width,
                                                    guint * height);
 
-gboolean        gst_d3d11_screen_capture_get_colorimetry (GstD3D11ScreenCapture * capture,
-                                                          GstVideoColorimetry * colorimetry);
-
 gboolean        gst_d3d11_screen_capture_unlock      (GstD3D11ScreenCapture * capture);
 
 gboolean        gst_d3d11_screen_capture_unlock_stop (GstD3D11ScreenCapture * capture);
index 01a87b2..468cf6e 100644 (file)
@@ -39,8 +39,10 @@ GST_DEBUG_CATEGORY_EXTERN (gst_d3d11_screen_capture_device_debug);
 
 static GstStaticCaps template_caps =
     GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
-    (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, "BGRA") ", pixel-aspect-ratio = 1/1;"
-    GST_VIDEO_CAPS_MAKE ("BGRA") ", pixel-aspect-ratio = 1/1");
+    (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY,
+        "BGRA") ", pixel-aspect-ratio = 1/1, colorimetry = (string) sRGB; "
+    GST_VIDEO_CAPS_MAKE ("BGRA") ", pixel-aspect-ratio = 1/1, "
+    "colorimetry = (string) sRGB");
 
 enum
 {
index 13ba11b..92155aa 100644 (file)
@@ -119,8 +119,10 @@ gst_d3d11_screen_capture_api_get_type (void)
 
 static GstStaticCaps template_caps =
     GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
-    (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY, "BGRA") ", pixel-aspect-ratio = 1/1;"
-    GST_VIDEO_CAPS_MAKE ("BGRA") ", pixel-aspect-ratio = 1/1");
+    (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY,
+        "BGRA") ", pixel-aspect-ratio = 1/1, colorimetry = (string) sRGB; "
+    GST_VIDEO_CAPS_MAKE ("BGRA") ", pixel-aspect-ratio = 1/1, "
+    "colorimetry = (string) sRGB");
 
 struct _GstD3D11ScreenCaptureSrc
 {
@@ -565,7 +567,6 @@ gst_d3d11_screen_capture_src_get_caps (GstBaseSrc * bsrc, GstCaps * filter)
   GstD3D11ScreenCaptureSrc *self = GST_D3D11_SCREEN_CAPTURE_SRC (bsrc);
   GstCaps *caps = NULL;
   guint width, height;
-  GstVideoColorimetry color;
 
   if (!self->capture) {
     GST_DEBUG_OBJECT (self, "capture object is not configured yet");
@@ -582,16 +583,6 @@ gst_d3d11_screen_capture_src_get_caps (GstBaseSrc * bsrc, GstCaps * filter)
   gst_caps_set_simple (caps, "width", G_TYPE_INT, width, "height",
       G_TYPE_INT, height, nullptr);
 
-  if (gst_d3d11_screen_capture_get_colorimetry (self->capture, &color)) {
-    gchar *color_str = gst_video_colorimetry_to_string (&color);
-
-    if (color_str) {
-      gst_caps_set_simple (caps, "colorimetry", G_TYPE_STRING, color_str,
-          nullptr);
-      g_free (color_str);
-    }
-  }
-
   if (filter) {
     GstCaps *tmp =
         gst_caps_intersect_full (filter, caps, GST_CAPS_INTERSECT_FIRST);
index 4c876f3..790f18a 100644 (file)
@@ -241,9 +241,6 @@ static gboolean
 gst_d3d11_winrt_capture_get_size (GstD3D11ScreenCapture * capture,
     guint * width, guint * height);
 static gboolean
-gst_d3d11_winrt_capture_get_colorimetry (GstD3D11ScreenCapture * capture,
-    GstVideoColorimetry * colorimetry);
-static gboolean
 gst_d3d11_winrt_capture_unlock (GstD3D11ScreenCapture * capture);
 static gboolean
 gst_d3d11_winrt_capture_unlock_stop (GstD3D11ScreenCapture * capture);
@@ -296,8 +293,6 @@ gst_d3d11_winrt_capture_class_init (GstD3D11WinRTCaptureClass * klass)
   capture_class->prepare = GST_DEBUG_FUNCPTR (gst_d3d11_winrt_capture_prepare);
   capture_class->get_size =
       GST_DEBUG_FUNCPTR (gst_d3d11_winrt_capture_get_size);
-  capture_class->get_colorimetry =
-      GST_DEBUG_FUNCPTR (gst_d3d11_winrt_capture_get_colorimetry);
   capture_class->unlock = GST_DEBUG_FUNCPTR (gst_d3d11_winrt_capture_unlock);
   capture_class->unlock_stop =
       GST_DEBUG_FUNCPTR (gst_d3d11_winrt_capture_unlock_stop);
@@ -751,13 +746,6 @@ gst_d3d11_winrt_capture_get_size (GstD3D11ScreenCapture * capture,
 }
 
 static gboolean
-gst_d3d11_winrt_capture_get_colorimetry (GstD3D11ScreenCapture * capture,
-    GstVideoColorimetry * colorimetry)
-{
-  return FALSE;
-}
-
-static gboolean
 gst_d3d11_winrt_capture_unlock (GstD3D11ScreenCapture * capture)
 {
   GstD3D11WinRTCapture *self = GST_D3D11_WINRT_CAPTURE (capture);