FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/h2645_parse.c
Date: 2026-04-24 19:58:39
Exec Total Coverage
Lines: 228 267 85.4%
Functions: 15 15 100.0%
Branches: 172 222 77.5%

Line Branch Exec Source
1 /*
2 * H.264/HEVC common parsing code
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 #include <string.h>
22
23 #include "config.h"
24
25 #include "libavutil/error.h"
26 #include "libavutil/intmath.h"
27 #include "libavutil/intreadwrite.h"
28 #include "libavutil/mem.h"
29
30 #include "bytestream.h"
31 #include "h264.h"
32 #include "h2645_parse.h"
33 #include "vvc.h"
34
35 #include "hevc/hevc.h"
36
37 239598 int ff_h2645_extract_rbsp(const uint8_t *src, int length,
38 H2645RBSP *rbsp, H2645NAL *nal, int small_padding)
39 {
40 int i, si, di;
41 uint8_t *dst;
42
43 239598 nal->skipped_bytes = 0;
44 #define STARTCODE_TEST \
45 if (i + 2 < length && src[i + 1] == 0 && \
46 (src[i + 2] == 3 || src[i + 2] == 1)) { \
47 if (src[i + 2] == 1) { \
48 /* startcode, so we must be past the end */ \
49 length = i; \
50 } \
51 break; \
52 }
53 #if HAVE_FAST_UNALIGNED
54 #define FIND_FIRST_ZERO \
55 if (i > 0 && !src[i]) \
56 i--; \
57 while (src[i]) \
58 i++
59 #if HAVE_FAST_64BIT
60
2/2
✓ Branch 0 taken 53453444 times.
✓ Branch 1 taken 107878 times.
53561322 for (i = 0; i + 1 < length; i += 9) {
61 105311509 if (!((~AV_RN64(src + i) &
62
2/2
✓ Branch 0 taken 51858065 times.
✓ Branch 1 taken 1595379 times.
53453444 (AV_RN64(src + i) - 0x0100010001000101ULL)) &
63 0x8000800080008080ULL))
64 51858065 continue;
65
6/6
✓ Branch 0 taken 1505313 times.
✓ Branch 1 taken 90066 times.
✓ Branch 2 taken 345318 times.
✓ Branch 3 taken 1159995 times.
✓ Branch 4 taken 4937509 times.
✓ Branch 5 taken 1595379 times.
6532888 FIND_FIRST_ZERO;
66
10/10
✓ Branch 0 taken 1544862 times.
✓ Branch 1 taken 50517 times.
✓ Branch 2 taken 220851 times.
✓ Branch 3 taken 1324011 times.
✓ Branch 4 taken 210878 times.
✓ Branch 5 taken 9973 times.
✓ Branch 6 taken 121747 times.
✓ Branch 7 taken 89131 times.
✓ Branch 8 taken 121747 times.
✓ Branch 9 taken 9973 times.
1595379 STARTCODE_TEST;
67 1463659 i -= 7;
68 }
69 #else
70 for (i = 0; i + 1 < length; i += 5) {
71 if (!((~AV_RN32(src + i) &
72 (AV_RN32(src + i) - 0x01000101U)) &
73 0x80008080U))
74 continue;
75 FIND_FIRST_ZERO;
76 STARTCODE_TEST;
77 i -= 3;
78 }
79 #endif /* HAVE_FAST_64BIT */
80 #else
81 for (i = 0; i + 1 < length; i += 2) {
82 if (src[i])
83 continue;
84 if (i > 0 && src[i - 1] == 0)
85 i--;
86 STARTCODE_TEST;
87 }
88 #endif /* HAVE_FAST_UNALIGNED */
89
90
4/4
✓ Branch 0 taken 229625 times.
✓ Branch 1 taken 9973 times.
✓ Branch 2 taken 178591 times.
✓ Branch 3 taken 51034 times.
239598 if (i >= length - 1 && small_padding) { // no escaped 0
91 178591 nal->data =
92 178591 nal->raw_data = src;
93 178591 nal->size =
94 178591 nal->raw_size = length;
95 178591 return length;
96
2/2
✓ Branch 0 taken 24708 times.
✓ Branch 1 taken 36299 times.
61007 } else if (i > length)
97 24708 i = length;
98
99 61007 dst = &rbsp->rbsp_buffer[rbsp->rbsp_buffer_size];
100
101 61007 memcpy(dst, src, i);
102 61007 si = di = i;
103
2/2
✓ Branch 0 taken 10922669 times.
✓ Branch 1 taken 54103 times.
10976772 while (si + 2 < length) {
104 // remove escapes (very rare 1:2^22)
105
2/2
✓ Branch 0 taken 10599624 times.
✓ Branch 1 taken 323045 times.
10922669 if (src[si + 2] > 3) {
106 10599624 dst[di++] = src[si++];
107 10599624 dst[di++] = src[si++];
108
6/6
✓ Branch 0 taken 63583 times.
✓ Branch 1 taken 259462 times.
✓ Branch 2 taken 51934 times.
✓ Branch 3 taken 11649 times.
✓ Branch 4 taken 44508 times.
✓ Branch 5 taken 7426 times.
323045 } else if (src[si] == 0 && src[si + 1] == 0 && src[si + 2] != 0) {
109
2/2
✓ Branch 0 taken 37604 times.
✓ Branch 1 taken 6904 times.
44508 if (src[si + 2] == 3) { // escape
110 37604 dst[di++] = 0;
111 37604 dst[di++] = 0;
112 37604 si += 3;
113
114
2/2
✓ Branch 0 taken 30112 times.
✓ Branch 1 taken 7492 times.
37604 if (nal->skipped_bytes_pos) {
115 30112 nal->skipped_bytes++;
116
2/2
✓ Branch 0 taken 25 times.
✓ Branch 1 taken 30087 times.
30112 if (nal->skipped_bytes_pos_size < nal->skipped_bytes) {
117 25 nal->skipped_bytes_pos_size *= 2;
118
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 25 times.
25 av_assert0(nal->skipped_bytes_pos_size >= nal->skipped_bytes);
119 25 av_reallocp_array(&nal->skipped_bytes_pos,
120 25 nal->skipped_bytes_pos_size,
121 sizeof(*nal->skipped_bytes_pos));
122
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 25 times.
25 if (!nal->skipped_bytes_pos) {
123 nal->skipped_bytes_pos_size = 0;
124 return AVERROR(ENOMEM);
125 }
126 }
127
1/2
✓ Branch 0 taken 30112 times.
✗ Branch 1 not taken.
30112 if (nal->skipped_bytes_pos)
128 30112 nal->skipped_bytes_pos[nal->skipped_bytes-1] = di - 1;
129 }
130 37604 continue;
131 } else // next start code
132 6904 goto nsc;
133 }
134
135 10878161 dst[di++] = src[si++];
136 }
137
2/2
✓ Branch 0 taken 6286 times.
✓ Branch 1 taken 54103 times.
60389 while (si < length)
138 6286 dst[di++] = src[si++];
139
140 54103 nsc:
141 61007 memset(dst + di, 0, AV_INPUT_BUFFER_PADDING_SIZE);
142
143 61007 nal->data = dst;
144 61007 nal->size = di;
145 61007 nal->raw_data = src;
146 61007 nal->raw_size = si;
147 61007 rbsp->rbsp_buffer_size += si;
148
149 61007 return si;
150 }
151
152 static const char *const lcevc_nal_type_name[32] = {
153 "UNSPEC0", // LCEVC_UNSPEC0_NUT
154 "UNSPEC1", // LCEVC_UNSPEC1_NUT
155 "UNSPEC2", // LCEVC_UNSPEC2_NUT
156 "UNSPEC3", // LCEVC_UNSPEC3_NUT
157 "UNSPEC4", // LCEVC_UNSPEC4_NUT
158 "UNSPEC5", // LCEVC_UNSPEC5_NUT
159 "UNSPEC6", // LCEVC_UNSPEC6_NUT
160 "UNSPEC7", // LCEVC_UNSPEC7_NUT
161 "UNSPEC8", // LCEVC_UNSPEC8_NUT
162 "UNSPEC9", // LCEVC_UNSPEC9_NUT
163 "UNSPEC10", // LCEVC_UNSPEC10_NUT
164 "UNSPEC11", // LCEVC_UNSPEC11_NUT
165 "UNSPEC12", // LCEVC_UNSPEC12_NUT
166 "UNSPEC13", // LCEVC_UNSPEC13_NUT
167 "UNSPEC14", // LCEVC_UNSPEC14_NUT
168 "UNSPEC15", // LCEVC_UNSPEC15_NUT
169 "UNSPEC16", // LCEVC_UNSPEC16_NUT
170 "UNSPEC17", // LCEVC_UNSPEC17_NUT
171 "UNSPEC18", // LCEVC_UNSPEC18_NUT
172 "UNSPEC19", // LCEVC_UNSPEC19_NUT
173 "UNSPEC20", // LCEVC_UNSPEC20_NUT
174 "UNSPEC21", // LCEVC_UNSPEC21_NUT
175 "UNSPEC22", // LCEVC_UNSPEC22_NUT
176 "UNSPEC23", // LCEVC_UNSPEC23_NUT
177 "UNSPEC24", // LCEVC_UNSPEC24_NUT
178 "UNSPEC25", // LCEVC_UNSPEC25_NUT
179 "UNSPEC26", // LCEVC_UNSPEC26_NUT
180 "UNSPEC27", // LCEVC_UNSPEC27_NUT
181 "NON_IDR_NUT", //LCEVC_NON_IDR_NUT
182 "IDR_NUT", // LCEVC_IDR_NUT
183 "RSV_NUT", // LCEVC_RSV_NUT
184 "UNSPEC31", // LCEVC_UNSPEC31_NUT
185 };
186
187 285 static const char *lcevc_nal_unit_name(int nal_type)
188 {
189
2/4
✓ Branch 0 taken 285 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 285 times.
285 av_assert0(nal_type >= 0 && nal_type < 32);
190 285 return lcevc_nal_type_name[nal_type];
191 }
192
193 static const char *const vvc_nal_type_name[32] = {
194 "TRAIL_NUT", // VVC_TRAIL_NUT
195 "STSA_NUT", // VVC_STSA_NUT
196 "RADL_NUT", // VVC_RADL_NUT
197 "RASL_NUT", // VVC_RASL_NUT
198 "RSV_VCL4", // VVC_RSV_VCL_4
199 "RSV_VCL5", // VVC_RSV_VCL_5
200 "RSV_VCL6", // VVC_RSV_VCL_6
201 "IDR_W_RADL", // VVC_IDR_W_RADL
202 "IDR_N_LP", // VVC_IDR_N_LP
203 "CRA_NUT", // VVC_CRA_NUT
204 "GDR_NUT", // VVC_GDR_NUT
205 "RSV_IRAP_11", // VVC_RSV_IRAP_11
206 "OPI_NUT", // VVC_OPI_NUT
207 "DCI_NUT", // VVC_DCI_NUT
208 "VPS_NUT", // VVC_VPS_NUT
209 "SPS_NUT", // VVC_SPS_NUT
210 "PPS_NUT", // VVC_PPS_NUT
211 "APS_PREFIX", // VVC_PREFIX_APS_NUT
212 "APS_SUFFIX", // VVC_SUFFIX_APS_NUT
213 "PH_NUT", // VVC_PH_NUT
214 "AUD_NUT", // VVC_AUD_NUT
215 "EOS_NUT", // VVC_EOS_NUT
216 "EOB_NUT", // VVC_EOB_NUT
217 "SEI_PREFIX", // VVC_PREFIX_SEI_NUT
218 "SEI_SUFFIX", // VVC_SUFFIX_SEI_NUT
219 "FD_NUT", // VVC_FD_NUT
220 "RSV_NVCL26", // VVC_RSV_NVCL_26
221 "RSV_NVCL27", // VVC_RSV_NVCL_27
222 "UNSPEC28", // VVC_UNSPEC_28
223 "UNSPEC29", // VVC_UNSPEC_29
224 "UNSPEC30", // VVC_UNSPEC_30
225 "UNSPEC31", // VVC_UNSPEC_31
226 };
227
228 20593 static const char *vvc_nal_unit_name(int nal_type)
229 {
230
2/4
✓ Branch 0 taken 20593 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 20593 times.
20593 av_assert0(nal_type >= 0 && nal_type < 32);
231 20593 return vvc_nal_type_name[nal_type];
232 }
233
234 static const char *const hevc_nal_type_name[64] = {
235 "TRAIL_N", // HEVC_NAL_TRAIL_N
236 "TRAIL_R", // HEVC_NAL_TRAIL_R
237 "TSA_N", // HEVC_NAL_TSA_N
238 "TSA_R", // HEVC_NAL_TSA_R
239 "STSA_N", // HEVC_NAL_STSA_N
240 "STSA_R", // HEVC_NAL_STSA_R
241 "RADL_N", // HEVC_NAL_RADL_N
242 "RADL_R", // HEVC_NAL_RADL_R
243 "RASL_N", // HEVC_NAL_RASL_N
244 "RASL_R", // HEVC_NAL_RASL_R
245 "RSV_VCL_N10", // HEVC_NAL_VCL_N10
246 "RSV_VCL_R11", // HEVC_NAL_VCL_R11
247 "RSV_VCL_N12", // HEVC_NAL_VCL_N12
248 "RSV_VLC_R13", // HEVC_NAL_VCL_R13
249 "RSV_VCL_N14", // HEVC_NAL_VCL_N14
250 "RSV_VCL_R15", // HEVC_NAL_VCL_R15
251 "BLA_W_LP", // HEVC_NAL_BLA_W_LP
252 "BLA_W_RADL", // HEVC_NAL_BLA_W_RADL
253 "BLA_N_LP", // HEVC_NAL_BLA_N_LP
254 "IDR_W_RADL", // HEVC_NAL_IDR_W_RADL
255 "IDR_N_LP", // HEVC_NAL_IDR_N_LP
256 "CRA_NUT", // HEVC_NAL_CRA_NUT
257 "RSV_IRAP_VCL22", // HEVC_NAL_RSV_IRAP_VCL22
258 "RSV_IRAP_VCL23", // HEVC_NAL_RSV_IRAP_VCL23
259 "RSV_VCL24", // HEVC_NAL_RSV_VCL24
260 "RSV_VCL25", // HEVC_NAL_RSV_VCL25
261 "RSV_VCL26", // HEVC_NAL_RSV_VCL26
262 "RSV_VCL27", // HEVC_NAL_RSV_VCL27
263 "RSV_VCL28", // HEVC_NAL_RSV_VCL28
264 "RSV_VCL29", // HEVC_NAL_RSV_VCL29
265 "RSV_VCL30", // HEVC_NAL_RSV_VCL30
266 "RSV_VCL31", // HEVC_NAL_RSV_VCL31
267 "VPS", // HEVC_NAL_VPS
268 "SPS", // HEVC_NAL_SPS
269 "PPS", // HEVC_NAL_PPS
270 "AUD", // HEVC_NAL_AUD
271 "EOS_NUT", // HEVC_NAL_EOS_NUT
272 "EOB_NUT", // HEVC_NAL_EOB_NUT
273 "FD_NUT", // HEVC_NAL_FD_NUT
274 "SEI_PREFIX", // HEVC_NAL_SEI_PREFIX
275 "SEI_SUFFIX", // HEVC_NAL_SEI_SUFFIX
276 "RSV_NVCL41", // HEVC_NAL_RSV_NVCL41
277 "RSV_NVCL42", // HEVC_NAL_RSV_NVCL42
278 "RSV_NVCL43", // HEVC_NAL_RSV_NVCL43
279 "RSV_NVCL44", // HEVC_NAL_RSV_NVCL44
280 "RSV_NVCL45", // HEVC_NAL_RSV_NVCL45
281 "RSV_NVCL46", // HEVC_NAL_RSV_NVCL46
282 "RSV_NVCL47", // HEVC_NAL_RSV_NVCL47
283 "UNSPEC48", // HEVC_NAL_UNSPEC48
284 "UNSPEC49", // HEVC_NAL_UNSPEC49
285 "UNSPEC50", // HEVC_NAL_UNSPEC50
286 "UNSPEC51", // HEVC_NAL_UNSPEC51
287 "UNSPEC52", // HEVC_NAL_UNSPEC52
288 "UNSPEC53", // HEVC_NAL_UNSPEC53
289 "UNSPEC54", // HEVC_NAL_UNSPEC54
290 "UNSPEC55", // HEVC_NAL_UNSPEC55
291 "UNSPEC56", // HEVC_NAL_UNSPEC56
292 "UNSPEC57", // HEVC_NAL_UNSPEC57
293 "UNSPEC58", // HEVC_NAL_UNSPEC58
294 "UNSPEC59", // HEVC_NAL_UNSPEC59
295 "UNSPEC60", // HEVC_NAL_UNSPEC60
296 "UNSPEC61", // HEVC_NAL_UNSPEC61
297 "UNSPEC62", // HEVC_NAL_UNSPEC62
298 "UNSPEC63", // HEVC_NAL_UNSPEC63
299 };
300
301 102643 static const char *hevc_nal_unit_name(int nal_type)
302 {
303
2/4
✓ Branch 0 taken 102643 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 102643 times.
102643 av_assert0(nal_type >= 0 && nal_type < 64);
304 102643 return hevc_nal_type_name[nal_type];
305 }
306
307 static const char *const h264_nal_type_name[32] = {
308 "Unspecified 0", //H264_NAL_UNSPECIFIED
309 "Coded slice of a non-IDR picture", // H264_NAL_SLICE
310 "Coded slice data partition A", // H264_NAL_DPA
311 "Coded slice data partition B", // H264_NAL_DPB
312 "Coded slice data partition C", // H264_NAL_DPC
313 "IDR", // H264_NAL_IDR_SLICE
314 "SEI", // H264_NAL_SEI
315 "SPS", // H264_NAL_SPS
316 "PPS", // H264_NAL_PPS
317 "AUD", // H264_NAL_AUD
318 "End of sequence", // H264_NAL_END_SEQUENCE
319 "End of stream", // H264_NAL_END_STREAM
320 "Filler data", // H264_NAL_FILLER_DATA
321 "SPS extension", // H264_NAL_SPS_EXT
322 "Prefix", // H264_NAL_PREFIX
323 "Subset SPS", // H264_NAL_SUB_SPS
324 "Depth parameter set", // H264_NAL_DPS
325 "Reserved 17", // H264_NAL_RESERVED17
326 "Reserved 18", // H264_NAL_RESERVED18
327 "Auxiliary coded picture without partitioning", // H264_NAL_AUXILIARY_SLICE
328 "Slice extension", // H264_NAL_EXTEN_SLICE
329 "Slice extension for a depth view or a 3D-AVC texture view", // H264_NAL_DEPTH_EXTEN_SLICE
330 "Reserved 22", // H264_NAL_RESERVED22
331 "Reserved 23", // H264_NAL_RESERVED23
332 "Unspecified 24", // H264_NAL_UNSPECIFIED24
333 "Unspecified 25", // H264_NAL_UNSPECIFIED25
334 "Unspecified 26", // H264_NAL_UNSPECIFIED26
335 "Unspecified 27", // H264_NAL_UNSPECIFIED27
336 "Unspecified 28", // H264_NAL_UNSPECIFIED28
337 "Unspecified 29", // H264_NAL_UNSPECIFIED29
338 "Unspecified 30", // H264_NAL_UNSPECIFIED30
339 "Unspecified 31", // H264_NAL_UNSPECIFIED31
340 };
341
342 64571 static const char *h264_nal_unit_name(int nal_type)
343 {
344
2/4
✓ Branch 0 taken 64571 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 64571 times.
64571 av_assert0(nal_type >= 0 && nal_type < 32);
345 64571 return h264_nal_type_name[nal_type];
346 }
347
348 188094 static int get_bit_length(H2645NAL *nal, int min_size, int skip_trailing_zeros)
349 {
350 188094 int size = nal->size;
351 188094 int trailing_padding = 0;
352
353
5/6
✓ Branch 0 taken 237067 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 237067 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 48977 times.
✓ Branch 5 taken 188090 times.
237071 while (skip_trailing_zeros && size > 0 && nal->data[size - 1] == 0)
354 48977 size--;
355
356
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 188094 times.
188094 if (!size)
357 return 0;
358
359
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 188030 times.
188094 if (size <= min_size) {
360
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
64 if (nal->size < min_size)
361 return AVERROR_INVALIDDATA;
362 64 size = min_size;
363 } else {
364 188030 int v = nal->data[size - 1];
365 /* remove the stop bit and following trailing zeros,
366 * or nothing for damaged bitstreams */
367
1/2
✓ Branch 0 taken 188030 times.
✗ Branch 1 not taken.
188030 if (v)
368 188030 trailing_padding = ff_ctz(v) + 1;
369 }
370
371
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 188094 times.
188094 if (size > INT_MAX / 8)
372 return AVERROR(ERANGE);
373 188094 size *= 8;
374
375 188094 return size - trailing_padding;
376 }
377
378 /**
379 * @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
380 * 0 otherwise
381 */
382
383 285 static int lcevc_parse_nal_header(H2645NAL *nal, void *logctx)
384 {
385 285 GetBitContext *gb = &nal->gb;
386
387
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 285 times.
285 if (get_bits1(gb) != 0) //forbidden_zero_bit
388 return AVERROR_INVALIDDATA;
389
390
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 285 times.
285 if (get_bits1(gb) != 1) //forbidden_one_bit
391 return AVERROR_INVALIDDATA;
392
393 285 nal->type = get_bits(gb, 5);
394
395 285 av_log(logctx, AV_LOG_DEBUG,
396 "nal_unit_type: %d(%s)\n",
397 nal->type, lcevc_nal_unit_name(nal->type));
398
399 285 return 0;
400 }
401
402 20593 static int vvc_parse_nal_header(H2645NAL *nal, void *logctx)
403 {
404 20593 GetBitContext *gb = &nal->gb;
405
406
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 20593 times.
20593 if (get_bits1(gb) != 0) //forbidden_zero_bit
407 return AVERROR_INVALIDDATA;
408
409 20593 skip_bits1(gb); //nuh_reserved_zero_bit
410
411 20593 nal->nuh_layer_id = get_bits(gb, 6);
412 20593 nal->type = get_bits(gb, 5);
413 20593 nal->temporal_id = get_bits(gb, 3) - 1;
414
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 20593 times.
20593 if (nal->temporal_id < 0)
415 return AVERROR_INVALIDDATA;
416
417
5/6
✓ Branch 0 taken 12847 times.
✓ Branch 1 taken 7746 times.
✓ Branch 2 taken 1429 times.
✓ Branch 3 taken 11418 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1429 times.
20593 if ((nal->type >= VVC_IDR_W_RADL && nal->type <= VVC_RSV_IRAP_11) && nal->temporal_id)
418 return AVERROR_INVALIDDATA;
419
420 20593 av_log(logctx, AV_LOG_DEBUG,
421 "nal_unit_type: %d(%s), nuh_layer_id: %d, temporal_id: %d\n",
422 nal->type, vvc_nal_unit_name(nal->type), nal->nuh_layer_id, nal->temporal_id);
423
424 20593 return 0;
425 }
426
427 102645 static int hevc_parse_nal_header(H2645NAL *nal, void *logctx)
428 {
429 102645 GetBitContext *gb = &nal->gb;
430
431
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 102643 times.
102645 if (get_bits1(gb) != 0)
432 2 return AVERROR_INVALIDDATA;
433
434 102643 nal->type = get_bits(gb, 6);
435
436 102643 nal->nuh_layer_id = get_bits(gb, 6);
437 102643 nal->temporal_id = get_bits(gb, 3) - 1;
438
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 102643 times.
102643 if (nal->temporal_id < 0)
439 return AVERROR_INVALIDDATA;
440
441 102643 av_log(logctx, AV_LOG_DEBUG,
442 "nal_unit_type: %d(%s), nuh_layer_id: %d, temporal_id: %d\n",
443 nal->type, hevc_nal_unit_name(nal->type), nal->nuh_layer_id, nal->temporal_id);
444
445 102643 return 0;
446 }
447
448 64571 static int h264_parse_nal_header(H2645NAL *nal, void *logctx)
449 {
450 64571 GetBitContext *gb = &nal->gb;
451
452
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 64571 times.
64571 if (get_bits1(gb) != 0)
453 return AVERROR_INVALIDDATA;
454
455 64571 nal->ref_idc = get_bits(gb, 2);
456 64571 nal->type = get_bits(gb, 5);
457
458 64571 av_log(logctx, AV_LOG_DEBUG,
459 "nal_unit_type: %d(%s), nal_ref_idc: %d\n",
460 nal->type, h264_nal_unit_name(nal->type), nal->ref_idc);
461
462 64571 return 0;
463 }
464
465 177489 static int find_next_start_code(const uint8_t *buf, const uint8_t *next_avc)
466 {
467 177489 int i = 0;
468
469
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 177489 times.
177489 if (buf + 3 >= next_avc)
470 return next_avc - buf;
471
472
1/2
✓ Branch 0 taken 238149 times.
✗ Branch 1 not taken.
238149 while (buf + i + 3 < next_avc) {
473
4/6
✓ Branch 0 taken 238149 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 238149 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 177489 times.
✓ Branch 5 taken 60660 times.
238149 if (buf[i] == 0 && buf[i + 1] == 0 && buf[i + 2] == 1)
474 177489 break;
475 60660 i++;
476 }
477 177489 return i + 3;
478 }
479
480 68606 static void alloc_rbsp_buffer(H2645RBSP *rbsp, unsigned int size, int use_ref)
481 {
482 68606 int min_size = size;
483
484
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 68606 times.
68606 if (size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
485 goto fail;
486 68606 size += AV_INPUT_BUFFER_PADDING_SIZE;
487
488
2/2
✓ Branch 0 taken 63577 times.
✓ Branch 1 taken 5029 times.
68606 if (rbsp->rbsp_buffer_alloc_size >= size &&
489
4/4
✓ Branch 0 taken 11580 times.
✓ Branch 1 taken 51997 times.
✓ Branch 3 taken 10928 times.
✓ Branch 4 taken 652 times.
63577 (!rbsp->rbsp_buffer_ref || av_buffer_is_writable(rbsp->rbsp_buffer_ref))) {
490
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 62925 times.
62925 av_assert0(rbsp->rbsp_buffer);
491 62925 memset(rbsp->rbsp_buffer + min_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
492 62925 return;
493 }
494
495
1/2
✓ Branch 0 taken 5681 times.
✗ Branch 1 not taken.
5681 size = FFMIN(size + size / 16 + 32, INT_MAX);
496
497
2/2
✓ Branch 0 taken 1664 times.
✓ Branch 1 taken 4017 times.
5681 if (rbsp->rbsp_buffer_ref)
498 1664 av_buffer_unref(&rbsp->rbsp_buffer_ref);
499 else
500 4017 av_free(rbsp->rbsp_buffer);
501
502 5681 rbsp->rbsp_buffer = av_mallocz(size);
503
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5681 times.
5681 if (!rbsp->rbsp_buffer)
504 goto fail;
505 5681 rbsp->rbsp_buffer_alloc_size = size;
506
507
2/2
✓ Branch 0 taken 1917 times.
✓ Branch 1 taken 3764 times.
5681 if (use_ref) {
508 1917 rbsp->rbsp_buffer_ref = av_buffer_create(rbsp->rbsp_buffer, size,
509 NULL, NULL, 0);
510
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1917 times.
1917 if (!rbsp->rbsp_buffer_ref)
511 goto fail;
512 }
513
514 5681 return;
515
516 fail:
517 rbsp->rbsp_buffer_alloc_size = 0;
518 if (rbsp->rbsp_buffer_ref) {
519 av_buffer_unref(&rbsp->rbsp_buffer_ref);
520 rbsp->rbsp_buffer = NULL;
521 } else
522 av_freep(&rbsp->rbsp_buffer);
523
524 return;
525 }
526
527 68606 int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
528 void *logctx, int nal_length_size,
529 enum AVCodecID codec_id, int flags)
530 {
531 GetByteContext bc;
532 68606 int consumed, ret = 0;
533
2/2
✓ Branch 0 taken 62847 times.
✓ Branch 1 taken 5759 times.
68606 int next_avc = (flags & H2645_FLAG_IS_NALFF) ? 0 : length;
534
2/2
✓ Branch 0 taken 38647 times.
✓ Branch 1 taken 29959 times.
68606 int64_t padding = (flags & H2645_FLAG_SMALL_PADDING) ? 0 : MAX_MBPAIR_SIZE;
535
536 68606 bytestream2_init(&bc, buf, length);
537 68606 alloc_rbsp_buffer(&pkt->rbsp, length + padding, !!(flags & H2645_FLAG_USE_REF));
538
539
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 68606 times.
68606 if (!pkt->rbsp.rbsp_buffer)
540 return AVERROR(ENOMEM);
541
542 68606 pkt->rbsp.rbsp_buffer_size = 0;
543 68606 pkt->nb_nals = 0;
544
2/2
✓ Branch 1 taken 188095 times.
✓ Branch 2 taken 68605 times.
256700 while (bytestream2_get_bytes_left(&bc) >= 4) {
545 H2645NAL *nal;
546 188095 int extract_length = 0;
547 188095 int skip_trailing_zeros = 1;
548
549
2/2
✓ Branch 1 taken 10606 times.
✓ Branch 2 taken 177489 times.
188095 if (bytestream2_tell(&bc) == next_avc) {
550 10606 int i = 0;
551 10606 extract_length = get_nalsize(nal_length_size,
552 bc.buffer, bytestream2_get_bytes_left(&bc), &i, logctx);
553
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 10605 times.
10606 if (extract_length < 0)
554 1 return extract_length;
555
556 10605 bytestream2_skip(&bc, nal_length_size);
557
558 10605 next_avc = bytestream2_tell(&bc) + extract_length;
559 } else {
560 int buf_index;
561
562
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 177489 times.
177489 if (bytestream2_tell(&bc) > next_avc)
563 av_log(logctx, AV_LOG_WARNING, "Exceeded next NALFF position, re-syncing.\n");
564
565 /* search start code */
566 177489 buf_index = find_next_start_code(bc.buffer, buf + next_avc);
567
568 177489 bytestream2_skip(&bc, buf_index);
569
570
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 177489 times.
177489 if (!bytestream2_get_bytes_left(&bc)) {
571 if (pkt->nb_nals > 0) {
572 // No more start codes: we discarded some irrelevant
573 // bytes at the end of the packet.
574 return 0;
575 } else {
576 av_log(logctx, AV_LOG_ERROR, "No start code is found.\n");
577 return AVERROR_INVALIDDATA;
578 }
579 }
580
581
2/2
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 177483 times.
177489 extract_length = FFMIN(bytestream2_get_bytes_left(&bc), next_avc - bytestream2_tell(&bc));
582
583
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 177489 times.
177489 if (bytestream2_tell(&bc) >= next_avc) {
584 /* skip to the start of the next NAL */
585 bytestream2_skip(&bc, next_avc - bytestream2_tell(&bc));
586 continue;
587 }
588 }
589
590
2/2
✓ Branch 0 taken 15180 times.
✓ Branch 1 taken 172914 times.
188094 if (pkt->nals_allocated < pkt->nb_nals + 1) {
591 15180 int new_size = pkt->nals_allocated + 1;
592 void *tmp;
593
594
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15180 times.
15180 if (new_size >= INT_MAX / sizeof(*pkt->nals))
595 return AVERROR(ENOMEM);
596
597 15180 tmp = av_fast_realloc(pkt->nals, &pkt->nal_buffer_size, new_size * sizeof(*pkt->nals));
598
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15180 times.
15180 if (!tmp)
599 return AVERROR(ENOMEM);
600
601 15180 pkt->nals = tmp;
602 15180 memset(pkt->nals + pkt->nals_allocated, 0, sizeof(*pkt->nals));
603
604 15180 nal = &pkt->nals[pkt->nb_nals];
605
2/2
✓ Branch 0 taken 6456 times.
✓ Branch 1 taken 8724 times.
15180 nal->skipped_bytes_pos_size = FFMIN(1024, extract_length/3+1); // initial buffer size
606 15180 nal->skipped_bytes_pos = av_malloc_array(nal->skipped_bytes_pos_size, sizeof(*nal->skipped_bytes_pos));
607
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15180 times.
15180 if (!nal->skipped_bytes_pos)
608 return AVERROR(ENOMEM);
609
610 15180 pkt->nals_allocated = new_size;
611 }
612 188094 nal = &pkt->nals[pkt->nb_nals];
613
614 188094 consumed = ff_h2645_extract_rbsp(bc.buffer, extract_length, &pkt->rbsp, nal,
615 188094 !!(flags & H2645_FLAG_SMALL_PADDING));
616
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 188094 times.
188094 if (consumed < 0)
617 return consumed;
618
619
5/6
✓ Branch 0 taken 10617 times.
✓ Branch 1 taken 177477 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 10605 times.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
188094 if ((flags & H2645_FLAG_IS_NALFF) && (extract_length != consumed) && extract_length)
620 12 av_log(logctx, AV_LOG_DEBUG,
621 "NALFF: Consumed only %d bytes instead of %d\n",
622 consumed, extract_length);
623
624 188094 bytestream2_skip(&bc, consumed);
625
626 /* see commit 3566042a0 */
627
4/4
✓ Branch 1 taken 119500 times.
✓ Branch 2 taken 68594 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 119496 times.
307594 if (bytestream2_get_bytes_left(&bc) >= 4 &&
628 119500 bytestream2_peek_be32(&bc) == 0x000001E0)
629 4 skip_trailing_zeros = 0;
630
631
2/2
✓ Branch 0 taken 102645 times.
✓ Branch 1 taken 85449 times.
188094 nal->size_bits = get_bit_length(nal, 1 + (codec_id == AV_CODEC_ID_HEVC),
632 skip_trailing_zeros);
633
634
2/4
✓ Branch 0 taken 188094 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 188094 times.
188094 if (nal->size <= 0 || nal->size_bits <= 0)
635 continue;
636
637 188094 ret = init_get_bits(&nal->gb, nal->data, nal->size_bits);
638
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 188094 times.
188094 if (ret < 0)
639 return ret;
640
641 /* Reset type in case it contains a stale value from a previously parsed NAL */
642 188094 nal->type = 0;
643
644
2/2
✓ Branch 0 taken 20593 times.
✓ Branch 1 taken 167501 times.
188094 if (codec_id == AV_CODEC_ID_VVC)
645 20593 ret = vvc_parse_nal_header(nal, logctx);
646
2/2
✓ Branch 0 taken 285 times.
✓ Branch 1 taken 167216 times.
167501 else if (codec_id == AV_CODEC_ID_LCEVC)
647 285 ret = lcevc_parse_nal_header(nal, logctx);
648
2/2
✓ Branch 0 taken 102645 times.
✓ Branch 1 taken 64571 times.
167216 else if (codec_id == AV_CODEC_ID_HEVC) {
649 102645 ret = hevc_parse_nal_header(nal, logctx);
650
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 102645 times.
102645 if (nal->nuh_layer_id == 63)
651 continue;
652 } else
653 64571 ret = h264_parse_nal_header(nal, logctx);
654
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 188092 times.
188094 if (ret < 0) {
655 2 av_log(logctx, AV_LOG_WARNING,
656 "Failed to parse header of NALU (type %d): \"%s\". Skipping NALU.\n",
657 2 nal->type, av_err2str(ret));
658 2 continue;
659 }
660
661 188092 pkt->nb_nals++;
662 }
663
664 68605 return 0;
665 }
666
667 23777 int ff_h2645_unit_requires_zero_byte(enum AVCodecID codec_id,
668 unsigned int type,
669 int nal_unit_index)
670 {
671 // Section B.1.2 in H.264, section B.2.2 in H.265, H.266.
672
2/2
✓ Branch 0 taken 7915 times.
✓ Branch 1 taken 15862 times.
23777 if (nal_unit_index == 0) {
673 // Assume that this is the first NAL unit in an access unit.
674 7915 return 1;
675 }
676
2/2
✓ Branch 0 taken 5438 times.
✓ Branch 1 taken 10424 times.
15862 if (codec_id == AV_CODEC_ID_H264)
677
4/4
✓ Branch 0 taken 5428 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 450 times.
✓ Branch 3 taken 4978 times.
5438 return type == H264_NAL_SPS || type == H264_NAL_PPS;
678
2/2
✓ Branch 0 taken 6556 times.
✓ Branch 1 taken 3868 times.
10424 if (codec_id == AV_CODEC_ID_HEVC)
679
6/6
✓ Branch 0 taken 6553 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 6491 times.
✓ Branch 3 taken 62 times.
✓ Branch 4 taken 60 times.
✓ Branch 5 taken 6431 times.
6556 return type == HEVC_NAL_VPS || type == HEVC_NAL_SPS || type == HEVC_NAL_PPS;
680
1/2
✓ Branch 0 taken 3868 times.
✗ Branch 1 not taken.
3868 if (codec_id == AV_CODEC_ID_VVC)
681
4/4
✓ Branch 0 taken 2761 times.
✓ Branch 1 taken 1107 times.
✓ Branch 2 taken 488 times.
✓ Branch 3 taken 2273 times.
3868 return type >= VVC_OPI_NUT && type <= VVC_SUFFIX_APS_NUT;
682 return 0;
683 }
684
685 4457 void ff_h2645_packet_uninit(H2645Packet *pkt)
686 {
687 int i;
688
2/2
✓ Branch 0 taken 15180 times.
✓ Branch 1 taken 4457 times.
19637 for (i = 0; i < pkt->nals_allocated; i++) {
689 15180 av_freep(&pkt->nals[i].skipped_bytes_pos);
690 }
691 4457 av_freep(&pkt->nals);
692 4457 pkt->nals_allocated = pkt->nal_buffer_size = 0;
693
2/2
✓ Branch 0 taken 253 times.
✓ Branch 1 taken 4204 times.
4457 if (pkt->rbsp.rbsp_buffer_ref) {
694 253 av_buffer_unref(&pkt->rbsp.rbsp_buffer_ref);
695 253 pkt->rbsp.rbsp_buffer = NULL;
696 } else
697 4204 av_freep(&pkt->rbsp.rbsp_buffer);
698 4457 pkt->rbsp.rbsp_buffer_alloc_size = pkt->rbsp.rbsp_buffer_size = 0;
699 4457 }
700