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
29
34
36
39 {
42
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 for (
i = 0;
i + 1 < length;
i += 9) {
63 0x8000800080008080ULL))
64 continue;
65 FIND_FIRST_ZERO;
68 }
69 #else
70 for (
i = 0;
i + 1 < length;
i += 5) {
73 0x80008080U))
74 continue;
75 FIND_FIRST_ZERO;
78 }
79 #endif /* HAVE_FAST_64BIT */
80 #else
81 for (
i = 0;
i + 1 < length;
i += 2) {
83 continue;
84 if (
i > 0 &&
src[
i - 1] == 0)
87 }
88 #endif /* HAVE_FAST_UNALIGNED */
89
90 if (
i >= length - 1 && small_padding) {
// no escaped 0
95 return length;
96 }
else if (
i > length)
98
100
103 while (si + 2 < length) {
104 // remove escapes (very rare 1:2^22)
105 if (
src[si + 2] > 3) {
108 }
else if (
src[si] == 0 &&
src[si + 1] == 0 &&
src[si + 2] != 0) {
109 if (
src[si + 2] == 3) {
// escape
112 si += 3;
113
125 }
126 }
129 }
130 continue;
131 } else // next start code
132 goto nsc;
133 }
134
136 }
137 while (si < length)
139
140 nsc:
142
148
149 return si;
150 }
151
153 "TRAIL_NUT", // VVC_TRAIL_NUT
154 "STSA_NUT", // VVC_STSA_NUT
155 "RADL_NUT", // VVC_RADL_NUT
156 "RASL_NUT", // VVC_RASL_NUT
157 "RSV_VCL4", // VVC_RSV_VCL_4
158 "RSV_VCL5", // VVC_RSV_VCL_5
159 "RSV_VCL6", // VVC_RSV_VCL_6
160 "IDR_W_RADL", // VVC_IDR_W_RADL
161 "IDR_N_LP", // VVC_IDR_N_LP
162 "CRA_NUT", // VVC_CRA_NUT
163 "GDR_NUT", // VVC_GDR_NUT
164 "RSV_IRAP_11", // VVC_RSV_IRAP_11
165 "OPI_NUT", // VVC_OPI_NUT
166 "DCI_NUT", // VVC_DCI_NUT
167 "VPS_NUT", // VVC_VPS_NUT
168 "SPS_NUT", // VVC_SPS_NUT
169 "PPS_NUT", // VVC_PPS_NUT
170 "APS_PREFIX", // VVC_PREFIX_APS_NUT
171 "APS_SUFFIX", // VVC_SUFFIX_APS_NUT
172 "PH_NUT", // VVC_PH_NUT
173 "AUD_NUT", // VVC_AUD_NUT
174 "EOS_NUT", // VVC_EOS_NUT
175 "EOB_NUT", // VVC_EOB_NUT
176 "SEI_PREFIX", // VVC_PREFIX_SEI_NUT
177 "SEI_SUFFIX", // VVC_SUFFIX_SEI_NUT
178 "FD_NUT", // VVC_FD_NUT
179 "RSV_NVCL26", // VVC_RSV_NVCL_26
180 "RSV_NVCL27", // VVC_RSV_NVCL_27
181 "UNSPEC28", // VVC_UNSPEC_28
182 "UNSPEC29", // VVC_UNSPEC_29
183 "UNSPEC30", // VVC_UNSPEC_30
184 "UNSPEC31", // VVC_UNSPEC_31
185 };
186
188 {
191 }
192
194 "TRAIL_N", // HEVC_NAL_TRAIL_N
195 "TRAIL_R", // HEVC_NAL_TRAIL_R
196 "TSA_N", // HEVC_NAL_TSA_N
197 "TSA_R", // HEVC_NAL_TSA_R
198 "STSA_N", // HEVC_NAL_STSA_N
199 "STSA_R", // HEVC_NAL_STSA_R
200 "RADL_N", // HEVC_NAL_RADL_N
201 "RADL_R", // HEVC_NAL_RADL_R
202 "RASL_N", // HEVC_NAL_RASL_N
203 "RASL_R", // HEVC_NAL_RASL_R
204 "RSV_VCL_N10", // HEVC_NAL_VCL_N10
205 "RSV_VCL_R11", // HEVC_NAL_VCL_R11
206 "RSV_VCL_N12", // HEVC_NAL_VCL_N12
207 "RSV_VLC_R13", // HEVC_NAL_VCL_R13
208 "RSV_VCL_N14", // HEVC_NAL_VCL_N14
209 "RSV_VCL_R15", // HEVC_NAL_VCL_R15
210 "BLA_W_LP", // HEVC_NAL_BLA_W_LP
211 "BLA_W_RADL", // HEVC_NAL_BLA_W_RADL
212 "BLA_N_LP", // HEVC_NAL_BLA_N_LP
213 "IDR_W_RADL", // HEVC_NAL_IDR_W_RADL
214 "IDR_N_LP", // HEVC_NAL_IDR_N_LP
215 "CRA_NUT", // HEVC_NAL_CRA_NUT
216 "RSV_IRAP_VCL22", // HEVC_NAL_RSV_IRAP_VCL22
217 "RSV_IRAP_VCL23", // HEVC_NAL_RSV_IRAP_VCL23
218 "RSV_VCL24", // HEVC_NAL_RSV_VCL24
219 "RSV_VCL25", // HEVC_NAL_RSV_VCL25
220 "RSV_VCL26", // HEVC_NAL_RSV_VCL26
221 "RSV_VCL27", // HEVC_NAL_RSV_VCL27
222 "RSV_VCL28", // HEVC_NAL_RSV_VCL28
223 "RSV_VCL29", // HEVC_NAL_RSV_VCL29
224 "RSV_VCL30", // HEVC_NAL_RSV_VCL30
225 "RSV_VCL31", // HEVC_NAL_RSV_VCL31
226 "VPS", // HEVC_NAL_VPS
227 "SPS", // HEVC_NAL_SPS
228 "PPS", // HEVC_NAL_PPS
229 "AUD", // HEVC_NAL_AUD
230 "EOS_NUT", // HEVC_NAL_EOS_NUT
231 "EOB_NUT", // HEVC_NAL_EOB_NUT
232 "FD_NUT", // HEVC_NAL_FD_NUT
233 "SEI_PREFIX", // HEVC_NAL_SEI_PREFIX
234 "SEI_SUFFIX", // HEVC_NAL_SEI_SUFFIX
235 "RSV_NVCL41", // HEVC_NAL_RSV_NVCL41
236 "RSV_NVCL42", // HEVC_NAL_RSV_NVCL42
237 "RSV_NVCL43", // HEVC_NAL_RSV_NVCL43
238 "RSV_NVCL44", // HEVC_NAL_RSV_NVCL44
239 "RSV_NVCL45", // HEVC_NAL_RSV_NVCL45
240 "RSV_NVCL46", // HEVC_NAL_RSV_NVCL46
241 "RSV_NVCL47", // HEVC_NAL_RSV_NVCL47
242 "UNSPEC48", // HEVC_NAL_UNSPEC48
243 "UNSPEC49", // HEVC_NAL_UNSPEC49
244 "UNSPEC50", // HEVC_NAL_UNSPEC50
245 "UNSPEC51", // HEVC_NAL_UNSPEC51
246 "UNSPEC52", // HEVC_NAL_UNSPEC52
247 "UNSPEC53", // HEVC_NAL_UNSPEC53
248 "UNSPEC54", // HEVC_NAL_UNSPEC54
249 "UNSPEC55", // HEVC_NAL_UNSPEC55
250 "UNSPEC56", // HEVC_NAL_UNSPEC56
251 "UNSPEC57", // HEVC_NAL_UNSPEC57
252 "UNSPEC58", // HEVC_NAL_UNSPEC58
253 "UNSPEC59", // HEVC_NAL_UNSPEC59
254 "UNSPEC60", // HEVC_NAL_UNSPEC60
255 "UNSPEC61", // HEVC_NAL_UNSPEC61
256 "UNSPEC62", // HEVC_NAL_UNSPEC62
257 "UNSPEC63", // HEVC_NAL_UNSPEC63
258 };
259
261 {
264 }
265
267 "Unspecified 0", //H264_NAL_UNSPECIFIED
268 "Coded slice of a non-IDR picture", // H264_NAL_SLICE
269 "Coded slice data partition A", // H264_NAL_DPA
270 "Coded slice data partition B", // H264_NAL_DPB
271 "Coded slice data partition C", // H264_NAL_DPC
272 "IDR", // H264_NAL_IDR_SLICE
273 "SEI", // H264_NAL_SEI
274 "SPS", // H264_NAL_SPS
275 "PPS", // H264_NAL_PPS
276 "AUD", // H264_NAL_AUD
277 "End of sequence", // H264_NAL_END_SEQUENCE
278 "End of stream", // H264_NAL_END_STREAM
279 "Filler data", // H264_NAL_FILLER_DATA
280 "SPS extension", // H264_NAL_SPS_EXT
281 "Prefix", // H264_NAL_PREFIX
282 "Subset SPS", // H264_NAL_SUB_SPS
283 "Depth parameter set", // H264_NAL_DPS
284 "Reserved 17", // H264_NAL_RESERVED17
285 "Reserved 18", // H264_NAL_RESERVED18
286 "Auxiliary coded picture without partitioning", // H264_NAL_AUXILIARY_SLICE
287 "Slice extension", // H264_NAL_EXTEN_SLICE
288 "Slice extension for a depth view or a 3D-AVC texture view", // H264_NAL_DEPTH_EXTEN_SLICE
289 "Reserved 22", // H264_NAL_RESERVED22
290 "Reserved 23", // H264_NAL_RESERVED23
291 "Unspecified 24", // H264_NAL_UNSPECIFIED24
292 "Unspecified 25", // H264_NAL_UNSPECIFIED25
293 "Unspecified 26", // H264_NAL_UNSPECIFIED26
294 "Unspecified 27", // H264_NAL_UNSPECIFIED27
295 "Unspecified 28", // H264_NAL_UNSPECIFIED28
296 "Unspecified 29", // H264_NAL_UNSPECIFIED29
297 "Unspecified 30", // H264_NAL_UNSPECIFIED30
298 "Unspecified 31", // H264_NAL_UNSPECIFIED31
299 };
300
302 {
305 }
306
308 {
310 int trailing_padding = 0;
311
312 while (skip_trailing_zeros &&
size > 0 && nal->
data[
size - 1] == 0)
314
316 return 0;
317
318 if (
size <= min_size) {
319 if (nal->
size < min_size)
322 } else {
324 /* remove the stop bit and following trailing zeros,
325 * or nothing for damaged bitstreams */
326 if (v)
327 trailing_padding =
ff_ctz(v) + 1;
328 }
329
330 if (
size > INT_MAX / 8)
333
334 return size - trailing_padding;
335 }
336
337 /**
338 * @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
339 * 0 otherwise
340 */
342 {
344
345 if (
get_bits1(gb) != 0)
//forbidden_zero_bit
347
349
355
358
360 "nal_unit_type: %d(%s), nuh_layer_id: %d, temporal_id: %d\n",
362
363 return 0;
364 }
365
367 {
369
372
374
379
381 "nal_unit_type: %d(%s), nuh_layer_id: %d, temporal_id: %d\n",
383
384 return 0;
385 }
386
388 {
390
393
396
398 "nal_unit_type: %d(%s), nal_ref_idc: %d\n",
400
401 return 0;
402 }
403
405 {
407
408 if (buf + 3 >= next_avc)
409 return next_avc - buf;
410
411 while (buf +
i + 3 < next_avc) {
412 if (buf[
i] == 0 && buf[
i + 1] == 0 && buf[
i + 2] == 1)
413 break;
415 }
417 }
418
420 {
422
426
431 return;
432 }
433
435
438 else
440
445
446 if (use_ref) {
451 }
452
453 return;
454
460 } else
462
463 return;
464 }
465
467 void *logctx, int nal_length_size,
469 {
471 int consumed,
ret = 0;
474
477
478 if (!
pkt->rbsp.rbsp_buffer)
480
481 pkt->rbsp.rbsp_buffer_size = 0;
485 int extract_length = 0;
486 int skip_trailing_zeros = 1;
487
492 if (extract_length < 0)
493 return extract_length;
494
496
498 } else {
499 int buf_index;
500
503
504 /* search start code */
506
508
510 if (
pkt->nb_nals > 0) {
511 // No more start codes: we discarded some irrelevant
512 // bytes at the end of the packet.
513 return 0;
514 } else {
517 }
518 }
519
521
523 /* skip to the start of the next NAL */
525 continue;
526 }
527 }
528
529 if (
pkt->nals_allocated <
pkt->nb_nals + 1) {
530 int new_size =
pkt->nals_allocated + 1;
532
533 if (new_size >= INT_MAX /
sizeof(*
pkt->nals))
535
539
541 memset(
pkt->nals +
pkt->nals_allocated, 0,
sizeof(*
pkt->nals));
542
543 nal = &
pkt->nals[
pkt->nb_nals];
548
549 pkt->nals_allocated = new_size;
550 }
551 nal = &
pkt->nals[
pkt->nb_nals];
552
555 if (consumed < 0)
556 return consumed;
557
560 "NALFF: Consumed only %d bytes instead of %d\n",
561 consumed, extract_length);
562
564
565 /* see commit 3566042a0 */
567 bytestream2_peek_be32(&bc) == 0x000001E0)
568 skip_trailing_zeros = 0;
569
571 skip_trailing_zeros);
572
574 continue;
575
579
580 /* Reset type in case it contains a stale value from a previously parsed NAL */
582
588 continue;
589 } else
593 "Failed to parse header of NALU (type %d): \"%s\". Skipping NALU.\n",
595 continue;
596 }
597
599 }
600
601 return 0;
602 }
603
605 {
607 for (
i = 0;
i <
pkt->nals_allocated;
i++) {
609 }
611 pkt->nals_allocated =
pkt->nal_buffer_size = 0;
612 if (
pkt->rbsp.rbsp_buffer_ref) {
615 } else
617 pkt->rbsp.rbsp_buffer_alloc_size =
pkt->rbsp.rbsp_buffer_size = 0;
618 }