From 5293d3b7d7a73341769d9f4d8e701a2d948ead39 Mon Sep 17 00:00:00 2001 From: Tristan Matthews Date: Mon, 9 Sep 2024 17:27:24 -0400 Subject: [PATCH] aom: make BGR matching stricter This is equivalent to the fix in ece317a245e8c32a5efc11d5e82dcd8a28a2f10b as the aom decoder had the same issue reported in #28776. (cherry picked from commit 0001e85a098ee4e6e2526eaec8a76899c2b23b90) Gbp-Pq: Name 0031-aom-make-BGR-matching-stricter.patch --- modules/codec/aom.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/modules/codec/aom.c b/modules/codec/aom.c index 0c4d3442..09e0370f 100644 --- a/modules/codec/aom.c +++ b/modules/codec/aom.c @@ -89,38 +89,43 @@ static const struct vlc_fourcc_t i_chroma; enum aom_img_fmt i_chroma_id; uint8_t i_bitdepth; - uint8_t i_needs_hack; - + enum aom_transfer_characteristics transfer_characteristics; + enum aom_color_primaries color_primaries; + enum aom_matrix_coefficients matrix_coefficients; } chroma_table[] = { - { VLC_CODEC_I420, AOM_IMG_FMT_I420, 8, 0 }, - { VLC_CODEC_I422, AOM_IMG_FMT_I422, 8, 0 }, - { VLC_CODEC_I444, AOM_IMG_FMT_I444, 8, 0 }, + /* Transfer characteristic-dependent mappings must come first */ + { VLC_CODEC_GBR_PLANAR, AOM_IMG_FMT_I444, 8, AOM_CICP_TC_SRGB, AOM_CICP_CP_BT_709, AOM_CICP_MC_IDENTITY }, + { VLC_CODEC_GBR_PLANAR_10L, AOM_IMG_FMT_I44416, 10, AOM_CICP_TC_SRGB , AOM_CICP_CP_BT_709, AOM_CICP_MC_IDENTITY }, - { VLC_CODEC_YV12, AOM_IMG_FMT_YV12, 8, 0 }, + { VLC_CODEC_I420, AOM_IMG_FMT_I420, 8, AOM_CICP_TC_UNSPECIFIED, AOM_CICP_CP_UNSPECIFIED, AOM_CICP_MC_UNSPECIFIED }, + { VLC_CODEC_I422, AOM_IMG_FMT_I422, 8, AOM_CICP_TC_UNSPECIFIED, AOM_CICP_CP_UNSPECIFIED, AOM_CICP_MC_UNSPECIFIED }, + { VLC_CODEC_I444, AOM_IMG_FMT_I444, 8, AOM_CICP_TC_UNSPECIFIED, AOM_CICP_CP_UNSPECIFIED, AOM_CICP_MC_UNSPECIFIED }, - { VLC_CODEC_GBR_PLANAR, AOM_IMG_FMT_I444, 8, 1 }, - { VLC_CODEC_GBR_PLANAR_10L, AOM_IMG_FMT_I44416, 10, 1 }, + { VLC_CODEC_YV12, AOM_IMG_FMT_YV12, 8, AOM_CICP_TC_UNSPECIFIED, AOM_CICP_CP_UNSPECIFIED, AOM_CICP_MC_UNSPECIFIED }, - { VLC_CODEC_I420_10L, AOM_IMG_FMT_I42016, 10, 0 }, - { VLC_CODEC_I422_10L, AOM_IMG_FMT_I42216, 10, 0 }, - { VLC_CODEC_I444_10L, AOM_IMG_FMT_I44416, 10, 0 }, + { VLC_CODEC_I420_10L, AOM_IMG_FMT_I42016, 10, AOM_CICP_TC_UNSPECIFIED, AOM_CICP_CP_UNSPECIFIED, AOM_CICP_MC_UNSPECIFIED }, + { VLC_CODEC_I422_10L, AOM_IMG_FMT_I42216, 10, AOM_CICP_TC_UNSPECIFIED, AOM_CICP_CP_UNSPECIFIED, AOM_CICP_MC_UNSPECIFIED }, + { VLC_CODEC_I444_10L, AOM_IMG_FMT_I44416, 10, AOM_CICP_TC_UNSPECIFIED, AOM_CICP_CP_UNSPECIFIED, AOM_CICP_MC_UNSPECIFIED }, - { VLC_CODEC_I420_12L, AOM_IMG_FMT_I42016, 12, 0 }, - { VLC_CODEC_I422_12L, AOM_IMG_FMT_I42216, 12, 0 }, - { VLC_CODEC_I444_12L, AOM_IMG_FMT_I44416, 12, 0 }, + { VLC_CODEC_I420_12L, AOM_IMG_FMT_I42016, 12, AOM_CICP_TC_UNSPECIFIED, AOM_CICP_CP_UNSPECIFIED, AOM_CICP_MC_UNSPECIFIED }, + { VLC_CODEC_I422_12L, AOM_IMG_FMT_I42216, 12, AOM_CICP_TC_UNSPECIFIED, AOM_CICP_CP_UNSPECIFIED, AOM_CICP_MC_UNSPECIFIED }, + { VLC_CODEC_I444_12L, AOM_IMG_FMT_I44416, 12, AOM_CICP_TC_UNSPECIFIED, AOM_CICP_CP_UNSPECIFIED, AOM_CICP_MC_UNSPECIFIED }, - { VLC_CODEC_I444_16L, AOM_IMG_FMT_I44416, 16, 0 }, + { VLC_CODEC_I444_16L, AOM_IMG_FMT_I44416, 16, AOM_CICP_TC_UNSPECIFIED, AOM_CICP_CP_UNSPECIFIED, AOM_CICP_MC_UNSPECIFIED }, }; static vlc_fourcc_t FindVlcChroma( struct aom_image *img ) { - uint8_t hack = (img->fmt & AOM_IMG_FMT_I444) && (img->tc == AOM_CICP_TC_SRGB); - for( unsigned int i = 0; i < ARRAY_SIZE(chroma_table); i++ ) if( chroma_table[i].i_chroma_id == img->fmt && chroma_table[i].i_bitdepth == img->bit_depth && - chroma_table[i].i_needs_hack == hack ) + ( chroma_table[i].transfer_characteristics == AOM_CICP_TC_UNSPECIFIED || + chroma_table[i].transfer_characteristics == img->tc ) && + ( chroma_table[i].color_primaries == AOM_CICP_CP_UNSPECIFIED || + chroma_table[i].color_primaries == img->cp ) && + ( chroma_table[i].matrix_coefficients == AOM_CICP_MC_UNSPECIFIED || + chroma_table[i].matrix_coefficients == img->mc ) ) return chroma_table[i].i_chroma; return 0; -- 2.30.2