diff --git a/sys/d3d11/gstd3d11format.c b/sys/d3d11/gstd3d11format.c index 336788e059..f0462f5a47 100644 --- a/sys/d3d11/gstd3d11format.c +++ b/sys/d3d11/gstd3d11format.c @@ -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), - /* RGB_FULL_G10_NONE_P709 */ - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _0_255, UNKNOWN, GAMMA10, BT709), + /* 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), - /* RGB_STUDIO_G22_NONE_P709 */ - MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P709, _16_235, UNKNOWN, BT709, BT709), + /* 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), - /* 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), + /* 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), - /* RGB_FULL_G2084_NONE_P2020 */ + /* 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), + + /* 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 */ - MAKE_COLOR_MAP (RGB_STUDIO_G24_NONE_P709, _16_235, UNKNOWN, SRGB, BT709), + /* 7-1) Approximation for RGB_FULL_G22_NONE_P2020 */ + MAKE_COLOR_MAP (RGB_FULL_G22_NONE_P2020, _0_255, UNKNOWN, SRGB, BT2020), - /* RGB_STUDIO_G24_NONE_P2020 */ - MAKE_COLOR_MAP (RGB_STUDIO_G24_NONE_P709, _16_235, 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), + + /* 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 */ - MAKE_COLOR_MAP (YCBCR_FULL_G22_NONE_P709_X601, _0_255, BT601, BT709, BT709), + /* 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 + */ - /* YCBCR_STUDIO_G22_LEFT_P601 */ + /* 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), - /* YCBCR_FULL_G22_LEFT_P601 */ + /* 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), - /* YCBCR_STUDIO_G22_LEFT_P709 */ + /* 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), - /* YCBCR_FULL_G22_LEFT_P709 */ + /* 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), - /* YCBCR_STUDIO_G22_LEFT_P2020 */ + /* 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;