/* | |
* Copyright (c) 2020 Vacing Fang <[email protected]> | |
* | |
* This file is part of FFmpeg. | |
* | |
* FFmpeg is free software; you can redistribute it and/or | |
* modify it under the terms of the GNU Lesser General Public | |
* License as published by the Free Software Foundation; either | |
* version 2.1 of the License, or (at your option) any later version. | |
* | |
* FFmpeg is distributed in the hope that it will be useful, | |
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
* Lesser General Public License for more details. | |
* | |
* You should have received a copy of the GNU Lesser General Public | |
* License along with FFmpeg; if not, write to the Free Software | |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
*/ | |
/** | |
* @file | |
* DOVI configuration | |
*/ | |
/* | |
* DOVI configuration | |
* ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2.1.2 | |
dolby-vision-bitstreams-in-mpeg-2-transport-stream-multiplex-v1.2 | |
* @code | |
* uint8_t dv_version_major, the major version number that the stream complies with | |
* uint8_t dv_version_minor, the minor version number that the stream complies with | |
* uint8_t dv_profile, the Dolby Vision profile | |
* uint8_t dv_level, the Dolby Vision level | |
* uint8_t rpu_present_flag | |
* uint8_t el_present_flag | |
* uint8_t bl_present_flag | |
* uint8_t dv_bl_signal_compatibility_id | |
* @endcode | |
* | |
* @note The struct must be allocated with av_dovi_alloc() and | |
* its size is not a part of the public ABI. | |
*/ | |
typedef struct AVDOVIDecoderConfigurationRecord { | |
uint8_t dv_version_major; | |
uint8_t dv_version_minor; | |
uint8_t dv_profile; | |
uint8_t dv_level; | |
uint8_t rpu_present_flag; | |
uint8_t el_present_flag; | |
uint8_t bl_present_flag; | |
uint8_t dv_bl_signal_compatibility_id; | |
} AVDOVIDecoderConfigurationRecord; | |
/** | |
* Allocate a AVDOVIDecoderConfigurationRecord structure and initialize its | |
* fields to default values. | |
* | |
* @return the newly allocated struct or NULL on failure | |
*/ | |
AVDOVIDecoderConfigurationRecord *av_dovi_alloc(size_t *size); | |
/** | |
* Dolby Vision RPU data header. | |
* | |
* @note sizeof(AVDOVIRpuDataHeader) is not part of the public ABI. | |
*/ | |
typedef struct AVDOVIRpuDataHeader { | |
uint8_t rpu_type; | |
uint16_t rpu_format; | |
uint8_t vdr_rpu_profile; | |
uint8_t vdr_rpu_level; | |
uint8_t chroma_resampling_explicit_filter_flag; | |
uint8_t coef_data_type; /* informative, lavc always converts to fixed */ | |
uint8_t coef_log2_denom; | |
uint8_t vdr_rpu_normalized_idc; | |
uint8_t bl_video_full_range_flag; | |
uint8_t bl_bit_depth; /* [8, 16] */ | |
uint8_t el_bit_depth; /* [8, 16] */ | |
uint8_t vdr_bit_depth; /* [8, 16] */ | |
uint8_t spatial_resampling_filter_flag; | |
uint8_t el_spatial_resampling_filter_flag; | |
uint8_t disable_residual_flag; | |
} AVDOVIRpuDataHeader; | |
enum AVDOVIMappingMethod { | |
AV_DOVI_MAPPING_POLYNOMIAL = 0, | |
AV_DOVI_MAPPING_MMR = 1, | |
}; | |
/** | |
* Coefficients of a piece-wise function. The pieces of the function span the | |
* value ranges between two adjacent pivot values. | |
*/ | |
typedef struct AVDOVIReshapingCurve { | |
uint8_t num_pivots; /* [2, 9] */ | |
uint16_t pivots[AV_DOVI_MAX_PIECES + 1]; /* sorted ascending */ | |
enum AVDOVIMappingMethod mapping_idc[AV_DOVI_MAX_PIECES]; | |
/* AV_DOVI_MAPPING_POLYNOMIAL */ | |
uint8_t poly_order[AV_DOVI_MAX_PIECES]; /* [1, 2] */ | |
int64_t poly_coef[AV_DOVI_MAX_PIECES][3]; /* x^0, x^1, x^2 */ | |
/* AV_DOVI_MAPPING_MMR */ | |
uint8_t mmr_order[AV_DOVI_MAX_PIECES]; /* [1, 3] */ | |
int64_t mmr_constant[AV_DOVI_MAX_PIECES]; | |
int64_t mmr_coef[AV_DOVI_MAX_PIECES][3/* order - 1 */][7]; | |
} AVDOVIReshapingCurve; | |
enum AVDOVINLQMethod { | |
AV_DOVI_NLQ_NONE = -1, | |
AV_DOVI_NLQ_LINEAR_DZ = 0, | |
}; | |
/** | |
* Coefficients of the non-linear inverse quantization. For the interpretation | |
* of these, see ETSI GS CCM 001. | |
*/ | |
typedef struct AVDOVINLQParams { | |
uint16_t nlq_offset; | |
uint64_t vdr_in_max; | |
/* AV_DOVI_NLQ_LINEAR_DZ */ | |
uint64_t linear_deadzone_slope; | |
uint64_t linear_deadzone_threshold; | |
} AVDOVINLQParams; | |
/** | |
* Dolby Vision RPU data mapping parameters. | |
* | |
* @note sizeof(AVDOVIDataMapping) is not part of the public ABI. | |
*/ | |
typedef struct AVDOVIDataMapping { | |
uint8_t vdr_rpu_id; | |
uint8_t mapping_color_space; | |
uint8_t mapping_chroma_format_idc; | |
AVDOVIReshapingCurve curves[3]; /* per component */ | |
/* Non-linear inverse quantization */ | |
enum AVDOVINLQMethod nlq_method_idc; | |
uint32_t num_x_partitions; | |
uint32_t num_y_partitions; | |
AVDOVINLQParams nlq[3]; /* per component */ | |
} AVDOVIDataMapping; | |
/** | |
* Dolby Vision RPU colorspace metadata parameters. | |
* | |
* @note sizeof(AVDOVIColorMetadata) is not part of the public ABI. | |
*/ | |
typedef struct AVDOVIColorMetadata { | |
uint8_t dm_metadata_id; | |
uint8_t scene_refresh_flag; | |
/** | |
* Coefficients of the custom Dolby Vision IPT-PQ matrices. These are to be | |
* used instead of the matrices indicated by the frame's colorspace tags. | |
* The output of rgb_to_lms_matrix is to be fed into a BT.2020 LMS->RGB | |
* matrix based on a Hunt-Pointer-Estevez transform, but without any | |
* crosstalk. (See the definition of the ICtCp colorspace for more | |
* information.) | |
*/ | |
AVRational ycc_to_rgb_matrix[9]; /* before PQ linearization */ | |
AVRational ycc_to_rgb_offset[3]; /* input offset of neutral value */ | |
AVRational rgb_to_lms_matrix[9]; /* after PQ linearization */ | |
/** | |
* Extra signal metadata (see Dolby patents for more info). | |
*/ | |
uint16_t signal_eotf; | |
uint16_t signal_eotf_param0; | |
uint16_t signal_eotf_param1; | |
uint32_t signal_eotf_param2; | |
uint8_t signal_bit_depth; | |
uint8_t signal_color_space; | |
uint8_t signal_chroma_format; | |
uint8_t signal_full_range_flag; /* [0, 3] */ | |
uint16_t source_min_pq; | |
uint16_t source_max_pq; | |
uint16_t source_diagonal; | |
} AVDOVIColorMetadata; | |
/** | |
* Combined struct representing a combination of header, mapping and color | |
* metadata, for attaching to frames as side data. | |
* | |
* @note The struct must be allocated with av_dovi_metadata_alloc() and | |
* its size is not a part of the public ABI. | |
*/ | |
typedef struct AVDOVIMetadata { | |
/** | |
* Offset in bytes from the beginning of this structure at which the | |
* respective structs start. | |
*/ | |
size_t header_offset; /* AVDOVIRpuDataHeader */ | |
size_t mapping_offset; /* AVDOVIDataMapping */ | |
size_t color_offset; /* AVDOVIColorMetadata */ | |
} AVDOVIMetadata; | |
static av_always_inline AVDOVIRpuDataHeader * | |
av_dovi_get_header(const AVDOVIMetadata *data) | |
{ | |
return (AVDOVIRpuDataHeader *)((uint8_t *) data + data->header_offset); | |
} | |
static av_always_inline AVDOVIDataMapping * | |
av_dovi_get_mapping(const AVDOVIMetadata *data) | |
{ | |
return (AVDOVIDataMapping *)((uint8_t *) data + data->mapping_offset); | |
} | |
static av_always_inline AVDOVIColorMetadata * | |
av_dovi_get_color(const AVDOVIMetadata *data) | |
{ | |
return (AVDOVIColorMetadata *)((uint8_t *) data + data->color_offset); | |
} | |
/** | |
* Allocate an AVDOVIMetadata structure and initialize its | |
* fields to default values. | |
* | |
* @param size If this parameter is non-NULL, the size in bytes of the | |
* allocated struct will be written here on success | |
* | |
* @return the newly allocated struct or NULL on failure | |
*/ | |
AVDOVIMetadata *av_dovi_metadata_alloc(size_t *size); | |