diff --git a/lib/src/jpegrutils.cpp b/lib/src/jpegrutils.cpp index 3f064ade..b2ec6433 100644 --- a/lib/src/jpegrutils.cpp +++ b/lib/src/jpegrutils.cpp @@ -258,7 +258,7 @@ class XMPXmlHandler : public XmlHandler { stringstream ss(maxContentBoostStr); float val; if (ss >> val) { - *max_content_boost = exp2(val); + *max_content_boost = isApple ? val : exp2(val); return true; } else { return false; diff --git a/tests/jpegr_test.cpp b/tests/jpegr_test.cpp index 8748dac1..71371620 100644 --- a/tests/jpegr_test.cpp +++ b/tests/jpegr_test.cpp @@ -1712,6 +1712,33 @@ TEST(JpegRTest, writeXmpThenRead) { EXPECT_TRUE(metadata_read.use_base_cg); } +TEST(JpegRTest, readAppleHeadroomXmpAsLinearBoost) { + const std::string nameSpace = "http://ns.adobe.com/xap/1.0/\0"; + const size_t nameSpaceLength = nameSpace.size() + 1; + const std::string xmp = + "" + "131072" + "4.0" + ""; + + std::vector xmpData; + xmpData.reserve(nameSpaceLength + xmp.size()); + xmpData.insert(xmpData.end(), reinterpret_cast(nameSpace.c_str()), + reinterpret_cast(nameSpace.c_str()) + nameSpaceLength); + xmpData.insert(xmpData.end(), reinterpret_cast(xmp.c_str()), + reinterpret_cast(xmp.c_str()) + xmp.size()); + + uhdr_gainmap_metadata_ext_t metadata; + ASSERT_EQ(getMetadataFromXMP(xmpData.data(), xmpData.size(), /*exif_data=*/nullptr, + /*exif_size=*/0, &metadata) + .error_code, + UHDR_CODEC_OK); + EXPECT_FLOAT_EQ(metadata.max_content_boost[0], 4.0f); + EXPECT_FLOAT_EQ(metadata.hdr_capacity_max, 4.0f); +} + TEST(JpegRTest, decodeApple) { JpegR decoder; uhdr_compressed_image_t uhdrCompressedImg; @@ -1743,7 +1770,7 @@ TEST(JpegRTest, decodeApple) { const uhdr_gainmap_metadata_t* gainmapMetadata = uhdr_dec_get_gainmap_metadata(dec); ASSERT_NE(gainmapMetadata, nullptr); - const double headroom = fileName == kOldAppleFileName ? 8.0 : 23.1474762; + const double headroom = fileName == kOldAppleFileName ? 8.0 : 4.532783; for (int c = 0; c < 3; ++c) { EXPECT_EQ(gainmapMetadata->gamma[c], 1.0f); EXPECT_EQ(gainmapMetadata->offset_sdr[c], 0.0f);