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  bytestream2_init_writer(&pb_extradata, NULL, 0);
373  // dummy pass to find sc, gc or ai
374  if (!write_lcevc_nalu(ctx, &pb_extradata, nal, 0))
375  extradata_size += nal->raw_size + 3;
376  }
377  filtered_size += nal->raw_size + 3;
378  }
379 
380  if (extradata_size) {
381  AVBufferRef *filtered_buf = NULL;
382  PutByteContext pb_filtered_data;
383  uint8_t *extradata;
384 
385  if (s->remove) {
386  filtered_buf = av_buffer_alloc(filtered_size + AV_INPUT_BUFFER_PADDING_SIZE);
387  if (!filtered_buf) {
388  return AVERROR(ENOMEM);
389  }
390  memset(filtered_buf->data + filtered_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
391  }
392 
393  extradata = av_malloc(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
394  if (!extradata) {
395  av_buffer_unref(&filtered_buf);
396  return AVERROR(ENOMEM);
397  }
398 
399  *data = extradata;
400  *size = 0;
401 
402  bytestream2_init_writer(&pb_extradata, extradata, extradata_size);
403  if (s->remove)
404  bytestream2_init_writer(&pb_filtered_data, filtered_buf->data, filtered_size);
405 
406  filtered_size = 0;
407  for (i = 0; i < s->h2645_pkt.nb_nals; i++) {
408  H2645NAL *nal = &s->h2645_pkt.nals[i];
409  if (val_in_array(extradata_nal_types, nb_extradata_nal_types,
410  nal->type)) {
411  bytestream2_put_be24(&pb_extradata, 1); //startcode
412  ret = write_lcevc_nalu(ctx, &pb_extradata, nal, 0);
413  if (ret < 0) {
414  av_freep(data);
415  av_buffer_unref(&filtered_buf);
416  return ret;
417  }
418  *size += ret;
419  if (s->remove) {
420  bytestream2_put_be24(&pb_filtered_data, 1); //startcode
421  ret = write_lcevc_nalu(ctx, &pb_filtered_data, nal, 1);
422  if (ret < 0) {
423  av_freep(data);
424  av_buffer_unref(&filtered_buf);
425  return ret;
426  }
427  filtered_size += ret;
428  }
429  } else if (s->remove) {
430  bytestream2_put_be24(&pb_filtered_data, 1); //startcode
431  bytestream2_put_bufferu(&pb_filtered_data, nal->raw_data, nal->raw_size);
432  filtered_size += nal->raw_size;
433  }
434  }
435 
436  if (s->remove) {
438  pkt->buf = filtered_buf;
439  pkt->data = filtered_buf->data;
440  pkt->size = filtered_size;
441  }
442  }
443 
444  return 0;
445 }
446 
448  uint8_t **data, int *size)
449 {
451  const uint8_t *ptr = pkt->data, *end = pkt->data + pkt->size;
452  uint32_t state = UINT32_MAX;
453  int has_extradata = 0, extradata_size = 0;
454 
455  while (ptr < end) {
456  ptr = avpriv_find_start_code(ptr, end, &state);
458  has_extradata = 1;
459  } else if (has_extradata && IS_MARKER(state)) {
460  extradata_size = ptr - 4 - pkt->data;
461  break;
462  }
463  }
464 
465  if (extradata_size) {
466  *data = av_malloc(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
467  if (!*data)
468  return AVERROR(ENOMEM);
469 
470  memcpy(*data, pkt->data, extradata_size);
471  *size = extradata_size;
472 
473  if (s->remove) {
474  pkt->data += extradata_size;
475  pkt->size -= extradata_size;
476  }
477  }
478 
479  return 0;
480 }
481 
483  uint8_t **data, int *size)
484 {
486  uint32_t state = UINT32_MAX;
487  int i, found = 0;
488 
489  for (i = 0; i < pkt->size; i++) {
490  state = (state << 8) | pkt->data[i];
491  if (state == 0x1B3)
492  found = 1;
493  else if (found && state != 0x1B5 && state < 0x200 && state >= 0x100) {
494  *size = i - 3;
496  if (!*data)
497  return AVERROR(ENOMEM);
498 
499  memcpy(*data, pkt->data, *size);
500 
501  if (s->remove) {
502  pkt->data += *size;
503  pkt->size -= *size;
504  }
505  break;
506  }
507  }
508  return 0;
509 }
510 
512  uint8_t **data, int *size)
513 {
515  const uint8_t *ptr = pkt->data, *end = pkt->data + pkt->size;
516  uint32_t state = UINT32_MAX;
517 
518  while (ptr < end) {
519  ptr = avpriv_find_start_code(ptr, end, &state);
520  if (state == 0x1B3 || state == 0x1B6) {
521  if (ptr - pkt->data > 4) {
522  *size = ptr - 4 - pkt->data;
524  if (!*data)
525  return AVERROR(ENOMEM);
526 
527  memcpy(*data, pkt->data, *size);
528 
529  if (s->remove) {
530  pkt->data += *size;
531  pkt->size -= *size;
532  }
533  }
534  break;
535  }
536  }
537  return 0;
538 }
539 
540 static const struct {
541  enum AVCodecID id;
543  uint8_t **data, int *size);
544 } extract_tab[] = {
557 };
558 
560 {
562  int i;
563 
564  for (i = 0; i < FF_ARRAY_ELEMS(extract_tab); i++) {
565  if (extract_tab[i].id == ctx->par_in->codec_id) {
566  s->extract = extract_tab[i].extract;
567  break;
568  }
569  }
570  if (!s->extract)
571  return AVERROR_BUG;
572 
573  return 0;
574 }
575 
577 {
579  uint8_t *extradata = NULL;
580  int extradata_size;
581  int ret = 0;
582 
584  if (ret < 0)
585  return ret;
586 
587  ret = s->extract(ctx, pkt, &extradata, &extradata_size);
588  if (ret < 0)
589  goto fail;
590 
591  if (extradata) {
592  memset(extradata + extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
594  extradata, extradata_size);
595  if (ret < 0) {
596  av_freep(&extradata);
597  goto fail;
598  }
599  }
600 
601  return 0;
602 
603 fail:
605  return ret;
606 }
607 
609 {
611  ff_av1_packet_uninit(&s->av1_pkt);
612  ff_h2645_packet_uninit(&s->h2645_pkt);
613 }
614 
615 static const enum AVCodecID codec_ids[] = {
629 };
630 
631 #define OFFSET(x) offsetof(ExtractExtradataContext, x)
632 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_BSF_PARAM)
633 static const AVOption options[] = {
634  { "remove", "remove the extradata from the bitstream", OFFSET(remove), AV_OPT_TYPE_INT,
635  { .i64 = 0 }, 0, 1, FLAGS },
636  { NULL },
637 };
638 
640  .class_name = "extract_extradata",
641  .item_name = av_default_item_name,
642  .option = options,
643  .version = LIBAVUTIL_VERSION_INT,
644 };
645 
647  .p.name = "extract_extradata",
648  .p.codec_ids = codec_ids,
649  .p.priv_class = &extract_extradata_class,
650  .priv_data_size = sizeof(ExtractExtradataContext),
654 };
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:631
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:447
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:639
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:541
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:482
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:542
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:220
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:608
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:511
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
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:615
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:576
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:646
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:550
extract_extradata_init
static int extract_extradata_init(AVBSFContext *ctx)
Definition: extract_extradata.c:559
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:633
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:632
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:655
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