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/intmath.h"
26 #include "libavutil/intreadwrite.h"
27 #include "libavutil/mem.h"
28 
29 #include "bytestream.h"
30 #include "hevc.h"
31 #include "h264.h"
32 #include "h2645_parse.h"
33 #include "vvc.h"
34 
35 int ff_h2645_extract_rbsp(const uint8_t *src, int length,
36  H2645RBSP *rbsp, H2645NAL *nal, int small_padding)
37 {
38  int i, si, di;
39  uint8_t *dst;
40 
41  nal->skipped_bytes = 0;
42 #define STARTCODE_TEST \
43  if (i + 2 < length && src[i + 1] == 0 && src[i + 2] <= 3) { \
44  if (src[i + 2] != 3 && src[i + 2] != 0) { \
45  /* startcode, so we must be past the end */ \
46  length = i; \
47  } \
48  break; \
49  }
50 #if HAVE_FAST_UNALIGNED
51 #define FIND_FIRST_ZERO \
52  if (i > 0 && !src[i]) \
53  i--; \
54  while (src[i]) \
55  i++
56 #if HAVE_FAST_64BIT
57  for (i = 0; i + 1 < length; i += 9) {
58  if (!((~AV_RN64(src + i) &
59  (AV_RN64(src + i) - 0x0100010001000101ULL)) &
60  0x8000800080008080ULL))
61  continue;
62  FIND_FIRST_ZERO;
64  i -= 7;
65  }
66 #else
67  for (i = 0; i + 1 < length; i += 5) {
68  if (!((~AV_RN32(src + i) &
69  (AV_RN32(src + i) - 0x01000101U)) &
70  0x80008080U))
71  continue;
72  FIND_FIRST_ZERO;
74  i -= 3;
75  }
76 #endif /* HAVE_FAST_64BIT */
77 #else
78  for (i = 0; i + 1 < length; i += 2) {
79  if (src[i])
80  continue;
81  if (i > 0 && src[i - 1] == 0)
82  i--;
84  }
85 #endif /* HAVE_FAST_UNALIGNED */
86 
87  if (i >= length - 1 && small_padding) { // no escaped 0
88  nal->data =
89  nal->raw_data = src;
90  nal->size =
91  nal->raw_size = length;
92  return length;
93  } else if (i > length)
94  i = length;
95 
96  dst = &rbsp->rbsp_buffer[rbsp->rbsp_buffer_size];
97 
98  memcpy(dst, src, i);
99  si = di = i;
100  while (si + 2 < length) {
101  // remove escapes (very rare 1:2^22)
102  if (src[si + 2] > 3) {
103  dst[di++] = src[si++];
104  dst[di++] = src[si++];
105  } else if (src[si] == 0 && src[si + 1] == 0 && src[si + 2] != 0) {
106  if (src[si + 2] == 3) { // escape
107  dst[di++] = 0;
108  dst[di++] = 0;
109  si += 3;
110 
111  if (nal->skipped_bytes_pos) {
112  nal->skipped_bytes++;
113  if (nal->skipped_bytes_pos_size < nal->skipped_bytes) {
114  nal->skipped_bytes_pos_size *= 2;
118  sizeof(*nal->skipped_bytes_pos));
119  if (!nal->skipped_bytes_pos) {
120  nal->skipped_bytes_pos_size = 0;
121  return AVERROR(ENOMEM);
122  }
123  }
124  if (nal->skipped_bytes_pos)
125  nal->skipped_bytes_pos[nal->skipped_bytes-1] = di - 1;
126  }
127  continue;
128  } else // next start code
129  goto nsc;
130  }
131 
132  dst[di++] = src[si++];
133  }
134  while (si < length)
135  dst[di++] = src[si++];
136 
137 nsc:
138  memset(dst + di, 0, AV_INPUT_BUFFER_PADDING_SIZE);
139 
140  nal->data = dst;
141  nal->size = di;
142  nal->raw_data = src;
143  nal->raw_size = si;
144  rbsp->rbsp_buffer_size += si;
145 
146  return si;
147 }
148 
149 static const char *const vvc_nal_type_name[32] = {
150  "TRAIL_NUT", // VVC_TRAIL_NUT
151  "STSA_NUT", // VVC_STSA_NUT
152  "RADL_NUT", // VVC_RADL_NUT
153  "RASL_NUT", // VVC_RASL_NUT
154  "RSV_VCL4", // VVC_RSV_VCL_4
155  "RSV_VCL5", // VVC_RSV_VCL_5
156  "RSV_VCL6", // VVC_RSV_VCL_6
157  "IDR_W_RADL", // VVC_IDR_W_RADL
158  "IDR_N_LP", // VVC_IDR_N_LP
159  "CRA_NUT", // VVC_CRA_NUT
160  "GDR_NUT", // VVC_GDR_NUT
161  "RSV_IRAP_11", // VVC_RSV_IRAP_11
162  "OPI_NUT", // VVC_OPI_NUT
163  "DCI_NUT", // VVC_DCI_NUT
164  "VPS_NUT", // VVC_VPS_NUT
165  "SPS_NUT", // VVC_SPS_NUT
166  "PPS_NUT", // VVC_PPS_NUT
167  "APS_PREFIX", // VVC_PREFIX_APS_NUT
168  "APS_SUFFIX", // VVC_SUFFIX_APS_NUT
169  "PH_NUT", // VVC_PH_NUT
170  "AUD_NUT", // VVC_AUD_NUT
171  "EOS_NUT", // VVC_EOS_NUT
172  "EOB_NUT", // VVC_EOB_NUT
173  "SEI_PREFIX", // VVC_PREFIX_SEI_NUT
174  "SEI_SUFFIX", // VVC_SUFFIX_SEI_NUT
175  "FD_NUT", // VVC_FD_NUT
176  "RSV_NVCL26", // VVC_RSV_NVCL_26
177  "RSV_NVCL27", // VVC_RSV_NVCL_27
178  "UNSPEC28", // VVC_UNSPEC_28
179  "UNSPEC29", // VVC_UNSPEC_29
180  "UNSPEC30", // VVC_UNSPEC_30
181  "UNSPEC31", // VVC_UNSPEC_31
182 };
183 
184 static const char *vvc_nal_unit_name(int nal_type)
185 {
186  av_assert0(nal_type >= 0 && nal_type < 32);
187  return vvc_nal_type_name[nal_type];
188 }
189 
190 static const char *const hevc_nal_type_name[64] = {
191  "TRAIL_N", // HEVC_NAL_TRAIL_N
192  "TRAIL_R", // HEVC_NAL_TRAIL_R
193  "TSA_N", // HEVC_NAL_TSA_N
194  "TSA_R", // HEVC_NAL_TSA_R
195  "STSA_N", // HEVC_NAL_STSA_N
196  "STSA_R", // HEVC_NAL_STSA_R
197  "RADL_N", // HEVC_NAL_RADL_N
198  "RADL_R", // HEVC_NAL_RADL_R
199  "RASL_N", // HEVC_NAL_RASL_N
200  "RASL_R", // HEVC_NAL_RASL_R
201  "RSV_VCL_N10", // HEVC_NAL_VCL_N10
202  "RSV_VCL_R11", // HEVC_NAL_VCL_R11
203  "RSV_VCL_N12", // HEVC_NAL_VCL_N12
204  "RSV_VLC_R13", // HEVC_NAL_VCL_R13
205  "RSV_VCL_N14", // HEVC_NAL_VCL_N14
206  "RSV_VCL_R15", // HEVC_NAL_VCL_R15
207  "BLA_W_LP", // HEVC_NAL_BLA_W_LP
208  "BLA_W_RADL", // HEVC_NAL_BLA_W_RADL
209  "BLA_N_LP", // HEVC_NAL_BLA_N_LP
210  "IDR_W_RADL", // HEVC_NAL_IDR_W_RADL
211  "IDR_N_LP", // HEVC_NAL_IDR_N_LP
212  "CRA_NUT", // HEVC_NAL_CRA_NUT
213  "RSV_IRAP_VCL22", // HEVC_NAL_RSV_IRAP_VCL22
214  "RSV_IRAP_VCL23", // HEVC_NAL_RSV_IRAP_VCL23
215  "RSV_VCL24", // HEVC_NAL_RSV_VCL24
216  "RSV_VCL25", // HEVC_NAL_RSV_VCL25
217  "RSV_VCL26", // HEVC_NAL_RSV_VCL26
218  "RSV_VCL27", // HEVC_NAL_RSV_VCL27
219  "RSV_VCL28", // HEVC_NAL_RSV_VCL28
220  "RSV_VCL29", // HEVC_NAL_RSV_VCL29
221  "RSV_VCL30", // HEVC_NAL_RSV_VCL30
222  "RSV_VCL31", // HEVC_NAL_RSV_VCL31
223  "VPS", // HEVC_NAL_VPS
224  "SPS", // HEVC_NAL_SPS
225  "PPS", // HEVC_NAL_PPS
226  "AUD", // HEVC_NAL_AUD
227  "EOS_NUT", // HEVC_NAL_EOS_NUT
228  "EOB_NUT", // HEVC_NAL_EOB_NUT
229  "FD_NUT", // HEVC_NAL_FD_NUT
230  "SEI_PREFIX", // HEVC_NAL_SEI_PREFIX
231  "SEI_SUFFIX", // HEVC_NAL_SEI_SUFFIX
232  "RSV_NVCL41", // HEVC_NAL_RSV_NVCL41
233  "RSV_NVCL42", // HEVC_NAL_RSV_NVCL42
234  "RSV_NVCL43", // HEVC_NAL_RSV_NVCL43
235  "RSV_NVCL44", // HEVC_NAL_RSV_NVCL44
236  "RSV_NVCL45", // HEVC_NAL_RSV_NVCL45
237  "RSV_NVCL46", // HEVC_NAL_RSV_NVCL46
238  "RSV_NVCL47", // HEVC_NAL_RSV_NVCL47
239  "UNSPEC48", // HEVC_NAL_UNSPEC48
240  "UNSPEC49", // HEVC_NAL_UNSPEC49
241  "UNSPEC50", // HEVC_NAL_UNSPEC50
242  "UNSPEC51", // HEVC_NAL_UNSPEC51
243  "UNSPEC52", // HEVC_NAL_UNSPEC52
244  "UNSPEC53", // HEVC_NAL_UNSPEC53
245  "UNSPEC54", // HEVC_NAL_UNSPEC54
246  "UNSPEC55", // HEVC_NAL_UNSPEC55
247  "UNSPEC56", // HEVC_NAL_UNSPEC56
248  "UNSPEC57", // HEVC_NAL_UNSPEC57
249  "UNSPEC58", // HEVC_NAL_UNSPEC58
250  "UNSPEC59", // HEVC_NAL_UNSPEC59
251  "UNSPEC60", // HEVC_NAL_UNSPEC60
252  "UNSPEC61", // HEVC_NAL_UNSPEC61
253  "UNSPEC62", // HEVC_NAL_UNSPEC62
254  "UNSPEC63", // HEVC_NAL_UNSPEC63
255 };
256 
257 static const char *hevc_nal_unit_name(int nal_type)
258 {
259  av_assert0(nal_type >= 0 && nal_type < 64);
260  return hevc_nal_type_name[nal_type];
261 }
262 
263 static const char *const h264_nal_type_name[32] = {
264  "Unspecified 0", //H264_NAL_UNSPECIFIED
265  "Coded slice of a non-IDR picture", // H264_NAL_SLICE
266  "Coded slice data partition A", // H264_NAL_DPA
267  "Coded slice data partition B", // H264_NAL_DPB
268  "Coded slice data partition C", // H264_NAL_DPC
269  "IDR", // H264_NAL_IDR_SLICE
270  "SEI", // H264_NAL_SEI
271  "SPS", // H264_NAL_SPS
272  "PPS", // H264_NAL_PPS
273  "AUD", // H264_NAL_AUD
274  "End of sequence", // H264_NAL_END_SEQUENCE
275  "End of stream", // H264_NAL_END_STREAM
276  "Filler data", // H264_NAL_FILLER_DATA
277  "SPS extension", // H264_NAL_SPS_EXT
278  "Prefix", // H264_NAL_PREFIX
279  "Subset SPS", // H264_NAL_SUB_SPS
280  "Depth parameter set", // H264_NAL_DPS
281  "Reserved 17", // H264_NAL_RESERVED17
282  "Reserved 18", // H264_NAL_RESERVED18
283  "Auxiliary coded picture without partitioning", // H264_NAL_AUXILIARY_SLICE
284  "Slice extension", // H264_NAL_EXTEN_SLICE
285  "Slice extension for a depth view or a 3D-AVC texture view", // H264_NAL_DEPTH_EXTEN_SLICE
286  "Reserved 22", // H264_NAL_RESERVED22
287  "Reserved 23", // H264_NAL_RESERVED23
288  "Unspecified 24", // H264_NAL_UNSPECIFIED24
289  "Unspecified 25", // H264_NAL_UNSPECIFIED25
290  "Unspecified 26", // H264_NAL_UNSPECIFIED26
291  "Unspecified 27", // H264_NAL_UNSPECIFIED27
292  "Unspecified 28", // H264_NAL_UNSPECIFIED28
293  "Unspecified 29", // H264_NAL_UNSPECIFIED29
294  "Unspecified 30", // H264_NAL_UNSPECIFIED30
295  "Unspecified 31", // H264_NAL_UNSPECIFIED31
296 };
297 
298 static const char *h264_nal_unit_name(int nal_type)
299 {
300  av_assert0(nal_type >= 0 && nal_type < 32);
301  return h264_nal_type_name[nal_type];
302 }
303 
304 static int get_bit_length(H2645NAL *nal, int min_size, int skip_trailing_zeros)
305 {
306  int size = nal->size;
307  int trailing_padding = 0;
308 
309  while (skip_trailing_zeros && size > 0 && nal->data[size - 1] == 0)
310  size--;
311 
312  if (!size)
313  return 0;
314 
315  if (size <= min_size) {
316  if (nal->size < min_size)
317  return AVERROR_INVALIDDATA;
318  size = min_size;
319  } else {
320  int v = nal->data[size - 1];
321  /* remove the stop bit and following trailing zeros,
322  * or nothing for damaged bitstreams */
323  if (v)
324  trailing_padding = ff_ctz(v) + 1;
325  }
326 
327  if (size > INT_MAX / 8)
328  return AVERROR(ERANGE);
329  size *= 8;
330 
331  return size - trailing_padding;
332 }
333 
334 /**
335  * @return AVERROR_INVALIDDATA if the packet is not a valid NAL unit,
336  * 0 otherwise
337  */
338 static int vvc_parse_nal_header(H2645NAL *nal, void *logctx)
339 {
340  GetBitContext *gb = &nal->gb;
341 
342  if (get_bits1(gb) != 0) //forbidden_zero_bit
343  return AVERROR_INVALIDDATA;
344 
345  skip_bits1(gb); //nuh_reserved_zero_bit
346 
347  nal->nuh_layer_id = get_bits(gb, 6);
348  nal->type = get_bits(gb, 5);
349  nal->temporal_id = get_bits(gb, 3) - 1;
350  if (nal->temporal_id < 0)
351  return AVERROR_INVALIDDATA;
352 
353  if ((nal->type >= VVC_IDR_W_RADL && nal->type <= VVC_RSV_IRAP_11) && nal->temporal_id)
354  return AVERROR_INVALIDDATA;
355 
356  av_log(logctx, AV_LOG_DEBUG,
357  "nal_unit_type: %d(%s), nuh_layer_id: %d, temporal_id: %d\n",
358  nal->type, vvc_nal_unit_name(nal->type), nal->nuh_layer_id, nal->temporal_id);
359 
360  return 0;
361 }
362 
363 static int hevc_parse_nal_header(H2645NAL *nal, void *logctx)
364 {
365  GetBitContext *gb = &nal->gb;
366 
367  if (get_bits1(gb) != 0)
368  return AVERROR_INVALIDDATA;
369 
370  nal->type = get_bits(gb, 6);
371 
372  nal->nuh_layer_id = get_bits(gb, 6);
373  nal->temporal_id = get_bits(gb, 3) - 1;
374  if (nal->temporal_id < 0)
375  return AVERROR_INVALIDDATA;
376 
377  av_log(logctx, AV_LOG_DEBUG,
378  "nal_unit_type: %d(%s), nuh_layer_id: %d, temporal_id: %d\n",
379  nal->type, hevc_nal_unit_name(nal->type), nal->nuh_layer_id, nal->temporal_id);
380 
381  return 0;
382 }
383 
384 static int h264_parse_nal_header(H2645NAL *nal, void *logctx)
385 {
386  GetBitContext *gb = &nal->gb;
387 
388  if (get_bits1(gb) != 0)
389  return AVERROR_INVALIDDATA;
390 
391  nal->ref_idc = get_bits(gb, 2);
392  nal->type = get_bits(gb, 5);
393 
394  av_log(logctx, AV_LOG_DEBUG,
395  "nal_unit_type: %d(%s), nal_ref_idc: %d\n",
396  nal->type, h264_nal_unit_name(nal->type), nal->ref_idc);
397 
398  return 0;
399 }
400 
401 static int find_next_start_code(const uint8_t *buf, const uint8_t *next_avc)
402 {
403  int i = 0;
404 
405  if (buf + 3 >= next_avc)
406  return next_avc - buf;
407 
408  while (buf + i + 3 < next_avc) {
409  if (buf[i] == 0 && buf[i + 1] == 0 && buf[i + 2] == 1)
410  break;
411  i++;
412  }
413  return i + 3;
414 }
415 
416 static void alloc_rbsp_buffer(H2645RBSP *rbsp, unsigned int size, int use_ref)
417 {
418  int min_size = size;
419 
420  if (size > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE)
421  goto fail;
423 
424  if (rbsp->rbsp_buffer_alloc_size >= size &&
426  av_assert0(rbsp->rbsp_buffer);
427  memset(rbsp->rbsp_buffer + min_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
428  return;
429  }
430 
431  size = FFMIN(size + size / 16 + 32, INT_MAX);
432 
433  if (rbsp->rbsp_buffer_ref)
435  else
436  av_free(rbsp->rbsp_buffer);
437 
438  rbsp->rbsp_buffer = av_mallocz(size);
439  if (!rbsp->rbsp_buffer)
440  goto fail;
442 
443  if (use_ref) {
445  NULL, NULL, 0);
446  if (!rbsp->rbsp_buffer_ref)
447  goto fail;
448  }
449 
450  return;
451 
452 fail:
453  rbsp->rbsp_buffer_alloc_size = 0;
454  if (rbsp->rbsp_buffer_ref) {
456  rbsp->rbsp_buffer = NULL;
457  } else
458  av_freep(&rbsp->rbsp_buffer);
459 
460  return;
461 }
462 
463 int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length,
464  void *logctx, int is_nalff, int nal_length_size,
465  enum AVCodecID codec_id, int small_padding, int use_ref)
466 {
467  GetByteContext bc;
468  int consumed, ret = 0;
469  int next_avc = is_nalff ? 0 : length;
470  int64_t padding = small_padding ? 0 : MAX_MBPAIR_SIZE;
471 
472  bytestream2_init(&bc, buf, length);
473  alloc_rbsp_buffer(&pkt->rbsp, length + padding, use_ref);
474 
475  if (!pkt->rbsp.rbsp_buffer)
476  return AVERROR(ENOMEM);
477 
478  pkt->rbsp.rbsp_buffer_size = 0;
479  pkt->nb_nals = 0;
480  while (bytestream2_get_bytes_left(&bc) >= 4) {
481  H2645NAL *nal;
482  int extract_length = 0;
483  int skip_trailing_zeros = 1;
484 
485  if (bytestream2_tell(&bc) == next_avc) {
486  int i = 0;
487  extract_length = get_nalsize(nal_length_size,
488  bc.buffer, bytestream2_get_bytes_left(&bc), &i, logctx);
489  if (extract_length < 0)
490  return extract_length;
491 
492  bytestream2_skip(&bc, nal_length_size);
493 
494  next_avc = bytestream2_tell(&bc) + extract_length;
495  } else {
496  int buf_index;
497 
498  if (bytestream2_tell(&bc) > next_avc)
499  av_log(logctx, AV_LOG_WARNING, "Exceeded next NALFF position, re-syncing.\n");
500 
501  /* search start code */
502  buf_index = find_next_start_code(bc.buffer, buf + next_avc);
503 
504  bytestream2_skip(&bc, buf_index);
505 
506  if (!bytestream2_get_bytes_left(&bc)) {
507  if (pkt->nb_nals > 0) {
508  // No more start codes: we discarded some irrelevant
509  // bytes at the end of the packet.
510  return 0;
511  } else {
512  av_log(logctx, AV_LOG_ERROR, "No start code is found.\n");
513  return AVERROR_INVALIDDATA;
514  }
515  }
516 
517  extract_length = FFMIN(bytestream2_get_bytes_left(&bc), next_avc - bytestream2_tell(&bc));
518 
519  if (bytestream2_tell(&bc) >= next_avc) {
520  /* skip to the start of the next NAL */
521  bytestream2_skip(&bc, next_avc - bytestream2_tell(&bc));
522  continue;
523  }
524  }
525 
526  if (pkt->nals_allocated < pkt->nb_nals + 1) {
527  int new_size = pkt->nals_allocated + 1;
528  void *tmp;
529 
530  if (new_size >= INT_MAX / sizeof(*pkt->nals))
531  return AVERROR(ENOMEM);
532 
533  tmp = av_fast_realloc(pkt->nals, &pkt->nal_buffer_size, new_size * sizeof(*pkt->nals));
534  if (!tmp)
535  return AVERROR(ENOMEM);
536 
537  pkt->nals = tmp;
538  memset(pkt->nals + pkt->nals_allocated, 0, sizeof(*pkt->nals));
539 
540  nal = &pkt->nals[pkt->nb_nals];
541  nal->skipped_bytes_pos_size = FFMIN(1024, extract_length/3+1); // initial buffer size
543  if (!nal->skipped_bytes_pos)
544  return AVERROR(ENOMEM);
545 
546  pkt->nals_allocated = new_size;
547  }
548  nal = &pkt->nals[pkt->nb_nals];
549 
550  consumed = ff_h2645_extract_rbsp(bc.buffer, extract_length, &pkt->rbsp, nal, small_padding);
551  if (consumed < 0)
552  return consumed;
553 
554  if (is_nalff && (extract_length != consumed) && extract_length)
555  av_log(logctx, AV_LOG_DEBUG,
556  "NALFF: Consumed only %d bytes instead of %d\n",
557  consumed, extract_length);
558 
559  bytestream2_skip(&bc, consumed);
560 
561  /* see commit 3566042a0 */
562  if (bytestream2_get_bytes_left(&bc) >= 4 &&
563  bytestream2_peek_be32(&bc) == 0x000001E0)
564  skip_trailing_zeros = 0;
565 
566  nal->size_bits = get_bit_length(nal, 1 + (codec_id == AV_CODEC_ID_HEVC),
567  skip_trailing_zeros);
568 
569  if (nal->size <= 0 || nal->size_bits <= 0)
570  continue;
571 
572  ret = init_get_bits(&nal->gb, nal->data, nal->size_bits);
573  if (ret < 0)
574  return ret;
575 
576  /* Reset type in case it contains a stale value from a previously parsed NAL */
577  nal->type = 0;
578 
579  if (codec_id == AV_CODEC_ID_VVC)
580  ret = vvc_parse_nal_header(nal, logctx);
581  else if (codec_id == AV_CODEC_ID_HEVC)
582  ret = hevc_parse_nal_header(nal, logctx);
583  else
584  ret = h264_parse_nal_header(nal, logctx);
585  if (ret < 0) {
586  av_log(logctx, AV_LOG_WARNING, "Invalid NAL unit %d, skipping.\n",
587  nal->type);
588  continue;
589  }
590 
591  pkt->nb_nals++;
592  }
593 
594  return 0;
595 }
596 
598 {
599  int i;
600  for (i = 0; i < pkt->nals_allocated; i++) {
601  av_freep(&pkt->nals[i].skipped_bytes_pos);
602  }
603  av_freep(&pkt->nals);
604  pkt->nals_allocated = pkt->nal_buffer_size = 0;
605  if (pkt->rbsp.rbsp_buffer_ref) {
606  av_buffer_unref(&pkt->rbsp.rbsp_buffer_ref);
607  pkt->rbsp.rbsp_buffer = NULL;
608  } else
609  av_freep(&pkt->rbsp.rbsp_buffer);
610  pkt->rbsp.rbsp_buffer_alloc_size = pkt->rbsp.rbsp_buffer_size = 0;
611 }
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
VVC_RSV_IRAP_11
@ VVC_RSV_IRAP_11
Definition: vvc.h:40
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
ff_ctz
#define ff_ctz
Definition: intmath.h:107
STARTCODE_TEST
#define STARTCODE_TEST
GetByteContext
Definition: bytestream.h:33
get_bit_length
static int get_bit_length(H2645NAL *nal, int min_size, int skip_trailing_zeros)
Definition: h2645_parse.c:304
H2645NAL::ref_idc
int ref_idc
H.264 only, nal_ref_idc.
Definition: h2645_parse.h:57
H2645NAL::nuh_layer_id
int nuh_layer_id
Definition: h2645_parse.h:67
AV_RN64
#define AV_RN64(p)
Definition: intreadwrite.h:366
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
h264_parse_nal_header
static int h264_parse_nal_header(H2645NAL *nal, void *logctx)
Definition: h2645_parse.c:384
ff_h2645_packet_uninit
void ff_h2645_packet_uninit(H2645Packet *pkt)
Free all the allocated memory in the packet.
Definition: h2645_parse.c:597
find_next_start_code
static int find_next_start_code(const uint8_t *buf, const uint8_t *next_avc)
Definition: h2645_parse.c:401
H2645NAL::skipped_bytes_pos_size
int skipped_bytes_pos_size
Definition: h2645_parse.h:70
H2645NAL::temporal_id
int temporal_id
HEVC only, nuh_temporal_id_plus_1 - 1.
Definition: h2645_parse.h:62
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:514
hevc_parse_nal_header
static int hevc_parse_nal_header(H2645NAL *nal, void *logctx)
Definition: h2645_parse.c:363
H2645NAL::size_bits
int size_bits
Size, in bits, of just the data, excluding the stop bit and any trailing padding.
Definition: h2645_parse.h:42
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:335
hevc_nal_unit_name
static const char * hevc_nal_unit_name(int nal_type)
Definition: h2645_parse.c:257
fail
#define fail()
Definition: checkasm.h:138
GetBitContext
Definition: get_bits.h:108
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
H2645NAL::size
int size
Definition: h2645_parse.h:36
h264_nal_type_name
static const char *const h264_nal_type_name[32]
Definition: h2645_parse.c:263
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:495
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:40
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
H2645NAL::data
const uint8_t * data
Definition: h2645_parse.h:35
H2645NAL::skipped_bytes_pos
int * skipped_bytes_pos
Definition: h2645_parse.h:71
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:389
H2645NAL::type
int type
NAL unit type.
Definition: h2645_parse.h:52
H2645NAL::raw_size
int raw_size
Definition: h2645_parse.h:44
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
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:388
AV_RN32
#define AV_RN32(p)
Definition: intreadwrite.h:362
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
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(GetByteContext *g)
Definition: bytestream.h:158
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
bytestream2_tell
static av_always_inline int bytestream2_tell(GetByteContext *g)
Definition: bytestream.h:192
H2645NAL::skipped_bytes
int skipped_bytes
Definition: h2645_parse.h:69
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:190
vvc_nal_type_name
static const char *const vvc_nal_type_name[32]
Definition: h2645_parse.c:149
VVC_IDR_W_RADL
@ VVC_IDR_W_RADL
Definition: vvc.h:36
size
int size
Definition: twinvq_data.h:10344
H2645NAL::gb
GetBitContext gb
Definition: h2645_parse.h:47
vvc_nal_unit_name
static const char * vvc_nal_unit_name(int nal_type)
Definition: h2645_parse.c:184
H2645NAL
Definition: h2645_parse.h:34
H2645RBSP::rbsp_buffer_size
int rbsp_buffer_size
Definition: h2645_parse.h:78
ff_h2645_packet_split
int ff_h2645_packet_split(H2645Packet *pkt, const uint8_t *buf, int length, void *logctx, int is_nalff, int nal_length_size, enum AVCodecID codec_id, int small_padding, int use_ref)
Split an input packet into NAL units.
Definition: h2645_parse.c:463
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:223
AV_CODEC_ID_VVC
@ AV_CODEC_ID_VVC
Definition: codec_id.h:250
skip_bits1
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:413
h264_nal_unit_name
static const char * h264_nal_unit_name(int nal_type)
Definition: h2645_parse.c:298
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
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:35
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:31
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:226
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:254
H2645RBSP::rbsp_buffer_ref
AVBufferRef * rbsp_buffer_ref
Definition: h2645_parse.h:76
hevc.h
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
H2645NAL::raw_data
const uint8_t * raw_data
Definition: h2645_parse.h:45
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:338
vvc.h
MAX_MBPAIR_SIZE
#define MAX_MBPAIR_SIZE
Definition: h2645_parse.h:32
mem.h
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
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:119
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
H2645Packet
Definition: h2645_parse.h:82
H2645RBSP
Definition: h2645_parse.h:74
alloc_rbsp_buffer
static void alloc_rbsp_buffer(H2645RBSP *rbsp, unsigned int size, int use_ref)
Definition: h2645_parse.c:416
intmath.h