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);