d3d11: Add an utility method for DXGI colorspace conversion
authorSeungha Yang <seungha@centricular.com>
Thu, 7 Jul 2022 19:37:33 +0000 (04:37 +0900)
committerSeungha Yang <seungha@centricular.com>
Fri, 8 Jul 2022 11:03:06 +0000 (20:03 +0900)
Add a method for DXGI_COLOR_SPACE_TYPE -> GstVideoColorimetry conversion

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2729>

subprojects/gst-plugins-bad/sys/d3d11/gstd3d11pluginutils.cpp
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11pluginutils.h

index 299f4d4..96948e9 100644 (file)
@@ -525,6 +525,157 @@ gst_d3d11_video_info_to_dxgi_color_space (const GstVideoInfo * info,
 }
 
 gboolean
+gst_d3d11_colorimetry_from_dxgi_color_space (DXGI_COLOR_SPACE_TYPE colorspace,
+    GstVideoColorimetry * colorimetry)
+{
+  /* XXX: because of ancient MinGW header */
+  GST_DXGI_COLOR_SPACE_TYPE type = (GST_DXGI_COLOR_SPACE_TYPE) colorspace;
+  GstVideoColorimetry color;
+
+  switch (type) {
+    case GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709:
+      color.range = GST_VIDEO_COLOR_RANGE_0_255;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      color.transfer = GST_VIDEO_TRANSFER_SRGB;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709:
+      color.range = GST_VIDEO_COLOR_RANGE_0_255;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      color.transfer = GST_VIDEO_TRANSFER_GAMMA10;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      color.transfer = GST_VIDEO_TRANSFER_BT709;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      color.transfer = GST_VIDEO_TRANSFER_BT2020_10;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601:
+      color.range = GST_VIDEO_COLOR_RANGE_0_255;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_BT601;
+      color.transfer = GST_VIDEO_TRANSFER_BT601;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_BT601;
+      color.transfer = GST_VIDEO_TRANSFER_BT601;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_SMPTE170M;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601:
+      color.range = GST_VIDEO_COLOR_RANGE_0_255;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_BT601;
+      color.transfer = GST_VIDEO_TRANSFER_BT601;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_SMPTE170M;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_BT709;
+      color.transfer = GST_VIDEO_TRANSFER_BT709;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709:
+      color.range = GST_VIDEO_COLOR_RANGE_0_255;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_BT709;
+      color.transfer = GST_VIDEO_TRANSFER_BT709;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      color.transfer = GST_VIDEO_TRANSFER_BT2020_10;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020:
+      color.range = GST_VIDEO_COLOR_RANGE_0_255;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      color.transfer = GST_VIDEO_TRANSFER_BT2020_10;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020:
+      color.range = GST_VIDEO_COLOR_RANGE_0_255;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      color.transfer = GST_VIDEO_TRANSFER_SMPTE2084;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      color.transfer = GST_VIDEO_TRANSFER_SMPTE2084;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      color.transfer = GST_VIDEO_TRANSFER_BT2020_10;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      color.transfer = GST_VIDEO_TRANSFER_SMPTE2084;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020:
+      color.range = GST_VIDEO_COLOR_RANGE_0_255;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      color.transfer = GST_VIDEO_TRANSFER_SMPTE2084;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      color.transfer = GST_VIDEO_TRANSFER_ARIB_STD_B67;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020:
+      color.range = GST_VIDEO_COLOR_RANGE_0_255;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      color.transfer = GST_VIDEO_TRANSFER_ARIB_STD_B67;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      color.transfer = GST_VIDEO_TRANSFER_SRGB;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      color.transfer = GST_VIDEO_TRANSFER_SRGB;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P709:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      color.transfer = GST_VIDEO_TRANSFER_SRGB;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P2020:
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_TOPLEFT_P2020:
+      color.range = GST_VIDEO_COLOR_RANGE_16_235;
+      color.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      color.transfer = GST_VIDEO_TRANSFER_SRGB;
+      color.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    default:
+      return FALSE;
+  }
+
+  *colorimetry = color;
+
+  return TRUE;
+}
+
+gboolean
 gst_d3d11_find_swap_chain_color_space (const GstVideoInfo * info,
     IDXGISwapChain3 * swapchain, GstDxgiColorSpace * color_space)
 {
index 7ffdafb..f4af36c 100644 (file)
@@ -70,6 +70,9 @@ gboolean        gst_d3d11_hdr_meta_data_to_dxgi     (GstVideoMasteringDisplayInf
 gboolean        gst_d3d11_video_info_to_dxgi_color_space (const GstVideoInfo * info,
                                                           GstDxgiColorSpace * color_space);
 
+gboolean        gst_d3d11_colorimetry_from_dxgi_color_space (DXGI_COLOR_SPACE_TYPE colorspace,
+                                                             GstVideoColorimetry * colorimetry);
+
 gboolean        gst_d3d11_find_swap_chain_color_space (const GstVideoInfo * info,
                                                        IDXGISwapChain3 * swapchain,
                                                        GstDxgiColorSpace * color_space);