FFmpeg
h2645_parse.c
Go to the documentation of this file.
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 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  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  for (i = 0; i + 1 < length; i += 9) {
61  if (!((~AV_RN64(src + i) &
62  (AV_RN64(src + i) - 0x0100010001000101ULL)) &
63  0x8000800080008080ULL))
64  continue;
65  FIND_FIRST_ZERO;
67  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;
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--;
87  }
88 #endif /* HAVE_FAST_UNALIGNED */
89 
90  if (i >= length - 1 && small_padding) { // no escaped 0
91  nal->data =
92  nal->raw_data = src;
93  nal->size =
94  nal->raw_size = length;
95  return length;
96  } else if (i > length)
97  i = length;
98 
99  dst = &rbsp->rbsp_buffer[rbsp->rbsp_buffer_size];
100 
101  memcpy(dst, src, i);
102  si = di = i;
103  while (si + 2 < length) {
104  // remove escapes (very rare 1:2^22)
105  if (src[si + 2] > 3) {
106  dst[di++] = src[si++];
107  dst[di++] = src[si++];
108  } else if (src[si] == 0 && src[si + 1] == 0 && src[si + 2] != 0) {
109  if (src[si + 2] == 3) { // escape
110  dst[di++] = 0;
111  dst[di++] = 0;
112  si += 3;
113 
114  if (nal->skipped_bytes_pos) {
115  nal->skipped_bytes++;
116  if (nal->skipped_bytes_pos_size < nal->skipped_bytes) {
117  nal->skipped_bytes_pos_size *= 2;
118  av_assert0(nal->skipped_bytes_pos_size >= nal->skipped_bytes);
119  av_reallocp_array(&nal->skipped_bytes_pos,
120  nal->skipped_bytes_pos_size,
121  sizeof(*nal->skipped_bytes_pos));
122  if (!nal->skipped_bytes_pos) {
123  nal->skipped_bytes_pos_size = 0;
124  return AVERROR(ENOMEM);
125  }
126  }
127  if (nal->skipped_bytes_pos)
128  nal->skipped_bytes_pos[nal->skipped_bytes-1] = di - 1;
129  }
130  continue;
131  } else // next start code
132  goto nsc;
133  }
134 
135  dst[di++] = src[si++];
136  }
137  while (si < length)
138  dst[di++] = src[si++];
139 
140 nsc:
141  memset(dst + di, 0, AV_INPUT_BUFFER_PADDING_SIZE);
142 
143  nal->data = dst;
144  nal->size = di;
145  nal->raw_data = src;
146  nal->raw_size = si;
147  rbsp->rbsp_buffer_size += si;
148 
149  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 static const char *lcevc_nal_unit_name(int nal_type)
188 {
189  av_assert0(nal_type >= 0 && nal_type < 32);
190  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 static const char *vvc_nal_unit_name(int nal_type)
229 {
230  av_assert0(nal_type >= 0 && nal_type < 32);
231  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 static const char *hevc_nal_unit_name(int nal_type)
302 {
303  av_assert0(nal_type >= 0 && nal_type < 64);
304  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 static const char *h264_nal_unit_name(int nal_type)
343 {
344  av_assert0(nal_type >= 0 && nal_type < 32);
345  return h264_nal_type_name[nal_type];
346 }
347 
348 static int get_bit_length(H2645NAL *nal, int min_size, int skip_trailing_zeros)
349 {
350  int size = nal->size;
351  int trailing_padding = 0;
352 
353  while (skip_trailing_zeros && size > 0 && nal->data[size - 1] == 0)
354  size--;
355 
356  if (!size)
357  return 0;
358 
359  if (size <= min_size) {
360  if (nal->size < min_size)
361  return AVERROR_INVALIDDATA;
362  size = min_size;
363  } else {
364  int v = nal->data[size - 1];
365  /* remove the stop bit and following trailing zeros,
366  * or nothing for damaged bitstreams */
367  if (v)
368  trailing_padding = ff_ctz(v) + 1;
369  }
370 
371  if (size > INT_MAX / 8)
372  return AVERROR(ERANGE);
373  size *= 8;
374 
375  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 static int lcevc_parse_nal_header(H2645NAL *nal, void *logctx)
384 {
385  GetBitContext *gb = &nal->gb;
386 
387  if (get_bits1(gb) != 0) //forbidden_zero_bit
388  return AVERROR_INVALIDDATA;
389 
390  if (get_bits1(gb) != 1) //forbidden_one_bit
391  return AVERROR_INVALIDDATA;
392 
393  nal->type = get_bits(gb, 5);
394 
395  av_log(logctx, AV_LOG_DEBUG,
396  "nal_unit_type: %d(%s)\n",
397  nal->type, lcevc_nal_unit_name(nal->type));
398 
399  return 0;
400 }
401 
402 static int vvc_parse_nal_header(H2645NAL *nal, void *logctx)
403 {
404  GetBitContext *gb = &nal->gb;
405 
406  if (get_bits1(gb) != 0) //forbidden_zero_bit
407  return AVERROR_INVALIDDATA;
408 
409  skip_bits1(gb); //nuh_reserved_zero_bit
410 
411  nal->nuh_layer_id = get_bits(gb, 6);
412  nal->type = get_bits(gb, 5);
413  nal->temporal_id = get_bits(gb, 3) - 1;
414  if (nal->temporal_id < 0)
415  return AVERROR_INVALIDDATA;
416 
417  if ((nal->type >= VVC_IDR_W_RADL && nal->type <= VVC_RSV_IRAP_11) && nal->temporal_id)
418  return AVERROR_INVALIDDATA;
419 
420  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  return 0;
425 }
426 
427 static int hevc_parse_nal_header(H2645NAL *nal, void *logctx)
428 {
429  GetBitContext *gb = &nal->gb;
430 
431  if (get_bits1(gb) != 0)
432  return AVERROR_INVALIDDATA;
433 
434  nal->type = get_bits(gb, 6);
435 
436  nal->nuh_layer_id = get_bits(gb, 6);
437  nal->temporal_id = get_bits(gb, 3) - 1;
438  if (nal->temporal_id < 0)
439  return AVERROR_INVALIDDATA;
440 
441  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  return 0;
446 }
447 
448 static int h264_parse_nal_header(H2645NAL *nal, void *logctx)
449 {
450  GetBitContext *gb = &nal->gb;
451 
452  if (get_bits1(gb) != 0)
453  return AVERROR_INVALIDDATA;
454 
455  nal->ref_idc = get_bits(gb, 2);
456  nal->type = get_bits(gb, 5);
457 
458  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  return 0;
463 }
464 
465 static int find_next_start_code(const uint8_t *buf, const uint8_t *next_avc)
466 {
467  int i = 0;
468 
469  if (buf + 3 >= next_avc)
470  return next_avc - buf;
471 
472  while (buf + i + 3 < next_avc) {
473  if (buf[i] == 0 && buf[i + 1] == 0 && buf[i + 2] == 1)
474  break;
475  i++;
476  }
477  return i + 3;
478 }
479 
480 static void alloc_rbsp_buffer(H2645RBSP *rbsp, unsigned int size, int use_ref)
481 {
482  int min_size = size;
483 
484  if (size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
485  goto fail;
487 
488  if (rbsp->rbsp_buffer_alloc_size >= size &&
490  av_assert0(rbsp->rbsp_buffer);
491  memset(rbsp->rbsp_buffer + min_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
492  return;
493  }
494 
495  size = FFMIN(size + size / 16 + 32, INT_MAX);
496 
497  if (rbsp->rbsp_buffer_ref)
499  else
500  av_free(rbsp->rbsp_buffer);
501 
502  rbsp->rbsp_buffer = av_mallocz(size);
503  if (!rbsp->rbsp_buffer)
504  goto fail;
506 
507  if (use_ref) {
509  NULL, NULL, 0);
510  if (!rbsp->rbsp_buffer_ref)
511  goto fail;
512  }
513 
514  return;
515 
516 fail:
517  rbsp->rbsp_buffer_alloc_size = 0;
518  if (rbsp->rbsp_buffer_ref) {
520  rbsp->rbsp_buffer = NULL;
521  } else
522  av_freep(&rbsp->rbsp_buffer);
523 
524  return;
525 }
526 
527 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  int consumed, ret = 0;
533  int next_avc = (flags & H2645_FLAG_IS_NALFF) ? 0 : length;
535 
536  bytestream2_init(&bc, buf, length);
537  alloc_rbsp_buffer(&pkt->rbsp, length + padding, !!(flags & H2645_FLAG_USE_REF));
538 
539  if (!pkt->rbsp.rbsp_buffer)
540  return AVERROR(ENOMEM);
541 
542  pkt->rbsp.rbsp_buffer_size = 0;
543  pkt->nb_nals = 0;
544  while (bytestream2_get_bytes_left(&bc) >= 4) {
545  H2645NAL *nal;
546  int extract_length = 0;
547  int skip_trailing_zeros = 1;
548 
549  if (bytestream2_tell(&bc) == next_avc) {
550  int i = 0;
551  extract_length = get_nalsize(nal_length_size,
552  bc.buffer, bytestream2_get_bytes_left(&bc), &i, logctx);
553  if (extract_length < 0)
554  return extract_length;
555 
556  bytestream2_skip(&bc, nal_length_size);
557 
558  next_avc = bytestream2_tell(&bc) + extract_length;
559  } else {
560  int buf_index;
561 
562  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  buf_index = find_next_start_code(bc.buffer, buf + next_avc);
567 
568  bytestream2_skip(&bc, buf_index);
569 
570  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  extract_length = FFMIN(bytestream2_get_bytes_left(&bc), next_avc - bytestream2_tell(&bc));
582 
583  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  if (pkt->nals_allocated < pkt->nb_nals + 1) {
591  int new_size = pkt->nals_allocated + 1;
592  void *tmp;
593 
594  if (new_size >= INT_MAX / sizeof(*pkt->nals))
595  return AVERROR(ENOMEM);
596 
597  tmp = av_fast_realloc(pkt->nals, &pkt->nal_buffer_size, new_size * sizeof(*pkt->nals));
598  if (!tmp)
599  return AVERROR(ENOMEM);
600 
601  pkt->nals = tmp;
602  memset(pkt->nals + pkt->nals_allocated, 0, sizeof(*pkt->nals));
603 
604  nal = &pkt->nals[pkt->nb_nals];
605  nal->skipped_bytes_pos_size = FFMIN(1024, extract_length/3+1); // initial buffer size
606  nal->skipped_bytes_pos = av_malloc_array(nal->skipped_bytes_pos_size, sizeof(*nal->skipped_bytes_pos));
607  if (!nal->skipped_bytes_pos)
608  return AVERROR(ENOMEM);
609 
610  pkt->nals_allocated = new_size;
611  }
612  nal = &pkt->nals[pkt->nb_nals];
613 
614  consumed = ff_h2645_extract_rbsp(bc.buffer, extract_length, &pkt->rbsp, nal,
616  if (consumed < 0)
617  return consumed;
618 
619  if ((flags & H2645_FLAG_IS_NALFF) && (extract_length != consumed) && extract_length)
620  av_log(logctx, AV_LOG_DEBUG,
621  "NALFF: Consumed only %d bytes instead of %d\n",
622  consumed, extract_length);
623 
624  bytestream2_skip(&bc, consumed);
625 
626  /* see commit 3566042a0 */
627  if (bytestream2_get_bytes_left(&bc) >= 4 &&
628  bytestream2_peek_be32(&bc) == 0x000001E0)
629  skip_trailing_zeros = 0;
630 
631  nal->size_bits = get_bit_length(nal, 1 + (codec_id == AV_CODEC_ID_HEVC),
632  skip_trailing_zeros);
633 
634  if (nal->size <= 0 || nal->size_bits <= 0)
635  continue;
636 
637  ret = init_get_bits(&nal->gb, nal->data, nal->size_bits);
638  if (ret < 0)
639  return ret;
640 
641  /* Reset type in case it contains a stale value from a previously parsed NAL */
642  nal->type = 0;
643 
644  if (codec_id == AV_CODEC_ID_VVC)
645  ret = vvc_parse_nal_header(nal, logctx);
646  else if (codec_id == AV_CODEC_ID_LCEVC)
647  ret = lcevc_parse_nal_header(nal, logctx);
648  else if (codec_id == AV_CODEC_ID_HEVC) {
649  ret = hevc_parse_nal_header(nal, logctx);
650  if (nal->nuh_layer_id == 63)
651  continue;
652  } else
653  ret = h264_parse_nal_header(nal, logctx);
654  if (ret < 0) {
655  av_log(logctx, AV_LOG_WARNING,
656  "Failed to parse header of NALU (type %d): \"%s\". Skipping NALU.\n",
657  nal->type, av_err2str(ret));
658  continue;
659  }
660 
661  pkt->nb_nals++;
662  }
663 
664  return 0;
665 }
666 
668 {
669  int i;
670  for (i = 0; i < pkt->nals_allocated; i++) {
671  av_freep(&pkt->nals[i].skipped_bytes_pos);
672  }
673  av_freep(&pkt->nals);
674  pkt->nals_allocated = pkt->nal_buffer_size = 0;
675  if (pkt->rbsp.rbsp_buffer_ref) {
676  av_buffer_unref(&pkt->rbsp.rbsp_buffer_ref);
677  pkt->rbsp.rbsp_buffer = NULL;
678  } else
679  av_freep(&pkt->rbsp.rbsp_buffer);
680  pkt->rbsp.rbsp_buffer_alloc_size = pkt->rbsp.rbsp_buffer_size = 0;
681 }
flags
const SwsFlags flags[]
Definition: swscale.c:61
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
h2645_parse.h
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition: bytestream.h:158
ff_ctz
#define ff_ctz
Definition: intmath.h:105
STARTCODE_TEST
#define STARTCODE_TEST
GetByteContext
Definition: bytestream.h:33
bytestream2_tell
static av_always_inline int bytestream2_tell(const GetByteContext *g)
Definition: bytestream.h:192
get_bit_length
static int get_bit_length(H2645NAL *nal, int min_size, int skip_trailing_zeros)
Definition: h2645_parse.c:348
int64_t
long long int64_t
Definition: coverity.c:34
AV_RN64
#define AV_RN64(p)
Definition: intreadwrite.h:364
h264_parse_nal_header
static int h264_parse_nal_header(H2645NAL *nal, void *logctx)
Definition: h2645_parse.c:448
ff_h2645_packet_uninit
void ff_h2645_packet_uninit(H2645Packet *pkt)
Free all the allocated memory in the packet.
Definition: h2645_parse.c:667
find_next_start_code
static int find_next_start_code(const uint8_t *buf, const uint8_t *next_avc)
Definition: h2645_parse.c:465
lcevc_parse_nal_header
static int lcevc_parse_nal_header(H2645NAL *nal, void *logctx)
Definition: h2645_parse.c:383
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:517
hevc_parse_nal_header
static int hevc_parse_nal_header(H2645NAL *nal, void *logctx)
Definition: h2645_parse.c:427
bytestream2_skip
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
Definition: bytestream.h:168
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:337
hevc_nal_unit_name
static const char * hevc_nal_unit_name(int nal_type)
Definition: h2645_parse.c:301
fail
#define fail()
Definition: checkasm.h:219
GetBitContext
Definition: get_bits.h:109
VVC_IDR_W_RADL
@ VVC_IDR_W_RADL
Definition: vvc.h:36
lcevc_nal_unit_name
static const char * lcevc_nal_unit_name(int nal_type)
Definition: h2645_parse.c:187
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
h264_nal_type_name
static const char *const h264_nal_type_name[32]
Definition: h2645_parse.c:307
av_fast_realloc
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
Definition: mem.c:497
intreadwrite.h
GetByteContext::buffer
const uint8_t * buffer
Definition: bytestream.h:34
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
hevc.h
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:410
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
NULL
#define NULL
Definition: coverity.c:32
av_buffer_unref
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition: buffer.c:139
lcevc_nal_type_name
static const char *const lcevc_nal_type_name[32]
Definition: h2645_parse.c:152
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:391
AV_RN32
#define AV_RN32(p)
Definition: intreadwrite.h:360
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
error.h
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
H2645RBSP::rbsp_buffer
uint8_t * rbsp_buffer
Definition: h2645_parse.h:75
hevc_nal_type_name
static const char *const hevc_nal_type_name[64]
Definition: h2645_parse.c:234
vvc_nal_type_name
static const char *const vvc_nal_type_name[32]
Definition: h2645_parse.c:193
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
size
int size
Definition: twinvq_data.h:10344
vvc_nal_unit_name
static const char * vvc_nal_unit_name(int nal_type)
Definition: h2645_parse.c:228
H2645NAL
Definition: h2645_parse.h:34
H2645RBSP::rbsp_buffer_size
int rbsp_buffer_size
Definition: h2645_parse.h:78
av_reallocp_array
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate an array through a pointer to a pointer.
Definition: mem.c:225
AV_CODEC_ID_VVC
@ AV_CODEC_ID_VVC
Definition: codec_id.h:252
AV_CODEC_ID_LCEVC
@ AV_CODEC_ID_LCEVC
Definition: codec_id.h:615
skip_bits1
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:416
vvc.h
H2645_FLAG_SMALL_PADDING
@ H2645_FLAG_SMALL_PADDING
Definition: h2645_parse.h:98
h264_nal_unit_name
static const char * h264_nal_unit_name(int nal_type)
Definition: h2645_parse.c:342
nal
static int FUNC() nal(CodedBitstreamContext *ctx, RWContext *rw, LCEVCRawNAL *current, int nal_unit_type)
Definition: cbs_lcevc_syntax_template.c:655
ff_h2645_extract_rbsp
int ff_h2645_extract_rbsp(const uint8_t *src, int length, H2645RBSP *rbsp, H2645NAL *nal, int small_padding)
Extract the raw (unescaped) bitstream.
Definition: h2645_parse.c:37
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
H2645RBSP::rbsp_buffer_ref
AVBufferRef * rbsp_buffer_ref
Definition: h2645_parse.h:76
H2645RBSP::rbsp_buffer_alloc_size
int rbsp_buffer_alloc_size
Definition: h2645_parse.h:77
av_buffer_is_writable
int av_buffer_is_writable(const AVBufferRef *buf)
Definition: buffer.c:147
ret
ret
Definition: filter_design.txt:187
VVC_RSV_IRAP_11
@ VVC_RSV_IRAP_11
Definition: vvc.h:40
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
vvc_parse_nal_header
static int vvc_parse_nal_header(H2645NAL *nal, void *logctx)
Definition: h2645_parse.c:402
H2645_FLAG_USE_REF
@ H2645_FLAG_USE_REF
Definition: h2645_parse.h:99
MAX_MBPAIR_SIZE
#define MAX_MBPAIR_SIZE
Definition: h2645_parse.h:32
mem.h
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
bytestream.h
h264.h
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
get_nalsize
static int get_nalsize(int nal_length_size, const uint8_t *buf, int buf_size, int *buf_index, void *logctx)
Definition: h2645_parse.h:126
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
H2645_FLAG_IS_NALFF
@ H2645_FLAG_IS_NALFF
Definition: h2645_parse.h:97
ff_h2645_packet_split
int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, void *logctx, int nal_length_size, enum AVCodecID codec_id, int flags)
Split an input packet into NAL units.
Definition: h2645_parse.c:527
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
H2645Packet
Definition: h2645_parse.h:82
H2645RBSP
Definition: h2645_parse.h:74
src
#define src
Definition: vp8dsp.c:248
alloc_rbsp_buffer
static void alloc_rbsp_buffer(H2645RBSP *rbsp, unsigned int size, int use_ref)
Definition: h2645_parse.c:480
intmath.h