d3d11format: Move DXGI color space mapping method to gst-libs
authorSeungha Yang <seungha@centricular.com>
Sat, 16 Jul 2022 19:48:24 +0000 (04:48 +0900)
committerSeungha Yang <seungha@centricular.com>
Tue, 19 Jul 2022 22:05:46 +0000 (07:05 +0900)
Expose color space mapping method to public so that application
can configure GstCaps or GstVideoInfo using DXGI color space

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

subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11format.cpp
subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11format.h
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11converter.cpp
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11pluginutils.cpp
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11pluginutils.h
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11screencapture.cpp
subprojects/gst-plugins-bad/sys/d3d11/gstd3d11window.cpp

index 597b119..f145d76 100644 (file)
@@ -440,3 +440,476 @@ gst_d3d11_dxgi_format_to_string (DXGI_FORMAT format)
 
   return "Unknown";
 }
+
+/* Some values are not defined in old MinGW toolchain */
+typedef enum
+{
+  GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 = 0,
+  GST_DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 = 1,
+  GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709 = 2,
+  GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020 = 3,
+  GST_DXGI_COLOR_SPACE_RESERVED = 4,
+  GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601 = 5,
+  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601 = 6,
+  GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601 = 7,
+  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 = 8,
+  GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709 = 9,
+  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020 = 10,
+  GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020 = 11,
+  GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 = 12,
+  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020 = 13,
+  GST_DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020 = 14,
+  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020 = 15,
+  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020 = 16,
+  GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020 = 17,
+  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020 = 18,
+  GST_DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020 = 19,
+  GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709 = 20,
+  GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020 = 21,
+  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P709 = 22,
+  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P2020 = 23,
+  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_TOPLEFT_P2020 = 24,
+} GST_DXGI_COLOR_SPACE_TYPE;
+
+static gboolean
+rgb_to_colorspace (const GstVideoColorimetry * cinfo,
+    DXGI_COLOR_SPACE_TYPE * color_space)
+{
+  /* sRGB */
+  GST_DXGI_COLOR_SPACE_TYPE type = GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
+
+  /* Defined DXGI RGB colorspace
+   * 1) DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 = 0 (sRGB)
+   * 2) DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 = 1 (scRGB)
+   * 3) DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709 = 2 (BT601/BT709 studio range)
+   * 4) DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020 = 3 (BT2020 SDR studio range)
+   * 5) DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 = 12 (HDR10 full range)
+   * 6) DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020 = 13 (HDR10 studio range)
+   * 7) DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020 = 17 (BT2020 SDR fullrange)
+   * 8) DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709 = 20 (unused)
+   * 9) DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020 = 21 (unused)
+   *
+   * Note that GStreamer does not define gamma2.4. So, 8) and 9) are excluded
+   */
+  if (cinfo->transfer == GST_VIDEO_TRANSFER_GAMMA10) {
+    type = GST_DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709;
+    goto done;
+  }
+
+  /* HLG RGB colorspace is not defined, approximated to HDR10 */
+  if (cinfo->transfer == GST_VIDEO_TRANSFER_SMPTE2084 ||
+      cinfo->transfer == GST_VIDEO_TRANSFER_ARIB_STD_B67) {
+    if (cinfo->range == GST_VIDEO_COLOR_RANGE_16_235) {
+      type = GST_DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020;
+    } else {
+      type = GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020;
+    }
+    goto done;
+  }
+
+  if (cinfo->primaries == GST_VIDEO_COLOR_PRIMARIES_BT2020) {
+    if (cinfo->range == GST_VIDEO_COLOR_RANGE_16_235) {
+      type = GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020;
+    } else {
+      type = GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020;
+    }
+    goto done;
+  }
+
+  if (cinfo->range == GST_VIDEO_COLOR_RANGE_16_235)
+    type = GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709;
+
+done:
+  *color_space = (DXGI_COLOR_SPACE_TYPE) type;
+
+  return TRUE;
+}
+
+static gboolean
+yuv_to_colorspace (const GstVideoColorimetry * cinfo,
+    GstVideoChromaSite chroma_site, DXGI_COLOR_SPACE_TYPE * color_space)
+{
+  /* BT709 */
+  GST_DXGI_COLOR_SPACE_TYPE type =
+      GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709;
+
+  /* Defined DXGI RGB colorspace
+     * 1) DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601 = 5 (common JPG)
+     * 2) DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601 = 6 (BT601 studio range)
+     * 3) DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601 = 7 (BT601 full range)
+     * 4) DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 = 8 (BT709 studio range)
+     * 5) DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709 = 9 (BT709 full range)
+     * 6) DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020 = 10 (BT2020 4:2:0 studio range)
+     * 7) DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020 = 11 (BT2020 full range)
+     * 8) DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020 = 13 (HDR10 4:2:0 studio range)
+     * 9) DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020 = 15 (BT2020 4:2:2 or 4:4:4: studio range)
+     * 10) DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020 = 16 (HDR10 4:2:2 or 4:4:4 studio range)
+     * 11) DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020 = 18 (HLG studio range)
+     * 12) DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020 = 19 (HLG full range)
+     * 13) DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P709 = 22 (unused)
+     * 14) DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P2020 = 23 (unused)
+     * 15) DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_TOPLEFT_P2020 = 24 (unused)
+     *
+     * Note that GStreamer does not define gamma2.4. So, 13) ~ 15) are excluded
+   */
+
+  /* HLG */
+  if (cinfo->transfer == GST_VIDEO_TRANSFER_ARIB_STD_B67) {
+    if (cinfo->range == GST_VIDEO_COLOR_RANGE_0_255) {
+      type = GST_DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020;
+    } else {
+      type = GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020;
+    }
+    goto done;
+  }
+
+  /* HDR10 */
+  if (cinfo->transfer == GST_VIDEO_TRANSFER_SMPTE2084) {
+    if (chroma_site == GST_VIDEO_CHROMA_SITE_H_COSITED) {
+      type = GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020;
+    } else {
+      type = GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020;
+    }
+    goto done;
+  }
+
+  /* BT2020 */
+  if (cinfo->primaries == GST_VIDEO_COLOR_PRIMARIES_BT2020) {
+    if (cinfo->range == GST_VIDEO_COLOR_RANGE_0_255) {
+      type = GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020;
+    } else if (chroma_site == GST_VIDEO_CHROMA_SITE_H_COSITED) {
+      type = GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020;
+    } else {
+      type = GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020;
+    }
+    goto done;
+  }
+
+  /* BT601/BT709 primaries are similar. Depends on RGB matrix */
+  if (cinfo->matrix == GST_VIDEO_COLOR_MATRIX_BT601) {
+    if (cinfo->range == GST_VIDEO_COLOR_RANGE_0_255) {
+      if (cinfo->primaries == GST_VIDEO_COLOR_PRIMARIES_BT709) {
+        type = GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601;
+      } else {
+        type = GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601;
+      }
+    } else {
+      type = GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601;
+    }
+    goto done;
+  }
+
+  if (cinfo->range == GST_VIDEO_COLOR_RANGE_0_255)
+    type = GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709;
+
+done:
+  *color_space = (DXGI_COLOR_SPACE_TYPE) type;
+
+  return TRUE;
+}
+
+/**
+ * gst_video_info_to_dxgi_color_space:
+ * @info: a #GstVideoInfo
+ * @color_space: (out): DXGI color space
+ *
+ * Derives DXGI_COLOR_SPACE_TYPE from @info
+ *
+ * Returns: %TRUE if successful
+ *
+ * Since: 1.22
+ */
+gboolean
+gst_video_info_to_dxgi_color_space (const GstVideoInfo * info,
+    DXGI_COLOR_SPACE_TYPE * color_space)
+{
+  const GstVideoColorimetry *cinfo;
+  GstVideoColorimetry c;
+
+  g_return_val_if_fail (info != nullptr, FALSE);
+  g_return_val_if_fail (color_space != nullptr, FALSE);
+
+  cinfo = &info->colorimetry;
+
+  if (GST_VIDEO_INFO_IS_RGB (info)) {
+    /* ensure RGB matrix if format is already RGB */
+    c.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+  } else if (GST_VIDEO_INFO_IS_YUV (info) &&
+      cinfo->matrix == GST_VIDEO_COLOR_MATRIX_RGB) {
+    /* Invalid matrix */
+    c.matrix = GST_VIDEO_COLOR_MATRIX_UNKNOWN;
+  } else {
+    c.matrix = cinfo->matrix;
+  }
+
+  switch (cinfo->range) {
+    case GST_VIDEO_COLOR_RANGE_0_255:
+      c.range = GST_VIDEO_COLOR_RANGE_0_255;
+      break;
+    case GST_VIDEO_COLOR_RANGE_16_235:
+      c.range = GST_VIDEO_COLOR_RANGE_16_235;
+      break;
+    default:
+      if (c.matrix == GST_VIDEO_COLOR_MATRIX_RGB)
+        c.range = GST_VIDEO_COLOR_RANGE_0_255;
+      else
+        c.range = GST_VIDEO_COLOR_RANGE_16_235;
+      break;
+  }
+
+  /* DXGI primaries: BT601, BT709, BT2020 */
+  switch (cinfo->primaries) {
+    case GST_VIDEO_COLOR_PRIMARIES_BT2020:
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_VIDEO_COLOR_PRIMARIES_SMPTE170M:
+    case GST_VIDEO_COLOR_PRIMARIES_SMPTE240M:
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_SMPTE170M;
+      break;
+    default:
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+  }
+
+  /* DXGI gamma functions: linear (RGB only), gamma2.2, PQ, and HLG */
+  switch (cinfo->transfer) {
+    case GST_VIDEO_TRANSFER_SMPTE2084:
+      c.transfer = GST_VIDEO_TRANSFER_SMPTE2084;
+      break;
+    case GST_VIDEO_TRANSFER_ARIB_STD_B67:
+      c.transfer = GST_VIDEO_TRANSFER_ARIB_STD_B67;
+      break;
+    case GST_VIDEO_TRANSFER_GAMMA10:
+      /* Only DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 supports linear gamma */
+      if (c.matrix == GST_VIDEO_COLOR_MATRIX_RGB) {
+        c.transfer = GST_VIDEO_TRANSFER_GAMMA10;
+        c.range = GST_VIDEO_COLOR_RANGE_0_255;
+      } else {
+        c.transfer = GST_VIDEO_TRANSFER_GAMMA22;
+      }
+      break;
+    default:
+      /* Simply map the rest of values to gamma 2.2. We don't have any other
+       * choice */
+      c.transfer = GST_VIDEO_TRANSFER_GAMMA22;
+      break;
+  }
+
+  /* DXGI transform matrix: BT601, BT709, and BT2020 */
+  switch (c.matrix) {
+    case GST_VIDEO_COLOR_MATRIX_RGB:
+      c.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      break;
+    case GST_VIDEO_COLOR_MATRIX_FCC:
+    case GST_VIDEO_COLOR_MATRIX_BT601:
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT601;
+      break;
+    case GST_VIDEO_COLOR_MATRIX_BT2020:
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      break;
+    default:
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT709;
+      break;
+  }
+
+  if (c.matrix == GST_VIDEO_COLOR_MATRIX_RGB)
+    return rgb_to_colorspace (&c, color_space);
+
+  return yuv_to_colorspace (&c, info->chroma_site, color_space);
+}
+
+static gboolean
+dxgi_color_space_is_rgb (GST_DXGI_COLOR_SPACE_TYPE color_space)
+{
+  switch (color_space) {
+    case GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709:
+    case GST_DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709:
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709:
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020:
+    case GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020:
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020:
+    case GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020:
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709:
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020:
+      return TRUE;
+    default:
+      break;
+  }
+
+  return FALSE;
+}
+
+/**
+ * gst_video_info_apply_dxgi_color_space:
+ * @color_space: DXGI color space
+ * @info: (inout): a #GstVideoInfo
+ *
+ * Updates color information of @info using @color_space
+ *
+ * Returns: %TRUE if successful
+ *
+ * Since: 1.22
+ */
+gboolean
+gst_video_info_apply_dxgi_color_space (DXGI_COLOR_SPACE_TYPE color_space,
+    GstVideoInfo * info)
+{
+  GST_DXGI_COLOR_SPACE_TYPE type;
+  GstVideoColorimetry c;
+
+  g_return_val_if_fail (info != nullptr, FALSE);
+
+  type = (GST_DXGI_COLOR_SPACE_TYPE) color_space;
+
+  if (GST_VIDEO_INFO_IS_RGB (info) && !dxgi_color_space_is_rgb (type)) {
+    GST_WARNING ("Invalid DXGI color space mapping");
+    return FALSE;
+  }
+
+  switch (type) {
+    case GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709:
+      c.range = GST_VIDEO_COLOR_RANGE_0_255;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      c.transfer = GST_VIDEO_TRANSFER_SRGB;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709:
+      c.range = GST_VIDEO_COLOR_RANGE_0_255;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      c.transfer = GST_VIDEO_TRANSFER_GAMMA10;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709:
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709:
+      c.range = GST_VIDEO_COLOR_RANGE_16_235;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      c.transfer = GST_VIDEO_TRANSFER_BT709;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020:
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020:
+      c.range = GST_VIDEO_COLOR_RANGE_16_235;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) >= 12)
+        c.transfer = GST_VIDEO_TRANSFER_BT2020_12;
+      else
+        c.transfer = GST_VIDEO_TRANSFER_BT2020_10;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_RESERVED:
+      GST_WARNING ("Reserved color space");
+      return FALSE;
+    case GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601:
+      c.range = GST_VIDEO_COLOR_RANGE_0_255;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT601;
+      c.transfer = GST_VIDEO_TRANSFER_BT601;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601:
+      c.range = GST_VIDEO_COLOR_RANGE_16_235;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT601;
+      c.transfer = GST_VIDEO_TRANSFER_BT601;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_SMPTE170M;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601:
+      c.range = GST_VIDEO_COLOR_RANGE_0_255;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT601;
+      c.transfer = GST_VIDEO_TRANSFER_BT601;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_SMPTE170M;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709:
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P709:
+      c.range = GST_VIDEO_COLOR_RANGE_16_235;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT709;
+      c.transfer = GST_VIDEO_TRANSFER_BT709;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709:
+      c.range = GST_VIDEO_COLOR_RANGE_0_255;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT709;
+      c.transfer = GST_VIDEO_TRANSFER_BT709;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020:
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P2020:
+      c.range = GST_VIDEO_COLOR_RANGE_16_235;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) >= 12)
+        c.transfer = GST_VIDEO_TRANSFER_BT2020_12;
+      else
+        c.transfer = GST_VIDEO_TRANSFER_BT2020_10;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020:
+      c.range = GST_VIDEO_COLOR_RANGE_0_255;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) >= 12)
+        c.transfer = GST_VIDEO_TRANSFER_BT2020_12;
+      else
+        c.transfer = GST_VIDEO_TRANSFER_BT2020_10;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020:
+      c.range = GST_VIDEO_COLOR_RANGE_0_255;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      c.transfer = GST_VIDEO_TRANSFER_SMPTE2084;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020:
+      c.range = GST_VIDEO_COLOR_RANGE_16_235;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      c.transfer = GST_VIDEO_TRANSFER_SMPTE2084;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020:
+      c.range = GST_VIDEO_COLOR_RANGE_16_235;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      c.transfer = GST_VIDEO_TRANSFER_SMPTE2084;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020:
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_TOPLEFT_P2020:
+      c.range = GST_VIDEO_COLOR_RANGE_16_235;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) >= 12)
+        c.transfer = GST_VIDEO_TRANSFER_BT2020_12;
+      else
+        c.transfer = GST_VIDEO_TRANSFER_BT2020_10;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020:
+      c.range = GST_VIDEO_COLOR_RANGE_16_235;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      c.transfer = GST_VIDEO_TRANSFER_SMPTE2084;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020:
+      c.range = GST_VIDEO_COLOR_RANGE_0_255;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
+      if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) >= 12)
+        c.transfer = GST_VIDEO_TRANSFER_BT2020_12;
+      else
+        c.transfer = GST_VIDEO_TRANSFER_BT2020_10;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020:
+      c.range = GST_VIDEO_COLOR_RANGE_16_235;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      c.transfer = GST_VIDEO_TRANSFER_ARIB_STD_B67;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    case GST_DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020:
+      c.range = GST_VIDEO_COLOR_RANGE_0_255;
+      c.matrix = GST_VIDEO_COLOR_MATRIX_BT2020;
+      c.transfer = GST_VIDEO_TRANSFER_ARIB_STD_B67;
+      c.primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      break;
+    default:
+      GST_WARNING ("Unknown DXGI color space %d", type);
+      return FALSE;
+  }
+
+  info->colorimetry = c;
+
+  return TRUE;
+}
index 6448dee..3dc55cc 100644 (file)
@@ -91,5 +91,13 @@ guint           gst_d3d11_dxgi_format_get_alignment       (DXGI_FORMAT format);
 GST_D3D11_API
 const gchar *   gst_d3d11_dxgi_format_to_string           (DXGI_FORMAT format);
 
