xref: /aosp_15_r20/external/libultrahdr/lib/include/ultrahdr/jpegrutils.h (revision 89a0ef05262152531a00a15832a2d3b1e3990773)
1*89a0ef05SAndroid Build Coastguard Worker /*
2*89a0ef05SAndroid Build Coastguard Worker  * Copyright 2022 The Android Open Source Project
3*89a0ef05SAndroid Build Coastguard Worker  *
4*89a0ef05SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*89a0ef05SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*89a0ef05SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*89a0ef05SAndroid Build Coastguard Worker  *
8*89a0ef05SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*89a0ef05SAndroid Build Coastguard Worker  *
10*89a0ef05SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*89a0ef05SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*89a0ef05SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*89a0ef05SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*89a0ef05SAndroid Build Coastguard Worker  * limitations under the License.
15*89a0ef05SAndroid Build Coastguard Worker  */
16*89a0ef05SAndroid Build Coastguard Worker 
17*89a0ef05SAndroid Build Coastguard Worker #ifndef ULTRAHDR_JPEGRUTILS_H
18*89a0ef05SAndroid Build Coastguard Worker #define ULTRAHDR_JPEGRUTILS_H
19*89a0ef05SAndroid Build Coastguard Worker 
20*89a0ef05SAndroid Build Coastguard Worker #include "ultrahdr/jpegr.h"
21*89a0ef05SAndroid Build Coastguard Worker 
22*89a0ef05SAndroid Build Coastguard Worker // TODO (dichenzhang): This is old version metadata, new version can be found in
23*89a0ef05SAndroid Build Coastguard Worker // https://drive.google.com/file/d/1yUGmjGytRuBa2vpr9eM5Uu8CVhyyddjp/view?resourcekey=0-HGzFrzPQzu5FNYLRAJXQBA
24*89a0ef05SAndroid Build Coastguard Worker // and in gainmapmetadata.h/.cpp
25*89a0ef05SAndroid Build Coastguard Worker // This file is kept in order to keep the backward compatibility.
26*89a0ef05SAndroid Build Coastguard Worker namespace ultrahdr {
27*89a0ef05SAndroid Build Coastguard Worker 
EndianSwap32(uint32_t value)28*89a0ef05SAndroid Build Coastguard Worker static constexpr uint32_t EndianSwap32(uint32_t value) {
29*89a0ef05SAndroid Build Coastguard Worker   return ((value & 0xFF) << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) |
30*89a0ef05SAndroid Build Coastguard Worker          (value >> 24);
31*89a0ef05SAndroid Build Coastguard Worker }
EndianSwap16(uint16_t value)32*89a0ef05SAndroid Build Coastguard Worker static inline uint16_t EndianSwap16(uint16_t value) {
33*89a0ef05SAndroid Build Coastguard Worker   return static_cast<uint16_t>((value >> 8) | ((value & 0xFF) << 8));
34*89a0ef05SAndroid Build Coastguard Worker }
35*89a0ef05SAndroid Build Coastguard Worker 
36*89a0ef05SAndroid Build Coastguard Worker /*
37*89a0ef05SAndroid Build Coastguard Worker  * Mutable data structure. Holds information for metadata.
38*89a0ef05SAndroid Build Coastguard Worker  */
39*89a0ef05SAndroid Build Coastguard Worker class DataStruct {
40*89a0ef05SAndroid Build Coastguard Worker  private:
41*89a0ef05SAndroid Build Coastguard Worker   void* data;
42*89a0ef05SAndroid Build Coastguard Worker   size_t writePos;
43*89a0ef05SAndroid Build Coastguard Worker   size_t length;
44*89a0ef05SAndroid Build Coastguard Worker 
45*89a0ef05SAndroid Build Coastguard Worker  public:
46*89a0ef05SAndroid Build Coastguard Worker   DataStruct(size_t s);
47*89a0ef05SAndroid Build Coastguard Worker   ~DataStruct();
48*89a0ef05SAndroid Build Coastguard Worker 
49*89a0ef05SAndroid Build Coastguard Worker   void* getData();
50*89a0ef05SAndroid Build Coastguard Worker   size_t getLength();
51*89a0ef05SAndroid Build Coastguard Worker   size_t getBytesWritten();
52*89a0ef05SAndroid Build Coastguard Worker   bool write8(uint8_t value);
53*89a0ef05SAndroid Build Coastguard Worker   bool write16(uint16_t value);
54*89a0ef05SAndroid Build Coastguard Worker   bool write32(uint32_t value);
55*89a0ef05SAndroid Build Coastguard Worker   bool write(const void* src, size_t size);
56*89a0ef05SAndroid Build Coastguard Worker };
57*89a0ef05SAndroid Build Coastguard Worker 
58*89a0ef05SAndroid Build Coastguard Worker /*
59*89a0ef05SAndroid Build Coastguard Worker  * Helper function used for writing data to destination.
60*89a0ef05SAndroid Build Coastguard Worker  *
61*89a0ef05SAndroid Build Coastguard Worker  * @param destination destination of the data to be written.
62*89a0ef05SAndroid Build Coastguard Worker  * @param source source of data being written.
63*89a0ef05SAndroid Build Coastguard Worker  * @param length length of the data to be written.
64*89a0ef05SAndroid Build Coastguard Worker  * @param position cursor in desitination where the data is to be written.
65*89a0ef05SAndroid Build Coastguard Worker  * @return success or error code.
66*89a0ef05SAndroid Build Coastguard Worker  */
67*89a0ef05SAndroid Build Coastguard Worker uhdr_error_info_t Write(uhdr_compressed_image_t* destination, const void* source, size_t length,
68*89a0ef05SAndroid Build Coastguard Worker                         size_t& position);
69*89a0ef05SAndroid Build Coastguard Worker 
70*89a0ef05SAndroid Build Coastguard Worker /*
71*89a0ef05SAndroid Build Coastguard Worker  * Parses XMP packet and fills metadata with data from XMP
72*89a0ef05SAndroid Build Coastguard Worker  *
73*89a0ef05SAndroid Build Coastguard Worker  * @param xmp_data pointer to XMP packet
74*89a0ef05SAndroid Build Coastguard Worker  * @param xmp_size size of XMP packet
75*89a0ef05SAndroid Build Coastguard Worker  * @param metadata place to store HDR metadata values
76*89a0ef05SAndroid Build Coastguard Worker  * @return success or error code.
77*89a0ef05SAndroid Build Coastguard Worker  */
78*89a0ef05SAndroid Build Coastguard Worker uhdr_error_info_t getMetadataFromXMP(uint8_t* xmp_data, size_t xmp_size,
79*89a0ef05SAndroid Build Coastguard Worker                                      uhdr_gainmap_metadata_ext_t* metadata);
80*89a0ef05SAndroid Build Coastguard Worker 
81*89a0ef05SAndroid Build Coastguard Worker /*
82*89a0ef05SAndroid Build Coastguard Worker  * This method generates XMP metadata for the primary image.
83*89a0ef05SAndroid Build Coastguard Worker  *
84*89a0ef05SAndroid Build Coastguard Worker  * below is an example of the XMP metadata that this function generates where
85*89a0ef05SAndroid Build Coastguard Worker  * secondary_image_length = 1000
86*89a0ef05SAndroid Build Coastguard Worker  *
87*89a0ef05SAndroid Build Coastguard Worker  * <x:xmpmeta
88*89a0ef05SAndroid Build Coastguard Worker  *   xmlns:x="adobe:ns:meta/"
89*89a0ef05SAndroid Build Coastguard Worker  *   x:xmptk="Adobe XMP Core 5.1.2">
90*89a0ef05SAndroid Build Coastguard Worker  *   <rdf:RDF
91*89a0ef05SAndroid Build Coastguard Worker  *     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
92*89a0ef05SAndroid Build Coastguard Worker  *     <rdf:Description
93*89a0ef05SAndroid Build Coastguard Worker  *       xmlns:Container="http://ns.google.com/photos/1.0/container/"
94*89a0ef05SAndroid Build Coastguard Worker  *       xmlns:Item="http://ns.google.com/photos/1.0/container/item/"
95*89a0ef05SAndroid Build Coastguard Worker  *       xmlns:hdrgm="http://ns.adobe.com/hdr-gain-map/1.0/"
96*89a0ef05SAndroid Build Coastguard Worker  *       hdrgm:Version="1">
97*89a0ef05SAndroid Build Coastguard Worker  *       <Container:Directory>
98*89a0ef05SAndroid Build Coastguard Worker  *         <rdf:Seq>
99*89a0ef05SAndroid Build Coastguard Worker  *           <rdf:li
100*89a0ef05SAndroid Build Coastguard Worker  *             rdf:parseType="Resource">
101*89a0ef05SAndroid Build Coastguard Worker  *             <Container:Item
102*89a0ef05SAndroid Build Coastguard Worker  *               Item:Semantic="Primary"
103*89a0ef05SAndroid Build Coastguard Worker  *               Item:Mime="image/jpeg"/>
104*89a0ef05SAndroid Build Coastguard Worker  *           </rdf:li>
105*89a0ef05SAndroid Build Coastguard Worker  *           <rdf:li
106*89a0ef05SAndroid Build Coastguard Worker  *             rdf:parseType="Resource">
107*89a0ef05SAndroid Build Coastguard Worker  *             <Container:Item
108*89a0ef05SAndroid Build Coastguard Worker  *               Item:Semantic="GainMap"
109*89a0ef05SAndroid Build Coastguard Worker  *               Item:Mime="image/jpeg"
110*89a0ef05SAndroid Build Coastguard Worker  *               Item:Length="1000"/>
111*89a0ef05SAndroid Build Coastguard Worker  *           </rdf:li>
112*89a0ef05SAndroid Build Coastguard Worker  *         </rdf:Seq>
113*89a0ef05SAndroid Build Coastguard Worker  *       </Container:Directory>
114*89a0ef05SAndroid Build Coastguard Worker  *     </rdf:Description>
115*89a0ef05SAndroid Build Coastguard Worker  *   </rdf:RDF>
116*89a0ef05SAndroid Build Coastguard Worker  * </x:xmpmeta>
117*89a0ef05SAndroid Build Coastguard Worker  *
118*89a0ef05SAndroid Build Coastguard Worker  * @param secondary_image_length length of secondary image
119*89a0ef05SAndroid Build Coastguard Worker  * @return XMP metadata in type of string
120*89a0ef05SAndroid Build Coastguard Worker  */
121*89a0ef05SAndroid Build Coastguard Worker std::string generateXmpForPrimaryImage(size_t secondary_image_length,
122*89a0ef05SAndroid Build Coastguard Worker                                        uhdr_gainmap_metadata_ext_t& metadata);
123*89a0ef05SAndroid Build Coastguard Worker 
124*89a0ef05SAndroid Build Coastguard Worker /*
125*89a0ef05SAndroid Build Coastguard Worker  * This method generates XMP metadata for the recovery map image.
126*89a0ef05SAndroid Build Coastguard Worker  * Link: https://developer.android.com/media/platform/hdr-image-format#XMP-attributes
127*89a0ef05SAndroid Build Coastguard Worker  *
128*89a0ef05SAndroid Build Coastguard Worker  * below is an example of the XMP metadata that this function generates where
129*89a0ef05SAndroid Build Coastguard Worker  * max_content_boost = 8.0
130*89a0ef05SAndroid Build Coastguard Worker  * min_content_boost = 0.5
131*89a0ef05SAndroid Build Coastguard Worker  *
132*89a0ef05SAndroid Build Coastguard Worker  * <x:xmpmeta
133*89a0ef05SAndroid Build Coastguard Worker  *   xmlns:x="adobe:ns:meta/"
134*89a0ef05SAndroid Build Coastguard Worker  *   x:xmptk="Adobe XMP Core 5.1.2">
135*89a0ef05SAndroid Build Coastguard Worker  *   <rdf:RDF
136*89a0ef05SAndroid Build Coastguard Worker  *     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
137*89a0ef05SAndroid Build Coastguard Worker  *     <rdf:Description
138*89a0ef05SAndroid Build Coastguard Worker  *       xmlns:hdrgm="http://ns.adobe.com/hdr-gain-map/1.0/"
139*89a0ef05SAndroid Build Coastguard Worker  *       hdrgm:Version="1"
140*89a0ef05SAndroid Build Coastguard Worker  *       hdrgm:GainMapMin="-1"
141*89a0ef05SAndroid Build Coastguard Worker  *       hdrgm:GainMapMax="3"
142*89a0ef05SAndroid Build Coastguard Worker  *       hdrgm:Gamma="1"
143*89a0ef05SAndroid Build Coastguard Worker  *       hdrgm:OffsetSDR="0"
144*89a0ef05SAndroid Build Coastguard Worker  *       hdrgm:OffsetHDR="0"
145*89a0ef05SAndroid Build Coastguard Worker  *       hdrgm:HDRCapacityMin="0"
146*89a0ef05SAndroid Build Coastguard Worker  *       hdrgm:HDRCapacityMax="3"
147*89a0ef05SAndroid Build Coastguard Worker  *       hdrgm:BaseRenditionIsHDR="False"/>
148*89a0ef05SAndroid Build Coastguard Worker  *   </rdf:RDF>
149*89a0ef05SAndroid Build Coastguard Worker  * </x:xmpmeta>
150*89a0ef05SAndroid Build Coastguard Worker  *
151*89a0ef05SAndroid Build Coastguard Worker  * @param metadata JPEG/R metadata to encode as XMP
152*89a0ef05SAndroid Build Coastguard Worker  * @return XMP metadata in type of string
153*89a0ef05SAndroid Build Coastguard Worker  */
154*89a0ef05SAndroid Build Coastguard Worker std::string generateXmpForSecondaryImage(uhdr_gainmap_metadata_ext_t& metadata);
155*89a0ef05SAndroid Build Coastguard Worker 
156*89a0ef05SAndroid Build Coastguard Worker }  // namespace ultrahdr
157*89a0ef05SAndroid Build Coastguard Worker 
158*89a0ef05SAndroid Build Coastguard Worker #endif  // ULTRAHDR_JPEGRUTILS_H
159