FFmpeg
Loading...
Searching...
No Matches
dynamic_hdr_vivid.c
Go to the documentation of this file.
1/*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#include "dynamic_hdr_vivid.h"
20#include "get_bits.h"
21
22static const int32_t maxrgb_den = 4095;
24static const int32_t maximum_luminance_den = 4095;
25static const int32_t base_param_m_p_den = 16383;
26static const int32_t base_param_m_m_den = 10;
27static const int32_t base_param_m_a_den = 1023;
28static const int32_t base_param_m_b_den = 1023;
29static const int32_t base_param_m_n_den = 10;
30static const int32_t base_param_Delta_den = 127;
31
33 int size)
34{
35 GetBitContext gbc, *gb = &gbc;
36 int ret;
37
38 if (!s)
39 return AVERROR(ENOMEM);
40
41 ret = init_get_bits8(gb, data, size);
42 if (ret < 0)
43 return ret;
44
45 if (get_bits_left(gb) < 8)
47
48 s->system_start_code = get_bits(gb, 8);
49 // T/UWA 005.1-2022, table 11
50 if (s->system_start_code >= 0x01 && s->system_start_code <= 0x07) {
51 s->num_windows = 1;
52
53 if (get_bits_left(gb) < 12 * 4 * s->num_windows)
55 for (int w = 0; w < s->num_windows; w++) {
57
58 params->minimum_maxrgb = (AVRational){get_bits(gb, 12), maxrgb_den};
59 params->average_maxrgb = (AVRational){get_bits(gb, 12), maxrgb_den};
60 params->variance_maxrgb = (AVRational){get_bits(gb, 12), maxrgb_den};
61 params->maximum_maxrgb = (AVRational){get_bits(gb, 12), maxrgb_den};
62 }
63
64 if (get_bits_left(gb) < 2 * s->num_windows)
66 for (int w = 0; w < s->num_windows; w++) {
68
69 params->tone_mapping_mode_flag = get_bits(gb, 1);
70 if (params->tone_mapping_mode_flag) {
71 if (get_bits_left(gb) < 1 )
73 params->tone_mapping_param_num = get_bits(gb, 1) + 1;
74 for (int i = 0; i < params->tone_mapping_param_num; i++) {
75 AVHDRVividColorToneMappingParams *tm_params = &params->tm_params[i];
76
77 if (get_bits_left(gb) < 13)
80 tm_params->base_enable_flag = get_bits(gb, 1);
81 if (tm_params->base_enable_flag) {
82 if (get_bits_left(gb) < (14 + 6 + 10 + 10 + 6 + 8 + 10))
89 tm_params->base_param_k1 = get_bits(gb, 2);
90 tm_params->base_param_k2 = get_bits(gb, 2);
91 tm_params->base_param_k3 = get_bits(gb, 4);
92 tm_params->base_param_Delta_enable_mode = get_bits(gb, 3);
94 }
95 if (get_bits_left(gb) < 1)
97 tm_params->three_Spline_enable_flag = get_bits(gb, 1);
98 if (tm_params->three_Spline_enable_flag) {
99 AVHDRVivid3SplineParams *three_spline;
100
101 if (get_bits_left(gb) < 1 + tm_params->three_Spline_num * (2 + 12 + 28 + 1))
102 return AVERROR_INVALIDDATA;
103 tm_params->three_Spline_num = get_bits(gb, 1) + 1;
104 if (tm_params->three_Spline_num > FF_ARRAY_ELEMS(tm_params->three_spline))
105 return AVERROR_INVALIDDATA;
106 for (int j = 0; j < tm_params->three_Spline_num; j++) {
107 three_spline = &tm_params->three_spline[j];
108 three_spline->th_mode = get_bits(gb, 2);
109 if (three_spline->th_mode == 0 || three_spline->th_mode == 2) {
110 if (get_bits_left(gb) < 8)
111 return AVERROR_INVALIDDATA;
112 three_spline->th_enable_mb = (AVRational){get_bits(gb, 8), 255};
113 }
114 three_spline->th_enable = (AVRational){get_bits(gb, 12), 4095};
115 three_spline->th_delta1 = (AVRational){get_bits(gb, 10), 1023};
116 three_spline->th_delta2 = (AVRational){get_bits(gb, 10), 1023};
117 three_spline->enable_strength = (AVRational){get_bits(gb, 8), 255};
118 }
119 }
120 }
121 }
122
123 params->color_saturation_mapping_flag = get_bits(gb, 1);
124 if (params->color_saturation_mapping_flag) {
125 if (get_bits_left(gb) < 3 + params->color_saturation_num * 8)
126 return AVERROR_INVALIDDATA;
127
128 params->color_saturation_num = get_bits(gb, 3);
129 for (int i = 0; i < params->color_saturation_num; i++) {
130 params->color_saturation_gain[i] = (AVRational){get_bits(gb, 8), color_saturation_gain_den};
131 }
132 }
133 }
134 }
135
136 return 0;
137}
SwsAArch64OpImplParams params
Definition ops.c:51
int32_t
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
static const int32_t base_param_m_b_den
static const int32_t base_param_m_m_den
static const int32_t color_saturation_gain_den
static const int32_t base_param_Delta_den
static const int32_t maxrgb_den
int ff_parse_itu_t_t35_to_dynamic_hdr_vivid(AVDynamicHDRVivid *s, const uint8_t *data, int size)
Parse the user data registered ITU-T T.35 to AVbuffer (AVDynamicHDRVivid).
static const int32_t base_param_m_a_den
static const int32_t maximum_luminance_den
static const int32_t base_param_m_n_den
static const int32_t base_param_m_p_den
bitstream reader API header.
static int get_bits_left(GetBitContext *gb)
Definition get_bits.h:688
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition get_bits.h:544
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition get_bits.h:337
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
uint8_t w
Definition llvidencdsp.c:39
const char data[16]
Definition mxf.c:149
#define FF_ARRAY_ELEMS(a)
This struct represents dynamic metadata for color volume transform - CUVA 005.1:2021 standard.
HDR Vivid three spline params.
AVRational enable_strength
3Spline_enable_Strength of three Spline.
AVRational th_delta1
3Spline_TH_Delta1 of three Spline.
int th_mode
The mode of three Spline.
AVRational th_delta2
3Spline_TH_Delta2 of three Spline.
AVRational th_enable_mb
three_Spline_TH_enable_MB is in the range of 0.0 to 1.0, inclusive and in multiples of 1....
AVRational th_enable
3Spline_TH_enable of three Spline.
Color tone mapping parameters at a processing window in a dynamic metadata for CUVA 005....
int three_Spline_enable_flag
indicates 3Spline_enable_flag in the base parameter, This flag indicates that transfer three Spline o...
int base_param_k1
indicates k1_0 in the base parameter, base_param_k1 <= 1: k1_0 = base_param_k1 base_param_k1 > 1: res...
AVRational base_param_m_m
base_param_m_m in the base parameter, in multiples of 1.0/10.
AVRational base_param_m_p
base_param_m_p in the base parameter, in multiples of 1.0/16383.
int base_param_k3
indicates k3_0 in the base parameter, base_param_k3 == 1: k3_0 = base_param_k3 base_param_k3 == 2: k3...
AVRational base_param_m_b
base_param_m_b in the base parameter, in multiples of 1/1023.
AVRational base_param_m_a
base_param_m_a in the base parameter, in multiples of 1.0/1023.
AVRational base_param_Delta
base_param_Delta in the base parameter, in multiples of 1.0/127.
int three_Spline_num
The number of three Spline.
AVRational base_param_m_n
base_param_m_n in the base parameter, in multiples of 1.0/10.
int base_param_k2
indicates k2_0 in the base parameter, base_param_k2 <= 1: k2_0 = base_param_k2 base_param_k2 > 1: res...
AVRational targeted_system_display_maximum_luminance
The nominal maximum display luminance of the targeted system display, in multiples of 1....
int base_enable_flag
This flag indicates that transfer the base parameter(for value of 1)
int base_param_Delta_enable_mode
This flag indicates that delta mode of base parameter(for value of 1)
Color transform parameters at a processing window in a dynamic metadata for CUVA 005....
Rational number (pair of numerator and denominator).
Definition rational.h:58
int size