From 31f03e33d5c2e240afe5ff9f675429a43990af2d Mon Sep 17 00:00:00 2001 From: Nick Deakin Date: Fri, 31 Mar 2023 16:00:13 -0400 Subject: jpegrecoverymap: XMP fixes. * Update semantic type from RecoveryMap to GainMap * Add parseType="Resource" to Directory rdf:li's, for XMP toolkit * Fix writing of HDRCapacity Min and Max values Bug: 264715926 Test: Tests pass (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:42d08f450b07080b3d2a64875a26046cce150822) Merged-In: Ia4073cd75646dd79aee391e8d44169b3527f6e93 Change-Id: Ia4073cd75646dd79aee391e8d44169b3527f6e93 --- libs/jpegrecoverymap/jpegrutils.cpp | 71 +++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 30 deletions(-) (limited to 'libs/jpegrecoverymap/jpegrutils.cpp') diff --git a/libs/jpegrecoverymap/jpegrutils.cpp b/libs/jpegrecoverymap/jpegrutils.cpp index ff96447320..cde0ceb520 100644 --- a/libs/jpegrecoverymap/jpegrutils.cpp +++ b/libs/jpegrecoverymap/jpegrutils.cpp @@ -15,14 +15,17 @@ */ #include -#include + +#include +#include + #include #include #include #include #include #include -#include +#include using namespace photos_editing_formats::image_io; using namespace std; @@ -230,26 +233,26 @@ const string kItemMime = Name(kItemPrefix, "Mime"); const string kItemSemantic = Name(kItemPrefix, "Semantic"); // Item XMP constants - element and attribute values -const string kSemanticPrimary = "Primary"; -const string kSemanticRecoveryMap = "RecoveryMap"; -const string kMimeImageJpeg = "image/jpeg"; - -// RecoveryMap XMP constants - URI and namespace prefix -const string kRecoveryMapUri = "http://ns.adobe.com/hdr-gain-map/1.0/"; -const string kRecoveryMapPrefix = "hdrgm"; - -// RecoveryMap XMP constants - element and attribute names -const string kMapVersion = Name(kRecoveryMapPrefix, "Version"); -const string kMapGainMapMin = Name(kRecoveryMapPrefix, "GainMapMin"); -const string kMapGainMapMax = Name(kRecoveryMapPrefix, "GainMapMax"); -const string kMapGamma = Name(kRecoveryMapPrefix, "Gamma"); -const string kMapOffsetSdr = Name(kRecoveryMapPrefix, "OffsetSDR"); -const string kMapOffsetHdr = Name(kRecoveryMapPrefix, "OffsetHDR"); -const string kMapHDRCapacityMin = Name(kRecoveryMapPrefix, "HDRCapacityMin"); -const string kMapHDRCapacityMax = Name(kRecoveryMapPrefix, "HDRCapacityMax"); -const string kMapBaseRendition = Name(kRecoveryMapPrefix, "BaseRendition"); - -// RecoveryMap XMP constants - names for XMP handlers +const string kSemanticPrimary = "Primary"; +const string kSemanticGainMap = "GainMap"; +const string kMimeImageJpeg = "image/jpeg"; + +// GainMap XMP constants - URI and namespace prefix +const string kGainMapUri = "http://ns.adobe.com/hdr-gain-map/1.0/"; +const string kGainMapPrefix = "hdrgm"; + +// GainMap XMP constants - element and attribute names +const string kMapVersion = Name(kGainMapPrefix, "Version"); +const string kMapGainMapMin = Name(kGainMapPrefix, "GainMapMin"); +const string kMapGainMapMax = Name(kGainMapPrefix, "GainMapMax"); +const string kMapGamma = Name(kGainMapPrefix, "Gamma"); +const string kMapOffsetSdr = Name(kGainMapPrefix, "OffsetSDR"); +const string kMapOffsetHdr = Name(kGainMapPrefix, "OffsetHDR"); +const string kMapHDRCapacityMin = Name(kGainMapPrefix, "HDRCapacityMin"); +const string kMapHDRCapacityMax = Name(kGainMapPrefix, "HDRCapacityMax"); +const string kMapBaseRenditionIsHDR = Name(kGainMapPrefix, "BaseRenditionIsHDR"); + +// GainMap XMP constants - names for XMP handlers const string XMPXmlHandler::minContentBoostAttrName = kMapGainMapMin; const string XMPXmlHandler::maxContentBoostAttrName = kMapGainMapMax; @@ -313,15 +316,23 @@ string generateXmpForPrimaryImage(int secondary_image_length) { writer.StartWritingElement("rdf:Description"); writer.WriteXmlns(kContainerPrefix, kContainerUri); writer.WriteXmlns(kItemPrefix, kItemUri); + writer.StartWritingElements(kConDirSeq); - size_t item_depth = writer.StartWritingElements(kLiItem); + + size_t item_depth = writer.StartWritingElement("rdf:li"); + writer.WriteAttributeNameAndValue("rdf:parseType", "Resource"); + writer.StartWritingElement(kConItem); writer.WriteAttributeNameAndValue(kItemSemantic, kSemanticPrimary); writer.WriteAttributeNameAndValue(kItemMime, kMimeImageJpeg); writer.FinishWritingElementsToDepth(item_depth); - writer.StartWritingElements(kLiItem); - writer.WriteAttributeNameAndValue(kItemSemantic, kSemanticRecoveryMap); + + writer.StartWritingElement("rdf:li"); + writer.WriteAttributeNameAndValue("rdf:parseType", "Resource"); + writer.StartWritingElement(kConItem); + writer.WriteAttributeNameAndValue(kItemSemantic, kSemanticGainMap); writer.WriteAttributeNameAndValue(kItemMime, kMimeImageJpeg); writer.WriteAttributeNameAndValue(kItemLength, secondary_image_length); + writer.FinishWriting(); return ss.str(); @@ -329,7 +340,6 @@ string generateXmpForPrimaryImage(int secondary_image_length) { string generateXmpForSecondaryImage(jpegr_metadata_struct& metadata) { const vector kConDirSeq({kConDirectory, string("rdf:Seq")}); - const vector kLiItem({string("rdf:li"), kConItem}); std::stringstream ss; photos_editing_formats::image_io::XmlWriter writer(ss); @@ -339,16 +349,17 @@ string generateXmpForSecondaryImage(jpegr_metadata_struct& metadata) { writer.StartWritingElement("rdf:RDF"); writer.WriteXmlns("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); writer.StartWritingElement("rdf:Description"); - writer.WriteXmlns(kRecoveryMapPrefix, kRecoveryMapUri); + writer.WriteXmlns(kGainMapPrefix, kGainMapUri); writer.WriteAttributeNameAndValue(kMapVersion, metadata.version); writer.WriteAttributeNameAndValue(kMapGainMapMin, log2(metadata.minContentBoost)); writer.WriteAttributeNameAndValue(kMapGainMapMax, log2(metadata.maxContentBoost)); writer.WriteAttributeNameAndValue(kMapGamma, "1"); writer.WriteAttributeNameAndValue(kMapOffsetSdr, "0"); writer.WriteAttributeNameAndValue(kMapOffsetHdr, "0"); - writer.WriteAttributeNameAndValue(kMapHDRCapacityMin, "0"); - writer.WriteAttributeNameAndValue(kMapHDRCapacityMax, "2.3"); - writer.WriteAttributeNameAndValue(kMapBaseRendition, "SDR"); + writer.WriteAttributeNameAndValue( + kMapHDRCapacityMin, std::max(log2(metadata.minContentBoost), 0.0f)); + writer.WriteAttributeNameAndValue(kMapHDRCapacityMax, log2(metadata.maxContentBoost)); + writer.WriteAttributeNameAndValue(kMapBaseRenditionIsHDR, "False"); writer.FinishWriting(); return ss.str(); -- cgit v1.2.3-59-g8ed1b