| 1 | /* |
| 2 | * Copyright (c) 2018 Mohammad Izadi <moh.izadi at gmail.com> |
| 3 | * |
| 4 | * This file is part of FFmpeg. |
| 5 | * |
| 6 | * FFmpeg is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU Lesser General Public |
| 8 | * License as published by the Free Software Foundation; either |
| 9 | * version 2.1 of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * FFmpeg is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 | * Lesser General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU Lesser General Public |
| 17 | * License along with FFmpeg; if not, write to the Free Software |
| 18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 19 | */ |
| 20 | |
| 21 | #ifndef AVUTIL_HDR_DYNAMIC_METADATA_H |
| 22 | #define AVUTIL_HDR_DYNAMIC_METADATA_H |
| 23 | |
| 24 | #include "frame.h" |
| 25 | #include "rational.h" |
| 26 | |
| 27 | /** |
| 28 | * Option for overlapping elliptical pixel selectors in an image. |
| 29 | */ |
| 30 | enum AVHDRPlusOverlapProcessOption { |
| 31 | AV_HDR_PLUS_OVERLAP_PROCESS_WEIGHTED_AVERAGING = 0, |
| 32 | AV_HDR_PLUS_OVERLAP_PROCESS_LAYERING = 1, |
| 33 | }; |
| 34 | |
| 35 | /** |
| 36 | * Represents the percentile at a specific percentage in |
| 37 | * a distribution. |
| 38 | */ |
| 39 | typedef struct AVHDRPlusPercentile { |
| 40 | /** |
| 41 | * The percentage value corresponding to a specific percentile linearized |
| 42 | * RGB value in the processing window in the scene. The value shall be in |
| 43 | * the range of 0 to100, inclusive. |
| 44 | */ |
| 45 | uint8_t percentage; |
| 46 | |
| 47 | /** |
| 48 | * The linearized maxRGB value at a specific percentile in the processing |
| 49 | * window in the scene. The value shall be in the range of 0 to 1, inclusive |
| 50 | * and in multiples of 0.00001. |
| 51 | */ |
| 52 | AVRational percentile; |
| 53 | } AVHDRPlusPercentile; |
| 54 | |
| 55 | /** |
| 56 | * Color transform parameters at a processing window in a dynamic metadata for |
| 57 | * SMPTE 2094-40. |
| 58 | */ |
| 59 | typedef struct AVHDRPlusColorTransformParams { |
| 60 | /** |
| 61 | * The relative x coordinate of the top left pixel of the processing |
| 62 | * window. The value shall be in the range of 0 and 1, inclusive and |
| 63 | * in multiples of 1/(width of Picture - 1). The value 1 corresponds |
| 64 | * to the absolute coordinate of width of Picture - 1. The value for |
| 65 | * first processing window shall be 0. |
| 66 | */ |
| 67 | AVRational window_upper_left_corner_x; |
| 68 | |
| 69 | /** |
| 70 | * The relative y coordinate of the top left pixel of the processing |
| 71 | * window. The value shall be in the range of 0 and 1, inclusive and |
| 72 | * in multiples of 1/(height of Picture - 1). The value 1 corresponds |
| 73 | * to the absolute coordinate of height of Picture - 1. The value for |
| 74 | * first processing window shall be 0. |
| 75 | */ |
| 76 | AVRational window_upper_left_corner_y; |
| 77 | |
| 78 | /** |
| 79 | * The relative x coordinate of the bottom right pixel of the processing |
| 80 | * window. The value shall be in the range of 0 and 1, inclusive and |
| 81 | * in multiples of 1/(width of Picture - 1). The value 1 corresponds |
| 82 | * to the absolute coordinate of width of Picture - 1. The value for |
| 83 | * first processing window shall be 1. |
| 84 | */ |
| 85 | AVRational window_lower_right_corner_x; |
| 86 | |
| 87 | /** |
| 88 | * The relative y coordinate of the bottom right pixel of the processing |
| 89 | * window. The value shall be in the range of 0 and 1, inclusive and |
| 90 | * in multiples of 1/(height of Picture - 1). The value 1 corresponds |
| 91 | * to the absolute coordinate of height of Picture - 1. The value for |
| 92 | * first processing window shall be 1. |
| 93 | */ |
| 94 | AVRational window_lower_right_corner_y; |
| 95 | |
| 96 | /** |
| 97 | * The x coordinate of the center position of the concentric internal and |
| 98 | * external ellipses of the elliptical pixel selector in the processing |
| 99 | * window. The value shall be in the range of 0 to (width of Picture - 1), |
| 100 | * inclusive and in multiples of 1 pixel. |
| 101 | */ |
| 102 | uint16_t center_of_ellipse_x; |
| 103 | |
| 104 | /** |
| 105 | * The y coordinate of the center position of the concentric internal and |
| 106 | * external ellipses of the elliptical pixel selector in the processing |
| 107 | * window. The value shall be in the range of 0 to (height of Picture - 1), |
| 108 | * inclusive and in multiples of 1 pixel. |
| 109 | */ |
| 110 | uint16_t center_of_ellipse_y; |
| 111 | |
| 112 | /** |
| 113 | * The clockwise rotation angle in degree of arc with respect to the |
| 114 | * positive direction of the x-axis of the concentric internal and external |
| 115 | * ellipses of the elliptical pixel selector in the processing window. The |
| 116 | * value shall be in the range of 0 to 180, inclusive and in multiples of 1. |
| 117 | */ |
| 118 | uint8_t rotation_angle; |
| 119 | |
| 120 | /** |
| 121 | * The semi-major axis value of the internal ellipse of the elliptical pixel |
| 122 | * selector in amount of pixels in the processing window. The value shall be |
| 123 | * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. |
| 124 | */ |
| 125 | uint16_t semimajor_axis_internal_ellipse; |
| 126 | |
| 127 | /** |
| 128 | * The semi-major axis value of the external ellipse of the elliptical pixel |
| 129 | * selector in amount of pixels in the processing window. The value |
| 130 | * shall not be less than semimajor_axis_internal_ellipse of the current |
| 131 | * processing window. The value shall be in the range of 1 to 65535, |
| 132 | * inclusive and in multiples of 1 pixel. |
| 133 | */ |
| 134 | uint16_t semimajor_axis_external_ellipse; |
| 135 | |
| 136 | /** |
| 137 | * The semi-minor axis value of the external ellipse of the elliptical pixel |
| 138 | * selector in amount of pixels in the processing window. The value shall be |
| 139 | * in the range of 1 to 65535, inclusive and in multiples of 1 pixel. |
| 140 | */ |
| 141 | uint16_t semiminor_axis_external_ellipse; |
| 142 | |
| 143 | /** |
| 144 | * Overlap process option indicates one of the two methods of combining |
| 145 | * rendered pixels in the processing window in an image with at least one |
| 146 | * elliptical pixel selector. For overlapping elliptical pixel selectors |
| 147 | * in an image, overlap_process_option shall have the same value. |
| 148 | */ |
| 149 | enum AVHDRPlusOverlapProcessOption overlap_process_option; |
| 150 | |
| 151 | /** |
| 152 | * The maximum of the color components of linearized RGB values in the |
| 153 | * processing window in the scene. The values should be in the range of 0 to |
| 154 | * 1, inclusive and in multiples of 0.00001. maxscl[ 0 ], maxscl[ 1 ], and |
| 155 | * maxscl[ 2 ] are corresponding to R, G, B color components respectively. |
| 156 | */ |
| 157 | AVRational maxscl[3]; |
| 158 | |
| 159 | /** |
| 160 | * The average of linearized maxRGB values in the processing window in the |
| 161 | * scene. The value should be in the range of 0 to 1, inclusive and in |
| 162 | * multiples of 0.00001. |
| 163 | */ |
| 164 | AVRational average_maxrgb; |
| 165 | |
| 166 | /** |
| 167 | * The number of linearized maxRGB values at given percentiles in the |
| 168 | * processing window in the scene. The maximum value shall be 15. |
| 169 | */ |
| 170 | uint8_t num_distribution_maxrgb_percentiles; |
| 171 | |
| 172 | /** |
| 173 | * The linearized maxRGB values at given percentiles in the |
| 174 | * processing window in the scene. |
| 175 | */ |
| 176 | AVHDRPlusPercentile distribution_maxrgb[15]; |
| 177 | |
| 178 | /** |
| 179 | * The fraction of selected pixels in the image that contains the brightest |
| 180 | * pixel in the scene. The value shall be in the range of 0 to 1, inclusive |
| 181 | * and in multiples of 0.001. |
| 182 | */ |
| 183 | AVRational fraction_bright_pixels; |
| 184 | |
| 185 | /** |
| 186 | * This flag indicates that the metadata for the tone mapping function in |
| 187 | * the processing window is present (for value of 1). |
| 188 | */ |
| 189 | uint8_t tone_mapping_flag; |
| 190 | |
| 191 | /** |
| 192 | * The x coordinate of the separation point between the linear part and the |
| 193 | * curved part of the tone mapping function. The value shall be in the range |
| 194 | * of 0 to 1, excluding 0 and in multiples of 1/4095. |
| 195 | */ |
| 196 | AVRational knee_point_x; |
| 197 | |
| 198 | /** |
| 199 | * The y coordinate of the separation point between the linear part and the |
| 200 | * curved part of the tone mapping function. The value shall be in the range |
| 201 | * of 0 to 1, excluding 0 and in multiples of 1/4095. |
| 202 | */ |
| 203 | AVRational knee_point_y; |
| 204 | |
| 205 | /** |
| 206 | * The number of the intermediate anchor parameters of the tone mapping |
| 207 | * function in the processing window. The maximum value shall be 15. |
| 208 | */ |
| 209 | uint8_t num_bezier_curve_anchors; |
| 210 | |
| 211 | /** |
| 212 | * The intermediate anchor parameters of the tone mapping function in the |
| 213 | * processing window in the scene. The values should be in the range of 0 |
| 214 | * to 1, inclusive and in multiples of 1/1023. |
| 215 | */ |
| 216 | AVRational bezier_curve_anchors[15]; |
| 217 | |
| 218 | /** |
| 219 | * This flag shall be equal to 0 in bitstreams conforming to this version of |
| 220 | * this Specification. Other values are reserved for future use. |
| 221 | */ |
| 222 | uint8_t color_saturation_mapping_flag; |
| 223 | |
| 224 | /** |
| 225 | * The color saturation gain in the processing window in the scene. The |
| 226 | * value shall be in the range of 0 to 63/8, inclusive and in multiples of |
| 227 | * 1/8. The default value shall be 1. |
| 228 | */ |
| 229 | AVRational color_saturation_weight; |
| 230 | } AVHDRPlusColorTransformParams; |
| 231 | |
| 232 | /** |
| 233 | * This struct represents dynamic metadata for color volume transform - |
| 234 | * application 4 of SMPTE 2094-40:2016 standard. |
| 235 | * |
| 236 | * To be used as payload of a AVFrameSideData or AVPacketSideData with the |
| 237 | * appropriate type. |
| 238 | * |
| 239 | * @note The struct should be allocated with |
| 240 | * av_dynamic_hdr_plus_alloc() and its size is not a part of |
| 241 | * the public ABI. |
| 242 | */ |
| 243 | typedef struct AVDynamicHDRPlus { |
| 244 | /** |
| 245 | * Country code by Rec. ITU-T T.35 Annex A. The value shall be 0xB5. |
| 246 | */ |
| 247 | uint8_t itu_t_t35_country_code; |
| 248 | |
| 249 | /** |
| 250 | * Application version in the application defining document in ST-2094 |
| 251 | * suite. The value shall be set to 0. |
| 252 | */ |
| 253 | uint8_t application_version; |
| 254 | |
| 255 | /** |
| 256 | * The number of processing windows. The value shall be in the range |
| 257 | * of 1 to 3, inclusive. |
| 258 | */ |
| 259 | uint8_t num_windows; |
| 260 | |
| 261 | /** |
| 262 | * The color transform parameters for every processing window. |
| 263 | */ |
| 264 | AVHDRPlusColorTransformParams params[3]; |
| 265 | |
| 266 | /** |
| 267 | * The nominal maximum display luminance of the targeted system display, |
| 268 | * in units of 0.0001 candelas per square metre. The value shall be in |
| 269 | * the range of 0 to 10000, inclusive. |
| 270 | */ |
| 271 | AVRational targeted_system_display_maximum_luminance; |
| 272 | |
| 273 | /** |
| 274 | * This flag shall be equal to 0 in bit streams conforming to this version |
| 275 | * of this Specification. The value 1 is reserved for future use. |
| 276 | */ |
| 277 | uint8_t targeted_system_display_actual_peak_luminance_flag; |
| 278 | |
| 279 | /** |
| 280 | * The number of rows in the targeted system_display_actual_peak_luminance |
| 281 | * array. The value shall be in the range of 2 to 25, inclusive. |
| 282 | */ |
| 283 | uint8_t num_rows_targeted_system_display_actual_peak_luminance; |
| 284 | |
| 285 | /** |
| 286 | * The number of columns in the |
| 287 | * targeted_system_display_actual_peak_luminance array. The value shall be |
| 288 | * in the range of 2 to 25, inclusive. |
| 289 | */ |
| 290 | uint8_t num_cols_targeted_system_display_actual_peak_luminance; |
| 291 | |
| 292 | /** |
| 293 | * The normalized actual peak luminance of the targeted system display. The |
| 294 | * values should be in the range of 0 to 1, inclusive and in multiples of |
| 295 | * 1/15. |
| 296 | */ |
| 297 | AVRational targeted_system_display_actual_peak_luminance[25][25]; |
| 298 | |
| 299 | /** |
| 300 | * This flag shall be equal to 0 in bitstreams conforming to this version of |
| 301 | * this Specification. The value 1 is reserved for future use. |
| 302 | */ |
| 303 | uint8_t mastering_display_actual_peak_luminance_flag; |
| 304 | |
| 305 | /** |
| 306 | * The number of rows in the mastering_display_actual_peak_luminance array. |
| 307 | * The value shall be in the range of 2 to 25, inclusive. |
| 308 | */ |
| 309 | uint8_t num_rows_mastering_display_actual_peak_luminance; |
| 310 | |
| 311 | /** |
| 312 | * The number of columns in the mastering_display_actual_peak_luminance |
| 313 | * array. The value shall be in the range of 2 to 25, inclusive. |
| 314 | */ |
| 315 | uint8_t num_cols_mastering_display_actual_peak_luminance; |
| 316 | |
| 317 | /** |
| 318 | * The normalized actual peak luminance of the mastering display used for |
| 319 | * mastering the image essence. The values should be in the range of 0 to 1, |
| 320 | * inclusive and in multiples of 1/15. |
| 321 | */ |
| 322 | AVRational mastering_display_actual_peak_luminance[25][25]; |
| 323 | } AVDynamicHDRPlus; |
| 324 | |
| 325 | /** |
| 326 | * Allocate an AVDynamicHDRPlus structure and set its fields to |
| 327 | * default values. The resulting struct can be freed using av_freep(). |
| 328 | * |
| 329 | * @return An AVDynamicHDRPlus filled with default values or NULL |
| 330 | * on failure. |
| 331 | */ |
| 332 | AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size); |
| 333 | |
| 334 | /** |
| 335 | * Allocate a complete AVDynamicHDRPlus and add it to the frame. |
| 336 | * @param frame The frame which side data is added to. |
| 337 | * |
| 338 | * @return The AVDynamicHDRPlus structure to be filled by caller or NULL |
| 339 | * on failure. |
| 340 | */ |
| 341 | AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame); |
| 342 | |
| 343 | #endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */ |
| 344 | |