diff --git a/src/read.c b/src/read.c index 5c8b68ac55..a67f7adeb9 100644 --- a/src/read.c +++ b/src/read.c @@ -2028,6 +2028,11 @@ static avifResult avifParseToneMappedImageBox(avifGainMap * gainMap, const uint8 if (writerVersion <= supportedMetadataVersion) { AVIF_CHECKERR(avifROStreamRemainingBytes(&s) == 0, AVIF_RESULT_INVALID_TONE_MAPPED_IMAGE); } + + if (avifGainMapValidateMetadata(gainMap, diag) != AVIF_RESULT_OK) { + return AVIF_RESULT_INVALID_TONE_MAPPED_IMAGE; + } + return AVIF_RESULT_OK; } #endif // AVIF_ENABLE_EXPERIMENTAL_GAIN_MAP diff --git a/tests/data/README.md b/tests/data/README.md index 6d8a2fe11f..4ea64be267 100644 --- a/tests/data/README.md +++ b/tests/data/README.md @@ -654,6 +654,18 @@ Source : same as seine_sdr_gainmap_srgb.avif before commit 10b7232 An image with a `tmap` item (i.e. a gain map) but no 'tmap' brand in the `ftyp` box. The gain map should be ignored by the decoder since the `tmap` brand is missing. +### File [seine_sdr_gainmap_gammazero.avif](seine_sdr_gainmap_gammazero.avif) + +![](seine_sdr_gainmap_gammazero.avif) + +License: [same as libavif](https://github.com/AOMediaCodec/libavif/blob/main/LICENSE) + +Source : same as seine_sdr_gainmap_srgb.avif generated with a modified avifenc that +writes 0 instead of the gain map gamma numerator. + +An image with a gain map where the gain map gamma value is zero (invalid). + + ### File [seine_sdr_gainmap_big_srgb.avif](seine_sdr_gainmap_big_srgb.avif) ![](seine_sdr_gainmap_big_srgb.avif) diff --git a/tests/data/seine_sdr_gainmap_gammazero.avif b/tests/data/seine_sdr_gainmap_gammazero.avif new file mode 100644 index 0000000000..eb34fdcf30 Binary files /dev/null and b/tests/data/seine_sdr_gainmap_gammazero.avif differ diff --git a/tests/gtest/avifgainmaptest.cc b/tests/gtest/avifgainmaptest.cc index aaf76c781a..3a7d081417 100644 --- a/tests/gtest/avifgainmaptest.cc +++ b/tests/gtest/avifgainmaptest.cc @@ -928,6 +928,21 @@ TEST(GainMapTest, DecodeInvalidFtyp) { ASSERT_EQ(decoded->gainMap, nullptr); } +TEST(GainMapTest, DecodeInvalidGamma) { + const std::string path = + std::string(data_path) + "seine_sdr_gainmap_gammazero.avif"; + ImagePtr decoded(avifImageCreateEmpty()); + ASSERT_NE(decoded, nullptr); + DecoderPtr decoder(avifDecoderCreate()); + ASSERT_NE(decoder, nullptr); + decoder->enableDecodingGainMap = true; + decoder->enableParsingGainMapMetadata = true; + // Fails to decode: the gain map is ignored because the gain map gamma is zero + // (invalid). + ASSERT_EQ(avifDecoderReadFile(decoder.get(), decoded.get(), path.c_str()), + AVIF_RESULT_INVALID_TONE_MAPPED_IMAGE); +} + #define EXPECT_FRACTION_NEAR(numerator, denominator, expected) \ EXPECT_NEAR(std::abs((double)numerator / denominator), expected, \ expected * 0.001);