FFmpeg
formats.c
Go to the documentation of this file.
1 /*
2  * Filter layer - format negotiation
3  * Copyright (c) 2007 Bobby Bingham
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "libavutil/avassert.h"
23 #include "libavutil/bprint.h"
25 #include "libavutil/common.h"
26 #include "libavutil/mem.h"
27 #include "libavutil/pixdesc.h"
28 #include "avfilter.h"
29 #include "filters.h"
30 #include "formats.h"
31 
32 /**
33  * Add all refs from a to ret and destroy a.
34  */
35 #define MERGE_REF(ret, a, fmts, type, fail_statement) \
36 do { \
37  type ***tmp; \
38  int i; \
39  \
40  if (!(tmp = av_realloc_array(ret->refs, ret->refcount + a->refcount, \
41  sizeof(*tmp)))) \
42  { fail_statement } \
43  ret->refs = tmp; \
44  \
45  for (i = 0; i < a->refcount; i ++) { \
46  ret->refs[ret->refcount] = a->refs[i]; \
47  *ret->refs[ret->refcount++] = ret; \
48  } \
49  \
50  av_freep(&a->refs); \
51  av_freep(&a->fmts); \
52  av_freep(&a); \
53 } while (0)
54 
55 /**
56  * Add all formats common to a and b to a, add b's refs to a and destroy b.
57  * If check is set, nothing is modified and it is only checked whether
58  * the formats are compatible.
59  * If empty_allowed is set and one of a,b->nb is zero, the lists are
60  * merged; otherwise, 0 (for nonmergeability) is returned.
61  */
62 #define MERGE_FORMATS(a, b, fmts, nb, type, check, empty_allowed) \
63 do { \
64  int i, j, k = 0, skip = 0; \
65  \
66  if (empty_allowed) { \
67  if (!a->nb || !b->nb) { \
68  if (check) \
69  return 1; \
70  if (!a->nb) \
71  FFSWAP(type *, a, b); \
72  skip = 1; \
73  } \
74  } \
75  if (!skip) { \
76  for (i = 0; i < a->nb; i++) \
77  for (j = 0; j < b->nb; j++) \
78  if (a->fmts[i] == b->fmts[j]) { \
79  if (check) \
80  return 1; \
81  a->fmts[k++] = a->fmts[i]; \
82  break; \
83  } \
84  /* Check that there was at least one common format. \
85  * Notice that both a and b are unchanged if not. */ \
86  if (!k) \
87  return 0; \
88  av_assert2(!check); \
89  a->nb = k; \
90  } \
91  \
92  MERGE_REF(a, b, fmts, type, return AVERROR(ENOMEM);); \
93 } while (0)
94 
96  enum AVMediaType type, int check)
97 {
98  int i, j;
99  int alpha1=0, alpha2=0;
100  int chroma1=0, chroma2=0;
101 
102  av_assert2(check || (a->refcount && b->refcount));
103 
104  if (a == b)
105  return 1;
106 
107  /* Do not lose chroma or alpha in merging.
108  It happens if both lists have formats with chroma (resp. alpha), but
109  the only formats in common do not have it (e.g. YUV+gray vs.
110  RGB+gray): in that case, the merging would select the gray format,
111  possibly causing a lossy conversion elsewhere in the graph.
112  To avoid that, pretend that there are no common formats to force the
113  insertion of a conversion filter. */
114  if (type == AVMEDIA_TYPE_VIDEO)
115  for (i = 0; i < a->nb_formats; i++) {
116  const AVPixFmtDescriptor *const adesc = av_pix_fmt_desc_get(a->formats[i]);
117  for (j = 0; j < b->nb_formats; j++) {
118  const AVPixFmtDescriptor *bdesc = av_pix_fmt_desc_get(b->formats[j]);
119  alpha2 |= adesc->flags & bdesc->flags & AV_PIX_FMT_FLAG_ALPHA;
120  chroma2|= adesc->nb_components > 1 && bdesc->nb_components > 1;
121  if (a->formats[i] == b->formats[j]) {
122  alpha1 |= adesc->flags & AV_PIX_FMT_FLAG_ALPHA;
123  chroma1|= adesc->nb_components > 1;
124  }
125  }
126  }
127 
128  // If chroma or alpha can be lost through merging then do not merge
129  if (alpha2 > alpha1 || chroma2 > chroma1)
130  return 0;
131 
132  MERGE_FORMATS(a, b, formats, nb_formats, AVFilterFormats, check, 0);
133 
134  return 1;
135 }
136 
137 
138 /**
139  * Check the formats lists for compatibility for merging without actually
140  * merging.
141  *
142  * @return 1 if they are compatible, 0 if not.
143  */
144 static int can_merge_pix_fmts(const void *a, const void *b)
145 {
148 }
149 
150 /**
151  * Merge the formats lists if they are compatible and update all the
152  * references of a and b to point to the combined list and free the old
153  * lists as needed. The combined list usually contains the intersection of
154  * the lists of a and b.
155  *
156  * Both a and b must have owners (i.e. refcount > 0) for these functions.
157  *
158  * @return 1 if merging succeeded, 0 if a and b are incompatible
159  * and negative AVERROR code on failure.
160  * a and b are unmodified if 0 is returned.
161  */
162 static int merge_pix_fmts(void *a, void *b)
163 {
165 }
166 
167 /**
168  * See can_merge_pix_fmts().
169  */
170 static int can_merge_sample_fmts(const void *a, const void *b)
171 {
174 }
175 
176 /**
177  * See merge_pix_fmts().
178  */
179 static int merge_sample_fmts(void *a, void *b)
180 {
182 }
183 
185  AVFilterFormats *b, int check)
186 {
187  av_assert2(check || (a->refcount && b->refcount));
188  if (a == b) return 1;
189 
190  MERGE_FORMATS(a, b, formats, nb_formats, AVFilterFormats, check, 1);
191  return 1;
192 }
193 
194 /**
195  * See can_merge_pix_fmts().
196  */
197 static int can_merge_samplerates(const void *a, const void *b)
198 {
200 }
201 
202 /**
203  * See merge_pix_fmts().
204  */
205 static int merge_samplerates(void *a, void *b)
206 {
207  return merge_samplerates_internal(a, b, 0);
208 }
209 
210 /**
211  * See merge_pix_fmts().
212  */
215 {
217  unsigned a_all = a->all_layouts + a->all_counts;
218  unsigned b_all = b->all_layouts + b->all_counts;
219  int ret_max, ret_nb = 0, i, j, round;
220 
221  av_assert2(a->refcount && b->refcount);
222 
223  if (a == b) return 1;
224 
225  /* Put the most generic set in a, to avoid doing everything twice */
226  if (a_all < b_all) {
228  FFSWAP(unsigned, a_all, b_all);
229  }
230  if (a_all) {
231  if (a_all == 1 && !b_all) {
232  /* keep only known layouts in b; works also for b_all = 1 */
233  for (i = j = 0; i < b->nb_channel_layouts; i++)
234  if (KNOWN(&b->channel_layouts[i]) && i != j++) {
235  if (check)
236  return 1;
237  av_channel_layout_copy(&b->channel_layouts[j], &b->channel_layouts[i]);
238  }
239  /* Not optimal: the unknown layouts of b may become known after
240  another merge. */
241  if (!j)
242  return 0;
243  b->nb_channel_layouts = j;
244  }
246  return 1;
247  }
248 
249  ret_max = a->nb_channel_layouts + b->nb_channel_layouts;
250  if (!check && !(channel_layouts = av_calloc(ret_max, sizeof(*channel_layouts))))
251  return AVERROR(ENOMEM);
252 
253  /* a[known] intersect b[known] */
254  for (i = 0; i < a->nb_channel_layouts; i++) {
255  if (!KNOWN(&a->channel_layouts[i]))
256  continue;
257  for (j = 0; j < b->nb_channel_layouts; j++) {
258  if (!av_channel_layout_compare(&a->channel_layouts[i], &b->channel_layouts[j])) {
259  if (check)
260  return 1;
261  av_channel_layout_copy(&channel_layouts[ret_nb++], &a->channel_layouts[i]);
262  av_channel_layout_uninit(&a->channel_layouts[i]);
263  av_channel_layout_uninit(&b->channel_layouts[j]);
264  break;
265  }
266  }
267  }
268  /* 1st round: a[known] intersect b[generic]
269  2nd round: a[generic] intersect b[known] */
270  for (round = 0; round < 2; round++) {
271  for (i = 0; i < a->nb_channel_layouts; i++) {
272  AVChannelLayout *fmt = &a->channel_layouts[i], bfmt = { 0 };
273  if (!av_channel_layout_check(fmt) || !KNOWN(fmt))
274  continue;
275  bfmt = FF_COUNT2LAYOUT(fmt->nb_channels);
276  for (j = 0; j < b->nb_channel_layouts; j++)
277  if (!av_channel_layout_compare(&b->channel_layouts[j], &bfmt)) {
278  if (check)
279  return 1;
280  av_channel_layout_copy(&channel_layouts[ret_nb++], fmt);
281  }
282  }
283  /* 1st round: swap to prepare 2nd round; 2nd round: put it back */
285  }
286  /* a[generic] intersect b[generic] */
287  for (i = 0; i < a->nb_channel_layouts; i++) {
288  if (KNOWN(&a->channel_layouts[i]))
289  continue;
290  for (j = 0; j < b->nb_channel_layouts; j++)
291  if (!av_channel_layout_compare(&a->channel_layouts[i], &b->channel_layouts[j])) {
292  if (check)
293  return 1;
294  av_channel_layout_copy(&channel_layouts[ret_nb++], &a->channel_layouts[i]);
295  }
296  }
297 
298  if (!ret_nb) {
300  return 0;
301  }
302 
303  if (a->refcount > b->refcount)
305 
307  { av_free(channel_layouts); return AVERROR(ENOMEM); });
308  av_freep(&b->channel_layouts);
309  b->channel_layouts = channel_layouts;
310  b->nb_channel_layouts = ret_nb;
311  return 1;
312 }
313 
314 static int can_merge_channel_layouts(const void *a, const void *b)
315 {
317  (AVFilterChannelLayouts *)b, 1);
318 }
319 
320 static int merge_channel_layouts(void *a, void *b)
321 {
322  return merge_channel_layouts_internal(a, b, 0);
323 }
324 
326  AVFilterFormats *b, int check)
327 {
328  av_assert2(check || (a->refcount && b->refcount));
329 
330  if (a == b)
331  return 1;
332 
333  MERGE_FORMATS(a, b, formats, nb_formats, AVFilterFormats, check, 0);
334 
335  return 1;
336 }
337 
338 static int can_merge_generic(const void *a, const void *b)
339 {
341  (AVFilterFormats *)b, 1);
342 }
343 
344 static int merge_generic(void *a, void *b)
345 {
346  return merge_generic_internal(a, b, 0);
347 }
348 
349 #define PRINT_NAME(type, type_name) \
350 static void print_##type_name(AVBPrint *bp, const void *fmtsp) \
351 { \
352  const AVFilterFormats *fmts = fmtsp; \
353  for (int i = 0; i < fmts->nb_formats; i++) { \
354  const char *name = av_##type_name(fmts->formats[i]); \
355  av_bprint_chars(bp, ' ', i ? 1 : 0); \
356  av_bprint_append_data(bp, name, name ? strlen(name) : 0); \
357  } \
358 }
359 
360 PRINT_NAME(enum AVSampleFormat, get_sample_fmt_name)
361 PRINT_NAME(enum AVPixelFormat, get_pix_fmt_name)
362 PRINT_NAME(enum AVColorSpace, color_space_name)
363 PRINT_NAME(enum AVColorRange, color_range_name)
364 PRINT_NAME(enum AVAlphaMode, alpha_mode_name)
365 
366 static void print_channel_layout_desc(AVBPrint *bp, const void *layoutsp)
367 {
368  const AVFilterChannelLayouts *layouts = layoutsp;
369  for (int i = 0; i < layouts->nb_channel_layouts; i++) {
370  av_bprint_chars(bp, ' ', i ? 1 : 0);
371  av_channel_layout_describe_bprint(&layouts->channel_layouts[i], bp);
372  }
373 }
374 
375 static void print_sample_rate(AVBPrint *bp, const void *ratesp)
376 {
377  const AVFilterFormats *rates = ratesp;
378  for (int i = 0; i < rates->nb_formats; i++)
379  av_bprintf(bp, "%s%d", i ? " " : "", rates->formats[i]);
380 }
381 
382 #define CONVERSION_FILTER_SWSCALE \
383  .conversion_filter = "scale", \
384  .conversion_opts_offset = offsetof(AVFilterGraph, scale_sws_opts),
385 
386 #define CONVERSION_FILTER_ARESAMPLE \
387  .conversion_filter = "aresample", \
388  .conversion_opts_offset = offsetof(AVFilterGraph, aresample_swr_opts),
389 
390 static const AVFilterFormatsMerger mergers_video[] = {
391  {
392  .name = "Pixel formats",
393  .offset = offsetof(AVFilterFormatsConfig, formats),
394  .merge = merge_pix_fmts,
395  .can_merge = can_merge_pix_fmts,
396  .print_list = print_get_pix_fmt_name,
398  },
399  {
400  .name = "Color spaces",
401  .offset = offsetof(AVFilterFormatsConfig, color_spaces),
402  .merge = merge_generic,
403  .can_merge = can_merge_generic,
404  .print_list = print_color_space_name,
406  },
407  {
408  .name = "Color ranges",
409  .offset = offsetof(AVFilterFormatsConfig, color_ranges),
410  .merge = merge_generic,
411  .can_merge = can_merge_generic,
412  .print_list = print_color_range_name,
414  },
415  {
416  .name = "Alpha modes",
417  .offset = offsetof(AVFilterFormatsConfig, alpha_modes),
418  .merge = merge_generic,
419  .can_merge = can_merge_generic,
420  .print_list = print_alpha_mode_name,
421  .conversion_filter = "premultiply_dynamic",
422  },
423 };
424 
425 static const AVFilterFormatsMerger mergers_audio[] = {
426  {
427  .name = "Channel layouts",
428  .offset = offsetof(AVFilterFormatsConfig, channel_layouts),
429  .merge = merge_channel_layouts,
430  .can_merge = can_merge_channel_layouts,
431  .print_list = print_channel_layout_desc,
433  },
434  {
435  .name = "Sample rates",
436  .offset = offsetof(AVFilterFormatsConfig, samplerates),
437  .merge = merge_samplerates,
438  .can_merge = can_merge_samplerates,
439  .print_list = print_sample_rate,
441  },
442  {
443  .name = "Sample formats",
444  .offset = offsetof(AVFilterFormatsConfig, formats),
445  .merge = merge_sample_fmts,
446  .can_merge = can_merge_sample_fmts,
447  .print_list = print_get_sample_fmt_name,
449  },
450 };
451 
452 static const AVFilterNegotiation negotiate_video = {
454  .mergers = mergers_video,
455 };
456 
457 static const AVFilterNegotiation negotiate_audio = {
459  .mergers = mergers_audio,
460 };
461 
463 {
464  switch (link->type) {
465  case AVMEDIA_TYPE_VIDEO: return &negotiate_video;
466  case AVMEDIA_TYPE_AUDIO: return &negotiate_audio;
467  default: return NULL;
468  }
469 }
470 
471 int ff_pixfmt_is_in(enum AVPixelFormat fmt, const enum AVPixelFormat *fmts)
472 {
473  for (; *fmts != AV_PIX_FMT_NONE; ++fmts) {
474  if (fmt == *fmts)
475  return 1;
476  }
477  return 0;
478 }
479 
480 #define MAKE_FORMAT_LIST(type, field, count_field) \
481  type *formats; \
482  int count = 0; \
483  if (fmts) \
484  for (count = 0; fmts[count] != -1; count++) \
485  ; \
486  formats = av_mallocz(sizeof(*formats)); \
487  if (!formats) \
488  return NULL; \
489  formats->count_field = count; \
490  if (count) { \
491  formats->field = av_malloc_array(count, sizeof(*formats->field)); \
492  if (!formats->field) { \
493  av_freep(&formats); \
494  return NULL; \
495  } \
496  }
497 
498 #define MAKE_FORMAT_LIST_TYPE(name, type) \
499  AVFilterFormats *ff_make_ ## name ## _list(const type* fmts) \
500  { \
501  MAKE_FORMAT_LIST(AVFilterFormats, formats, nb_formats); \
502  while (count--) \
503  formats->formats[count] = (int)fmts[count]; \
504  return formats; \
505  }
506 
509 MAKE_FORMAT_LIST_TYPE(pixel_format, enum AVPixelFormat)
510 
512 {
513  AVFilterChannelLayouts *ch_layouts;
514  int count = 0;
515  if (fmts)
516  for (count = 0; fmts[count].nb_channels; count++)
517  ;
518  ch_layouts = av_mallocz(sizeof(*ch_layouts));
519  if (!ch_layouts)
520  return NULL;
521  ch_layouts->nb_channel_layouts = count;
522  if (count) {
523  ch_layouts->channel_layouts =
524  av_calloc(count, sizeof(*ch_layouts->channel_layouts));
525  if (!ch_layouts->channel_layouts) {
526  av_freep(&ch_layouts);
527  return NULL;
528  }
529  for (int i = 0; i < count; i++) {
530  int ret = av_channel_layout_copy(&ch_layouts->channel_layouts[i], &fmts[i]);
531  if (ret < 0)
532  goto fail;
533  }
534  }
535 
536  return ch_layouts;
537 
538 fail:
539  for (int i = 0; i < count; i++)
541  av_free(ch_layouts->channel_layouts);
542  av_freep(&ch_layouts);
543 
544  return NULL;
545 }
546 
547 #define ADD_FORMAT(f, fmt, unref_fn, type, list, nb) \
548 do { \
549  type *fmts; \
550  \
551  if (!(*f) && !(*f = av_mallocz(sizeof(**f)))) { \
552  return AVERROR(ENOMEM); \
553  } \
554  \
555  fmts = av_realloc_array((*f)->list, (*f)->nb + 1, \
556  sizeof(*(*f)->list)); \
557  if (!fmts) { \
558  unref_fn(f); \
559  return AVERROR(ENOMEM); \
560  } \
561  \
562  (*f)->list = fmts; \
563  ASSIGN_FMT(f, fmt, list, nb); \
564 } while (0)
565 
566 #define ASSIGN_FMT(f, fmt, list, nb) \
567 do { \
568  (*f)->list[(*f)->nb++] = fmt; \
569 } while (0)
570 
571 int ff_add_format(AVFilterFormats **avff, int64_t fmt)
572 {
573  ADD_FORMAT(avff, fmt, ff_formats_unref, int, formats, nb_formats);
574  return 0;
575 }
576 
577 #undef ASSIGN_FMT
578 #define ASSIGN_FMT(f, fmt, list, nb) \
579 do { \
580  int ret; \
581  memset((*f)->list + (*f)->nb, 0, sizeof(*(*f)->list)); \
582  ret = av_channel_layout_copy(&(*f)->list[(*f)->nb], fmt); \
583  if (ret < 0) \
584  return ret; \
585  (*f)->nb++; \
586 } while (0)
587 
589  const AVChannelLayout *channel_layout)
590 {
591  av_assert1(!(*l && (*l)->all_layouts));
592  ADD_FORMAT(l, channel_layout, ff_channel_layouts_unref, AVChannelLayout, channel_layouts, nb_channel_layouts);
593  return 0;
594 }
595 
597 {
598  int fmts[2] = { fmt, -1 };
599  return ff_make_format_list(fmts);
600 }
601 
603 {
605 
606  if (type == AVMEDIA_TYPE_VIDEO) {
607  return ff_formats_pixdesc_filter(0, 0);
608  } else if (type == AVMEDIA_TYPE_AUDIO) {
609  enum AVSampleFormat fmt = 0;
610  while (av_get_sample_fmt_name(fmt)) {
611  if (ff_add_format(&ret, fmt) < 0)
612  return NULL;
613  fmt++;
614  }
615  }
616 
617  return ret;
618 }
619 
620 AVFilterFormats *ff_formats_pixdesc_filter(unsigned want, unsigned rej)
621 {
622  unsigned nb_formats, fmt, flags;
624 
625  while (1) {
626  nb_formats = 0;
627  for (fmt = 0;; fmt++) {
629  if (!desc)
630  break;
631  flags = desc->flags;
632  if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL) &&
633  !(desc->flags & AV_PIX_FMT_FLAG_PLANAR) &&
634  (desc->log2_chroma_w || desc->log2_chroma_h))
636  if ((flags & (want | rej)) != want)
637  continue;
638  if (formats)
639  formats->formats[nb_formats] = fmt;
640  nb_formats++;
641  }
642  if (formats) {
643  av_assert0(formats->nb_formats == nb_formats);
644  return formats;
645  }
646  formats = av_mallocz(sizeof(*formats));
647  if (!formats)
648  return NULL;
649  formats->nb_formats = nb_formats;
650  if (nb_formats) {
651  formats->formats = av_malloc_array(nb_formats, sizeof(*formats->formats));
652  if (!formats->formats) {
653  av_freep(&formats);
654  return NULL;
655  }
656  }
657  }
658 }
659 
661 {
663  int fmt;
664 
665  for (fmt = 0; av_get_bytes_per_sample(fmt)>0; fmt++)
666  if (av_sample_fmt_is_planar(fmt))
667  if (ff_add_format(&ret, fmt) < 0)
668  return NULL;
669 
670  return ret;
671 }
672 
674 {
675  AVFilterFormats *ret = av_mallocz(sizeof(*ret));
676  return ret;
677 }
678 
680 {
682  if (!ret)
683  return NULL;
684  ret->all_layouts = 1;
685  return ret;
686 }
687 
689 {
691  if (!ret)
692  return NULL;
693  ret->all_layouts = ret->all_counts = 1;
694  return ret;
695 }
696 
698 {
701  return NULL;
702  for (int csp = 0; csp < AVCOL_SPC_NB; csp++) {
703  if (csp == AVCOL_SPC_RESERVED ||
704  csp == AVCOL_SPC_UNSPECIFIED)
705  continue;
706  if (ff_add_format(&ret, csp) < 0)
707  return NULL;
708  }
709 
710  return ret;
711 }
712 
714 {
716  for (int range = 0; range < AVCOL_RANGE_NB; range++) {
717  if (ff_add_format(&ret, range) < 0)
718  return NULL;
719  }
720 
721  return ret;
722 }
723 
725 {
727  for (int range = 0; range < AVALPHA_MODE_NB; range++) {
728  if (ff_add_format(&ret, range) < 0)
729  return NULL;
730  }
731 
732  return ret;
733 }
734 
735 #define FORMATS_REF(f, ref, unref_fn) \
736  void *tmp; \
737  \
738  if (!f) \
739  return AVERROR(ENOMEM); \
740  \
741  tmp = av_realloc_array(f->refs, f->refcount + 1, sizeof(*f->refs)); \
742  if (!tmp) { \
743  unref_fn(&f); \
744  return AVERROR(ENOMEM); \
745  } \
746  f->refs = tmp; \
747  f->refs[f->refcount++] = ref; \
748  *ref = f; \
749  return 0
750 
752 {
754 }
755 
757 {
759 }
760 
761 #define FIND_REF_INDEX(ref, idx) \
762 do { \
763  int i; \
764  for (i = 0; i < (*ref)->refcount; i ++) \
765  if((*ref)->refs[i] == ref) { \
766  idx = i; \
767  break; \
768  } \
769 } while (0)
770 
771 #define FORMATS_UNREF(ref, list) \
772 do { \
773  int idx = -1; \
774  \
775  if (!*ref) \
776  return; \
777  \
778  FIND_REF_INDEX(ref, idx); \
779  \
780  if (idx >= 0) { \
781  memmove((*ref)->refs + idx, (*ref)->refs + idx + 1, \
782  sizeof(*(*ref)->refs) * ((*ref)->refcount - idx - 1)); \
783  --(*ref)->refcount; \
784  } \
785  if (!(*ref)->refcount) { \
786  FREE_LIST(ref, list); \
787  av_free((*ref)->list); \
788  av_free((*ref)->refs); \
789  av_free(*ref); \
790  } \
791  *ref = NULL; \
792 } while (0)
793 
794 #define FREE_LIST(ref, list) do { } while(0)
796 {
798 }
799 
800 #undef FREE_LIST
801 #define FREE_LIST(ref, list) \
802  do { \
803  for (int i = 0; i < (*ref)->nb_channel_layouts; i++) \
804  av_channel_layout_uninit(&(*ref)->list[i]); \
805  } while(0)
806 
808 {
810 }
811 
812 #define FORMATS_CHANGEREF(oldref, newref) \
813 do { \
814  int idx = -1; \
815  \
816  FIND_REF_INDEX(oldref, idx); \
817  \
818  if (idx >= 0) { \
819  (*oldref)->refs[idx] = newref; \
820  *newref = *oldref; \
821  *oldref = NULL; \
822  } \
823 } while (0)
824 
826  AVFilterChannelLayouts **newref)
827 {
828  FORMATS_CHANGEREF(oldref, newref);
829 }
830 
832 {
833  FORMATS_CHANGEREF(oldref, newref);
834 }
835 
836 #define SET_COMMON_FORMATS(ctx, fmts, media_type, ref_fn, unref_fn) \
837  int i; \
838  \
839  if (!fmts) \
840  return AVERROR(ENOMEM); \
841  \
842  for (i = 0; i < ctx->nb_inputs; i++) { \
843  AVFilterLink *const link = ctx->inputs[i]; \
844  if (link && !link->outcfg.fmts && \
845  (media_type == AVMEDIA_TYPE_UNKNOWN || link->type == media_type)) { \
846  int ret = ref_fn(fmts, &ctx->inputs[i]->outcfg.fmts); \
847  if (ret < 0) { \
848  return ret; \
849  } \
850  } \
851  } \
852  for (i = 0; i < ctx->nb_outputs; i++) { \
853  AVFilterLink *const link = ctx->outputs[i]; \
854  if (link && !link->incfg.fmts && \
855  (media_type == AVMEDIA_TYPE_UNKNOWN || link->type == media_type)) { \
856  int ret = ref_fn(fmts, &ctx->outputs[i]->incfg.fmts); \
857  if (ret < 0) { \
858  return ret; \
859  } \
860  } \
861  } \
862  \
863  if (!fmts->refcount) \
864  unref_fn(&fmts); \
865  \
866  return 0;
867 
870 {
873 }
874 
876  const AVChannelLayout *fmts)
877 {
879 }
880 
882 {
884 }
885 
888 {
891 }
892 
894  const int *samplerates)
895 {
897 }
898 
900 {
902 }
903 
906 {
909 }
910 
912  const int *color_spaces)
913 {
915 }
916 
918 {
920 }
921 
924 {
927 }
928 
930  const int *color_ranges)
931 {
933 }
934 
936 {
938 }
939 
942 {
945 }
946 
948  const int *alpha_modes)
949 {
951 }
952 
954 {
956 }
957 
958 /**
959  * A helper for query_formats() which sets all links to the same list of
960  * formats. If there are no links hooked to this filter, the list of formats is
961  * freed.
962  */
964 {
967 }
968 
970 {
972 }
973 
975 {
977 }
978 
980 {
982 }
983 
984 #define SET_COMMON_FORMATS2(ctx, cfg_in, cfg_out, fmts, media_type, \
985  ref_fn, unref_fn) \
986  if (!fmts) \
987  return AVERROR(ENOMEM); \
988  \
989  for (unsigned i = 0; i < ctx->nb_inputs; i++) { \
990  const AVFilterLink *const link = ctx->inputs[i]; \
991  if (!cfg_in[i]->fmts && \
992  (media_type == AVMEDIA_TYPE_UNKNOWN || \
993  link->type == media_type)) { \
994  int ret = ref_fn(fmts, &cfg_in[i]->fmts); \
995  if (ret < 0) { \
996  return ret; \
997  } \
998  } \
999  } \
1000  for (unsigned i = 0; i < ctx->nb_outputs; i++) { \
1001  const AVFilterLink *const link = ctx->outputs[i]; \
1002  if (!cfg_out[i]->fmts && \
1003  (media_type == AVMEDIA_TYPE_UNKNOWN || \
1004  link->type == media_type)) { \
1005  int ret = ref_fn(fmts, &cfg_out[i]->fmts); \
1006  if (ret < 0) { \
1007  return ret; \
1008  } \
1009  } \
1010  } \
1011  \
1012  if (!fmts->refcount) \
1013  unref_fn(&fmts); \
1014  \
1015  return 0;
1018  AVFilterFormatsConfig **cfg_in,
1019  AVFilterFormatsConfig **cfg_out,
1021 {
1024 }
1027  AVFilterFormatsConfig **cfg_in,
1028  AVFilterFormatsConfig **cfg_out,
1029  const AVChannelLayout *fmts)
1030 {
1031  return ff_set_common_channel_layouts2(ctx, cfg_in, cfg_out, ff_make_channel_layout_list(fmts));
1032 }
1035  AVFilterFormatsConfig **cfg_in,
1036  AVFilterFormatsConfig **cfg_out)
1037 {
1038  return ff_set_common_channel_layouts2(ctx, cfg_in, cfg_out, ff_all_channel_counts());
1039 }
1042  AVFilterFormatsConfig **cfg_in,
1043  AVFilterFormatsConfig **cfg_out,
1045 {
1048 }
1051  AVFilterFormatsConfig **cfg_in,
1052  AVFilterFormatsConfig **cfg_out,
1053  const int *samplerates)
1054 {
1056 }
1059  AVFilterFormatsConfig **cfg_in,
1060  AVFilterFormatsConfig **cfg_out)
1061 {
1062  return ff_set_common_samplerates2(ctx, cfg_in, cfg_out, ff_all_samplerates());
1063 }
1066  AVFilterFormatsConfig **cfg_in,
1067  AVFilterFormatsConfig **cfg_out,
1069 {
1072 }
1075  AVFilterFormatsConfig **cfg_in,
1076  AVFilterFormatsConfig **cfg_out,
1077  const int *color_spaces)
1078 {
1080 }
1083  AVFilterFormatsConfig **cfg_in,
1084  AVFilterFormatsConfig **cfg_out)
1085 {
1086  return ff_set_common_color_spaces2(ctx, cfg_in, cfg_out, ff_all_color_spaces());
1087 }
1090  AVFilterFormatsConfig **cfg_in,
1091  AVFilterFormatsConfig **cfg_out,
1093 {
1096 }
1099  AVFilterFormatsConfig **cfg_in,
1100  AVFilterFormatsConfig **cfg_out,
1101  const int *color_ranges)
1102 {
1104 }
1107  AVFilterFormatsConfig **cfg_in,
1108  AVFilterFormatsConfig **cfg_out)
1109 {
1110  return ff_set_common_color_ranges2(ctx, cfg_in, cfg_out, ff_all_color_ranges());
1111 }
1114  AVFilterFormatsConfig **cfg_in,
1115  AVFilterFormatsConfig **cfg_out,
1117 {
1120 }
1123  AVFilterFormatsConfig **cfg_in,
1124  AVFilterFormatsConfig **cfg_out,
1125  const int *alpha_modes)
1126 {
1128 }
1131  AVFilterFormatsConfig **cfg_in,
1132  AVFilterFormatsConfig **cfg_out)
1133 {
1134  return ff_set_common_alpha_modes2(ctx, cfg_in, cfg_out, ff_all_alpha_modes());
1135 }
1138  AVFilterFormatsConfig **cfg_in,
1139  AVFilterFormatsConfig **cfg_out,
1141 {
1144 }
1147  AVFilterFormatsConfig **cfg_in,
1148  AVFilterFormatsConfig **cfg_out,
1149  const int *fmts)
1150 {
1151  return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_make_format_list(fmts));
1152 }
1155  AVFilterFormatsConfig **cfg_in,
1156  AVFilterFormatsConfig **cfg_out,
1157  const enum AVSampleFormat *fmts)
1158 {
1159  return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_make_sample_format_list(fmts));
1160 }
1163  AVFilterFormatsConfig **cfg_in,
1164  AVFilterFormatsConfig **cfg_out,
1165  const enum AVPixelFormat *fmts)
1166 {
1167  return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_make_pixel_format_list(fmts));
1168 }
1171 {
1172  const FFFilter *const f = fffilter(ctx->filter);
1174  enum AVMediaType type;
1175  int ret;
1176 
1177  switch (f->formats_state) {
1180  formats = ff_make_pixel_format_list(f->formats.pixels_list);
1181  break;
1184  formats = ff_make_sample_format_list(f->formats.samples_list);
1185  break;
1188  formats = ff_make_formats_list_singleton(f->formats.pix_fmt);
1189  break;
1192  formats = ff_make_formats_list_singleton(f->formats.sample_fmt);
1193  break;
1194  default:
1195  av_assert2(!"Unreachable");
1196  /* Intended fallthrough */
1201  formats = ff_all_formats(ctx->nb_inputs ? ctx->inputs [0]->type :
1202  ctx->nb_outputs ? ctx->outputs[0]->type :
1204  break;
1205  }
1206 
1208  if (ret < 0)
1209  return ret;
1210  if (type != AVMEDIA_TYPE_AUDIO) {
1212  if (ret < 0)
1213  return ret;
1215  if (ret < 0)
1216  return ret;
1218  if (ret < 0)
1219  return ret;
1220  }
1221  if (type != AVMEDIA_TYPE_VIDEO) {
1223  if (ret < 0)
1224  return ret;
1226  if (ret < 0)
1227  return ret;
1228  }
1229 
1230  return 0;
1231 }
1233 static int check_list(void *log, const char *name, const AVFilterFormats *fmts)
1234 {
1235  unsigned i, j;
1236 
1237  if (!fmts)
1238  return 0;
1239  if (!fmts->nb_formats) {
1240  av_log(log, AV_LOG_ERROR, "Empty %s list\n", name);
1241  return AVERROR(EINVAL);
1242  }
1243  for (i = 0; i < fmts->nb_formats; i++) {
1244  for (j = i + 1; j < fmts->nb_formats; j++) {
1245  if (fmts->formats[i] == fmts->formats[j]) {
1246  av_log(log, AV_LOG_ERROR, "Duplicated %s\n", name);
1247  return AVERROR(EINVAL);
1248  }
1249  }
1250  }
1251  return 0;
1252 }
1254 int ff_formats_check_pixel_formats(void *log, const AVFilterFormats *fmts)
1255 {
1256  return check_list(log, "pixel format", fmts);
1257 }
1259 int ff_formats_check_sample_formats(void *log, const AVFilterFormats *fmts)
1260 {
1261  return check_list(log, "sample format", fmts);
1262 }
1264 int ff_formats_check_sample_rates(void *log, const AVFilterFormats *fmts)
1265 {
1266  if (!fmts || !fmts->nb_formats)
1267  return 0;
1268  return check_list(log, "sample rate", fmts);
1269 }
1271 int ff_formats_check_color_spaces(void *log, const AVFilterFormats *fmts)
1272 {
1273  for (int i = 0; fmts && i < fmts->nb_formats; i++) {
1274  if (fmts->formats[i] == AVCOL_SPC_RESERVED) {
1275  av_log(log, AV_LOG_ERROR, "Invalid color space\n");
1276  return AVERROR(EINVAL);
1277  }
1278  }
1279  return check_list(log, "color space", fmts);
1280 }
1282 int ff_formats_check_color_ranges(void *log, const AVFilterFormats *fmts)
1283 {
1284  return check_list(log, "color range", fmts);
1285 }
1287 int ff_formats_check_alpha_modes(void *log, const AVFilterFormats *fmts)
1288 {
1289  return check_list(log, "alpha mode", fmts);
1290 }
1292 static int layouts_compatible(const AVChannelLayout *a, const AVChannelLayout *b)
1293 {
1294  return !av_channel_layout_compare(a, b) ||
1295  (KNOWN(a) && !KNOWN(b) && a->nb_channels == b->nb_channels) ||
1296  (KNOWN(b) && !KNOWN(a) && b->nb_channels == a->nb_channels);
1297 }
1300 {
1301  unsigned i, j;
1302 
1303  if (!fmts)
1304  return 0;
1305  if (fmts->all_layouts < fmts->all_counts) {
1306  av_log(log, AV_LOG_ERROR, "Inconsistent generic list\n");
1307  return AVERROR(EINVAL);
1308  }
1309  if (!fmts->all_layouts && !fmts->nb_channel_layouts) {
1310  av_log(log, AV_LOG_ERROR, "Empty channel layout list\n");
1311  return AVERROR(EINVAL);
1312  }
1313  for (i = 0; i < fmts->nb_channel_layouts; i++) {
1314  for (j = i + 1; j < fmts->nb_channel_layouts; j++) {
1315  if (layouts_compatible(&fmts->channel_layouts[i], &fmts->channel_layouts[j])) {
1316  av_log(log, AV_LOG_ERROR, "Duplicated or redundant channel layout\n");
1317  return AVERROR(EINVAL);
1318  }
1319  }
1320  }
1321  return 0;
1322 }
can_merge_generic
static int can_merge_generic(const void *a, const void *b)
Definition: formats.c:337
flags
const SwsFlags flags[]
Definition: swscale.c:61
merge_generic_internal
static int merge_generic_internal(AVFilterFormats *a, AVFilterFormats *b, int check)
Definition: formats.c:324
formats
formats
Definition: signature.h:47
ff_set_common_all_alpha_modes2
int ff_set_common_all_alpha_modes2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition: formats.c:1129
AVFilterChannelLayouts
A list of supported channel layouts.
Definition: formats.h:85
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
AVFilterFormatsConfig::samplerates
AVFilterFormats * samplerates
Lists of supported sample rates, only for audio.
Definition: avfilter.h:131
name
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 minimum maximum flags name is the option name
Definition: writing_filters.txt:88
CONVERSION_FILTER_SWSCALE
#define CONVERSION_FILTER_SWSCALE
Definition: formats.c:381
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
FF_FILTER_FORMATS_QUERY_FUNC
@ FF_FILTER_FORMATS_QUERY_FUNC
formats.query active.
Definition: filters.h:230
can_merge_sample_fmts
static int can_merge_sample_fmts(const void *a, const void *b)
See can_merge_pix_fmts().
Definition: formats.c:169
merge_formats_internal
static int merge_formats_internal(AVFilterFormats *a, AVFilterFormats *b, enum AVMediaType type, int check)
Definition: formats.c:94
ff_set_common_channel_layouts2
int ff_set_common_channel_layouts2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, AVFilterChannelLayouts *channel_layouts)
Helpers for query_formats2() which set all free audio links to the same list of channel layouts/sampl...
Definition: formats.c:1016
can_merge_pix_fmts
static int can_merge_pix_fmts(const void *a, const void *b)
Check the formats lists for compatibility for merging without actually merging.
Definition: formats.c:143
ff_set_common_color_ranges2
int ff_set_common_color_ranges2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, AVFilterFormats *color_ranges)
Definition: formats.c:1088
ff_set_common_alpha_modes
int ff_set_common_alpha_modes(AVFilterContext *ctx, AVFilterFormats *alpha_modes)
Definition: formats.c:939
ff_channel_layouts_ref
int ff_channel_layouts_ref(AVFilterChannelLayouts *f, AVFilterChannelLayouts **ref)
Add *ref as a new reference to f.
Definition: formats.c:750
layouts
enum MovChannelLayoutTag * layouts
Definition: mov_chan.c:335
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3456
ff_set_common_all_channel_counts2
int ff_set_common_all_channel_counts2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition: formats.c:1033
ff_formats_check_pixel_formats
int ff_formats_check_pixel_formats(void *log, const AVFilterFormats *fmts)
Check that fmts is a valid pixel formats list.
Definition: formats.c:1253
ff_set_common_formats2
int ff_set_common_formats2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, AVFilterFormats *formats)
Definition: formats.c:1136
int64_t
long long int64_t
Definition: coverity.c:34
ff_set_common_samplerates_from_list
int ff_set_common_samplerates_from_list(AVFilterContext *ctx, const int *samplerates)
Equivalent to ff_set_common_samplerates(ctx, ff_make_format_list(samplerates))
Definition: formats.c:892
PRINT_NAME
#define PRINT_NAME(type, type_name)
Definition: formats.c:348
merge_generic
static int merge_generic(void *a, void *b)
Definition: formats.c:343
normalize.log
log
Definition: normalize.py:21
ff_all_channel_counts
AVFilterChannelLayouts * ff_all_channel_counts(void)
Construct an AVFilterChannelLayouts coding for any channel layout, with known or unknown disposition.
Definition: formats.c:687
can_merge_channel_layouts
static int can_merge_channel_layouts(const void *a, const void *b)
Definition: formats.c:313
ff_set_pixel_formats_from_list2
int ff_set_pixel_formats_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const enum AVPixelFormat *fmts)
Definition: formats.c:1161
ff_set_common_all_color_spaces
int ff_set_common_all_color_spaces(AVFilterContext *ctx)
Equivalent to ff_set_common_color_spaces(ctx, ff_all_color_spaces())
Definition: formats.c:916
pixdesc.h
AVCOL_SPC_NB
@ AVCOL_SPC_NB
Not part of ABI.
Definition: pixfmt.h:720
b
#define b
Definition: input.c:42
ff_make_pixel_format_list
av_warn_unused_result AVFilterFormats * ff_make_pixel_format_list(const enum AVPixelFormat *fmts)
Create a list of supported pixel formats.
mergers_video
static const AVFilterFormatsMerger mergers_video[]
Definition: formats.c:389
MERGE_FORMATS
#define MERGE_FORMATS(a, b, fmts, nb, type, check, empty_allowed)
Add all formats common to a and b to a, add b's refs to a and destroy b.
Definition: formats.c:62
ff_set_common_channel_layouts_from_list2
int ff_set_common_channel_layouts_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const AVChannelLayout *fmts)
Definition: formats.c:1025
FF_FILTER_FORMATS_SINGLE_PIXFMT
@ FF_FILTER_FORMATS_SINGLE_PIXFMT
formats.pix_fmt active
Definition: filters.h:234
ff_set_common_all_samplerates
int ff_set_common_all_samplerates(AVFilterContext *ctx)
Equivalent to ff_set_common_samplerates(ctx, ff_all_samplerates())
Definition: formats.c:898
AVFilterFormats::formats
int * formats
list of media formats
Definition: formats.h:66
merge_samplerates_internal
static int merge_samplerates_internal(AVFilterFormats *a, AVFilterFormats *b, int check)
Definition: formats.c:183
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
ff_make_formats_list_singleton
AVFilterFormats * ff_make_formats_list_singleton(int fmt)
Equivalent to ff_make_format_list({const int[]}{ fmt, -1 })
Definition: formats.c:595
ff_set_common_color_ranges_from_list2
int ff_set_common_color_ranges_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const int *color_ranges)
Definition: formats.c:1097
FORMATS_UNREF
#define FORMATS_UNREF(ref, list)
Definition: formats.c:770
av_channel_layout_describe_bprint
int av_channel_layout_describe_bprint(const AVChannelLayout *channel_layout, AVBPrint *bp)
bprint variant of av_channel_layout_describe().
Definition: channel_layout.c:599
CONVERSION_FILTER_ARESAMPLE
#define CONVERSION_FILTER_ARESAMPLE
Definition: formats.c:385
fffilter
static const FFFilter * fffilter(const AVFilter *f)
Definition: filters.h:464
AVFilterFormats
A list of supported formats for one end of a filter link.
Definition: formats.h:64
formats.h
layouts_compatible
static int layouts_compatible(const AVChannelLayout *a, const AVChannelLayout *b)
Definition: formats.c:1291
AVCOL_SPC_RESERVED
@ AVCOL_SPC_RESERVED
reserved for future use by ITU-T and ISO/IEC just like 15-255 are
Definition: pixfmt.h:704
SET_COMMON_FORMATS
#define SET_COMMON_FORMATS(ctx, fmts, media_type, ref_fn, unref_fn)
Definition: formats.c:835
fail
#define fail()
Definition: checkasm.h:218
AV_PIX_FMT_FLAG_HWACCEL
#define AV_PIX_FMT_FLAG_HWACCEL
Pixel format is an HW accelerated format.
Definition: pixdesc.h:128
AVCOL_RANGE_NB
@ AVCOL_RANGE_NB
Not part of ABI.
Definition: pixfmt.h:778
type
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 type
Definition: writing_filters.txt:86
ff_set_common_color_spaces_from_list
int ff_set_common_color_spaces_from_list(AVFilterContext *ctx, const int *color_spaces)
Equivalent to ff_set_common_color_spaces(ctx, ff_make_format_list(color_spaces))
Definition: formats.c:910
AVFilterNegotiation
Callbacks and properties to describe the steps of a format negotiation.
Definition: formats.h:657
ff_all_formats
AVFilterFormats * ff_all_formats(enum AVMediaType type)
Return a list of all formats supported by FFmpeg for the given media type.
Definition: formats.c:601
AVFilterNegotiation::nb_mergers
unsigned nb_mergers
Definition: formats.h:658
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
ff_set_common_formats
int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
A helper for query_formats() which sets all links to the same list of formats.
Definition: formats.c:962
ff_set_common_color_spaces2
int ff_set_common_color_spaces2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, AVFilterFormats *color_spaces)
Definition: formats.c:1064
FFFilter
Definition: filters.h:267
check
#define check(x, y, S, v)
Definition: motion_est_template.c:405
SET_COMMON_FORMATS2
#define SET_COMMON_FORMATS2(ctx, cfg_in, cfg_out, fmts, media_type, ref_fn, unref_fn)
Definition: formats.c:983
ff_set_pixel_formats_from_list
int ff_set_pixel_formats_from_list(AVFilterContext *ctx, const enum AVPixelFormat *fmts)
Equivalent to ff_set_common_formats(ctx, ff_make_pixel_format_list(fmts))
Definition: formats.c:978
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
ff_formats_ref
int ff_formats_ref(AVFilterFormats *f, AVFilterFormats **ref)
Add *ref as a new reference to formats.
Definition: formats.c:755
ff_set_common_formats_from_list
int ff_set_common_formats_from_list(AVFilterContext *ctx, const int *fmts)
Equivalent to ff_set_common_formats(ctx, ff_make_format_list(fmts))
Definition: formats.c:968
ff_make_format_list
av_warn_unused_result AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
av_sample_fmt_is_planar
int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
Check if the sample format is planar.
Definition: samplefmt.c:114
filters.h
ff_set_sample_formats_from_list
int ff_set_sample_formats_from_list(AVFilterContext *ctx, const enum AVSampleFormat *fmts)
Equivalent to ff_set_common_formats(ctx, ff_make_sample_format_list(fmts))
Definition: formats.c:973
ff_set_common_alpha_modes2
int ff_set_common_alpha_modes2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, AVFilterFormats *alpha_modes)
Definition: formats.c:1112
ff_set_common_samplerates_from_list2
int ff_set_common_samplerates_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const int *samplerates)
Definition: formats.c:1049
AV_PIX_FMT_FLAG_ALPHA
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
Definition: pixdesc.h:147
ctx
static AVFormatContext * ctx
Definition: movenc.c:49
AVFilterFormatsConfig::color_spaces
AVFilterFormats * color_spaces
Lists of supported YUV color metadata, only for YUV video.
Definition: avfilter.h:141
ff_set_common_channel_layouts_from_list
int ff_set_common_channel_layouts_from_list(AVFilterContext *ctx, const AVChannelLayout *fmts)
Equivalent to ff_set_common_channel_layouts(ctx, ff_make_channel_layout_list(fmts))
Definition: formats.c:874
ff_set_common_samplerates2
int ff_set_common_samplerates2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, AVFilterFormats *samplerates)
Definition: formats.c:1040
av_get_sample_fmt_name
const char * av_get_sample_fmt_name(enum AVSampleFormat sample_fmt)
Return the name of sample_fmt, or NULL if sample_fmt is not recognized.
Definition: samplefmt.c:51
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
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
ff_formats_changeref
void ff_formats_changeref(AVFilterFormats **oldref, AVFilterFormats **newref)
Definition: formats.c:830
ff_set_common_color_spaces_from_list2
int ff_set_common_color_spaces_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const int *color_spaces)
Definition: formats.c:1073
NULL
#define NULL
Definition: coverity.c:32
format
New swscale design to change SwsGraph is what coordinates multiple passes These can include cascaded scaling error diffusion and so on Or we could have separate passes for the vertical and horizontal scaling In between each SwsPass lies a fully allocated image buffer Graph passes may have different levels of e g we can have a single threaded error diffusion pass following a multi threaded scaling pass SwsGraph is internally recreated whenever the image format
Definition: swscale-v2.txt:14
merge_pix_fmts
static int merge_pix_fmts(void *a, void *b)
Merge the formats lists if they are compatible and update all the references of a and b to point to t...
Definition: formats.c:161
AVPixFmtDescriptor::nb_components
uint8_t nb_components
The number of components each pixel has, (1-4)
Definition: pixdesc.h:71
ff_formats_check_alpha_modes
int ff_formats_check_alpha_modes(void *log, const AVFilterFormats *fmts)
Check that fmts is a valid formats list for alpha modes.
Definition: formats.c:1286
print_sample_rate
static void print_sample_rate(AVBPrint *bp, const void *ratesp)
Definition: formats.c:374
ff_add_format
int ff_add_format(AVFilterFormats **avff, int64_t fmt)
Add fmt to the list of media formats contained in *avff.
Definition: formats.c:570
AVFilterFormats::nb_formats
unsigned nb_formats
number of formats
Definition: formats.h:65
negotiate_audio
static const AVFilterNegotiation negotiate_audio
Definition: formats.c:456
ff_filter_get_negotiation
const AVFilterNegotiation * ff_filter_get_negotiation(const AVFilterLink *link)
Definition: formats.c:461
merge_samplerates
static int merge_samplerates(void *a, void *b)
See merge_pix_fmts().
Definition: formats.c:204
ff_set_common_all_channel_counts
int ff_set_common_all_channel_counts(AVFilterContext *ctx)
Equivalent to ff_set_common_channel_layouts(ctx, ff_all_channel_counts())
Definition: formats.c:880
ff_add_channel_layout
int ff_add_channel_layout(AVFilterChannelLayouts **l, const AVChannelLayout *channel_layout)
Definition: formats.c:587
ff_all_color_spaces
AVFilterFormats * ff_all_color_spaces(void)
Construct an AVFilterFormats representing all possible color spaces.
Definition: formats.c:696
AVPixFmtDescriptor::flags
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:94
ff_channel_layouts_unref
void ff_channel_layouts_unref(AVFilterChannelLayouts **ref)
Remove a reference to a channel layouts list.
Definition: formats.c:806
AVFilterFormatsConfig
Lists of formats / etc.
Definition: avfilter.h:121
FF_FILTER_FORMATS_SINGLE_SAMPLEFMT
@ FF_FILTER_FORMATS_SINGLE_SAMPLEFMT
formats.sample_fmt active.
Definition: filters.h:235
ff_formats_check_sample_formats
int ff_formats_check_sample_formats(void *log, const AVFilterFormats *fmts)
Check that fmts is a valid sample formats list.
Definition: formats.c:1258
AVAlphaMode
AVAlphaMode
Correlation between the alpha channel and color values.
Definition: pixfmt.h:810
MERGE_REF
#define MERGE_REF(ret, a, fmts, type, fail_statement)
Add all refs from a to ret and destroy a.
Definition: formats.c:35
f
f
Definition: af_crystalizer.c:122
ff_formats_check_color_spaces
int ff_formats_check_color_spaces(void *log, const AVFilterFormats *fmts)
Check that fmts is a valid formats list for YUV colorspace metadata.
Definition: formats.c:1270
AVMediaType
AVMediaType
Definition: avutil.h:198
FF_PIX_FMT_FLAG_SW_FLAT_SUB
#define FF_PIX_FMT_FLAG_SW_FLAT_SUB
Definition: formats.h:463
ff_default_query_formats
int ff_default_query_formats(AVFilterContext *ctx)
Sets all remaining unset filter lists for all inputs/outputs to their corresponding ff_all_*() lists.
Definition: formats.c:1169
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:319
merge_channel_layouts_internal
static int merge_channel_layouts_internal(AVFilterChannelLayouts *a, AVFilterChannelLayouts *b, int check)
See merge_pix_fmts().
Definition: formats.c:212
check_list
static int check_list(void *log, const char *name, const AVFilterFormats *fmts)
Definition: formats.c:1232
ff_set_common_color_ranges_from_list
int ff_set_common_color_ranges_from_list(AVFilterContext *ctx, const int *color_ranges)
Equivalent to ff_set_common_color_ranges(ctx, ff_make_format_list(color_ranges))
Definition: formats.c:928
AVFilterChannelLayouts::channel_layouts
AVChannelLayout * channel_layouts
list of channel layouts
Definition: formats.h:86
AVFilterChannelLayouts::all_layouts
char all_layouts
accept any known channel layout
Definition: formats.h:88
AVFilterChannelLayouts::all_counts
char all_counts
accept any channel layout or count
Definition: formats.h:89
AVALPHA_MODE_NB
@ AVALPHA_MODE_NB
Not part of ABI.
Definition: pixfmt.h:814
AVMEDIA_TYPE_UNKNOWN
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
Definition: avutil.h:199
range
enum AVColorRange range
Definition: mediacodec_wrapper.c:2594
ff_formats_check_channel_layouts
int ff_formats_check_channel_layouts(void *log, const AVFilterChannelLayouts *fmts)
Check that fmts is a valid channel layouts list.
Definition: formats.c:1298
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
ff_all_color_ranges
AVFilterFormats * ff_all_color_ranges(void)
Construct an AVFilterFormats representing all possible color ranges.
Definition: formats.c:712
AVFilterFormatsConfig::color_ranges
AVFilterFormats * color_ranges
AVColorRange.
Definition: avfilter.h:142
ff_all_channel_layouts
AVFilterChannelLayouts * ff_all_channel_layouts(void)
Construct an empty AVFilterChannelLayouts/AVFilterFormats struct – representing any channel layout (w...
Definition: formats.c:678
ADD_FORMAT
#define ADD_FORMAT(f, fmt, unref_fn, type, list, nb)
Definition: formats.c:546
av_channel_layout_compare
int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1)
Check whether two channel layouts are semantically the same, i.e.
Definition: channel_layout.c:809
ff_formats_unref
void ff_formats_unref(AVFilterFormats **ref)
If *ref is non-NULL, remove *ref as a reference to the format list it currently points to,...
Definition: formats.c:794
ff_set_common_color_ranges
int ff_set_common_color_ranges(AVFilterContext *ctx, AVFilterFormats *color_ranges)
Definition: formats.c:921
ff_set_common_alpha_modes_from_list2
int ff_set_common_alpha_modes_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const int *alpha_modes)
Definition: formats.c:1121
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:68
FF_FILTER_FORMATS_PASSTHROUGH
@ FF_FILTER_FORMATS_PASSTHROUGH
The default value meaning that this filter supports all formats and (for audio) sample rates and chan...
Definition: filters.h:229
ff_formats_pixdesc_filter
AVFilterFormats * ff_formats_pixdesc_filter(unsigned want, unsigned rej)
Construct a formats list containing all pixel formats with certain properties.
Definition: formats.c:619
bprint.h
MAKE_FORMAT_LIST_TYPE
#define MAKE_FORMAT_LIST_TYPE(name, type)
Definition: formats.c:497
FORMATS_REF
#define FORMATS_REF(f, ref, unref_fn)
Definition: formats.c:734
ff_formats_check_sample_rates
int ff_formats_check_sample_rates(void *log, const AVFilterFormats *fmts)
Check that fmts is a valid sample rates list.
Definition: formats.c:1263
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
round
static av_always_inline av_const double round(double x)
Definition: libm.h:446
av_get_bytes_per_sample
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
Definition: samplefmt.c:108
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:32
AVColorSpace
AVColorSpace
YUV colorspace type.
Definition: pixfmt.h:700
common.h
FORMATS_CHANGEREF
#define FORMATS_CHANGEREF(oldref, newref)
Definition: formats.c:811
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:58
ff_set_common_all_alpha_modes
int ff_set_common_all_alpha_modes(AVFilterContext *ctx)
Equivalent to ff_set_common_alpha_modes(ctx, ff_all_alpha_modes())
Definition: formats.c:952
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:55
ff_set_common_all_color_ranges
int ff_set_common_all_color_ranges(AVFilterContext *ctx)
Equivalent to ff_set_common_color_ranges(ctx, ff_all_color_ranges())
Definition: formats.c:934
ff_planar_sample_fmts
AVFilterFormats * ff_planar_sample_fmts(void)
Construct a formats list containing all planar sample formats.
Definition: formats.c:659
mergers_audio
static const AVFilterFormatsMerger mergers_audio[]
Definition: formats.c:424
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:703
merge_channel_layouts
static int merge_channel_layouts(void *a, void *b)
Definition: formats.c:319
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
ff_formats_check_color_ranges
int ff_formats_check_color_ranges(void *log, const AVFilterFormats *fmts)
Definition: formats.c:1281
ff_make_sample_format_list
av_warn_unused_result AVFilterFormats * ff_make_sample_format_list(const enum AVSampleFormat *fmts)
Create a list of supported sample formats.
ret
ret
Definition: filter_design.txt:187
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
ff_set_common_color_spaces
int ff_set_common_color_spaces(AVFilterContext *ctx, AVFilterFormats *color_spaces)
Definition: formats.c:903
av_channel_layout_check
int av_channel_layout_check(const AVChannelLayout *channel_layout)
Check whether a channel layout is valid, i.e.
Definition: channel_layout.c:783
FF_COUNT2LAYOUT
#define FF_COUNT2LAYOUT(c)
Encode a channel count as a channel layout.
Definition: formats.h:102
av_bprintf
void av_bprintf(AVBPrint *buf, const char *fmt,...)
Definition: bprint.c:122
ff_set_sample_formats_from_list2
int ff_set_sample_formats_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const enum AVSampleFormat *fmts)
Definition: formats.c:1153
ff_set_common_all_color_ranges2
int ff_set_common_all_color_ranges2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition: formats.c:1105
FF_FILTER_FORMATS_QUERY_FUNC2
@ FF_FILTER_FORMATS_QUERY_FUNC2
formats.query_func2 active.
Definition: filters.h:231
ff_all_samplerates
AVFilterFormats * ff_all_samplerates(void)
Definition: formats.c:672
ff_set_common_formats_from_list2
int ff_set_common_formats_from_list2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out, const int *fmts)
Definition: formats.c:1145
channel_layout.h
ff_set_common_alpha_modes_from_list
int ff_set_common_alpha_modes_from_list(AVFilterContext *ctx, const int *alpha_modes)
Equivalent to ff_set_common_alpha_modes(ctx, ff_make_format_list(alpha_modes))
Definition: formats.c:946
rates
static const int rates[]
Definition: swresample.c:101
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
avfilter.h
av_channel_layout_uninit
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
Definition: channel_layout.c:442
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
KNOWN
#define KNOWN(l)
Definition: formats.h:111
AV_PIX_FMT_FLAG_PLANAR
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
Definition: pixdesc.h:132
can_merge_samplerates
static int can_merge_samplerates(const void *a, const void *b)
See can_merge_pix_fmts().
Definition: formats.c:196
ff_all_alpha_modes
AVFilterFormats * ff_all_alpha_modes(void)
Construct an AVFilterFormats representing all possible alpha modes.
Definition: formats.c:723
AVFilterContext
An instance of a filter.
Definition: avfilter.h:274
av_channel_layout_copy
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
Definition: channel_layout.c:449
desc
const char * desc
Definition: libsvtav1.c:78
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
AVFilterChannelLayouts::nb_channel_layouts
int nb_channel_layouts
number of channel layouts
Definition: formats.h:87
mem.h
ff_pixfmt_is_in
int ff_pixfmt_is_in(enum AVPixelFormat fmt, const enum AVPixelFormat *fmts)
Tell if a pixel format is contained in the provided AV_PIX_FMT_NONE-terminated list.
Definition: formats.c:470
sample_format
enum AVSampleFormat sample_format
Definition: mediacodecdec_common.c:101
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
ff_set_common_all_samplerates2
int ff_set_common_all_samplerates2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition: formats.c:1057
channel_layouts
static const uint16_t channel_layouts[7]
Definition: dca_lbr.c:112
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
negotiate_video
static const AVFilterNegotiation negotiate_video
Definition: formats.c:451
ff_make_channel_layout_list
AVFilterChannelLayouts * ff_make_channel_layout_list(const AVChannelLayout *fmts)
Definition: formats.c:510
FF_FILTER_FORMATS_SAMPLEFMTS_LIST
@ FF_FILTER_FORMATS_SAMPLEFMTS_LIST
formats.samples_list active.
Definition: filters.h:233
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
ff_set_common_all_color_spaces2
int ff_set_common_all_color_spaces2(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition: formats.c:1081
ff_set_common_samplerates
int ff_set_common_samplerates(AVFilterContext *ctx, AVFilterFormats *samplerates)
Definition: formats.c:885
print_channel_layout_desc
static void print_channel_layout_desc(AVBPrint *bp, const void *layoutsp)
Definition: formats.c:365
av_bprint_chars
void av_bprint_chars(AVBPrint *buf, char c, unsigned n)
Append char c n times to a print buffer.
Definition: bprint.c:130
ff_channel_layouts_changeref
void ff_channel_layouts_changeref(AVFilterChannelLayouts **oldref, AVFilterChannelLayouts **newref)
Definition: formats.c:824
merge_sample_fmts
static int merge_sample_fmts(void *a, void *b)
See merge_pix_fmts().
Definition: formats.c:178
AVColorRange
AVColorRange
Visual content value range.
Definition: pixfmt.h:742
AVFilterFormatsConfig::alpha_modes
AVFilterFormats * alpha_modes
List of supported alpha modes, only for video with an alpha channel.
Definition: avfilter.h:147
FF_FILTER_FORMATS_PIXFMT_LIST
@ FF_FILTER_FORMATS_PIXFMT_LIST
formats.pixels_list active.
Definition: filters.h:232
ff_set_common_channel_layouts
int ff_set_common_channel_layouts(AVFilterContext *ctx, AVFilterChannelLayouts *channel_layouts)
Helpers for query_formats() which set all free audio links to the same list of channel layouts/sample...
Definition: formats.c:867