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_ULTRAHDRCOMMON_H 18*89a0ef05SAndroid Build Coastguard Worker #define ULTRAHDR_ULTRAHDRCOMMON_H 19*89a0ef05SAndroid Build Coastguard Worker 20*89a0ef05SAndroid Build Coastguard Worker //#define LOG_NDEBUG 0 21*89a0ef05SAndroid Build Coastguard Worker 22*89a0ef05SAndroid Build Coastguard Worker #ifdef UHDR_ENABLE_GLES 23*89a0ef05SAndroid Build Coastguard Worker #include <EGL/egl.h> 24*89a0ef05SAndroid Build Coastguard Worker #include <GLES3/gl3.h> 25*89a0ef05SAndroid Build Coastguard Worker #endif 26*89a0ef05SAndroid Build Coastguard Worker 27*89a0ef05SAndroid Build Coastguard Worker #include <deque> 28*89a0ef05SAndroid Build Coastguard Worker #include <map> 29*89a0ef05SAndroid Build Coastguard Worker #include <memory> 30*89a0ef05SAndroid Build Coastguard Worker #include <string> 31*89a0ef05SAndroid Build Coastguard Worker #include <vector> 32*89a0ef05SAndroid Build Coastguard Worker 33*89a0ef05SAndroid Build Coastguard Worker #include "ultrahdr_api.h" 34*89a0ef05SAndroid Build Coastguard Worker 35*89a0ef05SAndroid Build Coastguard Worker // =============================================================================================== 36*89a0ef05SAndroid Build Coastguard Worker // Function Macros 37*89a0ef05SAndroid Build Coastguard Worker // =============================================================================================== 38*89a0ef05SAndroid Build Coastguard Worker 39*89a0ef05SAndroid Build Coastguard Worker #ifdef __ANDROID__ 40*89a0ef05SAndroid Build Coastguard Worker 41*89a0ef05SAndroid Build Coastguard Worker #ifdef LOG_NDEBUG 42*89a0ef05SAndroid Build Coastguard Worker #include "android/log.h" 43*89a0ef05SAndroid Build Coastguard Worker 44*89a0ef05SAndroid Build Coastguard Worker #ifndef LOG_TAG 45*89a0ef05SAndroid Build Coastguard Worker #define LOG_TAG "UHDR" 46*89a0ef05SAndroid Build Coastguard Worker #endif 47*89a0ef05SAndroid Build Coastguard Worker 48*89a0ef05SAndroid Build Coastguard Worker #ifndef ALOGD 49*89a0ef05SAndroid Build Coastguard Worker #define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) 50*89a0ef05SAndroid Build Coastguard Worker #endif 51*89a0ef05SAndroid Build Coastguard Worker 52*89a0ef05SAndroid Build Coastguard Worker #ifndef ALOGE 53*89a0ef05SAndroid Build Coastguard Worker #define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) 54*89a0ef05SAndroid Build Coastguard Worker #endif 55*89a0ef05SAndroid Build Coastguard Worker 56*89a0ef05SAndroid Build Coastguard Worker #ifndef ALOGI 57*89a0ef05SAndroid Build Coastguard Worker #define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) 58*89a0ef05SAndroid Build Coastguard Worker #endif 59*89a0ef05SAndroid Build Coastguard Worker 60*89a0ef05SAndroid Build Coastguard Worker #ifndef ALOGV 61*89a0ef05SAndroid Build Coastguard Worker #define ALOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__) 62*89a0ef05SAndroid Build Coastguard Worker #endif 63*89a0ef05SAndroid Build Coastguard Worker 64*89a0ef05SAndroid Build Coastguard Worker #ifndef ALOGW 65*89a0ef05SAndroid Build Coastguard Worker #define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__) 66*89a0ef05SAndroid Build Coastguard Worker #endif 67*89a0ef05SAndroid Build Coastguard Worker 68*89a0ef05SAndroid Build Coastguard Worker #else 69*89a0ef05SAndroid Build Coastguard Worker 70*89a0ef05SAndroid Build Coastguard Worker #define ALOGD(...) ((void)0) 71*89a0ef05SAndroid Build Coastguard Worker #define ALOGE(...) ((void)0) 72*89a0ef05SAndroid Build Coastguard Worker #define ALOGI(...) ((void)0) 73*89a0ef05SAndroid Build Coastguard Worker #define ALOGV(...) ((void)0) 74*89a0ef05SAndroid Build Coastguard Worker #define ALOGW(...) ((void)0) 75*89a0ef05SAndroid Build Coastguard Worker 76*89a0ef05SAndroid Build Coastguard Worker #endif 77*89a0ef05SAndroid Build Coastguard Worker 78*89a0ef05SAndroid Build Coastguard Worker #else 79*89a0ef05SAndroid Build Coastguard Worker 80*89a0ef05SAndroid Build Coastguard Worker #ifdef LOG_NDEBUG 81*89a0ef05SAndroid Build Coastguard Worker #include <cstdio> 82*89a0ef05SAndroid Build Coastguard Worker 83*89a0ef05SAndroid Build Coastguard Worker #define ALOGD(...) \ 84*89a0ef05SAndroid Build Coastguard Worker do { \ 85*89a0ef05SAndroid Build Coastguard Worker fprintf(stderr, __VA_ARGS__); \ 86*89a0ef05SAndroid Build Coastguard Worker fprintf(stderr, "\n"); \ 87*89a0ef05SAndroid Build Coastguard Worker } while (0) 88*89a0ef05SAndroid Build Coastguard Worker 89*89a0ef05SAndroid Build Coastguard Worker #define ALOGE(...) \ 90*89a0ef05SAndroid Build Coastguard Worker do { \ 91*89a0ef05SAndroid Build Coastguard Worker fprintf(stderr, __VA_ARGS__); \ 92*89a0ef05SAndroid Build Coastguard Worker fprintf(stderr, "\n"); \ 93*89a0ef05SAndroid Build Coastguard Worker } while (0) 94*89a0ef05SAndroid Build Coastguard Worker 95*89a0ef05SAndroid Build Coastguard Worker #define ALOGI(...) \ 96*89a0ef05SAndroid Build Coastguard Worker do { \ 97*89a0ef05SAndroid Build Coastguard Worker fprintf(stdout, __VA_ARGS__); \ 98*89a0ef05SAndroid Build Coastguard Worker fprintf(stdout, "\n"); \ 99*89a0ef05SAndroid Build Coastguard Worker } while (0) 100*89a0ef05SAndroid Build Coastguard Worker 101*89a0ef05SAndroid Build Coastguard Worker #define ALOGV(...) \ 102*89a0ef05SAndroid Build Coastguard Worker do { \ 103*89a0ef05SAndroid Build Coastguard Worker fprintf(stdout, __VA_ARGS__); \ 104*89a0ef05SAndroid Build Coastguard Worker fprintf(stdout, "\n"); \ 105*89a0ef05SAndroid Build Coastguard Worker } while (0) 106*89a0ef05SAndroid Build Coastguard Worker 107*89a0ef05SAndroid Build Coastguard Worker #define ALOGW(...) \ 108*89a0ef05SAndroid Build Coastguard Worker do { \ 109*89a0ef05SAndroid Build Coastguard Worker fprintf(stderr, __VA_ARGS__); \ 110*89a0ef05SAndroid Build Coastguard Worker fprintf(stderr, "\n"); \ 111*89a0ef05SAndroid Build Coastguard Worker } while (0) 112*89a0ef05SAndroid Build Coastguard Worker 113*89a0ef05SAndroid Build Coastguard Worker #else 114*89a0ef05SAndroid Build Coastguard Worker 115*89a0ef05SAndroid Build Coastguard Worker #define ALOGD(...) ((void)0) 116*89a0ef05SAndroid Build Coastguard Worker #define ALOGE(...) ((void)0) 117*89a0ef05SAndroid Build Coastguard Worker #define ALOGI(...) ((void)0) 118*89a0ef05SAndroid Build Coastguard Worker #define ALOGV(...) ((void)0) 119*89a0ef05SAndroid Build Coastguard Worker #define ALOGW(...) ((void)0) 120*89a0ef05SAndroid Build Coastguard Worker 121*89a0ef05SAndroid Build Coastguard Worker #endif 122*89a0ef05SAndroid Build Coastguard Worker 123*89a0ef05SAndroid Build Coastguard Worker #endif 124*89a0ef05SAndroid Build Coastguard Worker 125*89a0ef05SAndroid Build Coastguard Worker #define ALIGNM(x, m) ((((x) + ((m)-1)) / (m)) * (m)) 126*89a0ef05SAndroid Build Coastguard Worker 127*89a0ef05SAndroid Build Coastguard Worker #define UHDR_ERR_CHECK(x) \ 128*89a0ef05SAndroid Build Coastguard Worker { \ 129*89a0ef05SAndroid Build Coastguard Worker uhdr_error_info_t status = (x); \ 130*89a0ef05SAndroid Build Coastguard Worker if (status.error_code != UHDR_CODEC_OK) { \ 131*89a0ef05SAndroid Build Coastguard Worker return status; \ 132*89a0ef05SAndroid Build Coastguard Worker } \ 133*89a0ef05SAndroid Build Coastguard Worker } 134*89a0ef05SAndroid Build Coastguard Worker 135*89a0ef05SAndroid Build Coastguard Worker #if defined(_MSC_VER) 136*89a0ef05SAndroid Build Coastguard Worker #define FORCE_INLINE __forceinline 137*89a0ef05SAndroid Build Coastguard Worker #define INLINE __inline 138*89a0ef05SAndroid Build Coastguard Worker #else 139*89a0ef05SAndroid Build Coastguard Worker #define FORCE_INLINE __inline__ __attribute__((always_inline)) 140*89a0ef05SAndroid Build Coastguard Worker #define INLINE inline 141*89a0ef05SAndroid Build Coastguard Worker #endif 142*89a0ef05SAndroid Build Coastguard Worker 143*89a0ef05SAndroid Build Coastguard Worker // '__has_attribute' macro was introduced by clang. later picked up by gcc. 144*89a0ef05SAndroid Build Coastguard Worker // If not supported by the current toolchain, define it to zero. 145*89a0ef05SAndroid Build Coastguard Worker #ifndef __has_attribute 146*89a0ef05SAndroid Build Coastguard Worker #define __has_attribute(x) 0 147*89a0ef05SAndroid Build Coastguard Worker #endif 148*89a0ef05SAndroid Build Coastguard Worker 149*89a0ef05SAndroid Build Coastguard Worker // Disables undefined behavior analysis for a function. 150*89a0ef05SAndroid Build Coastguard Worker // GCC 4.9+ uses __attribute__((no_sanitize_undefined)) 151*89a0ef05SAndroid Build Coastguard Worker // clang uses __attribute__((no_sanitize("undefined"))) 152*89a0ef05SAndroid Build Coastguard Worker #if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 409) 153*89a0ef05SAndroid Build Coastguard Worker #define UHDR_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize_undefined)) 154*89a0ef05SAndroid Build Coastguard Worker #elif __has_attribute(no_sanitize) 155*89a0ef05SAndroid Build Coastguard Worker #define UHDR_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize("undefined"))) 156*89a0ef05SAndroid Build Coastguard Worker #else 157*89a0ef05SAndroid Build Coastguard Worker #define UHDR_NO_SANITIZE_UNDEFINED 158*89a0ef05SAndroid Build Coastguard Worker #endif 159*89a0ef05SAndroid Build Coastguard Worker 160*89a0ef05SAndroid Build Coastguard Worker static const uhdr_error_info_t g_no_error = {UHDR_CODEC_OK, 0, ""}; 161*89a0ef05SAndroid Build Coastguard Worker 162*89a0ef05SAndroid Build Coastguard Worker namespace ultrahdr { 163*89a0ef05SAndroid Build Coastguard Worker 164*89a0ef05SAndroid Build Coastguard Worker // =============================================================================================== 165*89a0ef05SAndroid Build Coastguard Worker // Globals 166*89a0ef05SAndroid Build Coastguard Worker // =============================================================================================== 167*89a0ef05SAndroid Build Coastguard Worker extern const int kMinWidth, kMinHeight; 168*89a0ef05SAndroid Build Coastguard Worker extern const int kMaxWidth, kMaxHeight; 169*89a0ef05SAndroid Build Coastguard Worker 170*89a0ef05SAndroid Build Coastguard Worker // =============================================================================================== 171*89a0ef05SAndroid Build Coastguard Worker // Structure Definitions 172*89a0ef05SAndroid Build Coastguard Worker // =============================================================================================== 173*89a0ef05SAndroid Build Coastguard Worker 174*89a0ef05SAndroid Build Coastguard Worker /**\brief uhdr memory block */ 175*89a0ef05SAndroid Build Coastguard Worker typedef struct uhdr_memory_block { 176*89a0ef05SAndroid Build Coastguard Worker uhdr_memory_block(size_t capacity); 177*89a0ef05SAndroid Build Coastguard Worker 178*89a0ef05SAndroid Build Coastguard Worker std::unique_ptr<uint8_t[]> m_buffer; /**< data */ 179*89a0ef05SAndroid Build Coastguard Worker size_t m_capacity; /**< capacity */ 180*89a0ef05SAndroid Build Coastguard Worker } uhdr_memory_block_t; /**< alias for struct uhdr_memory_block */ 181*89a0ef05SAndroid Build Coastguard Worker 182*89a0ef05SAndroid Build Coastguard Worker /**\brief extended raw image descriptor */ 183*89a0ef05SAndroid Build Coastguard Worker typedef struct uhdr_raw_image_ext : uhdr_raw_image_t { 184*89a0ef05SAndroid Build Coastguard Worker uhdr_raw_image_ext(uhdr_img_fmt_t fmt, uhdr_color_gamut_t cg, uhdr_color_transfer_t ct, 185*89a0ef05SAndroid Build Coastguard Worker uhdr_color_range_t range, unsigned w, unsigned h, unsigned align_stride_to); 186*89a0ef05SAndroid Build Coastguard Worker 187*89a0ef05SAndroid Build Coastguard Worker private: 188*89a0ef05SAndroid Build Coastguard Worker std::unique_ptr<ultrahdr::uhdr_memory_block> m_block; 189*89a0ef05SAndroid Build Coastguard Worker } uhdr_raw_image_ext_t; /**< alias for struct uhdr_raw_image_ext */ 190*89a0ef05SAndroid Build Coastguard Worker 191*89a0ef05SAndroid Build Coastguard Worker /**\brief extended compressed image descriptor */ 192*89a0ef05SAndroid Build Coastguard Worker typedef struct uhdr_compressed_image_ext : uhdr_compressed_image_t { 193*89a0ef05SAndroid Build Coastguard Worker uhdr_compressed_image_ext(uhdr_color_gamut_t cg, uhdr_color_transfer_t ct, 194*89a0ef05SAndroid Build Coastguard Worker uhdr_color_range_t range, size_t sz); 195*89a0ef05SAndroid Build Coastguard Worker 196*89a0ef05SAndroid Build Coastguard Worker private: 197*89a0ef05SAndroid Build Coastguard Worker std::unique_ptr<ultrahdr::uhdr_memory_block> m_block; 198*89a0ef05SAndroid Build Coastguard Worker } uhdr_compressed_image_ext_t; /**< alias for struct uhdr_compressed_image_ext */ 199*89a0ef05SAndroid Build Coastguard Worker 200*89a0ef05SAndroid Build Coastguard Worker /*!\brief forward declaration for image effect descriptor */ 201*89a0ef05SAndroid Build Coastguard Worker typedef struct uhdr_effect_desc uhdr_effect_desc_t; 202*89a0ef05SAndroid Build Coastguard Worker 203*89a0ef05SAndroid Build Coastguard Worker /**\brief Gain map metadata. */ 204*89a0ef05SAndroid Build Coastguard Worker typedef struct uhdr_gainmap_metadata_ext : uhdr_gainmap_metadata { uhdr_gainmap_metadata_extuhdr_gainmap_metadata_ext205*89a0ef05SAndroid Build Coastguard Worker uhdr_gainmap_metadata_ext() {} 206*89a0ef05SAndroid Build Coastguard Worker uhdr_gainmap_metadata_extuhdr_gainmap_metadata_ext207*89a0ef05SAndroid Build Coastguard Worker uhdr_gainmap_metadata_ext(std::string ver) { version = ver; } 208*89a0ef05SAndroid Build Coastguard Worker uhdr_gainmap_metadata_extuhdr_gainmap_metadata_ext209*89a0ef05SAndroid Build Coastguard Worker uhdr_gainmap_metadata_ext(uhdr_gainmap_metadata& metadata, std::string ver) { 210*89a0ef05SAndroid Build Coastguard Worker max_content_boost = metadata.max_content_boost; 211*89a0ef05SAndroid Build Coastguard Worker min_content_boost = metadata.min_content_boost; 212*89a0ef05SAndroid Build Coastguard Worker gamma = metadata.gamma; 213*89a0ef05SAndroid Build Coastguard Worker offset_sdr = metadata.offset_sdr; 214*89a0ef05SAndroid Build Coastguard Worker offset_hdr = metadata.offset_hdr; 215*89a0ef05SAndroid Build Coastguard Worker hdr_capacity_min = metadata.hdr_capacity_min; 216*89a0ef05SAndroid Build Coastguard Worker hdr_capacity_max = metadata.hdr_capacity_max; 217*89a0ef05SAndroid Build Coastguard Worker version = ver; 218*89a0ef05SAndroid Build Coastguard Worker } 219*89a0ef05SAndroid Build Coastguard Worker 220*89a0ef05SAndroid Build Coastguard Worker std::string version; /**< Ultra HDR format version */ 221*89a0ef05SAndroid Build Coastguard Worker } uhdr_gainmap_metadata_ext_t; /**< alias for struct uhdr_gainmap_metadata */ 222*89a0ef05SAndroid Build Coastguard Worker 223*89a0ef05SAndroid Build Coastguard Worker #ifdef UHDR_ENABLE_GLES 224*89a0ef05SAndroid Build Coastguard Worker 225*89a0ef05SAndroid Build Coastguard Worker typedef enum uhdr_effect_shader { 226*89a0ef05SAndroid Build Coastguard Worker UHDR_MIR_HORZ, 227*89a0ef05SAndroid Build Coastguard Worker UHDR_MIR_VERT, 228*89a0ef05SAndroid Build Coastguard Worker UHDR_ROT_90, 229*89a0ef05SAndroid Build Coastguard Worker UHDR_ROT_180, 230*89a0ef05SAndroid Build Coastguard Worker UHDR_ROT_270, 231*89a0ef05SAndroid Build Coastguard Worker UHDR_CROP, 232*89a0ef05SAndroid Build Coastguard Worker UHDR_RESIZE, 233*89a0ef05SAndroid Build Coastguard Worker } uhdr_effect_shader_t; 234*89a0ef05SAndroid Build Coastguard Worker 235*89a0ef05SAndroid Build Coastguard Worker /**\brief OpenGL context */ 236*89a0ef05SAndroid Build Coastguard Worker typedef struct uhdr_opengl_ctxt { 237*89a0ef05SAndroid Build Coastguard Worker // EGL Context 238*89a0ef05SAndroid Build Coastguard Worker EGLDisplay mEGLDisplay; /**< EGL display connection */ 239*89a0ef05SAndroid Build Coastguard Worker EGLContext mEGLContext; /**< EGL rendering context */ 240*89a0ef05SAndroid Build Coastguard Worker EGLSurface mEGLSurface; /**< EGL surface for rendering */ 241*89a0ef05SAndroid Build Coastguard Worker EGLConfig mEGLConfig; /**< EGL frame buffer configuration */ 242*89a0ef05SAndroid Build Coastguard Worker 243*89a0ef05SAndroid Build Coastguard Worker // GLES Context 244*89a0ef05SAndroid Build Coastguard Worker GLuint mQuadVAO, mQuadVBO, mQuadEBO; /**< GL objects */ 245*89a0ef05SAndroid Build Coastguard Worker GLuint mShaderProgram[UHDR_RESIZE + 1]; /**< Shader programs */ 246*89a0ef05SAndroid Build Coastguard Worker GLuint mDecodedImgTexture, mGainmapImgTexture; /**< GL Textures */ 247*89a0ef05SAndroid Build Coastguard Worker uhdr_error_info_t mErrorStatus; /**< Context status */ 248*89a0ef05SAndroid Build Coastguard Worker 249*89a0ef05SAndroid Build Coastguard Worker uhdr_opengl_ctxt(); 250*89a0ef05SAndroid Build Coastguard Worker ~uhdr_opengl_ctxt(); 251*89a0ef05SAndroid Build Coastguard Worker 252*89a0ef05SAndroid Build Coastguard Worker /*!\brief Initializes the OpenGL context. Mainly it prepares EGL. We want a GLES3.0 context and a 253*89a0ef05SAndroid Build Coastguard Worker * surface that supports pbuffer. Once this is done and surface is made current, the gl state is 254*89a0ef05SAndroid Build Coastguard Worker * initialized 255*89a0ef05SAndroid Build Coastguard Worker * 256*89a0ef05SAndroid Build Coastguard Worker * \return none 257*89a0ef05SAndroid Build Coastguard Worker */ 258*89a0ef05SAndroid Build Coastguard Worker void init_opengl_ctxt(); 259*89a0ef05SAndroid Build Coastguard Worker 260*89a0ef05SAndroid Build Coastguard Worker /*!\brief This method is used to compile a shader 261*89a0ef05SAndroid Build Coastguard Worker * 262*89a0ef05SAndroid Build Coastguard Worker * \param[in] type shader type 263*89a0ef05SAndroid Build Coastguard Worker * \param[in] source shader source code 264*89a0ef05SAndroid Build Coastguard Worker * 265*89a0ef05SAndroid Build Coastguard Worker * \return GLuint #shader_id if operation succeeds, 0 otherwise. 266*89a0ef05SAndroid Build Coastguard Worker */ 267*89a0ef05SAndroid Build Coastguard Worker GLuint compile_shader(GLenum type, const char* source); 268*89a0ef05SAndroid Build Coastguard Worker 269*89a0ef05SAndroid Build Coastguard Worker /*!\brief This method is used to create a shader program 270*89a0ef05SAndroid Build Coastguard Worker * 271*89a0ef05SAndroid Build Coastguard Worker * \param[in] vertex_source vertex shader source code 272*89a0ef05SAndroid Build Coastguard Worker * \param[in] fragment_source fragment shader source code 273*89a0ef05SAndroid Build Coastguard Worker * 274*89a0ef05SAndroid Build Coastguard Worker * \return GLuint #shader_program_id if operation succeeds, 0 otherwise. 275*89a0ef05SAndroid Build Coastguard Worker */ 276*89a0ef05SAndroid Build Coastguard Worker GLuint create_shader_program(const char* vertex_source, const char* fragment_source); 277*89a0ef05SAndroid Build Coastguard Worker 278*89a0ef05SAndroid Build Coastguard Worker /*!\brief This method is used to create a 2D texture for a raw image 279*89a0ef05SAndroid Build Coastguard Worker * NOTE: For multichannel planar image, this method assumes the channel data to be contiguous 280*89a0ef05SAndroid Build Coastguard Worker * NOTE: For any channel, this method assumes width and stride to be identical 281*89a0ef05SAndroid Build Coastguard Worker * 282*89a0ef05SAndroid Build Coastguard Worker * \param[in] fmt image format 283*89a0ef05SAndroid Build Coastguard Worker * \param[in] w image width 284*89a0ef05SAndroid Build Coastguard Worker * \param[in] h image height 285*89a0ef05SAndroid Build Coastguard Worker * \param[in] data image data 286*89a0ef05SAndroid Build Coastguard Worker * 287*89a0ef05SAndroid Build Coastguard Worker * \return GLuint #texture_id if operation succeeds, 0 otherwise. 288*89a0ef05SAndroid Build Coastguard Worker */ 289*89a0ef05SAndroid Build Coastguard Worker GLuint create_texture(uhdr_img_fmt_t fmt, int w, int h, void* data); 290*89a0ef05SAndroid Build Coastguard Worker 291*89a0ef05SAndroid Build Coastguard Worker /*!\breif This method is used to read data from texture into a raw image 292*89a0ef05SAndroid Build Coastguard Worker * NOTE: For any channel, this method assumes width and stride to be identical 293*89a0ef05SAndroid Build Coastguard Worker * 294*89a0ef05SAndroid Build Coastguard Worker * \param[in] texture texture_id 295*89a0ef05SAndroid Build Coastguard Worker * \param[in] fmt image format 296*89a0ef05SAndroid Build Coastguard Worker * \param[in] w image width 297*89a0ef05SAndroid Build Coastguard Worker * \param[in] h image height 298*89a0ef05SAndroid Build Coastguard Worker * \param[in] data image data 299*89a0ef05SAndroid Build Coastguard Worker * 300*89a0ef05SAndroid Build Coastguard Worker * \return none 301*89a0ef05SAndroid Build Coastguard Worker */ 302*89a0ef05SAndroid Build Coastguard Worker void read_texture(GLuint* texture, uhdr_img_fmt_t fmt, int w, int h, void* data); 303*89a0ef05SAndroid Build Coastguard Worker 304*89a0ef05SAndroid Build Coastguard Worker /*!\brief This method is used to set up quad buffers and arrays 305*89a0ef05SAndroid Build Coastguard Worker * 306*89a0ef05SAndroid Build Coastguard Worker * \return none 307*89a0ef05SAndroid Build Coastguard Worker */ 308*89a0ef05SAndroid Build Coastguard Worker void setup_quad(); 309*89a0ef05SAndroid Build Coastguard Worker 310*89a0ef05SAndroid Build Coastguard Worker /*!\brief This method is used to set up frame buffer for a 2D texture 311*89a0ef05SAndroid Build Coastguard Worker * 312*89a0ef05SAndroid Build Coastguard Worker * \param[in] texture texture id 313*89a0ef05SAndroid Build Coastguard Worker * 314*89a0ef05SAndroid Build Coastguard Worker * \return GLuint #framebuffer_id if operation succeeds, 0 otherwise. 315*89a0ef05SAndroid Build Coastguard Worker */ 316*89a0ef05SAndroid Build Coastguard Worker GLuint setup_framebuffer(GLuint& texture); 317*89a0ef05SAndroid Build Coastguard Worker 318*89a0ef05SAndroid Build Coastguard Worker /*!\brief Checks for gl errors. On error, internal error state is updated with details 319*89a0ef05SAndroid Build Coastguard Worker * 320*89a0ef05SAndroid Build Coastguard Worker * \param[in] msg useful description for logging 321*89a0ef05SAndroid Build Coastguard Worker * 322*89a0ef05SAndroid Build Coastguard Worker * \return none 323*89a0ef05SAndroid Build Coastguard Worker */ 324*89a0ef05SAndroid Build Coastguard Worker void check_gl_errors(const char* msg); 325*89a0ef05SAndroid Build Coastguard Worker 326*89a0ef05SAndroid Build Coastguard Worker /*!\brief Reset the current context to default state for reuse 327*89a0ef05SAndroid Build Coastguard Worker * 328*89a0ef05SAndroid Build Coastguard Worker * \return none 329*89a0ef05SAndroid Build Coastguard Worker */ 330*89a0ef05SAndroid Build Coastguard Worker void reset_opengl_ctxt(); 331*89a0ef05SAndroid Build Coastguard Worker 332*89a0ef05SAndroid Build Coastguard Worker /*!\brief Deletes the current context 333*89a0ef05SAndroid Build Coastguard Worker * 334*89a0ef05SAndroid Build Coastguard Worker * \return none 335*89a0ef05SAndroid Build Coastguard Worker */ 336*89a0ef05SAndroid Build Coastguard Worker void delete_opengl_ctxt(); 337*89a0ef05SAndroid Build Coastguard Worker 338*89a0ef05SAndroid Build Coastguard Worker } uhdr_opengl_ctxt_t; /**< alias for struct uhdr_opengl_ctxt */ 339*89a0ef05SAndroid Build Coastguard Worker 340*89a0ef05SAndroid Build Coastguard Worker bool isBufferDataContiguous(uhdr_raw_image_t* img); 341*89a0ef05SAndroid Build Coastguard Worker 342*89a0ef05SAndroid Build Coastguard Worker #endif 343*89a0ef05SAndroid Build Coastguard Worker 344*89a0ef05SAndroid Build Coastguard Worker uhdr_error_info_t uhdr_validate_gainmap_metadata_descriptor(uhdr_gainmap_metadata_t* metadata); 345*89a0ef05SAndroid Build Coastguard Worker 346*89a0ef05SAndroid Build Coastguard Worker } // namespace ultrahdr 347*89a0ef05SAndroid Build Coastguard Worker 348*89a0ef05SAndroid Build Coastguard Worker // =============================================================================================== 349*89a0ef05SAndroid Build Coastguard Worker // Extensions of ultrahdr api definitions, so outside ultrahdr namespace 350*89a0ef05SAndroid Build Coastguard Worker // =============================================================================================== 351*89a0ef05SAndroid Build Coastguard Worker 352*89a0ef05SAndroid Build Coastguard Worker struct uhdr_codec_private { 353*89a0ef05SAndroid Build Coastguard Worker std::deque<ultrahdr::uhdr_effect_desc_t*> m_effects; 354*89a0ef05SAndroid Build Coastguard Worker #ifdef UHDR_ENABLE_GLES 355*89a0ef05SAndroid Build Coastguard Worker ultrahdr::uhdr_opengl_ctxt_t m_uhdr_gl_ctxt; 356*89a0ef05SAndroid Build Coastguard Worker bool m_enable_gles; 357*89a0ef05SAndroid Build Coastguard Worker #endif 358*89a0ef05SAndroid Build Coastguard Worker bool m_sailed; 359*89a0ef05SAndroid Build Coastguard Worker 360*89a0ef05SAndroid Build Coastguard Worker virtual ~uhdr_codec_private(); 361*89a0ef05SAndroid Build Coastguard Worker }; 362*89a0ef05SAndroid Build Coastguard Worker 363*89a0ef05SAndroid Build Coastguard Worker struct uhdr_encoder_private : uhdr_codec_private { 364*89a0ef05SAndroid Build Coastguard Worker // config data 365*89a0ef05SAndroid Build Coastguard Worker std::map<uhdr_img_label, std::unique_ptr<ultrahdr::uhdr_raw_image_ext_t>> m_raw_images; 366*89a0ef05SAndroid Build Coastguard Worker std::map<uhdr_img_label, std::unique_ptr<ultrahdr::uhdr_compressed_image_ext_t>> 367*89a0ef05SAndroid Build Coastguard Worker m_compressed_images; 368*89a0ef05SAndroid Build Coastguard Worker std::map<uhdr_img_label, int> m_quality; 369*89a0ef05SAndroid Build Coastguard Worker std::vector<uint8_t> m_exif; 370*89a0ef05SAndroid Build Coastguard Worker uhdr_gainmap_metadata_t m_metadata; 371*89a0ef05SAndroid Build Coastguard Worker uhdr_codec_t m_output_format; 372*89a0ef05SAndroid Build Coastguard Worker int m_gainmap_scale_factor; 373*89a0ef05SAndroid Build Coastguard Worker bool m_use_multi_channel_gainmap; 374*89a0ef05SAndroid Build Coastguard Worker float m_gamma; 375*89a0ef05SAndroid Build Coastguard Worker uhdr_enc_preset_t m_enc_preset; 376*89a0ef05SAndroid Build Coastguard Worker float m_min_content_boost; 377*89a0ef05SAndroid Build Coastguard Worker float m_max_content_boost; 378*89a0ef05SAndroid Build Coastguard Worker float m_target_disp_max_brightness; 379*89a0ef05SAndroid Build Coastguard Worker 380*89a0ef05SAndroid Build Coastguard Worker // internal data 381*89a0ef05SAndroid Build Coastguard Worker std::unique_ptr<ultrahdr::uhdr_compressed_image_ext_t> m_compressed_output_buffer; 382*89a0ef05SAndroid Build Coastguard Worker uhdr_error_info_t m_encode_call_status; 383*89a0ef05SAndroid Build Coastguard Worker }; 384*89a0ef05SAndroid Build Coastguard Worker 385*89a0ef05SAndroid Build Coastguard Worker struct uhdr_decoder_private : uhdr_codec_private { 386*89a0ef05SAndroid Build Coastguard Worker // config data 387*89a0ef05SAndroid Build Coastguard Worker std::unique_ptr<ultrahdr::uhdr_compressed_image_ext_t> m_uhdr_compressed_img; 388*89a0ef05SAndroid Build Coastguard Worker uhdr_img_fmt_t m_output_fmt; 389*89a0ef05SAndroid Build Coastguard Worker uhdr_color_transfer_t m_output_ct; 390*89a0ef05SAndroid Build Coastguard Worker float m_output_max_disp_boost; 391*89a0ef05SAndroid Build Coastguard Worker 392*89a0ef05SAndroid Build Coastguard Worker // internal data 393*89a0ef05SAndroid Build Coastguard Worker bool m_probed; 394*89a0ef05SAndroid Build Coastguard Worker std::unique_ptr<ultrahdr::uhdr_raw_image_ext_t> m_decoded_img_buffer; 395*89a0ef05SAndroid Build Coastguard Worker std::unique_ptr<ultrahdr::uhdr_raw_image_ext_t> m_gainmap_img_buffer; 396*89a0ef05SAndroid Build Coastguard Worker int m_img_wd, m_img_ht; 397*89a0ef05SAndroid Build Coastguard Worker int m_gainmap_wd, m_gainmap_ht, m_gainmap_num_comp; 398*89a0ef05SAndroid Build Coastguard Worker std::vector<uint8_t> m_exif; 399*89a0ef05SAndroid Build Coastguard Worker uhdr_mem_block_t m_exif_block; 400*89a0ef05SAndroid Build Coastguard Worker std::vector<uint8_t> m_icc; 401*89a0ef05SAndroid Build Coastguard Worker uhdr_mem_block_t m_icc_block; 402*89a0ef05SAndroid Build Coastguard Worker std::vector<uint8_t> m_base_img; 403*89a0ef05SAndroid Build Coastguard Worker uhdr_mem_block_t m_base_img_block; 404*89a0ef05SAndroid Build Coastguard Worker std::vector<uint8_t> m_gainmap_img; 405*89a0ef05SAndroid Build Coastguard Worker uhdr_mem_block_t m_gainmap_img_block; 406*89a0ef05SAndroid Build Coastguard Worker uhdr_gainmap_metadata_t m_metadata; 407*89a0ef05SAndroid Build Coastguard Worker uhdr_error_info_t m_probe_call_status; 408*89a0ef05SAndroid Build Coastguard Worker uhdr_error_info_t m_decode_call_status; 409*89a0ef05SAndroid Build Coastguard Worker }; 410*89a0ef05SAndroid Build Coastguard Worker 411*89a0ef05SAndroid Build Coastguard Worker #endif // ULTRAHDR_ULTRAHDRCOMMON_H 412