Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 65ee04df authored by Nick Deakin's avatar Nick Deakin Committed by Android (Google) Code Review
Browse files

Merge "jpegrecoverymap: XMP fixes."

parents 3f91ba71 42d08f45
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -105,14 +105,16 @@ bool getMetadataFromXMP(uint8_t* xmp_data, size_t xmp_size, jpegr_metadata_struc
 *       xmlns:Item="http://ns.google.com/photos/1.0/container/item/">
 *       <Container:Directory>
 *         <rdf:Seq>
 *           <rdf:li>
 *           <rdf:li
 *             rdf:parseType="Resource">
 *             <Container:Item
 *               Item:Semantic="Primary"
 *               Item:Mime="image/jpeg"/>
 *           </rdf:li>
 *           <rdf:li>
 *           <rdf:li
 *             rdf:parseType="Resource">
 *             <Container:Item
 *               Item:Semantic="RecoveryMap"
 *               Item:Semantic="GainMap"
 *               Item:Mime="image/jpeg"
 *               Item:Length="1000"/>
 *           </rdf:li>
@@ -142,14 +144,14 @@ std::string generateXmpForPrimaryImage(int secondary_image_length);
 *     <rdf:Description
 *       xmlns:hdrgm="http://ns.adobe.com/hdr-gain-map/1.0/"
 *       hdrgm:Version="1"
 *       hdrgm:GainMapMin="0.5"
 *       hdrgm:GainMapMax="8.5"
 *       hdrgm:GainMapMin="-1"
 *       hdrgm:GainMapMax="3"
 *       hdrgm:Gamma="1"
 *       hdrgm:OffsetSDR="0"
 *       hdrgm:OffsetHDR="0"
 *       hdrgm:HDRCapacityMin="0.5"
 *       hdrgm:HDRCapacityMax="8.5"
 *       hdrgm:BaseRendition="SDR"/>
 *       hdrgm:HDRCapacityMin="0"
 *       hdrgm:HDRCapacityMax="3"
 *       hdrgm:BaseRenditionIsHDR="False"/>
 *   </rdf:RDF>
 * </x:xmpmeta>
 *
+41 −30
Original line number Diff line number Diff line
@@ -15,14 +15,17 @@
 */

#include <jpegrecoverymap/jpegrutils.h>
#include <utils/Log.h>

#include <algorithm>
#include <cmath>

#include <image_io/xml/xml_reader.h>
#include <image_io/xml/xml_writer.h>
#include <image_io/base/message_handler.h>
#include <image_io/xml/xml_element_rules.h>
#include <image_io/xml/xml_handler.h>
#include <image_io/xml/xml_rule.h>
#include <cmath>
#include <utils/Log.h>

using namespace photos_editing_formats::image_io;
using namespace std;
@@ -231,25 +234,25 @@ const string kItemSemantic = Name(kItemPrefix, "Semantic");

// Item XMP constants - element and attribute values
const string kSemanticPrimary = "Primary";
const string kSemanticRecoveryMap = "RecoveryMap";
const string kSemanticGainMap = "GainMap";
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
// 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<string> kConDirSeq({kConDirectory, string("rdf:Seq")});
  const vector<string> 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();
+2 −2
Original line number Diff line number Diff line
@@ -192,8 +192,8 @@ TEST_F(JpegRTest, writeXmpThenRead) {

  jpegr_metadata_struct metadata_read;
  EXPECT_TRUE(getMetadataFromXMP(xmpData.data(), xmpData.size(), &metadata_read));
  ASSERT_EQ(metadata_expected.maxContentBoost, metadata_read.maxContentBoost);
  ASSERT_EQ(metadata_expected.minContentBoost, metadata_read.minContentBoost);
  EXPECT_FLOAT_EQ(metadata_expected.maxContentBoost, metadata_read.maxContentBoost);
  EXPECT_FLOAT_EQ(metadata_expected.minContentBoost, metadata_read.minContentBoost);
}

/* Test Encode API-0 and decode */