FFmpeg 8.1
Loading...
Searching...
No Matches
dovi_meta.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Vacing Fang <vacingfang@tencent.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/**
22 * @file
23 * DOVI configuration
24 */
25
26
27#ifndef AVUTIL_DOVI_META_H
28#define AVUTIL_DOVI_META_H
29
30#include <stdint.h>
31#include <stddef.h>
32
33#include "rational.h"
34#include "csp.h"
35
36/*
37 * DOVI configuration
38 * ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2.1.2
39 dolby-vision-bitstreams-in-mpeg-2-transport-stream-multiplex-v1.2
40 * @code
41 * uint8_t dv_version_major, the major version number that the stream complies with
42 * uint8_t dv_version_minor, the minor version number that the stream complies with
43 * uint8_t dv_profile, the Dolby Vision profile
44 * uint8_t dv_level, the Dolby Vision level
45 * uint8_t rpu_present_flag
46 * uint8_t el_present_flag
47 * uint8_t bl_present_flag
48 * uint8_t dv_bl_signal_compatibility_id
49 * uint8_t dv_md_compression, the compression method in use
50 * @endcode
51 *
52 * @note The struct must be allocated with av_dovi_alloc() and
53 * its size is not a part of the public ABI.
54 */
66
73
74/**
75 * Allocate a AVDOVIDecoderConfigurationRecord structure and initialize its
76 * fields to default values.
77 *
78 * @return the newly allocated struct or NULL on failure
79 */
81
82/**
83 * Dolby Vision RPU data header.
84 *
85 * @note sizeof(AVDOVIRpuDataHeader) is not part of the public ABI.
86 */
87typedef struct AVDOVIRpuDataHeader {
88 uint8_t rpu_type;
89 uint16_t rpu_format;
93 uint8_t coef_data_type; /* informative, lavc always converts to fixed */
97 uint8_t bl_bit_depth; /* [8, 16] */
98 uint8_t el_bit_depth; /* [8, 16] */
99 uint8_t vdr_bit_depth; /* [8, 16] */
103 uint8_t ext_mapping_idc_0_4; /* extended base layer inverse mapping indicator */
104 uint8_t ext_mapping_idc_5_7; /* reserved */
106
111
112/**
113 * Coefficients of a piece-wise function. The pieces of the function span the
114 * value ranges between two adjacent pivot values.
115 */
116#define AV_DOVI_MAX_PIECES 8
117typedef struct AVDOVIReshapingCurve {
118 uint8_t num_pivots; /* [2, 9] */
119 uint16_t pivots[AV_DOVI_MAX_PIECES + 1]; /* sorted ascending */
121 /* AV_DOVI_MAPPING_POLYNOMIAL */
122 uint8_t poly_order[AV_DOVI_MAX_PIECES]; /* [1, 2] */
123 int64_t poly_coef[AV_DOVI_MAX_PIECES][3]; /* x^0, x^1, x^2 */
124 /* AV_DOVI_MAPPING_MMR */
125 uint8_t mmr_order[AV_DOVI_MAX_PIECES]; /* [1, 3] */
127 int64_t mmr_coef[AV_DOVI_MAX_PIECES][3/* order - 1 */][7];
129
134
135/**
136 * Coefficients of the non-linear inverse quantization. For the interpretation
137 * of these, see ETSI GS CCM 001.
138 */
139typedef struct AVDOVINLQParams {
140 uint16_t nlq_offset;
141 uint64_t vdr_in_max;
142 /* AV_DOVI_NLQ_LINEAR_DZ */
146
147/**
148 * Dolby Vision RPU data mapping parameters.
149 *
150 * @note sizeof(AVDOVIDataMapping) is not part of the public ABI.
151 */
152typedef struct AVDOVIDataMapping {
153 uint8_t vdr_rpu_id;
156 AVDOVIReshapingCurve curves[3]; /* per component */
157
158 /* Non-linear inverse quantization */
162 AVDOVINLQParams nlq[3]; /* per component */
163 uint16_t nlq_pivots[2];
165
166/**
167 * Dolby Vision RPU colorspace metadata parameters.
168 *
169 * @note sizeof(AVDOVIColorMetadata) is not part of the public ABI.
170 */
171typedef struct AVDOVIColorMetadata {
174
175 /**
176 * Coefficients of the custom Dolby Vision IPT-PQ matrices. These are to be
177 * used instead of the matrices indicated by the frame's colorspace tags.
178 * The output of rgb_to_lms_matrix is to be fed into a BT.2020 LMS->RGB
179 * matrix based on a Hunt-Pointer-Estevez transform, but without any
180 * crosstalk. (See the definition of the ICtCp colorspace for more
181 * information.)
182 */
183 AVRational ycc_to_rgb_matrix[9]; /* before PQ linearization */
184 AVRational ycc_to_rgb_offset[3]; /* input offset of neutral value */
185 AVRational rgb_to_lms_matrix[9]; /* after PQ linearization */
186
187 /**
188 * Extra signal metadata (see Dolby patents for more info).
189 */
190 uint16_t signal_eotf;
197 uint8_t signal_full_range_flag; /* [0, 3] */
202
203typedef struct AVDOVIDmLevel1 {
204 /* Per-frame brightness metadata */
205 uint16_t min_pq;
206 uint16_t max_pq;
207 uint16_t avg_pq;
209
210typedef struct AVDOVIDmLevel2 {
211 /* Usually derived from level 8 (at different levels) */
213 uint16_t trim_slope;
214 uint16_t trim_offset;
215 uint16_t trim_power;
218 int16_t ms_weight;
220
221typedef struct AVDOVIDmLevel3 {
226
227typedef struct AVDOVIDmLevel4 {
228 uint16_t anchor_pq;
229 uint16_t anchor_power;
231
232typedef struct AVDOVIDmLevel5 {
233 /* Active area definition */
234 uint16_t left_offset;
235 uint16_t right_offset;
236 uint16_t top_offset;
239
240typedef struct AVDOVIDmLevel6 {
241 /* Static HDR10 metadata */
244 uint16_t max_cll;
245 uint16_t max_fall;
247
248typedef struct AVDOVIDmLevel8 {
249 /* Extended version of level 2 */
251 uint16_t trim_slope;
252 uint16_t trim_offset;
253 uint16_t trim_power;
256 uint16_t ms_weight;
258 uint16_t clip_trim;
262
263typedef struct AVDOVIDmLevel9 {
264 /* Source display characteristics */
268
269typedef struct AVDOVIDmLevel10 {
270 /* Target display characteristics */
277
278typedef struct AVDOVIDmLevel11 {
280 uint8_t whitepoint;
282#if FF_API_DOVI_L11_INVALID_PROPS
284 uint8_t sharpness;
286 uint8_t noise_reduction;
288 uint8_t mpeg_noise_reduction;
290 uint8_t frame_rate_conversion;
292 uint8_t brightness;
294 uint8_t color;
295#endif
297
298typedef struct AVDOVIDmLevel254 {
299 /* DMv2 info block, always present in samples with DMv2 metadata */
300 uint8_t dm_mode;
303
304typedef struct AVDOVIDmLevel255 {
305 /* Debug block, not really used in samples */
306 uint8_t dm_run_mode;
308 uint8_t dm_debug[4];
310
311/**
312 * Dolby Vision metadata extension block. Dynamic extension blocks may change
313 * from frame to frame, while static blocks are constant throughout the entire
314 * sequence.
315 *
316 * @note sizeof(AVDOVIDmData) is not part of the public API.
317 */
318typedef struct AVDOVIDmData {
319 uint8_t level; /* [1, 255] */
320 union {
321 AVDOVIDmLevel1 l1; /* dynamic */
322 AVDOVIDmLevel2 l2; /* dynamic, may appear multiple times */
323 AVDOVIDmLevel3 l3; /* dynamic */
324 AVDOVIDmLevel4 l4; /* dynamic */
325 AVDOVIDmLevel5 l5; /* dynamic */
326 AVDOVIDmLevel6 l6; /* static */
327 /* level 7 is currently unused */
328 AVDOVIDmLevel8 l8; /* dynamic, may appear multiple times */
329 AVDOVIDmLevel9 l9; /* dynamic */
330 AVDOVIDmLevel10 l10; /* static, may appear multiple times */
331 AVDOVIDmLevel11 l11; /* dynamic */
332 AVDOVIDmLevel254 l254; /* static */
333 AVDOVIDmLevel255 l255; /* static */
334 };
336
337/**
338 * Combined struct representing a combination of header, mapping and color
339 * metadata, for attaching to frames as side data.
340 *
341 * @note The struct must be allocated with av_dovi_metadata_alloc() and
342 * its size is not a part of the public ABI.
343 */
344
345typedef struct AVDOVIMetadata {
346 /**
347 * Offset in bytes from the beginning of this structure at which the
348 * respective structs start.
349 */
350 size_t header_offset; /* AVDOVIRpuDataHeader */
351 size_t mapping_offset; /* AVDOVIDataMapping */
352 size_t color_offset; /* AVDOVIColorMetadata */
353
354 size_t ext_block_offset; /* offset to start of ext blocks array */
355 size_t ext_block_size; /* size per element */
356 int num_ext_blocks; /* number of extension blocks */
357
358 /* static limit on num_ext_blocks, derived from bitstream limitations */
359#define AV_DOVI_MAX_EXT_BLOCKS 32
361
364{
365 return (AVDOVIRpuDataHeader *)((uint8_t *) data + data->header_offset);
366}
367
370{
371 return (AVDOVIDataMapping *)((uint8_t *) data + data->mapping_offset);
372}
373
376{
377 return (AVDOVIColorMetadata *)((uint8_t *) data + data->color_offset);
378}
379
380/**
381 * Gets the specified Dolby Vision Display Management (DM) metadata
382 * @param index must be non negative and below data->num_ext_blocks
383 */
385av_dovi_get_ext(const AVDOVIMetadata *data, int index)
386{
387 return (AVDOVIDmData *)((uint8_t *) data + data->ext_block_offset +
388 data->ext_block_size * index);
389}
390
391/**
392 * Find an extension block with a given level, or NULL. In the case of
393 * multiple extension blocks, only the first is returned.
394 */
395AVDOVIDmData *av_dovi_find_level(const AVDOVIMetadata *data, uint8_t level);
396
397/**
398 * Allocate an AVDOVIMetadata structure and initialize its
399 * fields to default values.
400 *
401 * @param size If this parameter is non-NULL, the size in bytes of the
402 * allocated struct will be written here on success
403 *
404 * @return the newly allocated struct or NULL on failure
405 */
407
408#endif /* AVUTIL_DOVI_META_H */
#define av_always_inline
Definition attributes.h:64
#define attribute_deprecated
Definition attributes.h:123
Colorspace value utility functions for libavutil.
static av_always_inline AVDOVIColorMetadata * av_dovi_get_color(const AVDOVIMetadata *data)
Definition dovi_meta.h:375
AVDOVIDmData * av_dovi_find_level(const AVDOVIMetadata *data, uint8_t level)
Find an extension block with a given level, or NULL.
AVDOVIDecoderConfigurationRecord * av_dovi_alloc(size_t *size)
Allocate a AVDOVIDecoderConfigurationRecord structure and initialize its fields to default values.
static av_always_inline AVDOVIRpuDataHeader * av_dovi_get_header(const AVDOVIMetadata *data)
Definition dovi_meta.h:363
AVDOVICompression
Definition dovi_meta.h:67
@ AV_DOVI_COMPRESSION_EXTENDED
Definition dovi_meta.h:71
@ AV_DOVI_COMPRESSION_LIMITED
Definition dovi_meta.h:69
@ AV_DOVI_COMPRESSION_NONE
Definition dovi_meta.h:68
@ AV_DOVI_COMPRESSION_RESERVED
Definition dovi_meta.h:70
static av_always_inline AVDOVIDmData * av_dovi_get_ext(const AVDOVIMetadata *data, int index)
Gets the specified Dolby Vision Display Management (DM) metadata.
Definition dovi_meta.h:385
AVDOVIMappingMethod
Definition dovi_meta.h:107
@ AV_DOVI_MAPPING_MMR
Definition dovi_meta.h:109
@ AV_DOVI_MAPPING_POLYNOMIAL
Definition dovi_meta.h:108
AVDOVINLQMethod
Definition dovi_meta.h:130
@ AV_DOVI_NLQ_NONE
Definition dovi_meta.h:131
@ AV_DOVI_NLQ_LINEAR_DZ
Definition dovi_meta.h:132
AVDOVIMetadata * av_dovi_metadata_alloc(size_t *size)
Allocate an AVDOVIMetadata structure and initialize its fields to default values.
static av_always_inline AVDOVIDataMapping * av_dovi_get_mapping(const AVDOVIMetadata *data)
Definition dovi_meta.h:369
#define AV_DOVI_MAX_PIECES
Coefficients of a piece-wise function.
Definition dovi_meta.h:116
Utilities for rational number calculation.
Struct that contains both white point location and primaries location, providing the complete descrip...
Definition csp.h:78
Dolby Vision RPU colorspace metadata parameters.
Definition dovi_meta.h:171
uint16_t signal_eotf
Extra signal metadata (see Dolby patents for more info).
Definition dovi_meta.h:190
AVRational rgb_to_lms_matrix[9]
Definition dovi_meta.h:185
uint8_t signal_bit_depth
Definition dovi_meta.h:194
AVRational ycc_to_rgb_matrix[9]
Coefficients of the custom Dolby Vision IPT-PQ matrices.
Definition dovi_meta.h:183
uint16_t signal_eotf_param0
Definition dovi_meta.h:191
uint16_t signal_eotf_param1
Definition dovi_meta.h:192
uint8_t scene_refresh_flag
Definition dovi_meta.h:173
uint16_t source_min_pq
Definition dovi_meta.h:198
uint8_t signal_chroma_format
Definition dovi_meta.h:196
uint16_t source_diagonal
Definition dovi_meta.h:200
uint16_t source_max_pq
Definition dovi_meta.h:199
uint32_t signal_eotf_param2
Definition dovi_meta.h:193
uint8_t signal_color_space
Definition dovi_meta.h:195
uint8_t signal_full_range_flag
Definition dovi_meta.h:197
AVRational ycc_to_rgb_offset[3]
Definition dovi_meta.h:184
Dolby Vision RPU data mapping parameters.
Definition dovi_meta.h:152
uint32_t num_x_partitions
Definition dovi_meta.h:160
AVDOVINLQParams nlq[3]
Definition dovi_meta.h:162
uint8_t mapping_color_space
Definition dovi_meta.h:154
uint8_t mapping_chroma_format_idc
Definition dovi_meta.h:155
uint16_t nlq_pivots[2]
Definition dovi_meta.h:163
AVDOVIReshapingCurve curves[3]
Definition dovi_meta.h:156
enum AVDOVINLQMethod nlq_method_idc
Definition dovi_meta.h:159
uint32_t num_y_partitions
Definition dovi_meta.h:161
Dolby Vision metadata extension block.
Definition dovi_meta.h:318
AVDOVIDmLevel9 l9
Definition dovi_meta.h:329
AVDOVIDmLevel3 l3
Definition dovi_meta.h:323
uint8_t level
Definition dovi_meta.h:319
AVDOVIDmLevel8 l8
Definition dovi_meta.h:328
AVDOVIDmLevel254 l254
Definition dovi_meta.h:332
AVDOVIDmLevel6 l6
Definition dovi_meta.h:326
AVDOVIDmLevel4 l4
Definition dovi_meta.h:324
AVDOVIDmLevel1 l1
Definition dovi_meta.h:321
AVDOVIDmLevel11 l11
Definition dovi_meta.h:331
AVDOVIDmLevel5 l5
Definition dovi_meta.h:325
AVDOVIDmLevel10 l10
Definition dovi_meta.h:330
AVDOVIDmLevel255 l255
Definition dovi_meta.h:333
AVDOVIDmLevel2 l2
Definition dovi_meta.h:322
uint16_t target_min_pq
Definition dovi_meta.h:273
uint16_t target_max_pq
Definition dovi_meta.h:272
uint8_t target_primary_index
Definition dovi_meta.h:274
AVColorPrimariesDesc target_display_primaries
Definition dovi_meta.h:275
uint8_t target_display_index
Definition dovi_meta.h:271
uint8_t content_type
Definition dovi_meta.h:279
uint8_t whitepoint
Definition dovi_meta.h:280
uint8_t reference_mode_flag
Definition dovi_meta.h:281
uint16_t avg_pq
Definition dovi_meta.h:207
uint16_t min_pq
Definition dovi_meta.h:205
uint16_t max_pq
Definition dovi_meta.h:206
uint8_t dm_version_index
Definition dovi_meta.h:301
uint8_t dm_debug[4]
Definition dovi_meta.h:308
uint8_t dm_run_version
Definition dovi_meta.h:307
uint8_t dm_run_mode
Definition dovi_meta.h:306
int16_t ms_weight
Definition dovi_meta.h:218
uint16_t target_max_pq
Definition dovi_meta.h:212
uint16_t trim_slope
Definition dovi_meta.h:213
uint16_t trim_chroma_weight
Definition dovi_meta.h:216
uint16_t trim_saturation_gain
Definition dovi_meta.h:217
uint16_t trim_offset
Definition dovi_meta.h:214
uint16_t trim_power
Definition dovi_meta.h:215
uint16_t max_pq_offset
Definition dovi_meta.h:223
uint16_t avg_pq_offset
Definition dovi_meta.h:224
uint16_t min_pq_offset
Definition dovi_meta.h:222
uint16_t anchor_pq
Definition dovi_meta.h:228
uint16_t anchor_power
Definition dovi_meta.h:229
uint16_t bottom_offset
Definition dovi_meta.h:237
uint16_t top_offset
Definition dovi_meta.h:236
uint16_t left_offset
Definition dovi_meta.h:234
uint16_t right_offset
Definition dovi_meta.h:235
uint16_t min_luminance
Definition dovi_meta.h:243
uint16_t max_luminance
Definition dovi_meta.h:242
uint16_t max_fall
Definition dovi_meta.h:245
uint16_t max_cll
Definition dovi_meta.h:244
uint16_t trim_offset
Definition dovi_meta.h:252
uint8_t target_display_index
Definition dovi_meta.h:250
uint16_t target_mid_contrast
Definition dovi_meta.h:257
uint8_t saturation_vector_field[6]
Definition dovi_meta.h:259
uint16_t trim_power
Definition dovi_meta.h:253
uint8_t hue_vector_field[6]
Definition dovi_meta.h:260
uint16_t trim_saturation_gain
Definition dovi_meta.h:255
uint16_t trim_chroma_weight
Definition dovi_meta.h:254
uint16_t ms_weight
Definition dovi_meta.h:256
uint16_t clip_trim
Definition dovi_meta.h:258
uint16_t trim_slope
Definition dovi_meta.h:251
AVColorPrimariesDesc source_display_primaries
Definition dovi_meta.h:266
uint8_t source_primary_index
Definition dovi_meta.h:265
Combined struct representing a combination of header, mapping and color metadata, for attaching to fr...
Definition dovi_meta.h:345
size_t ext_block_offset
Definition dovi_meta.h:354
size_t mapping_offset
Definition dovi_meta.h:351
size_t color_offset
Definition dovi_meta.h:352
size_t header_offset
Offset in bytes from the beginning of this structure at which the respective structs start.
Definition dovi_meta.h:350
size_t ext_block_size
Definition dovi_meta.h:355
Coefficients of the non-linear inverse quantization.
Definition dovi_meta.h:139
uint64_t linear_deadzone_slope
Definition dovi_meta.h:143
uint64_t linear_deadzone_threshold
Definition dovi_meta.h:144
uint16_t nlq_offset
Definition dovi_meta.h:140
uint64_t vdr_in_max
Definition dovi_meta.h:141
uint8_t poly_order[AV_DOVI_MAX_PIECES]
Definition dovi_meta.h:122
enum AVDOVIMappingMethod mapping_idc[AV_DOVI_MAX_PIECES]
Definition dovi_meta.h:120
int64_t mmr_constant[AV_DOVI_MAX_PIECES]
Definition dovi_meta.h:126
int64_t mmr_coef[AV_DOVI_MAX_PIECES][3][7]
Definition dovi_meta.h:127
int64_t poly_coef[AV_DOVI_MAX_PIECES][3]
Definition dovi_meta.h:123
uint16_t pivots[AV_DOVI_MAX_PIECES+1]
Definition dovi_meta.h:119
uint8_t mmr_order[AV_DOVI_MAX_PIECES]
Definition dovi_meta.h:125
Dolby Vision RPU data header.
Definition dovi_meta.h:87
uint8_t vdr_rpu_profile
Definition dovi_meta.h:90
uint8_t ext_mapping_idc_0_4
Definition dovi_meta.h:103
uint8_t spatial_resampling_filter_flag
Definition dovi_meta.h:100
uint8_t vdr_bit_depth
Definition dovi_meta.h:99
uint8_t el_spatial_resampling_filter_flag
Definition dovi_meta.h:101
uint8_t bl_video_full_range_flag
Definition dovi_meta.h:96
uint16_t rpu_format
Definition dovi_meta.h:89
uint8_t disable_residual_flag
Definition dovi_meta.h:102
uint8_t vdr_rpu_normalized_idc
Definition dovi_meta.h:95
uint8_t coef_log2_denom
Definition dovi_meta.h:94
uint8_t chroma_resampling_explicit_filter_flag
Definition dovi_meta.h:92
uint8_t coef_data_type
Definition dovi_meta.h:93
uint8_t ext_mapping_idc_5_7
Definition dovi_meta.h:104
uint8_t vdr_rpu_level
Definition dovi_meta.h:91
Rational number (pair of numerator and denominator).
Definition rational.h:58