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