d3d11format: Map more colorimetry with dxgi colorspace
authorSeungha Yang <seungha@centricular.com>
Sun, 25 Oct 2020 20:04:55 +0000 (05:04 +0900)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Tue, 27 Oct 2020 16:20:49 +0000 (16:20 +0000)
Map more logically identical set of GstVideoColorimetry formats
with dxgi color space.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1723>

sys/d3d11/gstd3d11format.c

index 336788e..f0462f5 100644 (file)
@@ -244,104 +244,228 @@ typedef enum
     GST_VIDEO_COLOR_PRIMARIES_ ##p }
 
 static const GstDxgiColorSpace rgb_colorspace_map[] = {
-  /* RGB_FULL_G22_NONE_P709 */
+  /* 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, 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, 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),
+
+  /* 1-1) Approximation for RGB_FULL_G22_NONE_P709 */
+  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, SRGB, BT709),
+  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, SRGB, BT470BG),
+
+  /* 2) RGB_FULL_G10_NONE_P709 */
+  MAKE_COLOR_MAP (RGB_FULL_G10_NONE_P709, _0_255, UNKNOWN, GAMMA10, BT709),
+  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),
+  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),
+
+  /* 3-1) Approximation for RGB_STUDIO_G22_NONE_P709 */
+  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),
 
-  /* RGB_FULL_G10_NONE_P709 */
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, GAMMA10, BT709),
-
-  /* RGB_STUDIO_G22_NONE_P709 */
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _16_235, UNKNOWN, BT709, BT709),
-
-  /* RGB_STUDIO_G22_NONE_P2020 */
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _16_235, UNKNOWN, BT2020_10, BT2020),
-  MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _16_235, UNKNOWN, BT2020_12, BT2020),
-
-  /* RGB_FULL_G2084_NONE_P2020 */
+  /* 5) RGB_FULL_G2084_NONE_P2020 */
   MAKE_COLOR_MAP (RGB_FULL_G2084_NONE_P2020, _0_255, UNKNOWN, SMPTE2084,
       BT2020),
 
-  /* RGB_STUDIO_G2084_NONE_P2020 */
-  MAKE_COLOR_MAP (RGB_STUDIO_G2084_NONE_P2020,
-      _16_235, UNKNOWN, SMPTE2084, BT2020),
+  /* 6) RGB_STUDIO_G2084_NONE_P2020 */
+  MAKE_COLOR_MAP (RGB_STUDIO_G2084_NONE_P2020, _16_235, UNKNOWN, SMPTE2084,
+      BT2020),
 
-  /* RGB_FULL_G22_NONE_P2020 */
+  /* 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),
 
-  /* RGB_STUDIO_G24_NONE_P709 */
+  /* 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),
+  MAKE_COLOR_MAP (RGB_STUDIO_G24_NONE_P709, _16_235, UNKNOWN, SRGB, BT470BG),
 
-  /* RGB_STUDIO_G24_NONE_P2020 */
-  MAKE_COLOR_MAP (RGB_STUDIO_G24_NONE_P709, _16_235, UNKNOWN, SRGB, BT2020),
+  /* 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[] = {
-  /* YCBCR_FULL_G22_NONE_P709_X601 */
+  /* 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),
-
-  /* YCBCR_STUDIO_G22_LEFT_P601 */
+  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),
-
-  /* YCBCR_FULL_G22_LEFT_P601 */
+  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),
-
-  /* YCBCR_STUDIO_G22_LEFT_P709 */
+  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),
-
-  /* YCBCR_FULL_G22_LEFT_P709 */
+  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),
-
-  /* YCBCR_STUDIO_G22_LEFT_P2020 */
+  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),
 
-  /* YCBCR_FULL_G22_LEFT_P2020 */
-  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),
+  /* 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),
 
-  /* YCBCR_STUDIO_G2084_LEFT_P2020 */
+  /* 8) YCBCR_STUDIO_G2084_LEFT_P2020 */
   MAKE_COLOR_MAP (YCBCR_STUDIO_G2084_LEFT_P2020, _16_235, BT2020, SMPTE2084,
       BT2020),
 
-  /* YCBCR_STUDIO_G22_TOPLEFT_P2020 */
+  /* 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),
 
-  /* YCBCR_STUDIO_G2084_TOPLEFT_P2020 */
+  /* 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),
 
-  /* YCBCR_STUDIO_GHLG_TOPLEFT_P2020 */
+  /* 11) YCBCR_STUDIO_GHLG_TOPLEFT_P2020 */
   MAKE_COLOR_MAP (YCBCR_STUDIO_GHLG_TOPLEFT_P2020, _16_235, BT2020,
       ARIB_STD_B67, BT2020),
 
-  /* YCBCR_STUDIO_GHLG_TOPLEFT_P2020 */
+  /* 12) YCBCR_FULL_GHLG_TOPLEFT_P2020 */
   MAKE_COLOR_MAP (YCBCR_FULL_GHLG_TOPLEFT_P2020, _0_255, BT2020, ARIB_STD_B67,
       BT2020),
 
-  /* YCBCR_STUDIO_G24_LEFT_P709 */
-  MAKE_COLOR_MAP (YCBCR_STUDIO_G22_LEFT_P709, _16_235, BT709, SRGB, BT709),
+  /* 13) YCBCR_STUDIO_G24_LEFT_P709 */
+  MAKE_COLOR_MAP (YCBCR_STUDIO_G24_LEFT_P709, _16_235, BT709, SRGB, BT709),
 
-  /* YCBCR_STUDIO_G24_LEFT_P2020 */
+  /* 14) YCBCR_STUDIO_G24_LEFT_P2020 */
   MAKE_COLOR_MAP (YCBCR_STUDIO_G24_LEFT_P2020, _16_235, BT2020, SRGB, BT2020),
 
-  /* YCBCR_STUDIO_G24_TOPLEFT_P2020 */
+  /* 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 1
+#define SCORE_RANGE_MISMATCH 5
 #define SCORE_MATRIX_MISMATCH 5
 #define SCORE_TRANSFER_MISMATCH 5
 #define SCORE_PRIMARY_MISMATCH 10
@@ -376,7 +500,7 @@ gst_d3d11_video_info_to_dxgi_color_space_rgb (GstVideoInfo * info)
   const GstDxgiColorSpace *colorspace = NULL;
 
   for (i = 0; i < G_N_ELEMENTS (rgb_colorspace_map); i++) {
-    score = get_score (info, &rgb_colorspace_map[i], TRUE);
+    score = get_score (info, &rgb_colorspace_map[i], FALSE);
 
     if (score < best_score) {
       best_score = score;