Skip to content

Commit

Permalink
Check that the gain map metadata is valid on decoding.
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 committed Oct 1, 2024
1 parent 7d357d6 commit cf1b2ca
Show file tree
Hide file tree
Showing 3 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 @@ -648,6 +648,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_ngammazero.avif](seine_sdr_gainmap_notmapbrand.avif)

![](seine_sdr_gainmap_notmapbrand.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
15 changes: 15 additions & 0 deletions tests/gtest/avifgainmaptest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -926,6 +926,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 cf1b2ca

Please sign in to comment.