• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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