FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/dynamic_hdr_vivid.c
Date: 2024-12-12 01:08:13
Exec Total Coverage
Lines: 70 83 84.3%
Functions: 1 1 100.0%
Branches: 30 52 57.7%

Line Branch Exec Source
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
22 static const int32_t maxrgb_den = 4095;
23 static const int32_t color_saturation_gain_den = 128;
24 static const int32_t maximum_luminance_den = 4095;
25 static const int32_t base_param_m_p_den = 16383;
26 static const int32_t base_param_m_m_den = 10;
27 static const int32_t base_param_m_a_den = 1023;
28 static const int32_t base_param_m_b_den = 1023;
29 static const int32_t base_param_m_n_den = 10;
30 static const int32_t base_param_Delta_den = 127;
31
32 3 int ff_parse_itu_t_t35_to_dynamic_hdr_vivid(AVDynamicHDRVivid *s, const uint8_t *data,
33 int size)
34 {
35 3 GetBitContext gbc, *gb = &gbc;
36 int ret;
37
38
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (!s)
39 return AVERROR(ENOMEM);
40
41 3 ret = init_get_bits8(gb, data, size);
42
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (ret < 0)
43 return ret;
44
45
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 if (get_bits_left(gb) < 8)
46 return AVERROR_INVALIDDATA;
47
48 3 s->system_start_code = get_bits(gb, 8);
49 // T/UWA 005.1-2022, table 11
50
2/4
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 if (s->system_start_code >= 0x01 && s->system_start_code <= 0x07) {
51 3 s->num_windows = 1;
52
53
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 if (get_bits_left(gb) < 12 * 4 * s->num_windows)
54 return AVERROR_INVALIDDATA;
55
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 for (int w = 0; w < s->num_windows; w++) {
56 3 AVHDRVividColorTransformParams *params = &s->params[w];
57
58 3 params->minimum_maxrgb = (AVRational){get_bits(gb, 12), maxrgb_den};
59 3 params->average_maxrgb = (AVRational){get_bits(gb, 12), maxrgb_den};
60 3 params->variance_maxrgb = (AVRational){get_bits(gb, 12), maxrgb_den};
61 3 params->maximum_maxrgb = (AVRational){get_bits(gb, 12), maxrgb_den};
62 }
63
64
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 if (get_bits_left(gb) < 2 * s->num_windows)
65 return AVERROR_INVALIDDATA;
66
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 for (int w = 0; w < s->num_windows; w++) {
67 3 AVHDRVividColorTransformParams *params = &s->params[w];
68
69 3 params->tone_mapping_mode_flag = get_bits(gb, 1);
70
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if (params->tone_mapping_mode_flag) {
71
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 if (get_bits_left(gb) < 1 )
72 return AVERROR_INVALIDDATA;
73 3 params->tone_mapping_param_num = get_bits(gb, 1) + 1;
74
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 3 times.
9 for (int i = 0; i < params->tone_mapping_param_num; i++) {
75 6 AVHDRVividColorToneMappingParams *tm_params = &params->tm_params[i];
76
77
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (get_bits_left(gb) < 13)
78 return AVERROR_INVALIDDATA;
79 6 tm_params->targeted_system_display_maximum_luminance = (AVRational){get_bits(gb, 12), maximum_luminance_den};
80 6 tm_params->base_enable_flag = get_bits(gb, 1);
81
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 if (tm_params->base_enable_flag) {
82
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (get_bits_left(gb) < (14 + 6 + 10 + 10 + 6 + 8 + 10))
83 return AVERROR_INVALIDDATA;
84 6 tm_params->base_param_m_p = (AVRational){get_bits(gb, 14), base_param_m_p_den};
85 6 tm_params->base_param_m_m = (AVRational){get_bits(gb, 6), base_param_m_m_den};
86 6 tm_params->base_param_m_a = (AVRational){get_bits(gb, 10), base_param_m_a_den};
87 6 tm_params->base_param_m_b = (AVRational){get_bits(gb, 10), base_param_m_b_den};
88 6 tm_params->base_param_m_n = (AVRational){get_bits(gb, 6), base_param_m_n_den};
89 6 tm_params->base_param_k1 = get_bits(gb, 2);
90 6 tm_params->base_param_k2 = get_bits(gb, 2);
91 6 tm_params->base_param_k3 = get_bits(gb, 4);
92 6 tm_params->base_param_Delta_enable_mode = get_bits(gb, 3);
93 6 tm_params->base_param_Delta = (AVRational){get_bits(gb, 7), base_param_Delta_den};
94 }
95
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (get_bits_left(gb) < 1)
96 return AVERROR_INVALIDDATA;
97 6 tm_params->three_Spline_enable_flag = get_bits(gb, 1);
98
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 if (tm_params->three_Spline_enable_flag) {
99 AVHDRVivid3SplineParams *three_spline;
100
101
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (get_bits_left(gb) < 1 + tm_params->three_Spline_num * (2 + 12 + 28 + 1))
102 return AVERROR_INVALIDDATA;
103 6 tm_params->three_Spline_num = get_bits(gb, 1) + 1;
104
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (tm_params->three_Spline_num > FF_ARRAY_ELEMS(tm_params->three_spline))
105 return AVERROR_INVALIDDATA;
106
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 for (int j = 0; j < tm_params->three_Spline_num; j++) {
107 6 three_spline = &tm_params->three_spline[j];
108 6 three_spline->th_mode = get_bits(gb, 2);
109
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6 if (three_spline->th_mode == 0 || three_spline->th_mode == 2) {
110
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (get_bits_left(gb) < 8)
111 return AVERROR_INVALIDDATA;
112 6 three_spline->th_enable_mb = (AVRational){get_bits(gb, 8), 255};
113 }
114 6 three_spline->th_enable = (AVRational){get_bits(gb, 12), 4095};
115 6 three_spline->th_delta1 = (AVRational){get_bits(gb, 10), 1023};
116 6 three_spline->th_delta2 = (AVRational){get_bits(gb, 10), 1023};
117 6 three_spline->enable_strength = (AVRational){get_bits(gb, 8), 255};
118 }
119 #if FF_API_HDR_VIVID_THREE_SPLINE
120 6 three_spline = &tm_params->three_spline[0];
121 FF_DISABLE_DEPRECATION_WARNINGS
122 6 tm_params->three_Spline_TH_mode = three_spline->th_mode;
123 6 tm_params->three_Spline_TH_enable_MB = three_spline->th_enable_mb;
124 6 tm_params->three_Spline_TH_enable = three_spline->th_enable;
125 6 tm_params->three_Spline_TH_Delta1 = three_spline->th_delta1;
126 6 tm_params->three_Spline_TH_Delta2 = three_spline->th_delta2;
127 6 tm_params->three_Spline_enable_Strength = three_spline->enable_strength;
128 FF_ENABLE_DEPRECATION_WARNINGS
129 #endif
130 }
131 }
132 }
133
134 3 params->color_saturation_mapping_flag = get_bits(gb, 1);
135
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if (params->color_saturation_mapping_flag) {
136
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 if (get_bits_left(gb) < 3 + params->color_saturation_num * 8)
137 return AVERROR_INVALIDDATA;
138
139 3 params->color_saturation_num = get_bits(gb, 3);
140
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 3 times.
9 for (int i = 0; i < params->color_saturation_num; i++) {
141 6 params->color_saturation_gain[i] = (AVRational){get_bits(gb, 8), color_saturation_gain_den};
142 }
143 }
144 }
145 }
146
147 3 return 0;
148 }
149