FFmpeg
extract_extradata.c
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #include <stdint.h>
20 
21 #include "libavutil/log.h"
22 #include "libavutil/mem.h"
23 #include "libavutil/opt.h"
24 
25 #include "av1.h"
26 #include "av1_parse.h"
27 #include "bsf.h"
28 #include "bsf_internal.h"
29 #include "bytestream.h"
30 #include "h2645_parse.h"
31 #include "h264.h"
32 #include "lcevc.h"
33 #include "lcevc_parse.h"
34 #include "startcode.h"
35 #include "vc1_common.h"
36 #include "vvc.h"
37 
38 #include "hevc/hevc.h"
39 
40 typedef struct ExtractExtradataContext {
41  const AVClass *class;
42 
44  uint8_t **data, int *size);
45 
46  /* AV1 specific fields */
48 
49  /* H264/HEVC specific fields */
51 
52  /* AVOptions */
53  int remove;
55 
56 static int val_in_array(const int *arr, size_t len, int val)
57 {
58  for (size_t i = 0; i < len; i++)
59  if (arr[i] == val)
60  return 1;
61  return 0;
62 }
63 
64 static int metadata_is_global(const AV1OBU *obu)
65 {
66  static const int metadata_obu_types[] = {
68  };
69  GetBitContext gb;
70  int metadata_type;
71 
72  if (init_get_bits(&gb, obu->data, obu->size_bits) < 0)
73  return 0;
74 
75  metadata_type = get_leb(&gb);
76 
77  return val_in_array(metadata_obu_types, FF_ARRAY_ELEMS(metadata_obu_types),
78  metadata_type);
79 }
80 
81 static int obu_is_global(const AV1OBU *obu)
82 {
83  static const int extradata_obu_types[] = {
85  };
86 
87  if (!val_in_array(extradata_obu_types, FF_ARRAY_ELEMS(extradata_obu_types),
88  obu->type))
89  return 0;
90  if (obu->type != AV1_OBU_METADATA)
91  return 1;
92 
93  return metadata_is_global(obu);
94 }
95 
97  uint8_t **data, int *size)
98 {
99 
101 
102  int extradata_size = 0, filtered_size = 0;
103  int i, has_seq = 0, ret = 0;
104 
105  ret = ff_av1_packet_split(&s->av1_pkt, pkt->data, pkt->size, ctx);
106  if (ret < 0)
107  return ret;
108 
109  for (i = 0; i < s->av1_pkt.nb_obus; i++) {
110  AV1OBU *obu = &s->av1_pkt.obus[i];
111  if (obu_is_global(obu)) {
112  extradata_size += obu->raw_size;
113  if (obu->type == AV1_OBU_SEQUENCE_HEADER)
114  has_seq = 1;
115  } else if (s->remove) {
116  filtered_size += obu->raw_size;
117  }
118  }
119 
120  if (extradata_size && has_seq) {
121  AVBufferRef *filtered_buf = NULL;
122  PutByteContext pb_filtered_data, pb_extradata;
123  uint8_t *extradata;
124 
125  if (s->remove) {
126  filtered_buf = av_buffer_alloc(filtered_size + AV_INPUT_BUFFER_PADDING_SIZE);
127  if (!filtered_buf) {
128  return AVERROR(ENOMEM);
129  }
130  memset(filtered_buf->data + filtered_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
131  }
132 
133  extradata = av_malloc(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
134  if (!extradata) {
135  av_buffer_unref(&filtered_buf);
136  return AVERROR(ENOMEM);
137  }
138 
139  *data = extradata;
140  *size = extradata_size;
141 
142  bytestream2_init_writer(&pb_extradata, extradata, extradata_size);
143  if (s->remove)
144  bytestream2_init_writer(&pb_filtered_data, filtered_buf->data, filtered_size);
145 
146  for (i = 0; i < s->av1_pkt.nb_obus; i++) {
147  AV1OBU *obu = &s->av1_pkt.obus[i];
148  if (obu_is_global(obu)) {
149  bytestream2_put_bufferu(&pb_extradata, obu->raw_data, obu->raw_size);
150  } else if (s->remove) {
151  bytestream2_put_bufferu(&pb_filtered_data, obu->raw_data, obu->raw_size);
152  }
153  }
154 
155  if (s->remove) {
157  pkt->buf = filtered_buf;
158  pkt->data = filtered_buf->data;
159  pkt->size = filtered_size;
160  }
161  }
162 
163  return 0;
164 }
165 
167  uint8_t **data, int *size)
168 {
169  static const int extradata_nal_types_vvc[] = {
171  };
172  static const int extradata_nal_types_hevc[] = {
174  };
175  static const int extradata_nal_types_h264[] = {
177  };
178 
180 
181  int extradata_size = 0, filtered_size = 0;
182  const int *extradata_nal_types;
183  size_t nb_extradata_nal_types;
184  int i, has_sps = 0, has_vps = 0, ret = 0;
185 
186  if (ctx->par_in->codec_id == AV_CODEC_ID_VVC) {
187  extradata_nal_types = extradata_nal_types_vvc;
188  nb_extradata_nal_types = FF_ARRAY_ELEMS(extradata_nal_types_vvc);
189  } else if (ctx->par_in->codec_id == AV_CODEC_ID_HEVC) {
190  extradata_nal_types = extradata_nal_types_hevc;
191  nb_extradata_nal_types = FF_ARRAY_ELEMS(extradata_nal_types_hevc);
192  } else {
193  extradata_nal_types = extradata_nal_types_h264;
194  nb_extradata_nal_types = FF_ARRAY_ELEMS(extradata_nal_types_h264);
195  }
196 
197  ret = ff_h2645_packet_split(&s->h2645_pkt, pkt->data, pkt->size,
198  ctx, 0, ctx->par_in->codec_id, H2645_FLAG_SMALL_PADDING);
199  if (ret < 0)
200  return ret;
201 
202  for (i = 0; i < s->h2645_pkt.nb_nals; i++) {
203  H2645NAL *nal = &s->h2645_pkt.nals[i];
204  if (val_in_array(extradata_nal_types, nb_extradata_nal_types, nal->type)) {
205  extradata_size += nal->raw_size + 3;
206  if (ctx->par_in->codec_id == AV_CODEC_ID_VVC) {
207  if (nal->type == VVC_SPS_NUT) has_sps = 1;
208  if (nal->type == VVC_VPS_NUT) has_vps = 1;
209  } else if (ctx->par_in->codec_id == AV_CODEC_ID_HEVC) {
210  if (nal->type == HEVC_NAL_SPS) has_sps = 1;
211  if (nal->type == HEVC_NAL_VPS) has_vps = 1;
212  } else {
213  if (nal->type == H264_NAL_SPS) has_sps = 1;
214  }
215  } else if (s->remove) {
216  filtered_size += nal->raw_size + 3;
217  }
218  }
219 
220  if (extradata_size &&
221  ((ctx->par_in->codec_id == AV_CODEC_ID_VVC && has_sps) ||
222  (ctx->par_in->codec_id == AV_CODEC_ID_HEVC && has_sps && has_vps) ||
223  (ctx->par_in->codec_id == AV_CODEC_ID_H264 && has_sps))) {
224  AVBufferRef *filtered_buf = NULL;
225  PutByteContext pb_filtered_data, pb_extradata;
226  uint8_t *extradata;
227 
228  if (s->remove) {
229  filtered_buf = av_buffer_alloc(filtered_size + AV_INPUT_BUFFER_PADDING_SIZE);
230  if (!filtered_buf) {
231  return AVERROR(ENOMEM);
232  }
233  memset(filtered_buf->data + filtered_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
234  }
235 
236  extradata = av_malloc(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
237  if (!extradata) {
238  av_buffer_unref(&filtered_buf);
239  return AVERROR(ENOMEM);
240  }
241 
242  *data = extradata;
243  *size = extradata_size;
244 
245  bytestream2_init_writer(&pb_extradata, extradata, extradata_size);
246  if (s->remove)
247  bytestream2_init_writer(&pb_filtered_data, filtered_buf->data, filtered_size);
248 
249  for (i = 0; i < s->h2645_pkt.nb_nals; i++) {
250  H2645NAL *nal = &s->h2645_pkt.nals[i];
251  if (val_in_array(extradata_nal_types, nb_extradata_nal_types,
252  nal->type)) {
253  bytestream2_put_be24u(&pb_extradata, 1); //startcode
254  bytestream2_put_bufferu(&pb_extradata, nal->raw_data, nal->raw_size);
255  } else if (s->remove) {
256  bytestream2_put_be24u(&pb_filtered_data, 1); // startcode
257  bytestream2_put_bufferu(&pb_filtered_data, nal->raw_data, nal->raw_size);
258  }
259  }
260 
261  if (s->remove) {
263  pkt->buf = filtered_buf;
264  pkt->data = filtered_buf->data;
265  pkt->size = filtered_size;
266  }
267  }
268 
269  return 0;
270 }
271 
272 /**
273  * Rewrite the NALu stripping the unneeded blocks.
274  * Given that length fields coded inside the NALu are not aware of any emulation_3bytes
275  * present in the bitstream, we need to keep track of the raw buffer as we navigate
276  * the stripped buffer.
277  */
279  int remove)
280 {
281  GetByteContext gbc, raw_gbc;
282  int sc = 0, gc = 0;
283  int skipped_byte_pos = 0;
284 
285  bytestream2_init(&gbc, nal->data, nal->size);
286  bytestream2_init(&raw_gbc, nal->raw_data, nal->raw_size);
287  bytestream2_put_be16(pbc, bytestream2_get_be16(&gbc));
288  bytestream2_skip(&raw_gbc, 2);
289 
290  while (bytestream2_get_bytes_left(&gbc) > 1) {
291  GetBitContext gb;
292  int payload_size_type, payload_type;
293  uint64_t payload_size;
294  int block_size, raw_block_size, block_end;
295 
297 
298  payload_size_type = get_bits(&gb, 3);
299  payload_type = get_bits(&gb, 5);
300  payload_size = payload_size_type;
301  if (payload_size_type == 6)
302  return AVERROR_PATCHWELCOME;
303  if (payload_size_type == 7)
304  payload_size = get_mb(&gb);
305 
306  if (payload_size > INT_MAX - (get_bits_count(&gb) >> 3))
307  return AVERROR_INVALIDDATA;
308 
309  block_size = raw_block_size = payload_size + (get_bits_count(&gb) >> 3);
310  if (block_size >= bytestream2_get_bytes_left(&gbc))
311  return AVERROR_INVALIDDATA;
312 
313  block_end = bytestream2_tell(&gbc) + block_size;
314  // Take into account removed emulation 3bytes, as payload_size in
315  // the bitstream is not aware of them.
316  for (; skipped_byte_pos < nal->skipped_bytes; skipped_byte_pos++) {
317  if (nal->skipped_bytes_pos[skipped_byte_pos] >= block_end)
318  break;
319  raw_block_size++;
320  }
321 
322  switch (payload_type) {
326  if (remove)
327  break;
328  bytestream2_put_buffer(pbc, raw_gbc.buffer, raw_block_size);
329  sc |= payload_type == LCEVC_PAYLOAD_TYPE_SEQUENCE_CONFIG;
330  gc |= payload_type == LCEVC_PAYLOAD_TYPE_GLOBAL_CONFIG;
331  break;
332  default:
333  if (!remove)
334  break;
335  bytestream2_put_buffer(pbc, raw_gbc.buffer, raw_block_size);
336  break;
337  }
338 
339  bytestream2_skip(&gbc, block_size);
340  bytestream2_skip(&raw_gbc, raw_block_size);
341  }
342 
343  if (!remove && !sc && !gc)
344  return AVERROR_INVALIDDATA;
345 
346  bytestream2_put_byte(pbc, 0x80); // rbsp_alignment bits
347 
348  return bytestream2_tell_p(pbc);
349 }
350 
352  uint8_t **data, int *size)
353 {
354  static const int extradata_nal_types[] = {
356  };
357 
359  PutByteContext pb_extradata;
360  int extradata_size = 0, filtered_size = 0;
361  size_t nb_extradata_nal_types = FF_ARRAY_ELEMS(extradata_nal_types);
362  int i, ret = 0;
363 
364  ret = ff_h2645_packet_split(&s->h2645_pkt, pkt->data, pkt->size,
365  ctx, 0, ctx->par_in->codec_id, H2645_FLAG_SMALL_PADDING);
366  if (ret < 0)
367  return ret;
368 
369  for (i = 0; i < s->h2645_pkt.nb_nals; i++) {
370  H2645NAL *nal = &s->h2645_pkt.nals[i];
371  if (val_in_array(extradata_nal_types, nb_extradata_nal_types, nal->type)) {
372  // dummy pass to find sc, gc or ai. A dummy pointer is used to prevent
373  // UB in PutByteContext. Nothing will be written.
374  bytestream2_init_writer(&pb_extradata, nal->data, 0);
375  if (!write_lcevc_nalu(ctx, &pb_extradata, nal, 0))
376  extradata_size += nal->raw_size + 3;
377  }
378  filtered_size += nal->raw_size + 3;
379  }
380 
381  if (extradata_size) {
382  AVBufferRef *filtered_buf = NULL;
383  PutByteContext pb_filtered_data;
384  uint8_t *extradata;
385 
386  if (s->remove) {
387  filtered_buf = av_buffer_alloc(filtered_size + AV_INPUT_BUFFER_PADDING_SIZE);
388  if (!filtered_buf) {
389  return AVERROR(ENOMEM);
390  }
391  memset(filtered_buf->data + filtered_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
392  }
393 
394  extradata = av_malloc(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
395  if (!extradata) {
396  av_buffer_unref(&filtered_buf);
397  return AVERROR(ENOMEM);
398  }
399 
400  bytestream2_init_writer(&pb_extradata, extradata, extradata_size);
401  if (s->remove)
402  bytestream2_init_writer(&pb_filtered_data, filtered_buf->data, filtered_size);
403 
404  for (i = 0; i < s->h2645_pkt.nb_nals; i++) {
405  H2645NAL *nal = &s->h2645_pkt.nals[i];
406  if (val_in_array(extradata_nal_types, nb_extradata_nal_types,
407  nal->type)) {
408  bytestream2_put_be24(&pb_extradata, 1); //startcode
409  ret = write_lcevc_nalu(ctx, &pb_extradata, nal, 0);
410  if (ret < 0) {
411  av_freep(&extradata);
412  av_buffer_unref(&filtered_buf);
413  return ret;
414  }
415  if (s->remove) {
416  bytestream2_put_be24(&pb_filtered_data, 1); //startcode
417  ret = write_lcevc_nalu(ctx, &pb_filtered_data, nal, 1);
418  if (ret < 0) {
419  av_freep(&extradata);
420  av_buffer_unref(&filtered_buf);
421  return ret;
422  }
423  }
424  } else if (s->remove) {
425  bytestream2_put_be24(&pb_filtered_data, 1); //startcode
426  bytestream2_put_bufferu(&pb_filtered_data, nal->raw_data, nal->raw_size);
427  }
428  }
429  *data = extradata;
430  *size = bytestream2_tell_p(&pb_extradata);
431  av_assert0(*size <= extradata_size);
432 
433  if (s->remove) {
434  av_assert0(bytestream2_tell_p(&pb_filtered_data) <= filtered_size);
436  pkt->buf = filtered_buf;
437  pkt->data = filtered_buf->data;
438  pkt->size = bytestream2_tell_p(&pb_filtered_data);
439  }
440  }
441 
442  return 0;
443 }
444 
446  uint8_t **data, int *size)
447 {
449  const uint8_t *ptr = pkt->data, *end = pkt->data + pkt->size;
450  uint32_t state = UINT32_MAX;
451  int has_extradata = 0, extradata_size = 0;
452 
453  while (ptr < end) {
454  ptr = avpriv_find_start_code(ptr, end, &state);
456  has_extradata = 1;
457  } else if (has_extradata && IS_MARKER(state)) {
458  extradata_size = ptr - 4 - pkt->data;
459  break;
460  }
461  }
462 
463  if (extradata_size) {
464  *data = av_malloc(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
465  if (!*data)
466  return AVERROR(ENOMEM);
467 
468  memcpy(*data, pkt->data, extradata_size);
469  *size = extradata_size;
470 
471  if (s->remove) {
472  pkt->data += extradata_size;
473  pkt->size -= extradata_size;
474  }
475  }
476 
477  return 0;
478 }
479 
481  uint8_t **data, int *size)
482 {
484  uint32_t state = UINT32_MAX;
485  int i, found = 0;
486 
487  for (i = 0; i < pkt->size; i++) {
488  state = (state << 8) | pkt->data[i];
489  if (state == 0x1B3)
490  found = 1;
491  else if (found && state != 0x1B5 && state < 0x200 && state >= 0x100) {
492  *size = i - 3;
494  if (!*data)
495  return AVERROR(ENOMEM);
496 
497  memcpy(*data, pkt->data, *size);
498 
499  if (s->remove) {
500  pkt->data += *size;
501  pkt->size -= *size;
502  }
503  break;
504  }
505  }
506  return 0;
507 }
508 
510  uint8_t **data, int *size)
511 {
513  const uint8_t *ptr = pkt->data, *end = pkt->data + pkt->size;
514  uint32_t state = UINT32_MAX;
515 
516  while (ptr < end) {
517  ptr = avpriv_find_start_code(ptr, end, &state);
518  if (state == 0x1B3 || state == 0x1B6) {
519  if (ptr - pkt->data > 4) {
520  *size = ptr - 4 - pkt->data;
522  if (!*data)
523  return AVERROR(ENOMEM);
524 
525  memcpy(*data, pkt->data, *size);
526 
527  if (s->remove) {
528  pkt->data += *size;
529  pkt->size -= *size;
530  }
531  }
532  break;
533  }
534  }
535  return 0;
536 }
537 
538 static const struct {
539  enum AVCodecID id;
541  uint8_t **data, int *size);
542 } extract_tab[] = {
555 };
556 
558 {
560  int i;
561 
562  for (i = 0; i < FF_ARRAY_ELEMS(extract_tab); i++) {
563  if (extract_tab[i].id == ctx->par_in->codec_id) {
564  s->extract = extract_tab[i].extract;
565  break;
566  }
567  }
568  if (!s->extract)
569  return AVERROR_BUG;
570 
571  return 0;
572 }
573 
575 {
577  uint8_t *extradata = NULL;
578  int extradata_size;
579  int ret = 0;
580 
582  if (ret < 0)
583  return ret;
584 
585  ret = s->extract(ctx, pkt, &extradata, &extradata_size);
586  if (ret < 0)
587  goto fail;
588 
589  if (extradata) {
590  memset(extradata + extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
592  extradata, extradata_size);
593  if (ret < 0) {
594  av_freep(&extradata);
595  goto fail;
596  }
597  }
598 
599  return 0;
600 
601 fail:
603  return ret;
604 }
605 
607 {
609  ff_av1_packet_uninit(&s->av1_pkt);
610  ff_h2645_packet_uninit(&s->h2645_pkt);
611 }
612 
613 static const enum AVCodecID codec_ids[] = {
627 };
628 
629 #define OFFSET(x) offsetof(ExtractExtradataContext, x)
630 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_BSF_PARAM)
631 static const AVOption options[] = {
632  { "remove", "remove the extradata from the bitstream", OFFSET(remove), AV_OPT_TYPE_INT,
633  { .i64 = 0 }, 0, 1, FLAGS },
634  { NULL },
635 };
636 
638  .class_name = "extract_extradata",
639  .item_name = av_default_item_name,
640  .option = options,
641  .version = LIBAVUTIL_VERSION_INT,
642 };
643 
645  .p.name = "extract_extradata",
646  .p.codec_ids = codec_ids,
647  .p.priv_class = &extract_extradata_class,
648  .priv_data_size = sizeof(ExtractExtradataContext),
652 };
H264_NAL_PPS
@ H264_NAL_PPS
Definition: h264.h:42
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:432
ExtractExtradataContext::h2645_pkt
H2645Packet h2645_pkt
Definition: extract_extradata.c:50
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
bsf_internal.h
opt.h
extract_extradata_lcevc
static int extract_extradata_lcevc(AVBSFContext *ctx, AVPacket *pkt, uint8_t **data, int *size)
Definition: extract_extradata.c:351
extract_extradata_h2645
static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt, uint8_t **data, int *size)
Definition: extract_extradata.c:166
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition: bytestream.h:158
OFFSET
#define OFFSET(x)
Definition: extract_extradata.c:629
GetByteContext
Definition: bytestream.h:33
bytestream2_tell
static av_always_inline int bytestream2_tell(const GetByteContext *g)
Definition: bytestream.h:192
AV_PKT_DATA_NEW_EXTRADATA
@ AV_PKT_DATA_NEW_EXTRADATA
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
Definition: packet.h:56
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
extract_extradata_vc1
static int extract_extradata_vc1(AVBSFContext *ctx, AVPacket *pkt, uint8_t **data, int *size)
Definition: extract_extradata.c:445
AVBitStreamFilter::name
const char * name
Definition: bsf.h:112
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:254
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:64
extract_extradata_class
static const AVClass extract_extradata_class
Definition: extract_extradata.c:637
state
static struct @560 state
AVPacket::data
uint8_t * data
Definition: packet.h:588
AVOption
AVOption.
Definition: opt.h:429
ff_h2645_packet_uninit
void ff_h2645_packet_uninit(H2645Packet *pkt)
Free all the allocated memory in the packet.
Definition: h2645_parse.c:667
AV_CODEC_ID_AVS2
@ AV_CODEC_ID_AVS2
Definition: codec_id.h:248
data
const char data[16]
Definition: mxf.c:149
AV1OBU
Definition: av1_parse.h:38
id
enum AVCodecID id
Definition: extract_extradata.c:539
filter
void(* filter)(uint8_t *src, int stride, int qscale)
Definition: h263dsp.c:29
extract_extradata_mpeg12
static int extract_extradata_mpeg12(AVBSFContext *ctx, AVPacket *pkt, uint8_t **data, int *size)
Definition: extract_extradata.c:480
ExtractExtradataContext::av1_pkt
AV1Packet av1_pkt
Definition: extract_extradata.c:47
lcevc_parse.h
obu_is_global
static int obu_is_global(const AV1OBU *obu)
Definition: extract_extradata.c:81
extract
int(* extract)(AVBSFContext *ctx, AVPacket *pkt, uint8_t **data, int *size)
Definition: extract_extradata.c:540
ExtractExtradataContext::remove
int remove
Definition: extract_extradata.c:53
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:517
get_mb
static uint64_t get_mb(GetBitContext *s)
Definition: lcevc_parse.h:26
AVBSFContext
The bitstream filter state.
Definition: bsf.h:68
AV1OBU::data
const uint8_t * data
Definition: av1_parse.h:41
ff_av1_packet_split
int ff_av1_packet_split(AV1Packet *pkt, const uint8_t *buf, int length, void *logctx)
Split an input packet into OBUs.
Definition: av1_parse.c:56
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:197
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
av1_parse.h
bsf.h
av_packet_add_side_data
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as a packet side data.
Definition: packet.c:197
AV1Packet
An input packet split into OBUs.
Definition: av1_parse.h:60
fail
#define fail()
Definition: checkasm.h:219
LCEVC_PAYLOAD_TYPE_SEQUENCE_CONFIG
@ LCEVC_PAYLOAD_TYPE_SEQUENCE_CONFIG
Definition: lcevc.h:70
ExtractExtradataContext::extract
int(* extract)(AVBSFContext *ctx, AVPacket *pkt, uint8_t **data, int *size)
Definition: extract_extradata.c:43
extract_extradata_close
static void extract_extradata_close(AVBSFContext *ctx)
Definition: extract_extradata.c:606
GetBitContext
Definition: get_bits.h:109
val
static double val(void *priv, double ch)
Definition: aeval.c:77
extract_extradata_mpeg4
static int extract_extradata_mpeg4(AVBSFContext *ctx, AVPacket *pkt, uint8_t **data, int *size)
Definition: extract_extradata.c:509
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:544
bytestream2_init_writer
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
Definition: bytestream.h:147
s
#define s(width, name)
Definition: cbs_vp9.c:198
bytestream2_tell_p
static av_always_inline int bytestream2_tell_p(const PutByteContext *p)
Definition: bytestream.h:197
bytestream2_put_buffer
static av_always_inline unsigned int bytestream2_put_buffer(PutByteContext *p, const uint8_t *src, unsigned int size)
Definition: bytestream.h:286
GetByteContext::buffer
const uint8_t * buffer
Definition: bytestream.h:34
HEVC_NAL_VPS
@ HEVC_NAL_VPS
Definition: hevc.h:61
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
hevc.h
AV_CODEC_ID_H264
@ AV_CODEC_ID_H264
Definition: codec_id.h:79
AV1_METADATA_TYPE_HDR_MDCV
@ AV1_METADATA_TYPE_HDR_MDCV
Definition: av1.h:45
if
if(ret)
Definition: filter_design.txt:179
LCEVC_IDR_NUT
@ LCEVC_IDR_NUT
Definition: lcevc.h:61
AV_CODEC_ID_AVS3
@ AV_CODEC_ID_AVS3
Definition: codec_id.h:250
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:571
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
get_leb
static unsigned get_leb(GetBitContext *s)
Read a unsigned integer coded as a variable number of up to eight little-endian bytes,...
Definition: leb.h:35
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
FFBitStreamFilter
Definition: bsf_internal.h:27
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
AV_CODEC_ID_AV1
@ AV_CODEC_ID_AV1
Definition: codec_id.h:284
LCEVC_PAYLOAD_TYPE_ADDITIONAL_INFO
@ LCEVC_PAYLOAD_TYPE_ADDITIONAL_INFO
Definition: lcevc.h:75
write_lcevc_nalu
static int write_lcevc_nalu(AVBSFContext *ctx, PutByteContext *pbc, const H2645NAL *nal, int remove)
Rewrite the NALu stripping the unneeded blocks.
Definition: extract_extradata.c:278
VC1_CODE_SEQHDR
@ VC1_CODE_SEQHDR
Definition: vc1_common.h:40
codec_ids
static enum AVCodecID codec_ids[]
Definition: extract_extradata.c:613
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
IS_MARKER
#define IS_MARKER(state)
Definition: dca_parser.c:52
options
Definition: swscale.c:43
VC1_CODE_ENTRYPOINT
@ VC1_CODE_ENTRYPOINT
Definition: vc1_common.h:39
extract_extradata_filter
static int extract_extradata_filter(AVBSFContext *ctx, AVPacket *pkt)
Definition: extract_extradata.c:574
avpriv_find_start_code
const uint8_t * avpriv_find_start_code(const uint8_t *p, const uint8_t *end, uint32_t *state)
ff_extract_extradata_bsf
const FFBitStreamFilter ff_extract_extradata_bsf
Definition: extract_extradata.c:644
AV_CODEC_ID_MPEG1VIDEO
@ AV_CODEC_ID_MPEG1VIDEO
Definition: codec_id.h:53
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
PutByteContext
Definition: bytestream.h:37
FFBitStreamFilter::p
AVBitStreamFilter p
The public AVBitStreamFilter.
Definition: bsf_internal.h:31
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:578
extract_extradata_init
static int extract_extradata_init(AVBSFContext *ctx)
Definition: extract_extradata.c:557
AVPacket::size
int size
Definition: packet.h:589
VVC_VPS_NUT
@ VVC_VPS_NUT
Definition: vvc.h:43
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
HEVC_NAL_SPS
@ HEVC_NAL_SPS
Definition: hevc.h:62
size
int size
Definition: twinvq_data.h:10344
H2645NAL
Definition: h2645_parse.h:34
AV1_OBU_SEQUENCE_HEADER
@ AV1_OBU_SEQUENCE_HEADER
Definition: av1.h:30
options
static const AVOption options[]
Definition: extract_extradata.c:631
val_in_array
static int val_in_array(const int *arr, size_t len, int val)
Definition: extract_extradata.c:56
HEVC_NAL_PPS
@ HEVC_NAL_PPS
Definition: hevc.h:63
LCEVC_PAYLOAD_TYPE_GLOBAL_CONFIG
@ LCEVC_PAYLOAD_TYPE_GLOBAL_CONFIG
Definition: lcevc.h:71
AV_CODEC_ID_VVC
@ AV_CODEC_ID_VVC
Definition: codec_id.h:252
AV1OBU::raw_size
int raw_size
Size of entire OBU, including header.
Definition: av1_parse.h:50
AV_CODEC_ID_LCEVC
@ AV_CODEC_ID_LCEVC
Definition: codec_id.h:615
av_buffer_alloc
AVBufferRef * av_buffer_alloc(size_t size)
Allocate an AVBuffer of the given size using av_malloc().
Definition: buffer.c:77
VVC_SPS_NUT
@ VVC_SPS_NUT
Definition: vvc.h:44
vc1_common.h
AV1OBU::size_bits
int size_bits
Size, in bits, of just the data, excluding the trailing_one_bit and any trailing padding.
Definition: av1_parse.h:47
H2645_FLAG_SMALL_PADDING
@ H2645_FLAG_SMALL_PADDING
Definition: h2645_parse.h:98
FLAGS
#define FLAGS
Definition: extract_extradata.c:630
log.h
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
nal
static int FUNC() nal(CodedBitstreamContext *ctx, RWContext *rw, LCEVCRawNAL *current, int nal_unit_type)
Definition: cbs_lcevc_syntax_template.c:657
extract_tab
static const struct @73 extract_tab[]
AV_CODEC_ID_CAVS
@ AV_CODEC_ID_CAVS
Definition: codec_id.h:139
AV1OBU::raw_data
const uint8_t * raw_data
Definition: av1_parse.h:51
AV_CODEC_ID_HEVC
@ AV_CODEC_ID_HEVC
Definition: codec_id.h:228
AV1_METADATA_TYPE_HDR_CLL
@ AV1_METADATA_TYPE_HDR_CLL
Definition: av1.h:44
ff_av1_packet_uninit
void ff_av1_packet_uninit(AV1Packet *pkt)
Free all the allocated memory in the packet.
Definition: av1_parse.c:104
AV_CODEC_ID_VC1
@ AV_CODEC_ID_VC1
Definition: codec_id.h:122
len
int len
Definition: vorbis_enc_data.h:426
extract_extradata_av1
static int extract_extradata_av1(AVBSFContext *ctx, AVPacket *pkt, uint8_t **data, int *size)
Definition: extract_extradata.c:96
ret
ret
Definition: filter_design.txt:187
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
av_malloc
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:98
VVC_PPS_NUT
@ VVC_PPS_NUT
Definition: vvc.h:45
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
H264_NAL_SPS
@ H264_NAL_SPS
Definition: h264.h:41
ExtractExtradataContext
Definition: extract_extradata.c:40
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
lcevc.h
AV1OBU::type
int type
Definition: av1_parse.h:53
LCEVC_NON_IDR_NUT
@ LCEVC_NON_IDR_NUT
Definition: lcevc.h:60
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
bytestream2_put_bufferu
static av_always_inline unsigned int bytestream2_put_bufferu(PutByteContext *p, const uint8_t *src, unsigned int size)
Definition: bytestream.h:301
AVPacket
This structure stores compressed data.
Definition: packet.h:565
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
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
metadata_is_global
static int metadata_is_global(const AV1OBU *obu)
Definition: extract_extradata.c:64
ff_bsf_get_packet_ref
int ff_bsf_get_packet_ref(AVBSFContext *ctx, AVPacket *pkt)
Called by bitstream filters to get packet for filtering.
Definition: bsf.c:256
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
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
AV_CODEC_ID_MPEG2VIDEO
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
Definition: codec_id.h:54
H2645Packet
Definition: h2645_parse.h:82
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1291
AV1_OBU_METADATA
@ AV1_OBU_METADATA
Definition: av1.h:34