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
28
34
37 {
39 uint8_t *dst;
40
42 #define STARTCODE_TEST \
43 if (i + 2 < length && src[i + 1] == 0 && \
44 (src[i + 2] == 3 || src[i + 2] == 1)) { \
45 if (src[i + 2] == 1) { \
46 /* startcode, so we must be past the end */ \
47 length = i; \
48 } \
49 break; \
50 }
51 #if HAVE_FAST_UNALIGNED
52 #define FIND_FIRST_ZERO \
53 if (i > 0 && !src[i]) \
54 i--; \
55 while (src[i]) \
56 i++
57 #if HAVE_FAST_64BIT
58 for (
i = 0;
i + 1 < length;
i += 9) {
61 0x8000800080008080ULL))
62 continue;
63 FIND_FIRST_ZERO;
66 }
67 #else
68 for (
i = 0;
i + 1 < length;
i += 5) {
71 0x80008080U))
72 continue;
73 FIND_FIRST_ZERO;
76 }
77 #endif /* HAVE_FAST_64BIT */
78 #else
79 for (
i = 0;
i + 1 < length;
i += 2) {
81 continue;
82 if (
i > 0 &&
src[
i - 1] == 0)
85 }
86 #endif /* HAVE_FAST_UNALIGNED */
87
88 if (
i >= length - 1 && small_padding) {
// no escaped 0
93 return length;
94 }
else if (
i > length)
96
98
101 while (si + 2 < length) {
102 // remove escapes (very rare 1:2^22)
103 if (
src[si + 2] > 3) {
104 dst[di++] =
src[si++];
105 dst[di++] =
src[si++];
106 }
else if (
src[si] == 0 &&
src[si + 1] == 0 &&
src[si + 2] != 0) {
107 if (
src[si + 2] == 3) {
// escape
108 dst[di++] = 0;
109 dst[di++] = 0;
110 si += 3;
111
123 }
124 }
127 }
128 continue;
129 } else // next start code
130 goto nsc;
131 }
132
133 dst[di++] =
src[si++];
134 }
135 while (si < length)
136 dst[di++] =
src[si++];
137
138 nsc:
140
146
147 return si;
148 }
149
151 "TRAIL_NUT", // VVC_TRAIL_NUT
152 "STSA_NUT", // VVC_STSA_NUT
153 "RADL_NUT", // VVC_RADL_NUT
154 "RASL_NUT", // VVC_RASL_NUT
155 "RSV_VCL4", // VVC_RSV_VCL_4
156 "RSV_VCL5", // VVC_RSV_VCL_5
157 "RSV_VCL6", // VVC_RSV_VCL_6
158 "IDR_W_RADL", // VVC_IDR_W_RADL
159 "IDR_N_LP", // VVC_IDR_N_LP
160 "CRA_NUT", // VVC_CRA_NUT
161 "GDR_NUT", // VVC_GDR_NUT
162 "RSV_IRAP_11", // VVC_RSV_IRAP_11
163 "OPI_NUT", // VVC_OPI_NUT
164 "DCI_NUT", // VVC_DCI_NUT
165 "VPS_NUT", // VVC_VPS_NUT
166 "SPS_NUT", // VVC_SPS_NUT
167 "PPS_NUT", // VVC_PPS_NUT
168 "APS_PREFIX", // VVC_PREFIX_APS_NUT
169 "APS_SUFFIX", // VVC_SUFFIX_APS_NUT
170 "PH_NUT", // VVC_PH_NUT
171 "AUD_NUT", // VVC_AUD_NUT
172 "EOS_NUT", // VVC_EOS_NUT
173 "EOB_NUT", // VVC_EOB_NUT
174 "SEI_PREFIX", // VVC_PREFIX_SEI_NUT
175 "SEI_SUFFIX", // VVC_SUFFIX_SEI_NUT
176 "FD_NUT", // VVC_FD_NUT
177 "RSV_NVCL26", // VVC_RSV_NVCL_26
178 "RSV_NVCL27", // VVC_RSV_NVCL_27
179 "UNSPEC28", // VVC_UNSPEC_28
180 "UNSPEC29", // VVC_UNSPEC_29
181 "UNSPEC30", // VVC_UNSPEC_30
182 "UNSPEC31", // VVC_UNSPEC_31
183 };
184
186 {
189 }
190
192 "TRAIL_N", // HEVC_NAL_TRAIL_N
193 "TRAIL_R", // HEVC_NAL_TRAIL_R
194 "TSA_N", // HEVC_NAL_TSA_N
195 "TSA_R", // HEVC_NAL_TSA_R
196 "STSA_N", // HEVC_NAL_STSA_N
197 "STSA_R", // HEVC_NAL_STSA_R
198 "RADL_N", // HEVC_NAL_RADL_N
199 "RADL_R", // HEVC_NAL_RADL_R
200 "RASL_N", // HEVC_NAL_RASL_N
201 "RASL_R", // HEVC_NAL_RASL_R
202 "RSV_VCL_N10", // HEVC_NAL_VCL_N10
203 "RSV_VCL_R11", // HEVC_NAL_VCL_R11
204 "RSV_VCL_N12", // HEVC_NAL_VCL_N12
205 "RSV_VLC_R13", // HEVC_NAL_VCL_R13
206 "RSV_VCL_N14", // HEVC_NAL_VCL_N14
207 "RSV_VCL_R15", // HEVC_NAL_VCL_R15
208 "BLA_W_LP", // HEVC_NAL_BLA_W_LP
209 "BLA_W_RADL", // HEVC_NAL_BLA_W_RADL
210 "BLA_N_LP", // HEVC_NAL_BLA_N_LP
211 "IDR_W_RADL", // HEVC_NAL_IDR_W_RADL
212 "IDR_N_LP", // HEVC_NAL_IDR_N_LP
213 "CRA_NUT", // HEVC_NAL_CRA_NUT
214 "RSV_IRAP_VCL22", // HEVC_NAL_RSV_IRAP_VCL22
215 "RSV_IRAP_VCL23", // HEVC_NAL_RSV_IRAP_VCL23
216 "RSV_VCL24", // HEVC_NAL_RSV_VCL24
217 "RSV_VCL25", // HEVC_NAL_RSV_VCL25
218 "RSV_VCL26", // HEVC_NAL_RSV_VCL26
219 "RSV_VCL27", // HEVC_NAL_RSV_VCL27
220 "RSV_VCL28", // HEVC_NAL_RSV_VCL28
221 "RSV_VCL29", // HEVC_NAL_RSV_VCL29
222 "RSV_VCL30", // HEVC_NAL_RSV_VCL30
223 "RSV_VCL31", // HEVC_NAL_RSV_VCL31
224 "VPS", // HEVC_NAL_VPS
225 "SPS", // HEVC_NAL_SPS
226 "PPS", // HEVC_NAL_PPS
227 "AUD", // HEVC_NAL_AUD
228 "EOS_NUT", // HEVC_NAL_EOS_NUT
229 "EOB_NUT", // HEVC_NAL_EOB_NUT
230 "FD_NUT", // HEVC_NAL_FD_NUT
231 "SEI_PREFIX", // HEVC_NAL_SEI_PREFIX
232 "SEI_SUFFIX", // HEVC_NAL_SEI_SUFFIX
233 "RSV_NVCL41", // HEVC_NAL_RSV_NVCL41
234 "RSV_NVCL42", // HEVC_NAL_RSV_NVCL42
235 "RSV_NVCL43", // HEVC_NAL_RSV_NVCL43
236 "RSV_NVCL44", // HEVC_NAL_RSV_NVCL44
237 "RSV_NVCL45", // HEVC_NAL_RSV_NVCL45
238 "RSV_NVCL46", // HEVC_NAL_RSV_NVCL46
239 "RSV_NVCL47", // HEVC_NAL_RSV_NVCL47
240 "UNSPEC48", // HEVC_NAL_UNSPEC48
241 "UNSPEC49", // HEVC_NAL_UNSPEC49
242 "UNSPEC50", // HEVC_NAL_UNSPEC50
243 "UNSPEC51", // HEVC_NAL_UNSPEC51
244 "UNSPEC52", // HEVC_NAL_UNSPEC52
245 "UNSPEC53", // HEVC_NAL_UNSPEC53
246 "UNSPEC54", // HEVC_NAL_UNSPEC54
247 "UNSPEC55", // HEVC_NAL_UNSPEC55
248 "UNSPEC56", // HEVC_NAL_UNSPEC56
249 "UNSPEC57", // HEVC_NAL_UNSPEC57
250 "UNSPEC58", // HEVC_NAL_UNSPEC58
251 "UNSPEC59", // HEVC_NAL_UNSPEC59
252 "UNSPEC60", // HEVC_NAL_UNSPEC60
253 "UNSPEC61", // HEVC_NAL_UNSPEC61
254 "UNSPEC62", // HEVC_NAL_UNSPEC62
255 "UNSPEC63", // HEVC_NAL_UNSPEC63
256 };
257
259 {
262 }
263
265 "Unspecified 0", //H264_NAL_UNSPECIFIED
266 "Coded slice of a non-IDR picture", // H264_NAL_SLICE
267 "Coded slice data partition A", // H264_NAL_DPA
268 "Coded slice data partition B", // H264_NAL_DPB
269 "Coded slice data partition C", // H264_NAL_DPC
270 "IDR", // H264_NAL_IDR_SLICE
271 "SEI", // H264_NAL_SEI
272 "SPS", // H264_NAL_SPS
273 "PPS", // H264_NAL_PPS
274 "AUD", // H264_NAL_AUD
275 "End of sequence", // H264_NAL_END_SEQUENCE
276 "End of stream", // H264_NAL_END_STREAM
277 "Filler data", // H264_NAL_FILLER_DATA
278 "SPS extension", // H264_NAL_SPS_EXT
279 "Prefix", // H264_NAL_PREFIX
280 "Subset SPS", // H264_NAL_SUB_SPS
281 "Depth parameter set", // H264_NAL_DPS
282 "Reserved 17", // H264_NAL_RESERVED17
283 "Reserved 18", // H264_NAL_RESERVED18
284 "Auxiliary coded picture without partitioning", // H264_NAL_AUXILIARY_SLICE
285 "Slice extension", // H264_NAL_EXTEN_SLICE
286 "Slice extension for a depth view or a 3D-AVC texture view", // H264_NAL_DEPTH_EXTEN_SLICE
287 "Reserved 22", // H264_NAL_RESERVED22
288 "Reserved 23", // H264_NAL_RESERVED23
289 "Unspecified 24", // H264_NAL_UNSPECIFIED24
290 "Unspecified 25", // H264_NAL_UNSPECIFIED25
291 "Unspecified 26", // H264_NAL_UNSPECIFIED26
292 "Unspecified 27", // H264_NAL_UNSPECIFIED27
293 "Unspecified 28", // H264_NAL_UNSPECIFIED28
294 "Unspecified 29", // H264_NAL_UNSPECIFIED29
295 "Unspecified 30", // H264_NAL_UNSPECIFIED30
296 "Unspecified 31", // H264_NAL_UNSPECIFIED31
297 };
298
300 {
303 }
304
306 {
308 int trailing_padding = 0;
309
310 while (skip_trailing_zeros &&
size > 0 && nal->
data[
size - 1] == 0)
312
314 return 0;
315
316 if (
size <= min_size) {
317 if (nal->
size < min_size)
320 } else {
322 /* remove the stop bit and following trailing zeros,
323 * or nothing for damaged bitstreams */
324 if (v)
325 trailing_padding =
ff_ctz(v) + 1;
326 }
327
328 if (
size > INT_MAX / 8)
331
332 return size - trailing_padding;
333 }
334
335 /**
336 * @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
337 * 0 otherwise
338 */
340 {
342
343 if (
get_bits1(gb) != 0)
//forbidden_zero_bit
345
347
353
356
358 "nal_unit_type: %d(%s), nuh_layer_id: %d, temporal_id: %d\n",
360
361 return 0;
362 }
363
365 {
367
370
372
377
379 "nal_unit_type: %d(%s), nuh_layer_id: %d, temporal_id: %d\n",
381
382 return 0;
383 }
384
386 {
388
391
394
396 "nal_unit_type: %d(%s), nal_ref_idc: %d\n",
398
399 return 0;
400 }
401
403 {
405
406 if (buf + 3 >= next_avc)
407 return next_avc - buf;
408
409 while (buf +
i + 3 < next_avc) {
410 if (buf[
i] == 0 && buf[
i + 1] == 0 && buf[
i + 2] == 1)
411 break;
413 }
415 }
416
418 {
420
424
429 return;
430 }
431
433
436 else
438
443
444 if (use_ref) {
449 }
450
451 return;
452
458 } else
460
461 return;
462 }
463
465 void *logctx, int is_nalff, int nal_length_size,
467 {
469 int consumed,
ret = 0;
470 int next_avc = is_nalff ? 0 : length;
472
475
476 if (!
pkt->rbsp.rbsp_buffer)
478
479 pkt->rbsp.rbsp_buffer_size = 0;
483 int extract_length = 0;
484 int skip_trailing_zeros = 1;
485
490 if (extract_length < 0)
491 return extract_length;
492
494
496 } else {
497 int buf_index;
498
501
502 /* search start code */
504
506
508 if (
pkt->nb_nals > 0) {
509 // No more start codes: we discarded some irrelevant
510 // bytes at the end of the packet.
511 return 0;
512 } else {
515 }
516 }
517
519
521 /* skip to the start of the next NAL */
523 continue;
524 }
525 }
526
527 if (
pkt->nals_allocated <
pkt->nb_nals + 1) {
528 int new_size =
pkt->nals_allocated + 1;
530
531 if (new_size >= INT_MAX /
sizeof(*
pkt->nals))
533
537
539 memset(
pkt->nals +
pkt->nals_allocated, 0,
sizeof(*
pkt->nals));
540
541 nal = &
pkt->nals[
pkt->nb_nals];
546
547 pkt->nals_allocated = new_size;
548 }
549 nal = &
pkt->nals[
pkt->nb_nals];
550
552 if (consumed < 0)
553 return consumed;
554
555 if (is_nalff && (extract_length != consumed) && extract_length)
557 "NALFF: Consumed only %d bytes instead of %d\n",
558 consumed, extract_length);
559
561
562 /* see commit 3566042a0 */
564 bytestream2_peek_be32(&bc) == 0x000001E0)
565 skip_trailing_zeros = 0;
566
568 skip_trailing_zeros);
569
571 continue;
572
576
577 /* Reset type in case it contains a stale value from a previously parsed NAL */
579
584 else
589 continue;
590 }
591
593 }
594
595 return 0;
596 }
597
599 {
601 for (
i = 0;
i <
pkt->nals_allocated;
i++) {
603 }
605 pkt->nals_allocated =
pkt->nal_buffer_size = 0;
606 if (
pkt->rbsp.rbsp_buffer_ref) {
609 } else
611 pkt->rbsp.rbsp_buffer_alloc_size =
pkt->rbsp.rbsp_buffer_size = 0;
612 }