From 6cc6494287807bc25e6cb142acdf267995f5d083 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Fri, 8 Jul 2022 03:38:30 +0900 Subject: [PATCH] d3d11screencapturesrc: Set colorimetry to caps Make use of reported DXGI colorspace if possible Part-of: --- .../sys/d3d11/gstd3d11screencapture.cpp | 32 ++++++++++++++++++++++ .../sys/d3d11/gstd3d11screencapture.h | 3 ++ .../sys/d3d11/gstd3d11screencapturesrc.cpp | 11 ++++++++ 3 files changed, 46 insertions(+) diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapture.cpp b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapture.cpp index a0d1023..2534977 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapture.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapture.cpp @@ -1506,6 +1506,7 @@ struct _GstD3D11ScreenCapture guint cached_height; D3D11DesktopDupObject *dupl_obj; + IDXGIOutput *output; HMONITOR monitor_handle; RECT desktop_coordinates; @@ -1657,6 +1658,8 @@ gst_d3d11_screen_capture_constructed (GObject * object) g_object_get (self->device, "adapter-luid", &self->adapter_luid, nullptr); + self->output = output.Detach (); + ret = TRUE; out: @@ -1690,6 +1693,8 @@ gst_d3d11_screen_capture_dispose (GObject * object) { GstD3D11ScreenCapture *self = GST_D3D11_SCREEN_CAPTURE (object); + GST_D3D11_CLEAR_COM (self->output); + if (self->dupl_obj) { delete self->dupl_obj; self->dupl_obj = nullptr; @@ -1830,6 +1835,33 @@ gst_d3d11_screen_capture_get_size (GstD3D11ScreenCapture * capture, return TRUE; } +gboolean +gst_d3d11_screen_capture_get_colorimetry (GstD3D11ScreenCapture * capture, + GstVideoColorimetry * colorimetry) +{ + DXGI_COLOR_SPACE_TYPE dxgi_cs; + + g_return_val_if_fail (GST_IS_D3D11_SCREEN_CAPTURE (capture), FALSE); + g_return_val_if_fail (colorimetry != nullptr, FALSE); + + dxgi_cs = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; + + if (capture->output) { + ComPtr < IDXGIOutput6 > output; + HRESULT hr; + DXGI_OUTPUT_DESC1 desc; + + hr = capture->output->QueryInterface (IID_PPV_ARGS (&output)); + if (SUCCEEDED (hr)) + hr = output->GetDesc1 (&desc); + + if (SUCCEEDED (hr)) + dxgi_cs = desc.ColorSpace; + } + + return gst_d3d11_colorimetry_from_dxgi_color_space (dxgi_cs, colorimetry); +} + GstFlowReturn gst_d3d11_screen_capture_do_capture (GstD3D11ScreenCapture * capture, GstD3D11Device * device, ID3D11Texture2D * texture, diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapture.h b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapture.h index b2197b9..f5be239 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapture.h +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapture.h @@ -43,6 +43,9 @@ gboolean gst_d3d11_screen_capture_get_size (GstD3D11ScreenCapture * captu guint * width, guint * height); +gboolean gst_d3d11_screen_capture_get_colorimetry (GstD3D11ScreenCapture * capture, + GstVideoColorimetry * colorimetry); + GstFlowReturn gst_d3d11_screen_capture_do_capture (GstD3D11ScreenCapture * capture, GstD3D11Device * device, ID3D11Texture2D * texture, diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapturesrc.cpp b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapturesrc.cpp index ae5d854..eacd32c 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapturesrc.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapturesrc.cpp @@ -373,6 +373,7 @@ 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, "Duplication object is not configured yet"); @@ -389,6 +390,16 @@ 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); -- 2.7.4