xref: /aosp_15_r20/external/libultrahdr/lib/include/ultrahdr/ultrahdr.h (revision 89a0ef05262152531a00a15832a2d3b1e3990773)
1*89a0ef05SAndroid Build Coastguard Worker /*
2*89a0ef05SAndroid Build Coastguard Worker  * Copyright 2023 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_ULTRAHDR_H
18*89a0ef05SAndroid Build Coastguard Worker #define ULTRAHDR_ULTRAHDR_H
19*89a0ef05SAndroid Build Coastguard Worker 
20*89a0ef05SAndroid Build Coastguard Worker #include <string>
21*89a0ef05SAndroid Build Coastguard Worker 
22*89a0ef05SAndroid Build Coastguard Worker namespace ultrahdr {
23*89a0ef05SAndroid Build Coastguard Worker 
24*89a0ef05SAndroid Build Coastguard Worker #define JPEGR_CHECK(x)                \
25*89a0ef05SAndroid Build Coastguard Worker   {                                   \
26*89a0ef05SAndroid Build Coastguard Worker     status_t status = (x);            \
27*89a0ef05SAndroid Build Coastguard Worker     if ((status) != JPEGR_NO_ERROR) { \
28*89a0ef05SAndroid Build Coastguard Worker       return status;                  \
29*89a0ef05SAndroid Build Coastguard Worker     }                                 \
30*89a0ef05SAndroid Build Coastguard Worker   }
31*89a0ef05SAndroid Build Coastguard Worker 
32*89a0ef05SAndroid Build Coastguard Worker // TODO (dichenzhang): rename these to "ULTRAHDR".
33*89a0ef05SAndroid Build Coastguard Worker typedef enum {
34*89a0ef05SAndroid Build Coastguard Worker   JPEGR_NO_ERROR = 0,
35*89a0ef05SAndroid Build Coastguard Worker   JPEGR_UNKNOWN_ERROR = -1,
36*89a0ef05SAndroid Build Coastguard Worker 
37*89a0ef05SAndroid Build Coastguard Worker   JPEGR_IO_ERROR_BASE = -10000,
38*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_BAD_PTR = JPEGR_IO_ERROR_BASE - 1,
39*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_UNSUPPORTED_WIDTH_HEIGHT = JPEGR_IO_ERROR_BASE - 2,
40*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_INVALID_COLORGAMUT = JPEGR_IO_ERROR_BASE - 3,
41*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_INVALID_STRIDE = JPEGR_IO_ERROR_BASE - 4,
42*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_INVALID_TRANS_FUNC = JPEGR_IO_ERROR_BASE - 5,
43*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_RESOLUTION_MISMATCH = JPEGR_IO_ERROR_BASE - 6,
44*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_INVALID_QUALITY_FACTOR = JPEGR_IO_ERROR_BASE - 7,
45*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_INVALID_DISPLAY_BOOST = JPEGR_IO_ERROR_BASE - 8,
46*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_INVALID_OUTPUT_FORMAT = JPEGR_IO_ERROR_BASE - 9,
47*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_BAD_METADATA = JPEGR_IO_ERROR_BASE - 10,
48*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_INVALID_CROPPING_PARAMETERS = JPEGR_IO_ERROR_BASE - 11,
49*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_INVALID_GAMMA = JPEGR_IO_ERROR_BASE - 12,
50*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_INVALID_ENC_PRESET = JPEGR_IO_ERROR_BASE - 13,
51*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_INVALID_TARGET_DISP_PEAK_BRIGHTNESS = JPEGR_IO_ERROR_BASE - 14,
52*89a0ef05SAndroid Build Coastguard Worker 
53*89a0ef05SAndroid Build Coastguard Worker   JPEGR_RUNTIME_ERROR_BASE = -20000,
54*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_ENCODE_ERROR = JPEGR_RUNTIME_ERROR_BASE - 1,
55*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_DECODE_ERROR = JPEGR_RUNTIME_ERROR_BASE - 2,
56*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_GAIN_MAP_IMAGE_NOT_FOUND = JPEGR_RUNTIME_ERROR_BASE - 3,
57*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_BUFFER_TOO_SMALL = JPEGR_RUNTIME_ERROR_BASE - 4,
58*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_METADATA_ERROR = JPEGR_RUNTIME_ERROR_BASE - 5,
59*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_NO_IMAGES_FOUND = JPEGR_RUNTIME_ERROR_BASE - 6,
60*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_MULTIPLE_EXIFS_RECEIVED = JPEGR_RUNTIME_ERROR_BASE - 7,
61*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_UNSUPPORTED_MAP_SCALE_FACTOR = JPEGR_RUNTIME_ERROR_BASE - 8,
62*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_GAIN_MAP_SIZE_ERROR = JPEGR_RUNTIME_ERROR_BASE - 9,
63*89a0ef05SAndroid Build Coastguard Worker 
64*89a0ef05SAndroid Build Coastguard Worker   ERROR_JPEGR_UNSUPPORTED_FEATURE = -30000,
65*89a0ef05SAndroid Build Coastguard Worker } status_t;
66*89a0ef05SAndroid Build Coastguard Worker 
67*89a0ef05SAndroid Build Coastguard Worker // Color gamuts for image data
68*89a0ef05SAndroid Build Coastguard Worker typedef enum {
69*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_COLORGAMUT_UNSPECIFIED = -1,
70*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_COLORGAMUT_BT709,
71*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_COLORGAMUT_P3,
72*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_COLORGAMUT_BT2100,
73*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_COLORGAMUT_MAX = ULTRAHDR_COLORGAMUT_BT2100,
74*89a0ef05SAndroid Build Coastguard Worker } ultrahdr_color_gamut;
75*89a0ef05SAndroid Build Coastguard Worker 
76*89a0ef05SAndroid Build Coastguard Worker // Transfer functions for image data
77*89a0ef05SAndroid Build Coastguard Worker // TODO: TF LINEAR is deprecated, remove this enum and the code surrounding it.
78*89a0ef05SAndroid Build Coastguard Worker typedef enum {
79*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_TF_UNSPECIFIED = -1,
80*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_TF_LINEAR = 0,
81*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_TF_HLG = 1,
82*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_TF_PQ = 2,
83*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_TF_SRGB = 3,
84*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_TF_MAX = ULTRAHDR_TF_SRGB,
85*89a0ef05SAndroid Build Coastguard Worker } ultrahdr_transfer_function;
86*89a0ef05SAndroid Build Coastguard Worker 
87*89a0ef05SAndroid Build Coastguard Worker // Target output formats for decoder
88*89a0ef05SAndroid Build Coastguard Worker typedef enum {
89*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_OUTPUT_UNSPECIFIED = -1,
90*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_OUTPUT_SDR,         // SDR in RGBA_8888 color format
91*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_OUTPUT_HDR_LINEAR,  // HDR in F16 color format (linear)
92*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_OUTPUT_HDR_PQ,      // HDR in RGBA_1010102 color format (PQ transfer function)
93*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_OUTPUT_HDR_HLG,     // HDR in RGBA_1010102 color format (HLG transfer function)
94*89a0ef05SAndroid Build Coastguard Worker   ULTRAHDR_OUTPUT_MAX = ULTRAHDR_OUTPUT_HDR_HLG,
95*89a0ef05SAndroid Build Coastguard Worker } ultrahdr_output_format;
96*89a0ef05SAndroid Build Coastguard Worker 
97*89a0ef05SAndroid Build Coastguard Worker /*
98*89a0ef05SAndroid Build Coastguard Worker  * Holds information for gain map related metadata.
99*89a0ef05SAndroid Build Coastguard Worker  *
100*89a0ef05SAndroid Build Coastguard Worker  * Not: all values stored in linear. This differs from the metadata encoding in XMP, where
101*89a0ef05SAndroid Build Coastguard Worker  * maxContentBoost (aka gainMapMax), minContentBoost (aka gainMapMin), hdrCapacityMin, and
102*89a0ef05SAndroid Build Coastguard Worker  * hdrCapacityMax are stored in log2 space.
103*89a0ef05SAndroid Build Coastguard Worker  */
104*89a0ef05SAndroid Build Coastguard Worker struct ultrahdr_metadata_struct {
105*89a0ef05SAndroid Build Coastguard Worker   // Ultra HDR format version
106*89a0ef05SAndroid Build Coastguard Worker   std::string version;
107*89a0ef05SAndroid Build Coastguard Worker   // Max Content Boost for the map
108*89a0ef05SAndroid Build Coastguard Worker   float maxContentBoost;
109*89a0ef05SAndroid Build Coastguard Worker   // Min Content Boost for the map
110*89a0ef05SAndroid Build Coastguard Worker   float minContentBoost;
111*89a0ef05SAndroid Build Coastguard Worker   // Gamma of the map data
112*89a0ef05SAndroid Build Coastguard Worker   float gamma;
113*89a0ef05SAndroid Build Coastguard Worker   // Offset for SDR data in map calculations
114*89a0ef05SAndroid Build Coastguard Worker   float offsetSdr;
115*89a0ef05SAndroid Build Coastguard Worker   // Offset for HDR data in map calculations
116*89a0ef05SAndroid Build Coastguard Worker   float offsetHdr;
117*89a0ef05SAndroid Build Coastguard Worker   // HDR capacity to apply the map at all
118*89a0ef05SAndroid Build Coastguard Worker   float hdrCapacityMin;
119*89a0ef05SAndroid Build Coastguard Worker   // HDR capacity to apply the map completely
120*89a0ef05SAndroid Build Coastguard Worker   float hdrCapacityMax;
121*89a0ef05SAndroid Build Coastguard Worker };
122*89a0ef05SAndroid Build Coastguard Worker 
123*89a0ef05SAndroid Build Coastguard Worker /*
124*89a0ef05SAndroid Build Coastguard Worker  * Holds information for uncompressed image or gain map.
125*89a0ef05SAndroid Build Coastguard Worker  */
126*89a0ef05SAndroid Build Coastguard Worker struct jpegr_uncompressed_struct {
127*89a0ef05SAndroid Build Coastguard Worker   // Pointer to the data location.
128*89a0ef05SAndroid Build Coastguard Worker   void* data;
129*89a0ef05SAndroid Build Coastguard Worker   // Width of the gain map or the luma plane of the image in pixels.
130*89a0ef05SAndroid Build Coastguard Worker   unsigned int width;
131*89a0ef05SAndroid Build Coastguard Worker   // Height of the gain map or the luma plane of the image in pixels.
132*89a0ef05SAndroid Build Coastguard Worker   unsigned int height;
133*89a0ef05SAndroid Build Coastguard Worker   // Color gamut.
134*89a0ef05SAndroid Build Coastguard Worker   ultrahdr_color_gamut colorGamut;
135*89a0ef05SAndroid Build Coastguard Worker 
136*89a0ef05SAndroid Build Coastguard Worker   // Values below are optional
137*89a0ef05SAndroid Build Coastguard Worker   // Pointer to chroma data, if it's NULL, chroma plane is considered to be immediately
138*89a0ef05SAndroid Build Coastguard Worker   // after the luma plane.
139*89a0ef05SAndroid Build Coastguard Worker   void* chroma_data = nullptr;
140*89a0ef05SAndroid Build Coastguard Worker   // Stride of Y plane in number of pixels. 0 indicates the member is uninitialized. If
141*89a0ef05SAndroid Build Coastguard Worker   // non-zero this value must be larger than or equal to luma width. If stride is
142*89a0ef05SAndroid Build Coastguard Worker   // uninitialized then it is assumed to be equal to luma width.
143*89a0ef05SAndroid Build Coastguard Worker   unsigned int luma_stride = 0;
144*89a0ef05SAndroid Build Coastguard Worker   // Stride of UV plane in number of pixels.
145*89a0ef05SAndroid Build Coastguard Worker   // 1. If this handle points to P010 image then this value must be larger than
146*89a0ef05SAndroid Build Coastguard Worker   //    or equal to luma width.
147*89a0ef05SAndroid Build Coastguard Worker   // 2. If this handle points to 420 image then this value must be larger than
148*89a0ef05SAndroid Build Coastguard Worker   //    or equal to (luma width / 2).
149*89a0ef05SAndroid Build Coastguard Worker   // NOTE: if chroma_data is nullptr, chroma_stride is irrelevant. Just as the way,
150*89a0ef05SAndroid Build Coastguard Worker   // chroma_data is derived from luma ptr, chroma stride is derived from luma stride.
151*89a0ef05SAndroid Build Coastguard Worker   unsigned int chroma_stride = 0;
152*89a0ef05SAndroid Build Coastguard Worker   // Pixel format.
153*89a0ef05SAndroid Build Coastguard Worker   uhdr_img_fmt_t pixelFormat = UHDR_IMG_FMT_UNSPECIFIED;
154*89a0ef05SAndroid Build Coastguard Worker   // Color range.
155*89a0ef05SAndroid Build Coastguard Worker   uhdr_color_range_t colorRange = UHDR_CR_UNSPECIFIED;
156*89a0ef05SAndroid Build Coastguard Worker };
157*89a0ef05SAndroid Build Coastguard Worker 
158*89a0ef05SAndroid Build Coastguard Worker /*
159*89a0ef05SAndroid Build Coastguard Worker  * Holds information for compressed image or gain map.
160*89a0ef05SAndroid Build Coastguard Worker  */
161*89a0ef05SAndroid Build Coastguard Worker struct jpegr_compressed_struct {
162*89a0ef05SAndroid Build Coastguard Worker   // Pointer to the data location.
163*89a0ef05SAndroid Build Coastguard Worker   void* data;
164*89a0ef05SAndroid Build Coastguard Worker   // Used data length in bytes.
165*89a0ef05SAndroid Build Coastguard Worker   size_t length;
166*89a0ef05SAndroid Build Coastguard Worker   // Maximum available data length in bytes.
167*89a0ef05SAndroid Build Coastguard Worker   size_t maxLength;
168*89a0ef05SAndroid Build Coastguard Worker   // Color gamut.
169*89a0ef05SAndroid Build Coastguard Worker   ultrahdr_color_gamut colorGamut;
170*89a0ef05SAndroid Build Coastguard Worker };
171*89a0ef05SAndroid Build Coastguard Worker 
172*89a0ef05SAndroid Build Coastguard Worker /*
173*89a0ef05SAndroid Build Coastguard Worker  * Holds information for EXIF metadata.
174*89a0ef05SAndroid Build Coastguard Worker  */
175*89a0ef05SAndroid Build Coastguard Worker struct jpegr_exif_struct {
176*89a0ef05SAndroid Build Coastguard Worker   // Pointer to the data location.
177*89a0ef05SAndroid Build Coastguard Worker   void* data;
178*89a0ef05SAndroid Build Coastguard Worker   // Data length;
179*89a0ef05SAndroid Build Coastguard Worker   size_t length;
180*89a0ef05SAndroid Build Coastguard Worker };
181*89a0ef05SAndroid Build Coastguard Worker 
182*89a0ef05SAndroid Build Coastguard Worker typedef struct jpegr_uncompressed_struct* jr_uncompressed_ptr;
183*89a0ef05SAndroid Build Coastguard Worker typedef struct jpegr_compressed_struct* jr_compressed_ptr;
184*89a0ef05SAndroid Build Coastguard Worker typedef struct jpegr_exif_struct* jr_exif_ptr;
185*89a0ef05SAndroid Build Coastguard Worker typedef struct ultrahdr_metadata_struct* ultrahdr_metadata_ptr;
186*89a0ef05SAndroid Build Coastguard Worker 
187*89a0ef05SAndroid Build Coastguard Worker }  // namespace ultrahdr
188*89a0ef05SAndroid Build Coastguard Worker 
189*89a0ef05SAndroid Build Coastguard Worker #endif  // ULTRAHDR_ULTRAHDR_H
190