+GST_D3D11_API
+gboolean        gst_video_info_to_dxgi_color_space       (const GstVideoInfo * info,
+                                                          DXGI_COLOR_SPACE_TYPE * color_space);
+
+GST_D3D11_API
+gboolean        gst_video_info_apply_dxgi_color_space    (DXGI_COLOR_SPACE_TYPE color_space,
+                                                          GstVideoInfo * info);
+
 G_END_DECLS
 
index b956d42..e2a30d8 100644 (file)
@@ -2698,7 +2698,7 @@ gst_d3d11_converter_setup_processor (GstD3D11Converter * self)
   ComPtr < ID3D11VideoProcessor > processor;
   UINT support_flags;
   BOOL conversion_supported = TRUE;
-  GstDxgiColorSpace in_space, out_space;
+  DXGI_COLOR_SPACE_TYPE in_space, out_space;
   DXGI_FORMAT in_dxgi_format = priv->in_d3d11_format.dxgi_format;
   DXGI_FORMAT out_dxgi_format = priv->out_d3d11_format.dxgi_format;
   UINT in_format_flags = priv->in_d3d11_format.format_support[0];
@@ -2721,12 +2721,12 @@ gst_d3d11_converter_setup_processor (GstD3D11Converter * self)
     return FALSE;
   }
 
