Skip to content

Commit

Permalink
Check that the gain map metadata is valid on decoding. (#2453)
Browse files Browse the repository at this point in the history
All fraction denominators must be != 0, and the gamma numerator
must also be != 0. Files with invalid gain map metadata are rejected.
  • Loading branch information
maryla-uc authored Oct 21, 2024
1 parent 048488e commit 5b6fe91
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/read.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 12 additions & 0 deletions tests/data/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Binary file added tests/data/seine_sdr_gainmap_gammazero.avif
Binary file not shown.
15 changes: 15 additions & 0 deletions tests/gtest/avifgainmaptest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 5b6fe91

Please sign in to comment.