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