-  if (!gst_d3d11_video_info_to_dxgi_color_space (&priv->in_info, &in_space)) {
+  if (!gst_video_info_to_dxgi_color_space (&priv->in_info, &in_space)) {
     GST_WARNING_OBJECT (self, "Unknown input DXGI colorspace");
     return FALSE;
   }
 
-  if (!gst_d3d11_video_info_to_dxgi_color_space (&priv->out_info, &out_space)) {
+  if (!gst_video_info_to_dxgi_color_space (&priv->out_info, &out_space)) {
     GST_WARNING_OBJECT (self, "Unknown output DXGI colorspace");
     return FALSE;
   }
@@ -2787,9 +2787,7 @@ gst_d3d11_converter_setup_processor (GstD3D11Converter * self)
   }
 
   hr = enumerator1->CheckVideoProcessorFormatConversion (in_dxgi_format,
-      (DXGI_COLOR_SPACE_TYPE) in_space.dxgi_color_space_type,
-      out_dxgi_format, (DXGI_COLOR_SPACE_TYPE) out_space.dxgi_color_space_type,
-      &conversion_supported);
+      in_space, out_dxgi_format, out_space, &conversion_supported);
   if (!gst_d3d11_result (hr, device) || !conversion_supported) {
     GST_DEBUG_OBJECT (self, "Conversion is not supported");
     return FALSE;
@@ -2812,9 +2810,9 @@ gst_d3d11_converter_setup_processor (GstD3D11Converter * self)
   video_context1->VideoProcessorSetStreamAutoProcessingMode
       (processor.Get (), 0, FALSE);
   video_context1->VideoProcessorSetStreamColorSpace1 (processor.Get (),
-      0, (DXGI_COLOR_SPACE_TYPE) in_space.dxgi_color_space_type);
+      0, in_space);
   video_context1->VideoProcessorSetOutputColorSpace1 (processor.Get (),
-      (DXGI_COLOR_SPACE_TYPE) in_space.dxgi_color_space_type);
+      out_space);
 
   priv->video_device = video_device;
   video_device->AddRef ();
