FFmpeg
bsf.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 <string.h>
20 
21 #include "libavutil/log.h"
22 #include "libavutil/mem.h"
23 #include "libavutil/opt.h"
24 #include "libavutil/avstring.h"
25 #include "libavutil/bprint.h"
26 
27 #include "avcodec.h"
28 #include "bsf.h"
29 
30 struct AVBSFInternal {
32  int eof;
33 };
34 
36 {
38 
39  if (!pctx || !*pctx)
40  return;
41  ctx = *pctx;
42 
43  if (ctx->filter->close)
44  ctx->filter->close(ctx);
45  if (ctx->filter->priv_class && ctx->priv_data)
47 
49 
50  if (ctx->internal)
51  av_packet_free(&ctx->internal->buffer_pkt);
54 
55  avcodec_parameters_free(&ctx->par_in);
56  avcodec_parameters_free(&ctx->par_out);
57 
58  av_freep(pctx);
59 }
60 
61 static void *bsf_child_next(void *obj, void *prev)
62 {
63  AVBSFContext *ctx = obj;
64  if (!prev && ctx->filter->priv_class)
65  return ctx->priv_data;
66  return NULL;
67 }
68 
69 static const AVClass bsf_class = {
70  .class_name = "AVBSFContext",
71  .item_name = av_default_item_name,
72  .version = LIBAVUTIL_VERSION_INT,
73  .child_next = bsf_child_next,
74  .child_class_next = ff_bsf_child_class_next,
75 };
76 
78 {
79  return &bsf_class;
80 }
81 
83 {
85  int ret;
86 
87  ctx = av_mallocz(sizeof(*ctx));
88  if (!ctx)
89  return AVERROR(ENOMEM);
90 
92  ctx->filter = filter;
93 
94  ctx->par_in = avcodec_parameters_alloc();
95  ctx->par_out = avcodec_parameters_alloc();
96  if (!ctx->par_in || !ctx->par_out) {
97  ret = AVERROR(ENOMEM);
98  goto fail;
99  }
100 
101  ctx->internal = av_mallocz(sizeof(*ctx->internal));
102  if (!ctx->internal) {
103  ret = AVERROR(ENOMEM);
104  goto fail;
105  }
106 
107  ctx->internal->buffer_pkt = av_packet_alloc();
108  if (!ctx->internal->buffer_pkt) {
109  ret = AVERROR(ENOMEM);
110  goto fail;
111  }
112 
114 
115  /* allocate priv data and init private options */
116  if (filter->priv_data_size) {
117  ctx->priv_data = av_mallocz(filter->priv_data_size);
118  if (!ctx->priv_data) {
119  ret = AVERROR(ENOMEM);
120  goto fail;
121  }
122  if (filter->priv_class) {
123  *(const AVClass **)ctx->priv_data = filter->priv_class;
125  }
126  }
127 
128  *pctx = ctx;
129  return 0;
130 fail:
131  av_bsf_free(&ctx);
132  return ret;
133 }
134 
136 {
137  int ret, i;
138 
139  /* check that the codec is supported */
140  if (ctx->filter->codec_ids) {
141  for (i = 0; ctx->filter->codec_ids[i] != AV_CODEC_ID_NONE; i++)
142  if (ctx->par_in->codec_id == ctx->filter->codec_ids[i])
143  break;
144  if (ctx->filter->codec_ids[i] == AV_CODEC_ID_NONE) {
145  const AVCodecDescriptor *desc = avcodec_descriptor_get(ctx->par_in->codec_id);
146  av_log(ctx, AV_LOG_ERROR, "Codec '%s' (%d) is not supported by the "
147  "bitstream filter '%s'. Supported codecs are: ",
148  desc ? desc->name : "unknown", ctx->par_in->codec_id, ctx->filter->name);
149  for (i = 0; ctx->filter->codec_ids[i] != AV_CODEC_ID_NONE; i++) {
150  desc = avcodec_descriptor_get(ctx->filter->codec_ids[i]);
151  av_log(ctx, AV_LOG_ERROR, "%s (%d) ",
152  desc ? desc->name : "unknown", ctx->filter->codec_ids[i]);
153  }
154  av_log(ctx, AV_LOG_ERROR, "\n");
155  return AVERROR(EINVAL);
156  }
157  }
158 
159  /* initialize output parameters to be the same as input
160  * init below might overwrite that */
161  ret = avcodec_parameters_copy(ctx->par_out, ctx->par_in);
162  if (ret < 0)
163  return ret;
164 
165  ctx->time_base_out = ctx->time_base_in;
166 
167  if (ctx->filter->init) {
168  ret = ctx->filter->init(ctx);
169  if (ret < 0)
170  return ret;
171  }
172 
173  return 0;
174 }
175 
177 {
178  ctx->internal->eof = 0;
179 
180  av_packet_unref(ctx->internal->buffer_pkt);
181 
182  if (ctx->filter->flush)
183  ctx->filter->flush(ctx);
184 }
185 
187 {
188  int ret;
189 
190  if (!pkt || (!pkt->data && !pkt->side_data_elems)) {
191  ctx->internal->eof = 1;
192  return 0;
193  }
194 
195  if (ctx->internal->eof) {
196  av_log(ctx, AV_LOG_ERROR, "A non-NULL packet sent after an EOF.\n");
197  return AVERROR(EINVAL);
198  }
199 
200  if (ctx->internal->buffer_pkt->data ||
201  ctx->internal->buffer_pkt->side_data_elems)
202  return AVERROR(EAGAIN);
203 
205  if (ret < 0)
206  return ret;
207  av_packet_move_ref(ctx->internal->buffer_pkt, pkt);
208 
209  return 0;
210 }
211 
213 {
214  return ctx->filter->filter(ctx, pkt);
215 }
216 
218 {
220  AVPacket *tmp_pkt;
221 
222  if (in->eof)
223  return AVERROR_EOF;
224 
225  if (!ctx->internal->buffer_pkt->data &&
226  !ctx->internal->buffer_pkt->side_data_elems)
227  return AVERROR(EAGAIN);
228 
229  tmp_pkt = av_packet_alloc();
230  if (!tmp_pkt)
231  return AVERROR(ENOMEM);
232 
233  *pkt = ctx->internal->buffer_pkt;
234  ctx->internal->buffer_pkt = tmp_pkt;
235 
236  return 0;
237 }
238 
240 {
242 
243  if (in->eof)
244  return AVERROR_EOF;
245 
246  if (!ctx->internal->buffer_pkt->data &&
247  !ctx->internal->buffer_pkt->side_data_elems)
248  return AVERROR(EAGAIN);
249 
250  av_packet_move_ref(pkt, ctx->internal->buffer_pkt);
251 
252  return 0;
253 }
254 
255 typedef struct BSFListContext {
256  const AVClass *class;
257 
259  int nb_bsfs;
260 
261  unsigned idx; // index of currently processed BSF
262  unsigned flushed_idx; // index of BSF being flushed
263 
264  char * item_name;
266 
267 
268 static int bsf_list_init(AVBSFContext *bsf)
269 {
270  BSFListContext *lst = bsf->priv_data;
271  int ret, i;
272  const AVCodecParameters *cod_par = bsf->par_in;
273  AVRational tb = bsf->time_base_in;
274 
275  for (i = 0; i < lst->nb_bsfs; ++i) {
276  ret = avcodec_parameters_copy(lst->bsfs[i]->par_in, cod_par);
277  if (ret < 0)
278  goto fail;
279 
280  lst->bsfs[i]->time_base_in = tb;
281 
282  ret = av_bsf_init(lst->bsfs[i]);
283  if (ret < 0)
284  goto fail;
285 
286  cod_par = lst->bsfs[i]->par_out;
287  tb = lst->bsfs[i]->time_base_out;
288  }
289 
290  bsf->time_base_out = tb;
291  ret = avcodec_parameters_copy(bsf->par_out, cod_par);
292 
293 fail:
294  return ret;
295 }
296 
298 {
299  BSFListContext *lst = bsf->priv_data;
300  int ret;
301 
302  if (!lst->nb_bsfs)
303  return ff_bsf_get_packet_ref(bsf, out);
304 
305  while (1) {
306  if (lst->idx > lst->flushed_idx) {
307  ret = av_bsf_receive_packet(lst->bsfs[lst->idx-1], out);
308  if (ret == AVERROR(EAGAIN)) {
309  /* no more packets from idx-1, try with previous */
310  ret = 0;
311  lst->idx--;
312  continue;
313  } else if (ret == AVERROR_EOF) {
314  /* filter idx-1 is done, continue with idx...nb_bsfs */
315  lst->flushed_idx = lst->idx;
316  continue;
317  }else if (ret < 0) {
318  /* filtering error */
319  break;
320  }
321  } else {
322  ret = ff_bsf_get_packet_ref(bsf, out);
323  if (ret == AVERROR_EOF) {
324  lst->idx = lst->flushed_idx;
325  } else if (ret < 0)
326  break;
327  }
328 
329  if (lst->idx < lst->nb_bsfs) {
330  AVPacket *pkt;
331  if (ret == AVERROR_EOF && lst->idx == lst->flushed_idx) {
332  /* ff_bsf_get_packet_ref returned EOF and idx is first
333  * filter of yet not flushed filter chain */
334  pkt = NULL;
335  } else {
336  pkt = out;
337  }
338  ret = av_bsf_send_packet(lst->bsfs[lst->idx], pkt);
339  if (ret < 0)
340  break;
341  lst->idx++;
342  } else {
343  /* The end of filter chain, break to return result */
344  break;
345  }
346  }
347 
348  if (ret < 0)
350 
351  return ret;
352 }
353 
354 static void bsf_list_flush(AVBSFContext *bsf)
355 {
356  BSFListContext *lst = bsf->priv_data;
357 
358  for (int i = 0; i < lst->nb_bsfs; i++)
359  av_bsf_flush(lst->bsfs[i]);
360  lst->idx = lst->flushed_idx = 0;
361 }
362 
363 static void bsf_list_close(AVBSFContext *bsf)
364 {
365  BSFListContext *lst = bsf->priv_data;
366  int i;
367 
368  for (i = 0; i < lst->nb_bsfs; ++i)
369  av_bsf_free(&lst->bsfs[i]);
370  av_freep(&lst->bsfs);
371  av_freep(&lst->item_name);
372 }
373 
374 static const char *bsf_list_item_name(void *ctx)
375 {
376  static const char *null_filter_name = "null";
377  AVBSFContext *bsf_ctx = ctx;
378  BSFListContext *lst = bsf_ctx->priv_data;
379 
380  if (!lst->nb_bsfs)
381  return null_filter_name;
382 
383  if (!lst->item_name) {
384  int i;
385  AVBPrint bp;
386  av_bprint_init(&bp, 16, 128);
387 
388  av_bprintf(&bp, "bsf_list(");
389  for (i = 0; i < lst->nb_bsfs; i++)
390  av_bprintf(&bp, i ? ",%s" : "%s", lst->bsfs[i]->filter->name);
391  av_bprintf(&bp, ")");
392 
393  av_bprint_finalize(&bp, &lst->item_name);
394  }
395 
396  return lst->item_name;
397 }
398 
399 static const AVClass bsf_list_class = {
400  .class_name = "bsf_list",
401  .item_name = bsf_list_item_name,
402  .version = LIBAVUTIL_VERSION_INT,
403 };
404 
406  .name = "bsf_list",
407  .priv_data_size = sizeof(BSFListContext),
408  .priv_class = &bsf_list_class,
409  .init = bsf_list_init,
412  .close = bsf_list_close,
413 };
414 
415 struct AVBSFList {
417  int nb_bsfs;
418 };
419 
421 {
422  return av_mallocz(sizeof(AVBSFList));
423 }
424 
426 {
427  int i;
428 
429  if (!*lst)
430  return;
431 
432  for (i = 0; i < (*lst)->nb_bsfs; ++i)
433  av_bsf_free(&(*lst)->bsfs[i]);
434  av_free((*lst)->bsfs);
435  av_freep(lst);
436 }
437 
439 {
440  return av_dynarray_add_nofree(&lst->bsfs, &lst->nb_bsfs, bsf);
441 }
442 
443 int av_bsf_list_append2(AVBSFList *lst, const char *bsf_name, AVDictionary ** options)
444 {
445  int ret;
446  const AVBitStreamFilter *filter;
447  AVBSFContext *bsf;
448 
449  filter = av_bsf_get_by_name(bsf_name);
450  if (!filter)
451  return AVERROR_BSF_NOT_FOUND;
452 
453  ret = av_bsf_alloc(filter, &bsf);
454  if (ret < 0)
455  return ret;
456 
457  if (options) {
459  if (ret < 0)
460  goto end;
461  }
462 
463  ret = av_bsf_list_append(lst, bsf);
464 
465 end:
466  if (ret < 0)
467  av_bsf_free(&bsf);
468 
469  return ret;
470 }
471 
473 {
474  int ret = 0;
476 
477  if ((*lst)->nb_bsfs == 1) {
478  *bsf = (*lst)->bsfs[0];
479  av_freep(&(*lst)->bsfs);
480  (*lst)->nb_bsfs = 0;
481  goto end;
482  }
483 
484  ret = av_bsf_alloc(&ff_list_bsf, bsf);
485  if (ret < 0)
486  return ret;
487 
488  ctx = (*bsf)->priv_data;
489 
490  ctx->bsfs = (*lst)->bsfs;
491  ctx->nb_bsfs = (*lst)->nb_bsfs;
492 
493 end:
494  av_freep(lst);
495  return ret;
496 }
497 
498 static int bsf_parse_single(const char *str, AVBSFList *bsf_lst)
499 {
500  char *bsf_name, *bsf_options_str, *buf;
501  AVDictionary *bsf_options = NULL;
502  int ret = 0;
503 
504  if (!(buf = av_strdup(str)))
505  return AVERROR(ENOMEM);
506 
507  bsf_name = av_strtok(buf, "=", &bsf_options_str);
508  if (!bsf_name) {
509  ret = AVERROR(EINVAL);
510  goto end;
511  }
512 
513  if (bsf_options_str) {
514  ret = av_dict_parse_string(&bsf_options, bsf_options_str, "=", ":", 0);
515  if (ret < 0)
516  goto end;
517  }
518 
519  ret = av_bsf_list_append2(bsf_lst, bsf_name, &bsf_options);
520 
521  av_dict_free(&bsf_options);
522 end:
523  av_free(buf);
524  return ret;
525 }
526 
527 int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst)
528 {
529  AVBSFList *lst;
530  char *bsf_str, *buf, *dup, *saveptr;
531  int ret;
532 
533  if (!str)
534  return av_bsf_get_null_filter(bsf_lst);
535 
536  lst = av_bsf_list_alloc();
537  if (!lst)
538  return AVERROR(ENOMEM);
539 
540  if (!(dup = buf = av_strdup(str))) {
541  ret = AVERROR(ENOMEM);
542  goto end;
543  }
544 
545  while (1) {
546  bsf_str = av_strtok(buf, ",", &saveptr);
547  if (!bsf_str)
548  break;
549 
550  ret = bsf_parse_single(bsf_str, lst);
551  if (ret < 0)
552  goto end;
553 
554  buf = NULL;
555  }
556 
557  ret = av_bsf_list_finalize(&lst, bsf_lst);
558 end:
559  if (ret < 0)
560  av_bsf_list_free(&lst);
561  av_free(dup);
562  return ret;
563 }
564 
566 {
567  return av_bsf_alloc(&ff_list_bsf, bsf);
568 }
AVBSFList::nb_bsfs
int nb_bsfs
Definition: bsf.c:417
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:599
AVBSFContext::par_in
AVCodecParameters * par_in
Parameters of the input stream.
Definition: avcodec.h:5791
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
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
opt.h
bsf_parse_single
static int bsf_parse_single(const char *str, AVBSFList *bsf_lst)
Definition: bsf.c:498
AVBSFInternal::buffer_pkt
AVPacket * buffer_pkt
Definition: bsf.c:31
av_opt_set_defaults
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
Definition: opt.c:1305
av_bprint_finalize
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
Definition: bprint.c:235
out
FILE * out
Definition: movenc.c:54
av_bprint_init
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
Definition: bprint.c:69
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: avcodec.h:3949
av_bsf_list_append
int av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf)
Append bitstream filter to the list of bitstream filters.
Definition: bsf.c:438
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:55
AVBitStreamFilter::name
const char * name
Definition: avcodec.h:5813
av_bsf_send_packet
int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
Submit a packet for filtering.
Definition: bsf.c:186
end
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:90
BSFListContext::bsfs
AVBSFContext ** bsfs
Definition: bsf.c:258
AVPacket::data
uint8_t * data
Definition: avcodec.h:1477
filter
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
Definition: filter_design.txt:228
AVDictionary
Definition: dict.c:30
ff_bsf_get_packet
int ff_bsf_get_packet(AVBSFContext *ctx, AVPacket **pkt)
Called by the bitstream filters to get the next packet for filtering.
Definition: bsf.c:217
AVFormatContext::internal
AVFormatInternal * internal
An opaque field for libavformat internal usage.
Definition: avformat.h:1795
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: avpacket.c:62
AVBSFContext
The bitstream filter state.
Definition: avcodec.h:5763
av_bsf_get_null_filter
int av_bsf_get_null_filter(AVBSFContext **bsf)
Get null/pass-through bitstream filter.
Definition: bsf.c:565
BSFListContext
Definition: bsf.c:255
av_bsf_alloc
int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **pctx)
Allocate a context for a given bitstream filter.
Definition: bsf.c:82
bsf.h
fail
#define fail()
Definition: checkasm.h:120
bsf_child_next
static void * bsf_child_next(void *obj, void *prev)
Definition: bsf.c:61
AVBSFContext::par_out
AVCodecParameters * par_out
Parameters of the output stream.
Definition: avcodec.h:5797
BSFListContext::nb_bsfs
int nb_bsfs
Definition: bsf.c:259
BSFListContext::idx
unsigned idx
Definition: bsf.c:261
bsf_list_filter
static int bsf_list_filter(AVBSFContext *bsf, AVPacket *out)
Definition: bsf.c:297
av_bsf_get_by_name
const AVBitStreamFilter * av_bsf_get_by_name(const char *name)
Definition: bitstream_filters.c:80
bsf_list_flush
static void bsf_list_flush(AVBSFContext *bsf)
Definition: bsf.c:354
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
buf
void * buf
Definition: avisynth_c.h:766
av_bsf_get_class
const AVClass * av_bsf_get_class(void)
Get the AVClass for AVBSFContext.
Definition: bsf.c:77
AVCodecDescriptor
This struct describes the properties of a single codec described by an AVCodecID.
Definition: avcodec.h:716
av_strtok
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok().
Definition: avstring.c:184
ctx
AVFormatContext * ctx
Definition: movenc.c:48
AVBSFContext::time_base_in
AVRational time_base_in
The timebase used for the timestamps of the input packets.
Definition: avcodec.h:5803
av_bsf_free
void av_bsf_free(AVBSFContext **pctx)
Free a bitstream filter context and everything associated with it; write NULL into the supplied point...
Definition: bsf.c:35
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:67
flush
static void flush(AVCodecContext *avctx)
Definition: aacdec_template.c:500
NULL
#define NULL
Definition: coverity.c:32
avcodec_parameters_free
void avcodec_parameters_free(AVCodecParameters **par)
Free an AVCodecParameters instance and everything associated with it and write NULL to the supplied p...
Definition: utils.c:2069
av_bsf_list_alloc
AVBSFList * av_bsf_list_alloc(void)
Allocate empty list of bitstream filters.
Definition: bsf.c:420
AVBSFInternal::eof
int eof
Definition: bsf.c:32
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191
AVERROR_BSF_NOT_FOUND
#define AVERROR_BSF_NOT_FOUND
Bitstream filter not found.
Definition: error.h:49
av_opt_free
void av_opt_free(void *obj)
Free all allocated objects in obj.
Definition: opt.c:1558
av_packet_move_ref
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
Move every field in src to dst and reset src.
Definition: avpacket.c:655
BSFListContext::flushed_idx
unsigned flushed_idx
Definition: bsf.c:262
options
const OptionDef options[]
bsf_class
static const AVClass bsf_class
Definition: bsf.c:69
ff_bsf_child_class_next
const AVClass * ff_bsf_child_class_next(const AVClass *prev)
Definition: bitstream_filters.c:96
desc
const char * desc
Definition: nvenc.c:68
av_bsf_list_free
void av_bsf_list_free(AVBSFList **lst)
Free list of bitstream filters.
Definition: bsf.c:425
av_bsf_flush
void av_bsf_flush(AVBSFContext *ctx)
Reset the internal bitstream filter state / flush internal buffers.
Definition: bsf.c:176
av_bsf_list_parse_str
int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst)
Parse string describing list of bitstream filters and create single AVBSFContext describing the whole...
Definition: bsf.c:527
bsf_list_item_name
static const char * bsf_list_item_name(void *ctx)
Definition: bsf.c:374
AV_OPT_SEARCH_CHILDREN
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:556
av_bsf_list_finalize
int av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf)
Finalize list of bitstream filters.
Definition: bsf.c:472
av_opt_set_dict2
int av_opt_set_dict2(void *obj, AVDictionary **options, int search_flags)
Set all the options from a given dictionary on an object.
Definition: opt.c:1578
av_packet_make_refcounted
int av_packet_make_refcounted(AVPacket *pkt)
Ensure the data described by a given packet is reference counted.
Definition: avpacket.c:663
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: avpacket.c:51
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:203
bsf_list_class
static const AVClass bsf_list_class
Definition: bsf.c:399
avcodec_parameters_alloc
AVCodecParameters * avcodec_parameters_alloc(void)
Allocate a new AVCodecParameters and set its fields to default values (unknown/invalid/0).
Definition: utils.c:2059
bsf_list_init
static int bsf_list_init(AVBSFContext *bsf)
Definition: bsf.c:268
in
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
Definition: audio_convert.c:326
bprint.h
log.h
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: avcodec.h:216
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
ff_list_bsf
const AVBitStreamFilter ff_list_bsf
Definition: bsf.c:405
avcodec_descriptor_get
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
Definition: codec_desc.c:3257
BSFListContext::item_name
char * item_name
Definition: bsf.c:264
tb
#define tb
Definition: regdef.h:68
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:236
AVBSFContext::time_base_out
AVRational time_base_out
The timebase used for the timestamps of the output packets.
Definition: avcodec.h:5809
avcodec.h
AVBSFContext::priv_data
void * priv_data
Opaque filter-specific private data.
Definition: avcodec.h:5784
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:72
AVFormatContext::av_class
const AVClass * av_class
A class for logging and AVOptions.
Definition: avformat.h:1347
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:94
av_dynarray_add_nofree
int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem)
Add an element to a dynamic array.
Definition: mem.c:294
AVBSFList
Structure for chain/list of bitstream filters.
Definition: bsf.c:415
av_bsf_init
int av_bsf_init(AVBSFContext *ctx)
Prepare the filter for use, after all the parameters and options have been set.
Definition: bsf.c:135
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
AVBitStreamFilter
Definition: avcodec.h:5812
av_dict_parse_string
int av_dict_parse_string(AVDictionary **pm, const char *str, const char *key_val_sep, const char *pairs_sep, int flags)
Parse the key/value pairs list and add the parsed entries to a dictionary.
Definition: dict.c:180
av_bsf_receive_packet
int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt)
Retrieve a filtered packet.
Definition: bsf.c:212
bsf_list_close
static void bsf_list_close(AVBSFContext *bsf)
Definition: bsf.c:363
AVBSFInternal
Definition: bsf.c:30
AVBSFContext::filter
const struct AVBitStreamFilter * filter
The bitstream filter this context is an instance of.
Definition: avcodec.h:5772
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:251
mem.h
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVPacket
This structure stores compressed data.
Definition: avcodec.h:1454
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
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:239
av_bsf_list_append2
int av_bsf_list_append2(AVBSFList *lst, const char *bsf_name, AVDictionary **options)
Construct new bitstream filter context given it's name and options and append it to the list of bitst...
Definition: bsf.c:443
avstring.h
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1370
AVBSFList::bsfs
AVBSFContext ** bsfs
Definition: bsf.c:416
avcodec_parameters_copy
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: utils.c:2080
AVPacket::side_data_elems
int side_data_elems
Definition: avcodec.h:1489