FFmpeg
bitstreamfilter.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 "config.h"
20 
21 #include <string.h>
22 
23 #include "libavutil/avassert.h"
24 #include "libavutil/mem.h"
25 #include "libavutil/opt.h"
26 
27 #include "bsf.h"
28 #include "bsf_internal.h"
29 
30 static const char *default_bsf_name(void *filter_ctx)
31 {
33  return ctx->name ? ctx->name : ctx->filter->name;
34 }
35 
36 static void *bsf_child_next(void *obj, void *prev)
37 {
39  if (!prev && ctx->filter && ctx->filter->priv_class && ctx->priv_data)
40  return ctx->priv_data;
41  return NULL;
42 }
43 
45  .class_name = "AVBitStreamFilterContext",
46  .item_name = default_bsf_name,
47  .version = LIBAVUTIL_VERSION_INT,
49  .child_next = bsf_child_next,
50  .child_class_iterate = ff_bsf_child_class_iterate,
51  .state_flags_offset = offsetof(FFBitStreamFilterContext, state_flags),
52 };
53 
54 int ff_bsf_alloc(const AVBitStreamFilter *filter, const char *inst_name, AVBitStreamFilterContext **pctx)
55 {
58  const FFBitStreamFilter *const fi = ff_bsf(filter);
59  int ret = AVERROR(ENOMEM), preinited = 0;
60 
62 
63  ctxi = av_mallocz(sizeof(*ctxi));
64  if (!ctxi)
65  return AVERROR(ENOMEM);
66  *pctx = ctx = &ctxi->p;
67 
69  ctx->filter = filter;
70  ctx->name = inst_name ? av_strdup(inst_name) : NULL;
71  if (fi->priv_data_size) {
73  if (!ctx->priv_data)
74  goto err;
75  }
76  if (fi->preinit) {
77  ret = fi->preinit(ctx);
78  if (ret < 0)
79  goto err;
80  preinited = 1;
81  }
82 
84  if (filter->priv_class) {
85  *(const AVClass**)ctx->priv_data = filter->priv_class;
87  }
88 
89  ctx->nb_inputs = fi->nb_inputs;
90  if (ctx->nb_inputs ) {
91  ctx->input_pads = av_memdup(fi->inputs, ctx->nb_inputs * sizeof(*fi->inputs));
92  if (!ctx->input_pads)
93  goto err;
94  ctx->inputs = av_calloc(ctx->nb_inputs, sizeof(*ctx->inputs));
95  if (!ctx->inputs)
96  goto err;
97  }
98 
99  ctx->nb_outputs = fi->nb_outputs;
100  if (ctx->nb_outputs) {
101  ctx->output_pads = av_memdup(fi->outputs, ctx->nb_outputs * sizeof(*fi->outputs));
102  if (!ctx->output_pads)
103  goto err;
104  ctx->outputs = av_calloc(ctx->nb_outputs, sizeof(*ctx->outputs));
105  if (!ctx->outputs)
106  goto err;
107  }
108 
109  return 0;
110 
111 err:
112  if (preinited)
113  fi->uninit(ctx);
114  av_freep(&ctx->name);
115  av_freep(&ctx->inputs);
116  av_freep(&ctx->input_pads);
117  ctx->nb_inputs = 0;
118  av_freep(&ctx->outputs);
119  av_freep(&ctx->output_pads);
120  ctx->nb_outputs = 0;
122  av_freep(pctx);
123  return ret;
124 }
125 
127  AVBitStreamFilterContext *dst, unsigned dstpad)
128 {
131 
132  av_assert0(src->graph);
133  av_assert0(dst->graph);
134  av_assert0(src->graph == dst->graph);
135 
136  if (src->nb_outputs <= srcpad || dst->nb_inputs <= dstpad ||
137  src->outputs[srcpad] || dst->inputs[dstpad])
138  return AVERROR(EINVAL);
139 
140  if (!(ffbsfctx(src)->state_flags & AV_CLASS_STATE_INITIALIZED) ||
141  !(ffbsfctx(dst)->state_flags & AV_CLASS_STATE_INITIALIZED)) {
142  av_log(src, AV_LOG_ERROR, "Filters must be initialized before linking.\n");
143  return AVERROR(EINVAL);
144  }
145 
146  if (src->output_pads[srcpad].codec_ids && dst->input_pads[dstpad].codec_ids) {
147  int found = 0;
148  for (int i = 0; src->output_pads[srcpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) {
149  for (int j = 0; dst->input_pads[dstpad].codec_ids[j] != AV_CODEC_ID_NONE; j++)
150  if (src->output_pads[srcpad].codec_ids[i] == dst->input_pads[dstpad].codec_ids[j]) {
151  found = 1;
152  break;
153  }
154  if (found)
155  break;
156  }
157 
158  if (!found) {
159  av_log(src, AV_LOG_ERROR, "No common codec id between source and dest pads\n");
160  av_log(src, AV_LOG_ERROR, "Supported input pad codecs are: ");
161  for (int i = 0; dst->input_pads[dstpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) {
162  enum AVCodecID codec_id = dst->input_pads[dstpad].codec_ids[i];
163  av_log(src, AV_LOG_ERROR, "%s (%d) ",
165  }
166  av_log(src, AV_LOG_ERROR, "\n");
167  av_log(src, AV_LOG_ERROR, "Supported output pad codecs are: ");
168  for (int i = 0; src->output_pads[srcpad].codec_ids[i] != AV_CODEC_ID_NONE; i++) {
169  enum AVCodecID codec_id = src->output_pads[srcpad].codec_ids[i];
170  av_log(src, AV_LOG_ERROR, "%s (%d) ",
172  }
173  av_log(src, AV_LOG_ERROR, "\n");
174 
175  return AVERROR(EINVAL);
176  }
177  }
178 
179  li = av_mallocz(sizeof(*li));
180  if (!li)
181  return AVERROR(ENOMEM);
182  link = &li->l;
183 
184  src->outputs[srcpad] = dst->inputs[dstpad] = link;
185 
186  link->src = src;
187  link->dst = dst;
188  link->srcpad = &src->output_pads[srcpad];
189  link->dstpad = &dst->input_pads[dstpad];
190  link->graph = src->graph;
192  if (!li->fifo)
193  return AVERROR(ENOMEM);
194 
195  return 0;
196 }
197 
198 static void link_free(AVBitStreamFilterLink **plink)
199 {
200  AVBitStreamFilterLink *link = *plink;
202 
203  if (!link)
204  return;
205  li = ff_link_internal(link);
206 
209 
210  av_freep(plink);
211 }
212 
214 {
215  if (!link)
216  return;
217 
218  if (link->src)
219  link->src->outputs[link->srcpad - link->src->output_pads] = NULL;
220  if (link->dst)
221  link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL;
222 
223  link_free(&link);
224 }
225 
227 {
228  int i;
229 
230  if (!ctx)
231  return;
232 
233  if (ctx->graph)
235 
236  if (ff_bsf(ctx->filter)->uninit)
237  ff_bsf(ctx->filter)->uninit(ctx);
238 
239  for (i = 0; i < ctx->nb_inputs; i++) {
240  free_link(ctx->inputs[i]);
241  if (ctx->input_pads[i].flags & FF_BSF_PAD_FLAG_FREE_NAME)
242  av_freep(&ctx->input_pads[i].name);
243  }
244  for (i = 0; i < ctx->nb_outputs; i++) {
245  free_link(ctx->outputs[i]);
246  if (ctx->output_pads[i].flags & FF_BSF_PAD_FLAG_FREE_NAME)
247  av_freep(&ctx->output_pads[i].name);
248  }
249 
250  if (ctx->filter->priv_class)
252 
253  av_freep(&ctx->name);
254  av_freep(&ctx->input_pads);
255  av_freep(&ctx->output_pads);
256  av_freep(&ctx->inputs);
257  av_freep(&ctx->outputs);
259  av_opt_free(ctx);
260  av_free(ctx);
261 }
262 
263 /**
264  * Parse filter options into a dictionary.
265  *
266  * @param logctx context for logging
267  * @param priv_class a filter's private class for shorthand options or NULL
268  * @param options dictionary to store parsed options in
269  * @param args options string to parse
270  *
271  * @return a non-negative number on success, a negative error code on failure
272  */
273 static int bsf_opt_parse(void *logctx, const AVClass *priv_class,
274  AVDictionary **options, const char *args)
275 {
276  const AVOption *o = NULL;
277  int ret;
278  int offset= -1;
279 
280  if (!args)
281  return 0;
282 
283  while (*args) {
284  char *parsed_key, *value;
285  const char *key;
286  const char *shorthand = NULL;
287  int additional_flags = 0;
288 
289  if (priv_class && (o = av_opt_next(&priv_class, o))) {
290  if (o->type == AV_OPT_TYPE_CONST || o->offset == offset)
291  continue;
292  offset = o->offset;
293  shorthand = o->name;
294  }
295 
296  ret = av_opt_get_key_value(&args, "=", ":",
297  shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
298  &parsed_key, &value);
299  if (ret < 0) {
300  if (ret == AVERROR(EINVAL))
301  av_log(logctx, AV_LOG_ERROR, "No option name near '%s'\n", args);
302  else
303  av_log(logctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", args,
304  av_err2str(ret));
305  return ret;
306  }
307  if (*args)
308  args++;
309  if (parsed_key) {
310  key = parsed_key;
311  additional_flags = AV_DICT_DONT_STRDUP_KEY;
312  priv_class = NULL; /* reject all remaining shorthand */
313  } else {
314  key = shorthand;
315  }
316 
317  av_log(logctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
318 
320  additional_flags | AV_DICT_DONT_STRDUP_VAL | AV_DICT_MULTIKEY);
321  }
322 
323  return 0;
324 }
325 
327 {
329  int ret = 0;
330 
332  av_log(ctx, AV_LOG_ERROR, "Filter already initialized\n");
333  return AVERROR(EINVAL);
334  }
335 
337  if (ret < 0) {
338  av_log(ctx, AV_LOG_ERROR, "Error applying generic filter options.\n");
339  return ret;
340  }
341 
342  if (ff_bsf(ctx->filter)->init2)
343  ret = ff_bsf(ctx->filter)->init2(ctx);
344  if (ret < 0)
345  return ret;
346 
348 
349  return 0;
350 }
351 
353 {
355  const AVDictionaryEntry *e;
356  int ret = 0;
357 
358  if (args && *args) {
359  ret = bsf_opt_parse(ctx, ctx->filter->priv_class, &options, args);
360  if (ret < 0)
361  goto fail;
362  }
363 
365  if (ret < 0)
366  goto fail;
367 
368  if ((e = av_dict_iterate(options, NULL))) {
369  av_log(ctx, AV_LOG_ERROR, "No such option: %s.\n", e->key);
371  goto fail;
372  }
373 
374 fail:
376 
377  return ret;
378 }
379 
380 const char *av_bsf_pad_get_name(const AVBitStreamFilterPad *pads, int pad_idx)
381 {
382  return pads[pad_idx].name;
383 }
384 
385 const enum AVCodecID *av_bsf_pad_get_codec_ids(const AVBitStreamFilterPad *pads, int pad_idx)
386 {
387  return pads[pad_idx].codec_ids;
388 }
389 
391 {
392  if (pts == AV_NOPTS_VALUE)
393  return;
394  li->l.current_pts = pts;
396  if (li->l.graph && li->age_index >= 0)
398 }
399 
401 {
403  ctxi->ready = FFMAX(ctxi->ready, priority);
404 }
405 
406 /**
407  * Clear packet_blocked_in on all outputs.
408  * This is necessary whenever something changes on input.
409  */
411 {
412  unsigned i;
413 
414  for (i = 0; i < filter->nb_outputs; i++) {
415  BitStreamFilterLinkInternal * const li = ff_link_internal(filter->outputs[i]);
416  li->packet_blocked_in = 0;
417  }
418 }
419 
421 {
423 
424  if (li->status_in == status)
425  return;
426  av_assert0(!li->status_in);
427  li->status_in = status;
428  li->status_in_pts = pts;
429  li->packet_wanted_out = 0;
430  li->packet_blocked_in = 0;
431  filter_unblock(link->dst);
432  ff_bsf_set_ready(link->dst, 200);
433 }
434 
435 /**
436  * Set the status field of a link from the destination filter.
437  * The pts should probably be left unset (AV_NOPTS_VALUE).
438  */
440 {
442 
444  av_assert0(!li->status_out);
445  li->status_out = status;
446  if (pts != AV_NOPTS_VALUE)
448  filter_unblock(link->dst);
449  ff_bsf_set_ready(link->src, 200);
450 }
451 
453 {
454  int (*config_link)(AVBitStreamFilterLink *);
455  unsigned i;
456  int ret;
457 
458  for (i = 0; i < filter->nb_inputs; i ++) {
459  AVBitStreamFilterLink *link = filter->inputs[i];
462 
463  if (!link) continue;
464  if (!link->src || !link->dst) {
466  "Not all input and output are properly linked (%d).\n", i);
467  return AVERROR(EINVAL);
468  }
469 
470  inlink = link->src->nb_inputs ? link->src->inputs[0] : NULL;
471  link->current_pts =
472  link->current_pts_us = AV_NOPTS_VALUE;
473 
474  switch (li->init_state) {
475  case AVLINK_INIT:
476  continue;
477  case AVLINK_STARTINIT:
478  av_log(filter, AV_LOG_INFO, "circular filter chain detected\n");
479  return 0;
480  case AVLINK_UNINIT:
481  li->init_state = AVLINK_STARTINIT;
482 
483  if ((ret = ff_bsf_config_links(link->src)) < 0)
484  return ret;
485 
486  if (!(config_link = link->srcpad->config_props)) {
487  if (link->src->nb_inputs != 1) {
488  av_log(link->src, AV_LOG_ERROR, "Source filters and filters "
489  "with more than one input "
490  "must set config_props() "
491  "callbacks on all outputs\n");
492  return AVERROR(EINVAL);
493  }
494  }
495 
496  if (inlink) {
497  av_assert0(!link->par && inlink->par);
499  if (!link->par)
500  return AVERROR(ENOMEM);
501  ret = avcodec_parameters_copy(link->par, inlink->par);
502  if (ret < 0)
503  return ret;
504  } else {
505  av_assert0(!link->par);
507  if (!link->par)
508  return AVERROR(ENOMEM);
509  }
510 
511  if (config_link && (ret = config_link(link)) < 0) {
512  av_log(link->src, AV_LOG_ERROR,
513  "Failed to configure output pad on %s\n",
514  link->src->name);
515  return ret;
516  }
517 
518  switch (link->par->codec_type) {
519  case AVMEDIA_TYPE_VIDEO:
520  if (!link->time_base.num && !link->time_base.den)
521  link->time_base = inlink ? inlink->time_base : AV_TIME_BASE_Q;
522  break;
523 
524  case AVMEDIA_TYPE_AUDIO:
525  if (inlink) {
526  if (!link->time_base.num && !link->time_base.den)
527  link->time_base = inlink->time_base;
528  }
529 
530  if (!link->time_base.num && !link->time_base.den)
531  link->time_base = (AVRational) {1, link->par->sample_rate};
532  break;
533  }
534 
535  if (link->dstpad->codec_ids) {
536  int j;
537  for (j = 0; link->dstpad->codec_ids[j] != AV_CODEC_ID_NONE; j++)
538  if (link->par->codec_id == link->dstpad->codec_ids[j])
539  break;
540  if (link->dstpad->codec_ids[j] == AV_CODEC_ID_NONE) {
541  av_log(link->dst, AV_LOG_ERROR, "Unsupported input codec id %s (%d). Supported input pad codecs are: ",
542  avcodec_get_name(link->par->codec_id), link->par->codec_id);
543  for (j = 0; link->dstpad->codec_ids[j] != AV_CODEC_ID_NONE; j++) {
544  enum AVCodecID codec_id = link->dstpad->codec_ids[j];
545  av_log(link->dst, AV_LOG_ERROR, "%s (%d) ",
547  }
548  av_log(link->dst, AV_LOG_ERROR, "\n");
549  return AVERROR(EINVAL);
550  }
551  }
552 
553  if ((config_link = link->dstpad->config_props))
554  if ((ret = config_link(link)) < 0) {
555  av_log(link->dst, AV_LOG_ERROR,
556  "Failed to configure input pad on %s\n",
557  link->dst->name);
558  return ret;
559  }
560 
561  li->init_state = AVLINK_INIT;
562  }
563  }
564 
565  return 0;
566 }
567 
569 {
571 
572  av_assert1(!ff_bsf(link->dst->filter)->activate);
573  if (li->status_out)
574  return li->status_out;
575  if (li->status_in) {
576  if (av_container_fifo_can_read(li->fifo)) {
578  av_assert1(ffbsfctx(link->dst)->ready >= 300);
579  return 0;
580  } else {
581  /* Acknowledge status change. Filters using ff_bsf_request_packet() will
582  handle the change automatically. Filters can also check the
583  status directly but none do yet. */
585  return li->status_out;
586  }
587  }
588  li->packet_wanted_out = 1;
589  ff_bsf_set_ready(link->src, 100);
590  return 0;
591 }
592 
594 {
595  unsigned i;
596  int64_t r = INT64_MAX;
597 
598  for (i = 0; i < ctx->nb_inputs; i++) {
599  AVBitStreamFilterLink * const link = ctx->inputs[i];
601  if (li->status_out == status)
602  r = FFMIN(r, av_rescale_q(link->current_pts, link->time_base, link_time_base));
603  }
604  if (r < INT64_MAX)
605  return r;
606  av_log(ctx, AV_LOG_WARNING, "EOF timestamp not reliable\n");
607  for (i = 0; i < ctx->nb_inputs; i++) {
608  AVBitStreamFilterLink * const link = ctx->inputs[i];
610  r = FFMIN(r, av_rescale_q(li->status_in_pts, link->time_base, link_time_base));
611  }
612  if (r < INT64_MAX)
613  return r;
614  return AV_NOPTS_VALUE;
615 }
616 
618 {
620  int ret = -1;
621 
622  /* Assume the filter is blocked, let the method clear it if not */
623  li->packet_blocked_in = 1;
624  if (link->srcpad->request_packet)
625  ret = link->srcpad->request_packet(link);
626  else if (link->src->inputs[0])
627  ret = ff_bsf_request_packet(link->src->inputs[0]);
628  if (ret < 0) {
629  if (ret != AVERROR(EAGAIN) && ret != li->status_in)
631  if (ret == AVERROR_EOF)
632  ret = 0;
633  }
634  return ret;
635 }
636 
638 {
639  return ff_bsf_filter_packet(link->dst->outputs[0], pkt);
640 }
641 
643 {
645  AVBitStreamFilterPad *dst = link->dstpad;
646  int ret;
647 
648  if (!(filter = dst->filter))
650 
651  if (dst->flags & FF_BSF_PAD_FLAG_NEEDS_WRITABLE) {
653  if (ret < 0)
654  goto fail;
655  }
656 
657  ret = filter(link, pkt);
658  link->packet_count_out++;
659  return ret;
660 
661 fail:
663  return ret;
664 }
665 
667 {
669  FFBitStreamFilterGraph * const graphi = ffbsffiltergraph(link->graph);
670  int ret;
671 
672  li->packet_blocked_in = li->packet_wanted_out = 0;
673  link->packet_count_in++;
674  filter_unblock(link->dst);
676  return AVERROR(ENOMEM);
677  ret = av_container_fifo_write(li->fifo, pkt, 0);
679  if (ret < 0)
680  return ret;
681  av_assert1(graphi->packets_queued < graphi->max_packet_queue);
682  graphi->packets_queued++;
683  ff_bsf_set_ready(link->dst, 300);
684  return 0;
685 }
686 
688 {
690  AVPacket *pkt = NULL;
692  int ret;
693 
696  av_assert1(ret);
697  if (ret < 0) {
698  av_assert1(!pkt);
699  return ret;
700  }
701 
702  /* The filter will soon have received a new packet, that may allow it to
703  produce one or more: unblock its outputs. */
705  /* AVBitStreamFilterPad.filter_packet() expect packet_count_out to have the value
706  before the packet; filter_packet_framed() will re-increment it. */
707  link->packet_count_out--;
709  if (ret < 0 && ret != li->status_out) {
711  } else {
712  /* Run once again, to see if several packets were available, or if
713  the input status has also changed, or any other reason. */
714  ff_bsf_set_ready(dst, 300);
715  }
716  return ret;
717 }
718 
720 {
721  AVBitStreamFilterLink *in = &li_in->l;
722  unsigned out = 0, progress = 0;
723  int ret;
724 
725  av_assert0(!li_in->status_out);
726  if (!filter->nb_outputs) {
727  /* not necessary with the current API and sinks */
728  return 0;
729  }
730  while (!li_in->status_out) {
732 
733  if (!li_out->status_in) {
734  progress++;
735  ret = request_packet_to_filter(filter->outputs[out]);
736  if (ret < 0)
737  return ret;
738  }
739  if (++out == filter->nb_outputs) {
740  if (!progress) {
741  /* Every output already closed: input no longer interesting. */
742  link_set_out_status(in, li_in->status_in, li_in->status_in_pts);
743  return 0;
744  }
745  progress = 0;
746  out = 0;
747  }
748  }
749  ff_bsf_set_ready(filter, 200);
750  return 0;
751 }
752 
754 {
755  int i, nb_eofs = 0;
756 
757  for (i = 0; i < ctx->nb_outputs; i++)
758  nb_eofs += ff_bsf_outlink_get_status(ctx->outputs[i]) == AVERROR_EOF;
759  if (ctx->nb_outputs && nb_eofs == ctx->nb_outputs) {
760  for (int j = 0; j < ctx->nb_inputs; j++)
762  return 0;
763  }
764 
765  for (i = 0; i < ctx->nb_inputs; i++) {
767  if (av_container_fifo_can_read(li->fifo)) {
768  return filter_packet_to_filter(ctx->inputs[i]);
769  }
770  }
771  for (i = 0; i < ctx->nb_inputs; i++) {
772  BitStreamFilterLinkInternal * const li = ff_link_internal(ctx->inputs[i]);
773  if (li->status_in && !li->status_out) {
775  return forward_status_change(ctx, li);
776  }
777  }
778  for (i = 0; i < ctx->nb_outputs; i++) {
779  BitStreamFilterLinkInternal * const li = ff_link_internal(ctx->outputs[i]);
780  if (li->packet_wanted_out &&
781  !li->packet_blocked_in) {
782  return request_packet_to_filter(ctx->outputs[i]);
783  }
784  }
785  for (i = 0; i < ctx->nb_outputs; i++) {
786  BitStreamFilterLinkInternal * const li = ff_link_internal(ctx->outputs[i]);
787  if (li->packet_wanted_out)
788  return request_packet_to_filter(ctx->outputs[i]);
789  }
790  if (!ctx->nb_outputs) {
791  ff_bsf_inlink_request_packet(ctx->inputs[0]);
792  return 0;
793  }
794  return FFERROR_BSF_NOT_READY;
795 }
796 
798 {
800  const FFBitStreamFilter *const fi = ff_bsf(ctx->filter);
801  int ret;
802 
803  ctxi->ready = 0;
805  if (ret == FFERROR_BSF_NOT_READY)
806  ret = 0;
807  return ret;
808 }
809 
811 {
813  *rpts = link->current_pts;
815  return *rstatus = 0;
816  if (li->status_out)
817  return *rstatus = li->status_out;
818  if (!li->status_in)
819  return *rstatus = 0;
820  *rstatus = li->status_out = li->status_in;
822  *rpts = link->current_pts;
823  return 1;
824 }
825 
827 {
829  return av_container_fifo_can_read(li->fifo);
830 }
831 
833 {
835  return av_container_fifo_can_read(li->fifo) > 0;
836 }
837 
839 {
841  li->l.packet_count_out++;
842 }
843 
845 {
847  FFBitStreamFilterGraph * const graphi = ffbsffiltergraph(link->graph);
848  AVPacket *pkt;
849 
850  *rpkt = NULL;
852  return 0;
853 
854  pkt = av_packet_alloc();
855  if (!pkt)
856  return AVERROR(ENOMEM);
857 
859  consume_update(li, pkt);
860  av_assert1(graphi->packets_queued > 0);
861  graphi->packets_queued--;
862  *rpkt = pkt;
863  return 1;
864 }
865 
867 {
869  av_assert1(!li->status_in);
870  av_assert1(!li->status_out);
871  li->packet_wanted_out = 1;
872  ff_bsf_set_ready(link->src, 100);
873 }
874 
876 {
878  FFBitStreamFilterGraph * const graphi = ffbsffiltergraph(link->graph);
879  if (li->status_out)
880  return;
881  li->packet_wanted_out = 0;
882  li->packet_blocked_in = 0;
884  while (av_container_fifo_can_read(li->fifo)) {
885  AVPacket pkt;
886  av_container_fifo_read(li->fifo, &pkt, 0);
888  av_assert1(graphi->packets_queued > 0);
889  graphi->packets_queued--;
890  }
891  if (!li->status_in)
892  li->status_in = status;
893 }
894 
896 {
898  return li->status_in;
899 }
900 
902 {
904  return li->packet_wanted_out;
905 }
906 
908  {
909  .name = "default",
910  }
911 };
AV_OPT_SEARCH_CHILDREN
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:604
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:434
forward_status_change
static int forward_status_change(AVBitStreamFilterContext *filter, BitStreamFilterLinkInternal *li_in)
Definition: bitstreamfilter.c:719
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
ff_default_bsf_pad
const AVBitStreamFilterPad ff_default_bsf_pad[1]
Definition: bitstreamfilter.c:907
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:1671
ff_bsf
static const av_always_inline FFBitStreamFilter * ff_bsf(const AVBitStreamFilter *bsf)
Definition: bsf_internal.h:82
av_container_fifo_write
int av_container_fifo_write(AVContainerFifo *cf, void *obj, unsigned flags)
Write the contents of obj to the FIFO.
Definition: container_fifo.c:162
r
const char * r
Definition: vf_curves.c:127
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
BitStreamFilterLinkInternal::status_out
int status_out
Link output status.
Definition: bsf_internal.h:142
ff_bsf_inlink_acknowledge_status
int ff_bsf_inlink_acknowledge_status(AVBitStreamFilterLink *link, int *rstatus, int64_t *rpts)
Definition: bitstreamfilter.c:810
FFBitStreamFilter::uninit
void(* uninit)(AVBitStreamFilterContext *ctx)
Definition: bsf_internal.h:65
out
static FILE * out
Definition: movenc.c:55
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AV_OPT_FLAG_IMPLICIT_KEY
@ AV_OPT_FLAG_IMPLICIT_KEY
Accept to parse a value without a key; the key will then be returned as NULL.
Definition: opt.h:723
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:263
int64_t
long long int64_t
Definition: coverity.c:34
inlink
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
Definition: filter_design.txt:212
AVBitStreamFilterPad
A filter pad used for either input or output.
Definition: filters.h:35
FFBitStreamFilter::preinit
int(* preinit)(AVBitStreamFilterContext *ctx)
Definition: bsf_internal.h:63
bsf_child_next
static void * bsf_child_next(void *obj, void *prev)
Definition: bitstreamfilter.c:36
ff_bsf_link_set_in_status
void ff_bsf_link_set_in_status(AVBitStreamFilterLink *link, int status, int64_t pts)
Definition: bitstreamfilter.c:420
FFBitStreamFilterContext::ready
unsigned ready
Ready status of the filter.
Definition: bsf_internal.h:194
BitStreamFilterLinkInternal::init_state
enum BitStreamFilterLinkInternal::@85 init_state
stage of the initialization of the link properties (dimensions, etc)
AVOption
AVOption.
Definition: opt.h:428
ff_bsf_inlink_consume_packet
int ff_bsf_inlink_consume_packet(AVBitStreamFilterLink *link, AVPacket **rpkt)
Definition: bitstreamfilter.c:844
FFBitStreamFilter::nb_inputs
uint8_t nb_inputs
The number of entries in the list of inputs.
Definition: bsf_internal.h:56
free_link
static void free_link(AVBitStreamFilterLink *link)
Definition: bitstreamfilter.c:213
filter_activate_default
static int filter_activate_default(AVBitStreamFilterContext *ctx)
Definition: bitstreamfilter.c:753
filter
void(* filter)(uint8_t *src, int stride, int qscale)
Definition: h263dsp.c:29
AVDictionary
Definition: dict.c:32
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
ff_bsf_inlink_check_available_packet
int ff_bsf_inlink_check_available_packet(AVBitStreamFilterLink *link)
Definition: bitstreamfilter.c:832
BitStreamFilterLinkInternal::packet_blocked_in
int packet_blocked_in
If set, the source filter can not generate a packet as is.
Definition: bsf_internal.h:123
ff_bsf_inlink_request_packet
void ff_bsf_inlink_request_packet(AVBitStreamFilterLink *link)
Definition: bitstreamfilter.c:866
BitStreamFilterLinkInternal::status_in
int status_in
Link input status.
Definition: bsf_internal.h:130
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: packet.c:74
BitStreamFilterLinkInternal::packet_wanted_out
int packet_wanted_out
True if a packet is currently wanted on the output of this filter.
Definition: bsf_internal.h:149
default_filter_packet
static int default_filter_packet(AVBitStreamFilterLink *link, AVPacket *pkt)
Definition: bitstreamfilter.c:637
av_memdup
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition: mem.c:302
filter_packet_to_filter
static int filter_packet_to_filter(AVBitStreamFilterLink *link)
Definition: bitstreamfilter.c:687
bsf.h
FF_BSF_PAD_FLAG_NEEDS_WRITABLE
#define FF_BSF_PAD_FLAG_NEEDS_WRITABLE
The filter expects writable packets from its input link, duplicating data buffers if needed.
Definition: filters.h:56
AVOption::offset
int offset
Native access only.
Definition: opt.h:443
av_opt_get_key_value
int av_opt_get_key_value(const char **ropts, const char *key_val_sep, const char *pairs_sep, unsigned flags, char **rkey, char **rval)
Extract a key-value pair from the beginning of a string.
Definition: opt.c:1868
ff_bsf_request_packet
int ff_bsf_request_packet(AVBitStreamFilterLink *link)
Definition: bitstreamfilter.c:568
av_opt_free
void av_opt_free(void *obj)
Free all allocated objects in obj.
Definition: opt.c:1942
AVERROR_OPTION_NOT_FOUND
#define AVERROR_OPTION_NOT_FOUND
Option not found.
Definition: error.h:63
filter_ctx
static FilteringContext * filter_ctx
Definition: transcode.c:52
pts
static int64_t pts
Definition: transcode_aac.c:649
ff_bsf_free
void ff_bsf_free(AVBitStreamFilterContext *ctx)
Free a filter context.
Definition: bitstreamfilter.c:226
av_bsf_pad_get_name
const char * av_bsf_pad_get_name(const AVBitStreamFilterPad *pads, int pad_idx)
Get the name of an AVBitStreamFilterPad.
Definition: bitstreamfilter.c:380
BitStreamFilterLinkInternal::fifo
AVContainerFifo * fifo
Queue of packets waiting to be filtered.
Definition: bsf_internal.h:116
AVRational::num
int num
Numerator.
Definition: rational.h:59
AV_DICT_DONT_STRDUP_VAL
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
Definition: dict.h:79
filter_unblock
static void filter_unblock(AVBitStreamFilterContext *filter)
Clear packet_blocked_in on all outputs.
Definition: bitstreamfilter.c:410
ff_bsf_outlink_packet_wanted
int ff_bsf_outlink_packet_wanted(AVBitStreamFilterLink *link)
Definition: bitstreamfilter.c:901
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
bitstreamfilter_class
static const AVClass bitstreamfilter_class
Definition: bitstreamfilter.c:44
FFBitStreamFilter::priv_data_size
int priv_data_size
Definition: bsf_internal.h:35
AVBitStreamFilterPad::codec_ids
enum AVCodecID * codec_ids
A list of codec ids supported by the pad, terminated by AV_CODEC_ID_NONE.
Definition: filters.h:48
consume_update
static void consume_update(BitStreamFilterLinkInternal *li, const AVPacket *pkt)
Definition: bitstreamfilter.c:838
ff_bsf_config_links
int ff_bsf_config_links(AVBitStreamFilterContext *filter)
Definition: bitstreamfilter.c:452
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1465
AVDictionaryEntry::key
char * key
Definition: dict.h:91
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
FFBitStreamFilter::activate
int(* activate)(AVBitStreamFilterContext *ctx)
Filter activation function.
Definition: bsf_internal.h:79
bsf_opt_parse
static int bsf_opt_parse(void *logctx, const AVClass *priv_class, AVDictionary **options, const char *args)
Parse filter options into a dictionary.
Definition: bitstreamfilter.c:273
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
av_container_fifo_read
int av_container_fifo_read(AVContainerFifo *cf, void *obj, unsigned flags)
Read the next available object from the FIFO into obj.
Definition: container_fifo.c:122
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
ff_bsf_filter_packet
int ff_bsf_filter_packet(AVBitStreamFilterLink *link, AVPacket *pkt)
Send a packet of data to the next filter.
Definition: bitstreamfilter.c:666
av_bsf_link
int av_bsf_link(AVBitStreamFilterContext *src, unsigned srcpad, AVBitStreamFilterContext *dst, unsigned dstpad)
Link two filters together.
Definition: bitstreamfilter.c:126
ff_bsf_inlink_set_status
void ff_bsf_inlink_set_status(AVBitStreamFilterLink *link, int status)
Definition: bitstreamfilter.c:875
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:410
AVClass::state_flags_offset
int state_flags_offset
When non-zero, offset in the object to an unsigned int holding object state flags,...
Definition: log.h:176
FFBitStreamFilterContext::p
AVBitStreamFilterContext p
The public AVBitStreamFilterContext.
Definition: bsf_internal.h:184
key
const char * key
Definition: hwcontext_opencl.c:189
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
update_link_current_pts
static void update_link_current_pts(BitStreamFilterLinkInternal *li, int64_t pts)
Definition: bitstreamfilter.c:390
link
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 link
Definition: filter_design.txt:23
FFBitStreamFilterGraph::packets_queued
size_t packets_queued
Definition: bsf_internal.h:222
fail
#define fail
Definition: test.h:478
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
FFBitStreamFilter
Definition: bsf_internal.h:29
AV_DICT_MULTIKEY
#define AV_DICT_MULTIKEY
Allow to store several equal keys in the dictionary.
Definition: dict.h:84
ff_bsf_alloc
int ff_bsf_alloc(const AVBitStreamFilter *filter, const char *inst_name, AVBitStreamFilterContext **pctx)
Allocate a new filter context and return it.
Definition: bitstreamfilter.c:54
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
FFERROR_BSF_NOT_READY
#define FFERROR_BSF_NOT_READY
Special return code when activate() did not do anything.
Definition: filters.h:32
options
Definition: swscale.c:50
AV_CLASS_STATE_INITIALIZED
@ AV_CLASS_STATE_INITIALIZED
Object initialization has finished and it is now in the 'runtime' stage.
Definition: log.h:56
ff_bsf_inlink_queued_packets
size_t ff_bsf_inlink_queued_packets(AVBitStreamFilterLink *link)
Definition: bitstreamfilter.c:826
BitStreamFilterLinkInternal::age_index
int age_index
Index in the age array.
Definition: bsf_internal.h:154
filter_packet_framed
static int filter_packet_framed(AVBitStreamFilterLink *link, AVPacket *pkt)
Definition: bitstreamfilter.c:642
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:47
ff_bsf_child_class_iterate
const AVClass * ff_bsf_child_class_iterate(void **opaque)
Definition: bitstream_filters.c:116
ff_bsf_activate
int ff_bsf_activate(AVBitStreamFilterContext *ctx)
Definition: bitstreamfilter.c:797
ff_link_internal
static BitStreamFilterLinkInternal * ff_link_internal(AVBitStreamFilterLink *link)
Definition: bsf_internal.h:164
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
AVFrame::sample_rate
int sample_rate
Sample rate of the audio data.
Definition: frame.h:629
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
FFBitStreamFilterContext::state_flags
unsigned state_flags
Definition: bsf_internal.h:187
FFBitStreamFilter::outputs
const struct AVBitStreamFilterPad * outputs
List of static outputs.
Definition: bsf_internal.h:51
AVFrame::time_base
AVRational time_base
Time base for the timestamps in this frame.
Definition: frame.h:583
link_set_out_status
static void link_set_out_status(AVBitStreamFilterLink *link, int status, int64_t pts)
Set the status field of a link from the destination filter.
Definition: bitstreamfilter.c:439
AVOption::name
const char * name
Definition: opt.h:429
FF_BSF_PAD_FLAG_FREE_NAME
#define FF_BSF_PAD_FLAG_FREE_NAME
The pad's name is allocated and should be freed generically.
Definition: filters.h:61
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: packet.c:63
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:233
AVCodecParameters::avcodec_parameters_alloc
AVCodecParameters * avcodec_parameters_alloc(void)
Allocate a new AVCodecParameters and set its fields to default values (unknown/invalid/0).
Definition: codec_par.c:57
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:221
av_bsf_pad_get_codec_ids
enum AVCodecID * av_bsf_pad_get_codec_ids(const AVBitStreamFilterPad *pads, int pad_idx)
Get the codec ids supported by an AVBitStreamFilterPad.
Definition: bitstreamfilter.c:385
avcodec_get_name
const char * avcodec_get_name(enum AVCodecID id)
Get the name of a codec.
Definition: utils.c:421
av_opt_next
const AVOption * av_opt_next(const void *obj, const AVOption *last)
Iterate over all AVOptions belonging to obj.
Definition: opt.c:47
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:48
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:596
ff_bsf_graph_update_heap
void ff_bsf_graph_update_heap(AVBitStreamFilterGraph *graph, BitStreamFilterLinkInternal *li)
Definition: bsfgraph.c:353
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:1955
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:58
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
FFBitStreamFilter::inputs
const struct AVBitStreamFilterPad * inputs
List of static inputs.
Definition: bsf_internal.h:46
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
FFBitStreamFilterContext
Definition: bsf_internal.h:180
FFBitStreamFilterGraph::max_packet_queue
size_t max_packet_queue
Definition: bsf_internal.h:221
AVCodecParameters::avcodec_parameters_copy
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: codec_par.c:107
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_container_fifo_free
void av_container_fifo_free(AVContainerFifo **pcf)
Free a AVContainerFifo and everything in it.
Definition: container_fifo.c:101
AVFormatContext::av_class
const AVClass * av_class
A class for logging and AVOptions.
Definition: avformat.h:1319
AVOption::type
enum AVOptionType type
Definition: opt.h:444
AVCodecParameters::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: codec_par.c:67
ff_bsf_outlink_get_status
int ff_bsf_outlink_get_status(AVBitStreamFilterLink *link)
Definition: bitstreamfilter.c:895
status
ov_status_e status
Definition: dnn_backend_openvino.c:100
AVBitStreamFilter
Definition: bsf.h:111
AVBitStreamFilterPad::name
const char * name
Pad name.
Definition: filters.h:41
request_packet_to_filter
static int request_packet_to_filter(AVBitStreamFilterLink *link)
Definition: bitstreamfilter.c:617
AVRational::den
int den
Denominator.
Definition: rational.h:60
av_packet_make_writable
int av_packet_make_writable(AVPacket *pkt)
Create a writable reference for the data described by a given packet, avoiding data copy if possible.
Definition: packet.c:516
FFBitStreamFilterGraph
Definition: bsf_internal.h:210
av_container_fifo_can_read
size_t av_container_fifo_can_read(const AVContainerFifo *cf)
Definition: container_fifo.c:185
av_bsf_init_str
int av_bsf_init_str(AVBitStreamFilterContext *ctx, const char *args)
Initialize a filter with the supplied parameters.
Definition: bitstreamfilter.c:352
BitStreamFilterLinkInternal
Definition: bsf_internal.h:110
ff_bsf_set_ready
void ff_bsf_set_ready(AVBitStreamFilterContext *filter, unsigned priority)
Mark a filter ready and schedule it for activation.
Definition: bitstreamfilter.c:400
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
mem.h
BitStreamFilterLinkInternal::status_in_pts
int64_t status_in_pts
Timestamp of the input status change.
Definition: bsf_internal.h:135
av_strdup
#define av_strdup(s)
Definition: ops_asmgen.c:47
av_bsf_init_dict
int av_bsf_init_dict(AVBitStreamFilterContext *ctx, AVDictionary **options)
Initialize a filter with the supplied dictionary of options.
Definition: bitstreamfilter.c:326
default_bsf_name
static const char * default_bsf_name(void *filter_ctx)
Definition: bitstreamfilter.c:30
AV_CLASS_CATEGORY_BITSTREAM_FILTER
@ AV_CLASS_CATEGORY_BITSTREAM_FILTER
Definition: log.h:37
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:90
ffbsffiltergraph
static FFBitStreamFilterGraph * ffbsffiltergraph(AVBitStreamFilterGraph *graph)
Definition: bsf_internal.h:225
AVPacket
This structure stores compressed data.
Definition: packet.h:580
link_free
static void link_free(AVBitStreamFilterLink **plink)
Definition: bitstreamfilter.c:198
FFBitStreamFilter::nb_outputs
uint8_t nb_outputs
The number of entries in the list of outputs.
Definition: bsf_internal.h:61
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:86
FFBitStreamFilter::init2
int(* init2)(AVBitStreamFilterContext *ctx)
Definition: bsf_internal.h:64
AVFormatContext::name
char * name
Name of this format context, only used for logging purposes.
Definition: avformat.h:1944
ff_bsf_graph_remove_filter
void ff_bsf_graph_remove_filter(AVBitStreamFilterGraph *graph, AVBitStreamFilterContext *filter)
Remove a filter from a graph;.
Definition: bsfgraph.c:64
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
BitStreamFilterLinkInternal::l
AVBitStreamFilterLink l
Definition: bsf_internal.h:111
AVBitStreamFilterContext
An instance of a filter.
Definition: bsf.h:347
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:298
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1342
guess_status_pts
static int64_t guess_status_pts(AVBitStreamFilterContext *ctx, int status, AVRational link_time_base)
Definition: bitstreamfilter.c:593
av_dict_iterate
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition: dict.c:42
src
#define src
Definition: vp8dsp.c:248
AV_DICT_DONT_STRDUP_KEY
#define AV_DICT_DONT_STRDUP_KEY
Take ownership of a key that's been allocated with av_malloc() or another memory allocation function.
Definition: dict.h:77
av_container_fifo_alloc_avpacket
AVContainerFifo * av_container_fifo_alloc_avpacket(unsigned flags)
Allocate an AVContainerFifo instance for AVPacket.
Definition: packet.c:695
ffbsfctx
static FFBitStreamFilterContext * ffbsfctx(AVBitStreamFilterContext *ctx)
Definition: bsf_internal.h:197