index bb0f50f..da495cd 100644 (file)
@@ -163,523 +163,13 @@ gst_d3d11_hdr_meta_data_to_dxgi (GstVideoMasteringDisplayInfo * minfo,
   return TRUE;
 }
 
-typedef enum
-{
-  GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 = 0,
-  GST_DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 = 1,
-  GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709 = 2,
-  GST_DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020 = 3,
-  GST_DXGI_COLOR_SPACE_RESERVED = 4,
-  GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601 = 5,
-  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601 = 6,
-  GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P601 = 7,
-  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 = 8,
-  GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709 = 9,
-  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020 = 10,
-  GST_DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020 = 11,
-  GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 = 12,
-  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020 = 13,
-  GST_DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020 = 14,
-  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_TOPLEFT_P2020 = 15,
-  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_TOPLEFT_P2020 = 16,
-  GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020 = 17,
-  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020 = 18,
-  GST_DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020 = 19,
-  GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709 = 20,
-  GST_DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020 = 21,
-  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P709 = 22,
-  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P2020 = 23,
-  GST_DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_TOPLEFT_P2020 = 24,
-  GST_DXGI_COLOR_SPACE_CUSTOM = 0xFFFFFFFF
-} GST_DXGI_COLOR_SPACE_TYPE;
-
-/* https://docs.microsoft.com/en-us/windows/win32/api/dxgicommon/ne-dxgicommon-dxgi_color_space_type */
-
-#define MAKE_COLOR_MAP(d,r,m,t,p) \
-  { GST_DXGI_COLOR_SPACE_ ##d, GST_VIDEO_COLOR_RANGE ##r, \
-    GST_VIDEO_COLOR_MATRIX_ ##m, GST_VIDEO_TRANSFER_ ##t, \
-    GST_VIDEO_COLOR_PRIMARIES_ ##p }
-
-static const GstDxgiColorSpace rgb_colorspace_map[] = {
-  /* 1) DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709
-   * 2) DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709
-   * 3) DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709
-   * 4) DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020
-   * 5) DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020
-   * 6) DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020
-   * 7) DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020
-   * 8) DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709
-   * 9) DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020
-   *
-   * NOTE: if G24 (Gamma 2.4, SRGB) transfer is not defined,
-   * it will be approximated as G22.
-   * NOTE: BT470BG ~= BT709
-   */
-
-  /* 1) RGB_FULL_G22_NONE_P709 */
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, SRGB, BT709),
-  /* 1-1) Approximation for RGB_FULL_G22_NONE_P709 */
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT709, BT709),
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT601, BT709),
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT2020_10, BT709),
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT2020_12, BT709),
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, SRGB, BT470BG),
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT709, BT470BG),
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT601, BT470BG),
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT2020_10, BT470BG),
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, BT2020_12, BT470BG),
-
-  /* 2) RGB_FULL_G10_NONE_P709 */
-  MAKE_COLOR_MAP (RGB_FULL_G10_NONE_P709, _0_255, UNKNOWN, GAMMA10, BT709),
-  /* 2-1 ) Approximation for RGB_FULL_G10_NONE_P709 */
-  MAKE_COLOR_MAP (RGB_FULL_G10_NONE_P709, _0_255, UNKNOWN, GAMMA10, BT470BG),
-
-  /* 3) RGB_STUDIO_G22_NONE_P709 */
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT709, BT709),
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT601, BT709),
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT2020_10, BT709),
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT2020_12, BT709),
-  /* 3-1) Approximation for RGB_STUDIO_G22_NONE_P709 */
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT709, BT470BG),
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT601, BT470BG),
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT2020_10,
-      BT470BG),
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, BT2020_12,
-      BT470BG),
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, SRGB, BT709),
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P709, _16_235, UNKNOWN, SRGB, BT470BG),
-
-  /* 4) RGB_STUDIO_G22_NONE_P2020 */
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P2020, _16_235, UNKNOWN, BT709, BT2020),
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P2020, _16_235, UNKNOWN, BT601, BT2020),
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P2020, _16_235, UNKNOWN, BT2020_10,
-      BT2020),
-  MAKE_COLOR_MAP (RGB_STUDIO_G22_NONE_P2020, _16_235, UNKNOWN, BT2020_12,
-      BT2020),
-
-  /* 5) RGB_FULL_G2084_NONE_P2020 */
-  MAKE_COLOR_MAP (RGB_FULL_G2084_NONE_P2020, _0_255, UNKNOWN, SMPTE2084,
-      BT2020),
-
-  /* 6) RGB_STUDIO_G2084_NONE_P2020 */
-  MAKE_COLOR_MAP (RGB_STUDIO_G2084_NONE_P2020, _16_235, UNKNOWN, SMPTE2084,
-      BT2020),
-
-  /* 7) RGB_FULL_G22_NONE_P2020 */
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P2020, _0_255, UNKNOWN, BT709, BT2020),
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P2020, _0_255, UNKNOWN, BT601, BT2020),
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P2020, _0_255, UNKNOWN, BT2020_10, BT2020),
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P2020, _0_255, UNKNOWN, BT2020_12, BT2020),
-  /* 7-1) Approximation for RGB_FULL_G22_NONE_P2020 */
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P2020, _0_255, UNKNOWN, SRGB, BT2020),
-
-  /* 8) RGB_STUDIO_G24_NONE_P709 */
-  MAKE_COLOR_MAP (RGB_STUDIO_G24_NONE_P709, _16_235, UNKNOWN, SRGB, BT709),
-  /* 8-1) Approximation for RGB_STUDIO_G24_NONE_P709 */
-  MAKE_COLOR_MAP (RGB_STUDIO_G24_NONE_P709, _16_235, UNKNOWN, SRGB, BT470BG),
-
-  /* 9) RGB_STUDIO_G24_NONE_P2020 */
-  MAKE_COLOR_MAP (RGB_STUDIO_G24_NONE_P2020, _16_235, UNKNOWN, SRGB, BT2020),
-};
-
-static const GstDxgiColorSpace yuv_colorspace_map[] = {
-  /* 1) YCBCR_FULL_G22_NONE_P709_X601
-   * 2) YCBCR_STUDIO_G22_LEFT_P601
-   * 3) YCBCR_FULL_G22_LEFT_P601
-   * 4) YCBCR_STUDIO_G22_LEFT_P709
-   * 5) YCBCR_FULL_G22_LEFT_P709
-   * 6) YCBCR_STUDIO_G22_LEFT_P2020
-   * 7) YCBCR_FULL_G22_LEFT_P2020
-   * 8) YCBCR_STUDIO_G2084_LEFT_P2020
-   * 9) YCBCR_STUDIO_G22_TOPLEFT_P2020
-   * 10) YCBCR_STUDIO_G2084_TOPLEFT_P2020
-   * 11) YCBCR_STUDIO_GHLG_TOPLEFT_P2020
-   * 12) YCBCR_FULL_GHLG_TOPLEFT_P2020
-   * 13) YCBCR_STUDIO_G24_LEFT_P709
-   * 14) YCBCR_STUDIO_G24_LEFT_P2020
-   * 15) YCBCR_STUDIO_G24_TOPLEFT_P2020
-   *
-   * NOTE: BT470BG ~= BT709
-   */
-
-  /* 1) YCBCR_FULL_G22_NONE_P709_X601 */
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT709, BT709),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT601, BT709),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT2020_10,
-      BT709),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT2020_12,
-      BT709),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT709, BT470BG),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT601, BT470BG),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT2020_10,
-      BT470BG),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT2020_12,
-      BT470BG),
-
-  /* 2) YCBCR_STUDIO_G22_LEFT_P601 */
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT601, SMPTE170M),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT709, SMPTE170M),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT2020_10,
-      SMPTE170M),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT2020_12,
-      SMPTE170M),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT601, SMPTE240M),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT709, SMPTE240M),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT2020_10,
-      SMPTE240M),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P601, _16_235, BT601, BT2020_12,
-      SMPTE240M),
-
-  /* 3) YCBCR_FULL_G22_LEFT_P601 */
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT601, SMPTE170M),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT709, SMPTE170M),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT2020_10,
-      SMPTE170M),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT2020_12,
-      SMPTE170M),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT601, SMPTE240M),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT709, SMPTE240M),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT2020_10,
-      SMPTE240M),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P601, _0_255, BT601, BT2020_12,
-      SMPTE240M),
-
-  /* 4) YCBCR_STUDIO_G22_LEFT_P709 */
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT709, BT709),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT601, BT709),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT2020_10,
-      BT709),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT2020_12,
-      BT709),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT709, BT470BG),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT601, BT470BG),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT2020_10,
-      BT470BG),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, BT2020_12,
-      BT470BG),
-
-  /* 5) YCBCR_FULL_G22_LEFT_P709 */
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT709, BT709),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT601, BT709),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT2020_10, BT709),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT2020_12, BT709),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT709, BT470BG),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT601, BT470BG),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT2020_10, BT470BG),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P709, _0_255, BT709, BT2020_12, BT470BG),
-
-  /* 6) YCBCR_STUDIO_G22_LEFT_P2020 */
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P2020, _16_235, BT2020, BT709, BT2020),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P2020, _16_235, BT2020, BT601, BT2020),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P2020, _16_235, BT2020, BT2020_10,
-      BT2020),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P2020, _16_235, BT2020, BT2020_12,
-      BT2020),
-
-  /* 7) YCBCR_FULL_G22_LEFT_P2020 */
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P2020, _0_255, BT2020, BT709, BT2020),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P2020, _0_255, BT2020, BT601, BT2020),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P2020, _0_255, BT2020, BT2020_10,
-      BT2020),
-  MAKE_COLOR_MAP (YCBCR_FULL_G22_LEFT_P2020, _0_255, BT2020, BT2020_12,
-      BT2020),
-
-  /* 8) YCBCR_STUDIO_G2084_LEFT_P2020 */
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G2084_LEFT_P2020, _16_235, BT2020, SMPTE2084,
-      BT2020),
-
-  /* 9) YCBCR_STUDIO_G22_TOPLEFT_P2020 */
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_TOPLEFT_P2020, _16_235, BT2020, BT2020_10,
-      BT2020),
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_TOPLEFT_P2020, _16_235, BT2020, BT2020_12,
-      BT2020),
-
-  /* 10) YCBCR_STUDIO_G2084_TOPLEFT_P2020 */
-  /* FIXME: check chroma-site to differentiate this from
-   * YCBCR_STUDIO_G2084_LEFT_P2020 */
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G2084_TOPLEFT_P2020, _16_235, BT2020, SMPTE2084,
-      BT2020),
-
-  /* 11) YCBCR_STUDIO_GHLG_TOPLEFT_P2020 */
-  MAKE_COLOR_MAP (YCBCR_STUDIO_GHLG_TOPLEFT_P2020, _16_235, BT2020,
-      ARIB_STD_B67, BT2020),
-
-  /* 12) YCBCR_FULL_GHLG_TOPLEFT_P2020 */
-  MAKE_COLOR_MAP (YCBCR_FULL_GHLG_TOPLEFT_P2020, _0_255, BT2020, ARIB_STD_B67,
-      BT2020),
-
-  /* 13) YCBCR_STUDIO_G24_LEFT_P709 */
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G24_LEFT_P709, _16_235, BT709, SRGB, BT709),
-
-  /* 14) YCBCR_STUDIO_G24_LEFT_P2020 */
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G24_LEFT_P2020, _16_235, BT2020, SRGB, BT2020),
-
-  /* 15) YCBCR_STUDIO_G24_TOPLEFT_P2020 */
-  /* FIXME: check chroma-site to differentiate this from
-   * YCBCR_STUDIO_G24_LEFT_P2020 */
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G24_TOPLEFT_P2020, _16_235, BT2020, SRGB,
-      BT2020),
-};
-
-#define SCORE_RANGE_MISMATCH 5
-#define SCORE_MATRIX_MISMATCH 5
-#define SCORE_TRANSFER_MISMATCH 5
-#define SCORE_PRIMARY_MISMATCH 10
-
-static gint
-get_score (const GstVideoInfo * info, const GstDxgiColorSpace * color_map,
-    gboolean is_yuv)
-{
-  gint loss = 0;
-  const GstVideoColorimetry *color = &info->colorimetry;
-
-  if (color->range != color_map->range)
-    loss += SCORE_RANGE_MISMATCH;
-
-  if (is_yuv && color->matrix != color_map->matrix)
-    loss += SCORE_MATRIX_MISMATCH;
-
-  if (color->transfer != color_map->transfer)
-    loss += SCORE_TRANSFER_MISMATCH;
-
-  if (color->primaries != color_map->primaries)
-    loss += SCORE_PRIMARY_MISMATCH;
-
-  return loss;
-}
-
-static gboolean
-gst_d3d11_video_info_to_dxgi_color_space_rgb (const GstVideoInfo * info,
-    GstDxgiColorSpace * color_space)
-{
-  gint best_score = G_MAXINT;
-  gint score;
-  guint i;
-  const GstDxgiColorSpace *best = nullptr;
-
-  for (i = 0; i < G_N_ELEMENTS (rgb_colorspace_map); i++) {
-    score = get_score (info, &rgb_colorspace_map[i], FALSE);
-
-    if (score < best_score) {
-      best_score = score;
-      best = &rgb_colorspace_map[i];
-
-      if (score == 0) {
-        *color_space = rgb_colorspace_map[i];
-        return TRUE;
-      }
-    }
-  }
-
-  if (best) {
-    *color_space = *best;
-    return TRUE;
-  }
-
-  return FALSE;
-}
-
-static gboolean
-gst_d3d11_video_info_to_dxgi_color_space_yuv (const GstVideoInfo * info,
-    GstDxgiColorSpace * color_space)
-{
-  gint best_score = G_MAXINT;
-  gint score;
-  guint i;
-  const GstDxgiColorSpace *best = nullptr;
-
-  for (i = 0; i < G_N_ELEMENTS (yuv_colorspace_map); i++) {
-    score = get_score (info, &yuv_colorspace_map[i], TRUE);
-
-    if (score < best_score) {
-      best_score = score;
-      best = &yuv_colorspace_map[i];
-
-      if (score == 0) {
-        *color_space = rgb_colorspace_map[i];
-        return TRUE;
-      }
-    }
-  }
-
-  if (best) {
-    *color_space = *best;
-    return TRUE;
-  }
-
-  return FALSE;
-}
-
-gboolean
-gst_d3d11_video_info_to_dxgi_color_space (const GstVideoInfo * info,
-    GstDxgiColorSpace * color_space)
-{
-  g_return_val_if_fail (info != nullptr, FALSE);
-  g_return_val_if_fail (color_space != nullptr, FALSE);
-
-  if (GST_VIDEO_INFO_IS_RGB (info))
-    return gst_d3d11_video_info_to_dxgi_color_space_rgb (info, color_space);
-
-  return gst_d3d11_video_info_to_dxgi_color_space_yuv (info, color_space);
-}
-
-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)
+    IDXGISwapChain3 * swapchain, DXGI_COLOR_SPACE_TYPE * color_space)
 {
   UINT can_support = 0;
   HRESULT hr;
+  DXGI_COLOR_SPACE_TYPE color;
 
   g_return_val_if_fail (info != NULL, FALSE);
   g_return_val_if_fail (swapchain != NULL, FALSE);
@@ -693,30 +183,19 @@ gst_d3d11_find_swap_chain_color_space (const GstVideoInfo * info,
   /* Select PQ color space only if input is also PQ */
   if (info->colorimetry.primaries == GST_VIDEO_COLOR_PRIMARIES_BT2020 &&
       info->colorimetry.transfer == GST_VIDEO_TRANSFER_SMPTE2084) {
-    guint pq = GST_DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020;
-    hr = swapchain->CheckColorSpaceSupport ((DXGI_COLOR_SPACE_TYPE) pq,
-        &can_support);
+    color = (DXGI_COLOR_SPACE_TYPE) 12;
+    hr = swapchain->CheckColorSpaceSupport (color, &can_support);
     if (SUCCEEDED (hr) && can_support) {
-      color_space->dxgi_color_space_type = pq;
-      color_space->range = GST_VIDEO_COLOR_RANGE_0_255;
-      color_space->matrix = GST_VIDEO_COLOR_MATRIX_RGB;
-      color_space->transfer = GST_VIDEO_TRANSFER_SMPTE2084;
-      color_space->primaries = GST_VIDEO_COLOR_PRIMARIES_BT2020;
+      *color_space = color;
       return TRUE;
     }
   }
 
   /* otherwise use standard sRGB color space */
-  hr = swapchain->CheckColorSpaceSupport (
-      (DXGI_COLOR_SPACE_TYPE) GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709,
-      &can_support);
+  color = (DXGI_COLOR_SPACE_TYPE) 0;
+  hr = swapchain->CheckColorSpaceSupport (color, &can_support);
   if (SUCCEEDED (hr) && can_support) {
-    color_space->dxgi_color_space_type =
-        GST_DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
-    color_space->range = GST_VIDEO_COLOR_RANGE_0_255;
-    color_space->matrix = GST_VIDEO_COLOR_MATRIX_RGB;
-    color_space->transfer = GST_VIDEO_TRANSFER_SRGB;
-    color_space->primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
+    *color_space = color;
     return TRUE;
   }
 
index f4af36c..c378a41 100644 (file)
@@ -38,15 +38,6 @@ typedef enum
   GST_D3D11_DEVICE_VENDOR_XBOX,
 } GstD3D11DeviceVendor;
 
-typedef struct _GstDxgiColorSpace
-{
-  guint dxgi_color_space_type;
-  GstVideoColorRange range;
-  GstVideoColorMatrix matrix;
-  GstVideoTransferFunction transfer;
-  GstVideoColorPrimaries primaries;
-} GstDxgiColorSpace;
-
 typedef struct _GstD3D11ColorMatrix
 {
   gdouble matrix[3][3];
@@ -67,15 +58,9 @@ gboolean        gst_d3d11_hdr_meta_data_to_dxgi     (GstVideoMasteringDisplayInf
                                                      GstVideoContentLightLevel * cll,
                                                      DXGI_HDR_METADATA_HDR10 * dxgi_hdr10);
 
-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);
+                                                       DXGI_COLOR_SPACE_TYPE * color_space);
 
 GstBuffer *     gst_d3d11_allocate_staging_buffer_for (GstBuffer * buffer,
                                                        const GstVideoInfo * info,
index ca44073..3bbfd18 100644 (file)
@@ -1843,6 +1843,7 @@ gst_d3d11_screen_capture_get_colorimetry (GstD3D11ScreenCapture * capture,
     GstVideoColorimetry * colorimetry)
 {
   DXGI_COLOR_SPACE_TYPE dxgi_cs;
+  GstVideoInfo info;
 
   g_return_val_if_fail (GST_IS_D3D11_SCREEN_CAPTURE (capture), FALSE);
   g_return_val_if_fail (colorimetry != nullptr, FALSE);
@@ -1862,7 +1863,13 @@ gst_d3d11_screen_capture_get_colorimetry (GstD3D11ScreenCapture * capture,
       dxgi_cs = desc.ColorSpace;
   }
 
-  return gst_d3d11_colorimetry_from_dxgi_color_space (dxgi_cs, colorimetry);
+  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;
 }
 
 GstFlowReturn
index 6a35b59..b551f26 100644 (file)
@@ -448,12 +448,10 @@ gst_d3d11_window_prepare_default (GstD3D11Window * window, guint display_width,
     {DXGI_FORMAT_R10G10B10A2_UNORM, GST_VIDEO_FORMAT_RGB10A2_LE, FALSE},
   };
   const GstD3D11WindowDisplayFormat *chosen_format = NULL;
-  GstDxgiColorSpace swapchain_colorspace;
-  gboolean found_swapchain_colorspace = FALSE;
+  DXGI_COLOR_SPACE_TYPE swapchain_colorspace =
+      DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
   gboolean hdr10_aware = FALSE;
   gboolean have_hdr10_meta = FALSE;
-  DXGI_COLOR_SPACE_TYPE native_colorspace_type =
-      DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
   ComPtr < IDXGIFactory5 > factory5;
   IDXGIFactory1 *factory_handle;
   BOOL allow_tearing = FALSE;
@@ -603,34 +601,19 @@ gst_d3d11_window_prepare_default (GstD3D11Window * window, guint display_width,
 
   hr = window->swap_chain->QueryInterface (IID_PPV_ARGS (&swapchain3));
   if (gst_d3d11_result (hr, device)) {
-    found_swapchain_colorspace =
-        gst_d3d11_find_swap_chain_color_space (&window->render_info,
-        swapchain3.Get (), &swapchain_colorspace);
-    if (found_swapchain_colorspace) {
-      native_colorspace_type =
-          (DXGI_COLOR_SPACE_TYPE) swapchain_colorspace.dxgi_color_space_type;
-      hr = swapchain3->SetColorSpace1 (native_colorspace_type);
+    if (gst_d3d11_find_swap_chain_color_space (&window->render_info,
+            swapchain3.Get (), &swapchain_colorspace)) {
+      hr = swapchain3->SetColorSpace1 (swapchain_colorspace);
       if (!gst_d3d11_result (hr, window->device)) {
         GST_WARNING_OBJECT (window, "Failed to set colorspace %d, hr: 0x%x",
-            native_colorspace_type, (guint) hr);
-        found_swapchain_colorspace = FALSE;
-        native_colorspace_type = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
+            swapchain_colorspace, (guint) hr);
+        swapchain_colorspace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
       } else {
         ComPtr < IDXGISwapChain4 > swapchain4;
 
-        GST_DEBUG_OBJECT (window, "Set colorspace %d", native_colorspace_type);
-
-        /* update with selected display color space */
-        window->render_info.colorimetry.primaries =
-            swapchain_colorspace.primaries;
-        window->render_info.colorimetry.transfer =
-            swapchain_colorspace.transfer;
-        window->render_info.colorimetry.range = swapchain_colorspace.range;
-        window->render_info.colorimetry.matrix = swapchain_colorspace.matrix;
-
         /* DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 = 12, undefined in old
          * mingw header */
-        if (native_colorspace_type == 12 && have_hdr10_meta) {
+        if (swapchain_colorspace == 12 && have_hdr10_meta) {
           hr = swapchain3.As (&swapchain4);
           if (gst_d3d11_result (hr, device)) {
             DXGI_HDR_METADATA_HDR10 hdr10_metadata = { 0, };
@@ -654,15 +637,11 @@ gst_d3d11_window_prepare_default (GstD3D11Window * window, guint display_width,
     }
   }
 
-  /* otherwise, use most common DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709
-   * color space */
-  if (!found_swapchain_colorspace) {
-    GST_DEBUG_OBJECT (window, "No selected render color space, use BT709");
-    window->render_info.colorimetry.primaries = GST_VIDEO_COLOR_PRIMARIES_BT709;
-    window->render_info.colorimetry.transfer = GST_VIDEO_TRANSFER_BT709;
-    window->render_info.colorimetry.range = GST_VIDEO_COLOR_RANGE_0_255;
-    window->render_info.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_RGB;
-  }
+  GST_DEBUG_OBJECT (window, "Set colorspace %d", swapchain_colorspace);
+
+  /* update with selected display color space */
+  gst_video_info_apply_dxgi_color_space (swapchain_colorspace,
+      &window->render_info);
 
   window->converter = gst_d3d11_converter_new (device,
       &window->info, &window->render_info, nullptr);