123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- /*
- * Copyright (c) 2020 Vacing Fang <vacingfang@tencent.com>
- *
- * 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
- */
- #ifndef AVUTIL_DOVI_META_H
- #define AVUTIL_DOVI_META_H
- #include <stdint.h>
- #include <stddef.h>
- #include "rational.h"
- /*
- * 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.
- */
- #define AV_DOVI_MAX_PIECES 8
- 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);
- #endif /* AVUTIL_DOVI_META_H */
|