| /* |
| * Copyright 2022 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ULTRAHDR_JPEGR_H |
| #define ULTRAHDR_JPEGR_H |
| |
| #include <array> |
| #include <cfloat> |
| |
| #include "ultrahdr_api.h" |
| #include "ultrahdr/ultrahdr.h" |
| #include "ultrahdr/ultrahdrcommon.h" |
| #include "ultrahdr/jpegdecoderhelper.h" |
| #include "ultrahdr/jpegencoderhelper.h" |
| |
| namespace ultrahdr { |
| |
| // Default configurations |
| // gainmap image downscale factor |
| static const int kMapDimensionScaleFactorDefault = 1; |
| static const int kMapDimensionScaleFactorAndroidDefault = 4; |
| |
| // JPEG compress quality (0 ~ 100) for base image |
| static const int kBaseCompressQualityDefault = 95; |
| |
| // JPEG compress quality (0 ~ 100) for gain map |
| static const int kMapCompressQualityDefault = 95; |
| static const int kMapCompressQualityAndroidDefault = 85; |
| |
| // Gain map calculation |
| static const bool kUseMultiChannelGainMapDefault = true; |
| static const bool kUseMultiChannelGainMapAndroidDefault = false; |
| |
| // encoding preset |
| static const uhdr_enc_preset_t kEncSpeedPresetDefault = UHDR_USAGE_BEST_QUALITY; |
| static const uhdr_enc_preset_t kEncSpeedPresetAndroidDefault = UHDR_USAGE_REALTIME; |
| |
| // Default gamma value for gain map |
| static const float kGainMapGammaDefault = 1.0f; |
| |
| // The current JPEGR version that we encode to |
| static const char* const kJpegrVersion = "1.0"; |
| |
| /* |
| * Holds information of jpeg image |
| */ |
| struct jpeg_info_struct { |
| std::vector<uint8_t> imgData = std::vector<uint8_t>(0); |
| std::vector<uint8_t> iccData = std::vector<uint8_t>(0); |
| std::vector<uint8_t> exifData = std::vector<uint8_t>(0); |
| std::vector<uint8_t> xmpData = std::vector<uint8_t>(0); |
| std::vector<uint8_t> isoData = std::vector<uint8_t>(0); |
| unsigned int width; |
| unsigned int height; |
| unsigned int numComponents; |
| }; |
| |
| /* |
| * Holds information of jpegr image |
| */ |
| struct jpegr_info_struct { |
| unsigned int width; // copy of primary image width (for easier access) |
| unsigned int height; // copy of primary image height (for easier access) |
| jpeg_info_struct* primaryImgInfo = nullptr; |
| jpeg_info_struct* gainmapImgInfo = nullptr; |
| }; |
| |
| typedef struct jpeg_info_struct* j_info_ptr; |
| typedef struct jpegr_info_struct* jr_info_ptr; |
| |
| class JpegR { |
| public: |
| JpegR(void* uhdrGLESCtxt = nullptr, |
| int mapDimensionScaleFactor = kMapDimensionScaleFactorAndroidDefault, |
| int mapCompressQuality = kMapCompressQualityAndroidDefault, |
| bool useMultiChannelGainMap = kUseMultiChannelGainMapAndroidDefault, |
| float gamma = kGainMapGammaDefault, |
| uhdr_enc_preset_t preset = kEncSpeedPresetAndroidDefault, float minContentBoost = FLT_MIN, |
| float maxContentBoost = FLT_MAX, float targetDispPeakBrightness = -1.0f); |
| |
| /*!\brief Encode API-0. |
| * |
| * Create ultrahdr jpeg image from raw hdr intent. |
| * |
| * Experimental only. |
| * |
| * Input hdr image is tonemapped to sdr image. A gainmap coefficient is computed between hdr and |
| * sdr intent. sdr intent and gain map coefficient are compressed using jpeg encoding. compressed |
| * gainmap is appended at the end of compressed sdr image. |
| * |
| * \param[in] hdr_intent hdr intent raw input image descriptor |
| * \param[in, out] dest output image descriptor to store compressed ultrahdr image |
| * \param[in] quality quality factor for sdr intent jpeg compression |
| * \param[in] exif optional exif metadata that needs to be inserted in |
| * compressed output |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t encodeJPEGR(uhdr_raw_image_t* hdr_intent, uhdr_compressed_image_t* dest, |
| int quality, uhdr_mem_block_t* exif); |
| |
| /*!\brief Encode API-1. |
| * |
| * Create ultrahdr jpeg image from raw hdr intent and raw sdr intent. |
| * |
| * A gainmap coefficient is computed between hdr and sdr intent. sdr intent and gain map |
| * coefficient are compressed using jpeg encoding. compressed gainmap is appended at the end of |
| * compressed sdr image. |
| * NOTE: Color transfer of sdr intent is expected to be sRGB. |
| * |
| * \param[in] hdr_intent hdr intent raw input image descriptor |
| * \param[in] sdr_intent sdr intent raw input image descriptor |
| * \param[in, out] dest output image descriptor to store compressed ultrahdr image |
| * \param[in] quality quality factor for sdr intent jpeg compression |
| * \param[in] exif optional exif metadata that needs to be inserted in |
| * compressed output |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t encodeJPEGR(uhdr_raw_image_t* hdr_intent, uhdr_raw_image_t* sdr_intent, |
| uhdr_compressed_image_t* dest, int quality, uhdr_mem_block_t* exif); |
| |
| /*!\brief Encode API-2. |
| * |
| * Create ultrahdr jpeg image from raw hdr intent, raw sdr intent and compressed sdr intent. |
| * |
| * A gainmap coefficient is computed between hdr and sdr intent. gain map coefficient is |
| * compressed using jpeg encoding. compressed gainmap is appended at the end of compressed sdr |
| * intent. ICC profile is added if one isn't present in the sdr intent JPEG image. |
| * NOTE: Color transfer of sdr intent is expected to be sRGB. |
| * NOTE: sdr intent raw and compressed inputs are expected to be related via compress/decompress |
| * operations. |
| * |
| * \param[in] hdr_intent hdr intent raw input image descriptor |
| * \param[in] sdr_intent sdr intent raw input image descriptor |
| * \param[in] sdr_intent_compressed sdr intent compressed input image descriptor |
| * \param[in, out] dest output image descriptor to store compressed ultrahdr |
| * image |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t encodeJPEGR(uhdr_raw_image_t* hdr_intent, uhdr_raw_image_t* sdr_intent, |
| uhdr_compressed_image_t* sdr_intent_compressed, |
| uhdr_compressed_image_t* dest); |
| |
| /*!\brief Encode API-3. |
| * |
| * Create ultrahdr jpeg image from raw hdr intent and compressed sdr intent. |
| * |
| * The sdr intent is decoded and a gainmap coefficient is computed between hdr and sdr intent. |
| * gain map coefficient is compressed using jpeg encoding. compressed gainmap is appended at the |
| * end of compressed sdr image. ICC profile is added if one isn't present in the sdr intent JPEG |
| * image. |
| * NOTE: Color transfer of sdr intent is expected to be sRGB. |
| * |
| * \param[in] hdr_intent hdr intent raw input image descriptor |
| * \param[in] sdr_intent_compressed sdr intent compressed input image descriptor |
| * \param[in, out] dest output image descriptor to store compressed ultrahdr |
| * image |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t encodeJPEGR(uhdr_raw_image_t* hdr_intent, |
| uhdr_compressed_image_t* sdr_intent_compressed, |
| uhdr_compressed_image_t* dest); |
| |
| /*!\brief Encode API-4. |
| * |
| * Create ultrahdr jpeg image from compressed sdr image and compressed gainmap image |
| * |
| * compressed gainmap image is added at the end of compressed sdr image. ICC profile is added if |
| * one isn't present in the sdr intent compressed image. |
| * |
| * \param[in] base_img_compressed sdr intent compressed input image descriptor |
| * \param[in] gainmap_img_compressed gainmap compressed image descriptor |
| * \param[in] metadata gainmap metadata descriptor |
| * \param[in, out] dest output image descriptor to store compressed ultrahdr |
| * image |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t encodeJPEGR(uhdr_compressed_image_t* base_img_compressed, |
| uhdr_compressed_image_t* gainmap_img_compressed, |
| uhdr_gainmap_metadata_ext_t* metadata, |
| uhdr_compressed_image_t* dest); |
| |
| /*!\brief Decode API. |
| * |
| * Decompress ultrahdr jpeg image. |
| * |
| * NOTE: This method requires that the ultrahdr input image contains an ICC profile with primaries |
| * that match those of a color gamut that this library is aware of; Bt.709, Display-P3, or |
| * Bt.2100. It also assumes the base image color transfer characteristics are sRGB. |
| * |
| * \param[in] uhdr_compressed_img compressed ultrahdr image descriptor |
| * \param[in, out] dest output image descriptor to store decoded output |
| * \param[in] max_display_boost (optional) the maximum available boost supported by a |
| * display, the value must be greater than or equal |
| * to 1.0 |
| * \param[in] output_ct (optional) output color transfer |
| * \param[in] output_format (optional) output pixel format |
| * \param[in, out] gainmap_img (optional) output image descriptor to store decoded |
| * gainmap image |
| * \param[in, out] gainmap_metadata (optional) descriptor to store gainmap metadata |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| * |
| * NOTE: This method only supports single gain map metadata values for fields that allow |
| * multi-channel metadata values. |
| * |
| * NOTE: Not all combinations of output color transfer and output pixel format are supported. |
| * Refer below table for supported combinations. |
| * ---------------------------------------------------------------------- |
| * | color transfer | color format | |
| * ---------------------------------------------------------------------- |
| * | SDR | 32bppRGBA8888 | |
| * ---------------------------------------------------------------------- |
| * | HDR_LINEAR | 64bppRGBAHalfFloat | |
| * ---------------------------------------------------------------------- |
| * | HDR_PQ | 32bppRGBA1010102 | |
| * ---------------------------------------------------------------------- |
| * | HDR_HLG | 32bppRGBA1010102 | |
| * ---------------------------------------------------------------------- |
| */ |
| uhdr_error_info_t decodeJPEGR(uhdr_compressed_image_t* uhdr_compressed_img, |
| uhdr_raw_image_t* dest, float max_display_boost = FLT_MAX, |
| uhdr_color_transfer_t output_ct = UHDR_CT_LINEAR, |
| uhdr_img_fmt_t output_format = UHDR_IMG_FMT_64bppRGBAHalfFloat, |
| uhdr_raw_image_t* gainmap_img = nullptr, |
| uhdr_gainmap_metadata_t* gainmap_metadata = nullptr); |
| |
| /*!\brief This function parses the bitstream and returns information that is useful for actual |
| * decoding. This does not decode the image. That is handled by decodeJPEGR |
| * |
| * \param[in] uhdr_compressed_img compressed ultrahdr image descriptor |
| * \param[in, out] uhdr_image_info image info descriptor |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t getJPEGRInfo(uhdr_compressed_image_t* uhdr_compressed_img, |
| jr_info_ptr uhdr_image_info); |
| |
| /*!\brief set gain map dimension scale factor |
| * NOTE: Applicable only in encoding scenario |
| * |
| * \param[in] mapDimensionScaleFactor scale factor |
| * |
| * \return none |
| */ |
| void setMapDimensionScaleFactor(int mapDimensionScaleFactor) { |
| this->mMapDimensionScaleFactor = mapDimensionScaleFactor; |
| } |
| |
| /*!\brief get gain map dimension scale factor |
| * NOTE: Applicable only in encoding scenario |
| * |
| * \return mapDimensionScaleFactor |
| */ |
| int getMapDimensionScaleFactor() { return this->mMapDimensionScaleFactor; } |
| |
| /*!\brief set gain map compression quality factor |
| * NOTE: Applicable only in encoding scenario |
| * |
| * \param[in] mapCompressQuality quality factor for gain map image compression |
| * |
| * \return none |
| */ |
| void setMapCompressQuality(int mapCompressQuality) { |
| this->mMapCompressQuality = mapCompressQuality; |
| } |
| |
| /*!\brief get gain map quality factor |
| * NOTE: Applicable only in encoding scenario |
| * |
| * \return quality factor |
| */ |
| int getMapCompressQuality() { return this->mMapCompressQuality; } |
| |
| /*!\brief set gain map gamma |
| * NOTE: Applicable only in encoding scenario |
| * |
| * \param[in] gamma gamma parameter that is used for gain map calculation |
| * |
| * \return none |
| */ |
| void setGainMapGamma(float gamma) { this->mGamma = gamma; } |
| |
| /*!\brief get gain map gamma |
| * NOTE: Applicable only in encoding scenario |
| * |
| * \return gamma parameter |
| */ |
| float getGainMapGamma() { return this->mGamma; } |
| |
| /*!\brief enable / disable multi channel gain map |
| * NOTE: Applicable only in encoding scenario |
| * |
| * \param[in] useMultiChannelGainMap enable / disable multi channel gain map |
| * |
| * \return none |
| */ |
| void setUseMultiChannelGainMap(bool useMultiChannelGainMap) { |
| this->mUseMultiChannelGainMap = useMultiChannelGainMap; |
| } |
| |
| /*!\brief check if multi channel gain map is enabled |
| * NOTE: Applicable only in encoding scenario |
| * |
| * \return true if multi channel gain map is enabled, false otherwise |
| */ |
| bool isUsingMultiChannelGainMap() { return this->mUseMultiChannelGainMap; } |
| |
| /*!\brief set gain map min and max content boost |
| * NOTE: Applicable only in encoding scenario |
| * |
| * \param[in] minBoost gain map min content boost |
| * \param[in] maxBoost gain map max content boost |
| * |
| * \return none |
| */ |
| void setGainMapMinMaxContentBoost(float minBoost, float maxBoost) { |
| this->mMinContentBoost = minBoost; |
| this->mMaxContentBoost = maxBoost; |
| } |
| |
| /*!\brief get gain map min max content boost |
| * NOTE: Applicable only in encoding scenario |
| * |
| * \param[out] minBoost gain map min content boost |
| * \param[out] maxBoost gain map max content boost |
| * |
| * \return none |
| */ |
| void getGainMapMinMaxContentBoost(float& minBoost, float& maxBoost) { |
| minBoost = this->mMinContentBoost; |
| maxBoost = this->mMaxContentBoost; |
| } |
| |
| /* \brief Alias of Encode API-0. |
| * |
| * \deprecated This function is deprecated. Use its alias |
| */ |
| status_t encodeJPEGR(jr_uncompressed_ptr p010_image_ptr, ultrahdr_transfer_function hdr_tf, |
| jr_compressed_ptr dest, int quality, jr_exif_ptr exif); |
| |
| /* \brief Alias of Encode API-1. |
| * |
| * \deprecated This function is deprecated. Use its actual |
| */ |
| status_t encodeJPEGR(jr_uncompressed_ptr p010_image_ptr, jr_uncompressed_ptr yuv420_image_ptr, |
| ultrahdr_transfer_function hdr_tf, jr_compressed_ptr dest, int quality, |
| jr_exif_ptr exif); |
| |
| /* \brief Alias of Encode API-2. |
| * |
| * \deprecated This function is deprecated. Use its actual |
| */ |
| status_t encodeJPEGR(jr_uncompressed_ptr p010_image_ptr, jr_uncompressed_ptr yuv420_image_ptr, |
| jr_compressed_ptr yuv420jpg_image_ptr, ultrahdr_transfer_function hdr_tf, |
| jr_compressed_ptr dest); |
| |
| /* \brief Alias of Encode API-3. |
| * |
| * \deprecated This function is deprecated. Use its actual |
| */ |
| status_t encodeJPEGR(jr_uncompressed_ptr p010_image_ptr, jr_compressed_ptr yuv420jpg_image_ptr, |
| ultrahdr_transfer_function hdr_tf, jr_compressed_ptr dest); |
| |
| /* \brief Alias of Encode API-4. |
| * |
| * \deprecated This function is deprecated. Use its actual |
| */ |
| status_t encodeJPEGR(jr_compressed_ptr yuv420jpg_image_ptr, |
| jr_compressed_ptr gainmapjpg_image_ptr, ultrahdr_metadata_ptr metadata, |
| jr_compressed_ptr dest); |
| |
| /* \brief Alias of Decode API |
| * |
| * \deprecated This function is deprecated. Use its actual |
| */ |
| status_t decodeJPEGR(jr_compressed_ptr jpegr_image_ptr, jr_uncompressed_ptr dest, |
| float max_display_boost = FLT_MAX, jr_exif_ptr exif = nullptr, |
| ultrahdr_output_format output_format = ULTRAHDR_OUTPUT_HDR_LINEAR, |
| jr_uncompressed_ptr gainmap_image_ptr = nullptr, |
| ultrahdr_metadata_ptr metadata = nullptr); |
| |
| /* \brief Alias of getJPEGRInfo |
| * |
| * \deprecated This function is deprecated. Use its actual |
| */ |
| status_t getJPEGRInfo(jr_compressed_ptr jpegr_image_ptr, jr_info_ptr jpegr_image_info_ptr); |
| |
| /*!\brief This function receives iso block and / or xmp block and parses gainmap metadata and fill |
| * the output descriptor. If both iso block and xmp block are available, then iso block is |
| * preferred over xmp. |
| * |
| * \param[in] iso_data iso memory block |
| * \param[in] iso_size iso block size |
| * \param[in] xmp_data xmp memory block |
| * \param[in] xmp_size xmp block size |
| * \param[in, out] gainmap_metadata gainmap metadata descriptor |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t parseGainMapMetadata(uint8_t* iso_data, size_t iso_size, uint8_t* xmp_data, |
| size_t xmp_size, |
| uhdr_gainmap_metadata_ext_t* uhdr_metadata); |
| |
| /*!\brief This method is used to tone map a hdr image |
| * |
| * \param[in] hdr_intent hdr image descriptor |
| * \param[in, out] sdr_intent sdr image descriptor |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t toneMap(uhdr_raw_image_t* hdr_intent, uhdr_raw_image_t* sdr_intent); |
| |
| /*!\brief This method takes hdr intent and sdr intent and computes gainmap coefficient. |
| * |
| * This method is called in the encoding pipeline. It takes uncompressed 8-bit and 10-bit yuv |
| * images as input and calculates gainmap. |
| * |
| * NOTE: The input images must be the same resolution. |
| * NOTE: The SDR input is assumed to use the sRGB transfer function. |
| * |
| * \param[in] sdr_intent sdr intent raw input image descriptor |
| * \param[in] hdr_intent hdr intent raw input image descriptor |
| * \param[in, out] gainmap_metadata gainmap metadata descriptor |
| * \param[in, out] gainmap_img gainmap image descriptor |
| * \param[in] sdr_is_601 (optional) if sdr_is_601 is true, then use BT.601 |
| * gamut to represent sdr intent regardless of the value |
| * present in the sdr intent image descriptor |
| * \param[in] use_luminance (optional) used for single channel gainmap. If |
| * use_luminance is true, gainmap calculation is based |
| * on the pixel's luminance which is a weighted |
| * combination of r, g, b channels; otherwise, gainmap |
| * calculation is based of the maximun value of r, g, b |
| * channels. |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t generateGainMap(uhdr_raw_image_t* sdr_intent, uhdr_raw_image_t* hdr_intent, |
| uhdr_gainmap_metadata_ext_t* gainmap_metadata, |
| std::unique_ptr<uhdr_raw_image_ext_t>& gainmap_img, |
| bool sdr_is_601 = false, bool use_luminance = true); |
| |
| protected: |
| /*!\brief This method takes sdr intent, gainmap image and gainmap metadata and computes hdr |
| * intent. This method is called in the decoding pipeline. The output hdr intent image will have |
| * same color gamut as sdr intent. |
| * |
| * NOTE: The SDR input is assumed to use the sRGB transfer function. |
| * |
| * \param[in] sdr_intent sdr intent raw input image descriptor |
| * \param[in] gainmap_img gainmap image descriptor |
| * \param[in] gainmap_metadata gainmap metadata descriptor |
| * \param[in] output_ct output color transfer |
| * \param[in] output_format output pixel format |
| * \param[in] max_display_boost the maximum available boost supported by a |
| * display, the value must be greater than or equal |
| * to 1.0 |
| * \param[in, out] dest output image descriptor to store output |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t applyGainMap(uhdr_raw_image_t* sdr_intent, uhdr_raw_image_t* gainmap_img, |
| uhdr_gainmap_metadata_ext_t* gainmap_metadata, |
| uhdr_color_transfer_t output_ct, uhdr_img_fmt_t output_format, |
| float max_display_boost, uhdr_raw_image_t* dest); |
| |
| private: |
| /*!\brief compress gainmap image |
| * |
| * \param[in] gainmap_img gainmap image descriptor |
| * \param[in] jpeg_enc_obj jpeg encoder object handle |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t compressGainMap(uhdr_raw_image_t* gainmap_img, JpegEncoderHelper* jpeg_enc_obj); |
| |
| /*!\brief This method is called to separate base image and gain map image from compressed |
| * ultrahdr image |
| * |
| * \param[in] jpegr_image compressed ultrahdr image descriptor |
| * \param[in, out] primary_image sdr image descriptor |
| * \param[in, out] gainmap_image gainmap image descriptor |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t extractPrimaryImageAndGainMap(uhdr_compressed_image_t* jpegr_image, |
| uhdr_compressed_image_t* primary_image, |
| uhdr_compressed_image_t* gainmap_image); |
| |
| /*!\brief This function parses the bitstream and returns metadata that is useful for actual |
| * decoding. This does not decode the image. That is handled by decompressImage(). |
| * |
| * \param[in] jpeg_image compressed jpeg image descriptor |
| * \param[in, out] image_info image info descriptor |
| * \param[in, out] img_width (optional) image width |
| * \param[in, out] img_height (optional) image height |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t parseJpegInfo(uhdr_compressed_image_t* jpeg_image, j_info_ptr image_info, |
| unsigned int* img_width = nullptr, |
| unsigned int* img_height = nullptr); |
| |
| /*!\brief This method takes compressed sdr intent, compressed gainmap coefficient, gainmap |
| * metadata and creates a ultrahdr image. This is done by first generating XMP packet from gainmap |
| * metadata, then appending in the order, |
| * SOI, APP2 (Exif is present), APP2 (XMP), base image, gain map image. |
| * |
| * NOTE: In the final output, EXIF package will appear if ONLY ONE of the following conditions is |
| * fulfilled: |
| * (1) EXIF package is available from outside input. I.e. pExif != nullptr. |
| * (2) Compressed sdr intent has EXIF. |
| * If both conditions are fulfilled, this method will return error indicating that it is unable to |
| * choose which exif to be placed in the bitstream. |
| * |
| * \param[in] sdr_intent_compressed sdr intent image descriptor |
| * \param[in] gainmap_compressed gainmap intent input image descriptor |
| * \param[in] pExif exif block to be placed in the bitstream |
| * \param[in] pIcc pointer to icc segment that needs to be added to the |
| * compressed image |
| * \param[in] icc_size size of icc segment |
| * \param[in] metadata gainmap metadata descriptor |
| * \param[in, out] dest output image descriptor to store compressed ultrahdr |
| * image |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t appendGainMap(uhdr_compressed_image_t* sdr_intent_compressed, |
| uhdr_compressed_image_t* gainmap_compressed, |
| uhdr_mem_block_t* pExif, void* pIcc, size_t icc_size, |
| uhdr_gainmap_metadata_ext_t* metadata, |
| uhdr_compressed_image_t* dest); |
| |
| /*!\brief This method is used to convert a raw image from one gamut space to another gamut space |
| * in-place. |
| * |
| * \param[in, out] image raw image descriptor |
| * \param[in] src_encoding input gamut space |
| * \param[in] dst_encoding destination gamut space |
| * |
| * \return uhdr_error_info_t #UHDR_CODEC_OK if operation succeeds, uhdr_codec_err_t otherwise. |
| */ |
| uhdr_error_info_t convertYuv(uhdr_raw_image_t* image, uhdr_color_gamut_t src_encoding, |
| uhdr_color_gamut_t dst_encoding); |
| |
| /* |
| * This method will check the validity of the input arguments. |
| * |
| * @param p010_image_ptr uncompressed HDR image in P010 color format |
| * @param yuv420_image_ptr pointer to uncompressed SDR image struct. HDR image is expected to |
| * be in 420p color format |
| * @param hdr_tf transfer function of the HDR image |
| * @param dest destination of the compressed JPEGR image. Please note that {@code maxLength} |
| * represents the maximum available size of the desitination buffer, and it must be |
| * set before calling this method. If the encoded JPEGR size exceeds |
| * {@code maxLength}, this method will return {@code ERROR_JPEGR_BUFFER_TOO_SMALL}. |
| * @return NO_ERROR if the input args are valid, error code is not valid. |
| */ |
| status_t areInputArgumentsValid(jr_uncompressed_ptr p010_image_ptr, |
| jr_uncompressed_ptr yuv420_image_ptr, |
| ultrahdr_transfer_function hdr_tf, jr_compressed_ptr dest_ptr); |
| |
| /* |
| * This method will check the validity of the input arguments. |
| * |
| * @param p010_image_ptr uncompressed HDR image in P010 color format |
| * @param yuv420_image_ptr pointer to uncompressed SDR image struct. HDR image is expected to |
| * be in 420p color format |
| * @param hdr_tf transfer function of the HDR image |
| * @param dest destination of the compressed JPEGR image. Please note that {@code maxLength} |
| * represents the maximum available size of the destination buffer, and it must be |
| * set before calling this method. If the encoded JPEGR size exceeds |
| * {@code maxLength}, this method will return {@code ERROR_JPEGR_BUFFER_TOO_SMALL}. |
| * @param quality target quality of the JPEG encoding, must be in range of 0-100 where 100 is |
| * the highest quality |
| * @return NO_ERROR if the input args are valid, error code is not valid. |
| */ |
| status_t areInputArgumentsValid(jr_uncompressed_ptr p010_image_ptr, |
| jr_uncompressed_ptr yuv420_image_ptr, |
| ultrahdr_transfer_function hdr_tf, jr_compressed_ptr dest, |
| int quality); |
| |
| // Configurations |
| void* mUhdrGLESCtxt; // opengl es context |
| int mMapDimensionScaleFactor; // gain map scale factor |
| int mMapCompressQuality; // gain map quality factor |
| bool mUseMultiChannelGainMap; // enable multichannel gain map |
| float mGamma; // gain map gamma parameter |
| uhdr_enc_preset_t mEncPreset; // encoding speed preset |
| float mMinContentBoost; // min content boost recommendation |
| float mMaxContentBoost; // max content boost recommendation |
| float mTargetDispPeakBrightness; // target display max luminance in nits |
| }; |
| |
| /* |
| * Holds tonemapping results of a pixel |
| */ |
| struct GlobalTonemapOutputs { |
| std::array<float, 3> rgb_out; |
| float y_hdr; |
| float y_sdr; |
| }; |
| |
| /*!\brief Applies a global tone mapping, based on Chrome's HLG/PQ rendering implemented at |
| * https://source.chromium.org/chromium/chromium/src/+/main:ui/gfx/color_transform.cc;l=1197-1252;drc=ac505aff1d29ec3bfcf317cb77d5e196a3664e92 |
| * |
| * \param[in] rgb_in hdr intent pixel in array format. |
| * \param[in] headroom ratio between hdr and sdr peak luminances. Must be greater |
| * than 1. If the input is normalized, then this is used to |
| * stretch it linearly from [0.0..1.0] to [0.0..headroom] |
| * \param[in] is_normalized marker to differentiate, if the input is normalized. |
| * |
| * \return tonemapped pixel in the normalized range [0.0..1.0] |
| */ |
| GlobalTonemapOutputs globalTonemap(const std::array<float, 3>& rgb_in, float headroom, |
| bool is_normalized); |
| |
| } // namespace ultrahdr |
| |
| #endif // ULTRAHDR_JPEGR_H |