xref: /aosp_15_r20/external/libultrahdr/lib/include/ultrahdr/ultrahdrcommon.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_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