FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavfilter/formats.c
Date: 2026-11-04 10:59:43
Exec Total Coverage
Lines: 363 468 77.6%
Functions: 75 102 73.5%
Branches: 528 748 70.6%

Line Branch Exec Source
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/attributes.h"
23 #include "libavutil/avassert.h"
24 #include "libavutil/bprint.h"
25 #include "libavutil/channel_layout.h"
26 #include "libavutil/common.h"
27 #include "libavutil/mem.h"
28 #include "libavutil/pixdesc.h"
29 #include "avfilter.h"
30 #include "filters.h"
31 #include "formats.h"
32
33 /**
34 * Add all refs from a to ret and destroy a.
35 */
36 #define MERGE_REF(ret, a, fmts, type, fail_statement) \
37 do { \
38 type ***tmp; \
39 int i; \
40 \
41 if (!(tmp = av_realloc_array(ret->refs, ret->refcount + a->refcount, \
42 sizeof(*tmp)))) \
43 { fail_statement } \
44 ret->refs = tmp; \
45 \
46 for (i = 0; i < a->refcount; i ++) { \
47 ret->refs[ret->refcount] = a->refs[i]; \
48 *ret->refs[ret->refcount++] = ret; \
49 } \
50 \
51 av_freep(&a->refs); \
52 av_freep(&a->fmts); \
53 av_freep(&a); \
54 } while (0)
55
56 /**
57 * Add all formats common to a and b to a, add b's refs to a and destroy b.
58 * If check is set, nothing is modified and it is only checked whether
59 * the formats are compatible.
60 * If empty_allowed is set and one of a,b->nb is zero, the lists are
61 * merged; otherwise, 0 (for nonmergeability) is returned.
62 */
63 #define MERGE_FORMATS(a, b, fmts, nb, type, check, empty_allowed) \
64 do { \
65 int i, j, k = 0, skip = 0; \
66 \
67 if (empty_allowed) { \
68 if (!a->nb || !b->nb) { \
69 if (check) \
70 return 1; \
71 if (!a->nb) \
72 FFSWAP(type *, a, b); \
73 skip = 1; \
74 } \
75 } \
76 if (!skip) { \
77 for (i = 0; i < a->nb; i++) \
78 for (j = 0; j < b->nb; j++) \
79 if (a->fmts[i] == b->fmts[j]) { \
80 if (check) \
81 return 1; \
82 a->fmts[k++] = a->fmts[i]; \
83 break; \
84 } \
85 /* Check that there was at least one common format. \
86 * Notice that both a and b are unchanged if not. */ \
87 if (!k) \
88 return 0; \
89 av_assert2(!check); \
90 a->nb = k; \
91 } \
92 \
93 MERGE_REF(a, b, fmts, type, return AVERROR(ENOMEM);); \
94 } while (0)
95
96 75741 static int merge_formats_internal(AVFilterFormats *a, AVFilterFormats *b,
97 enum AVMediaType type, int check)
98 {
99 int i, j;
100 75741 int alpha1=0, alpha2=0;
101 75741 int chroma1=0, chroma2=0;
102
103 av_assert2(check || (a->refcount && b->refcount));
104
105
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 75741 times.
75741 if (a == b)
106 ✗ return 1;
107
108 /* Do not lose chroma or alpha in merging.
109 It happens if both lists have formats with chroma (resp. alpha), but
110 the only formats in common do not have it (e.g. YUV+gray vs.
111 RGB+gray): in that case, the merging would select the gray format,
112 possibly causing a lossy conversion elsewhere in the graph.
113 To avoid that, pretend that there are no common formats to force the
114 insertion of a conversion filter. */
115
2/2
✓ Branch 0 taken 62505 times.
✓ Branch 1 taken 13236 times.
75741 if (type == AVMEDIA_TYPE_VIDEO)
116
2/2
✓ Branch 0 taken 3482895 times.
✓ Branch 1 taken 62505 times.
3545400 for (i = 0; i < a->nb_formats; i++) {
117 3482895 const AVPixFmtDescriptor *const adesc = av_pix_fmt_desc_get(a->formats[i]);
118
2/2
✓ Branch 0 taken 207793659 times.
✓ Branch 1 taken 3482895 times.
211276554 for (j = 0; j < b->nb_formats; j++) {
119 207793659 const AVPixFmtDescriptor *bdesc = av_pix_fmt_desc_get(b->formats[j]);
120 207793659 alpha2 |= adesc->flags & bdesc->flags & AV_PIX_FMT_FLAG_ALPHA;
121
4/4
✓ Branch 0 taken 181200254 times.
✓ Branch 1 taken 26593405 times.
✓ Branch 2 taken 156982721 times.
✓ Branch 3 taken 24217533 times.
207793659 chroma2|= adesc->nb_components > 1 && bdesc->nb_components > 1;
122
2/2
✓ Branch 0 taken 787958 times.
✓ Branch 1 taken 207005701 times.
207793659 if (a->formats[i] == b->formats[j]) {
123 787958 alpha1 |= adesc->flags & AV_PIX_FMT_FLAG_ALPHA;
124 787958 chroma1|= adesc->nb_components > 1;
125 }
126 }
127 }
128
129 // If chroma or alpha can be lost through merging then do not merge
130
4/4
✓ Branch 0 taken 75718 times.
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 569 times.
✓ Branch 3 taken 75149 times.
75741 if (alpha2 > alpha1 || chroma2 > chroma1)
131 592 return 0;
132
133
14/16
✓ Branch 0 taken 75149 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 441615 times.
✓ Branch 3 taken 52594138 times.
✓ Branch 4 taken 35603 times.
✓ Branch 5 taken 406012 times.
✓ Branch 6 taken 53035753 times.
✓ Branch 7 taken 2010545 times.
✓ Branch 8 taken 2452160 times.
✓ Branch 9 taken 39546 times.
✓ Branch 10 taken 876 times.
✓ Branch 11 taken 38670 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 38670 times.
✓ Branch 15 taken 85468 times.
✓ Branch 16 taken 38670 times.
55171312 MERGE_FORMATS(a, b, formats, nb_formats, AVFilterFormats, check, 0);
134
135 38670 return 1;
136 }
137
138
139 /**
140 * Check the formats lists for compatibility for merging without actually
141 * merging.
142 *
143 * @return 1 if they are compatible, 0 if not.
144 */
145 30866 static int can_merge_pix_fmts(const void *a, const void *b)
146 {
147 30866 return merge_formats_internal((AVFilterFormats *)a,
148 (AVFilterFormats *)b, AVMEDIA_TYPE_VIDEO, 1);
149 }
150
151 /**
152 * Merge the formats lists if they are compatible and update all the
153 * references of a and b to point to the combined list and free the old
154 * lists as needed. The combined list usually contains the intersection of
155 * the lists of a and b.
156 *
157 * Both a and b must have owners (i.e. refcount > 0) for these functions.
158 *
159 * @return 1 if merging succeeded, 0 if a and b are incompatible
160 * and negative AVERROR code on failure.
161 * a and b are unmodified if 0 is returned.
162 */
163 31639 static int merge_pix_fmts(void *a, void *b)
164 {
165 31639 return merge_formats_internal(a, b, AVMEDIA_TYPE_VIDEO, 0);
166 }
167
168 /**
169 * See can_merge_pix_fmts().
170 */
171 6205 static int can_merge_sample_fmts(const void *a, const void *b)
172 {
173 6205 return merge_formats_internal((AVFilterFormats *)a,
174 (AVFilterFormats *)b, AVMEDIA_TYPE_AUDIO, 1);
175 }
176
177 /**
178 * See merge_pix_fmts().
179 */
180 7031 static int merge_sample_fmts(void *a, void *b)
181 {
182 7031 return merge_formats_internal(a, b, AVMEDIA_TYPE_AUDIO, 0);
183 }
184
185 13236 static int merge_samplerates_internal(AVFilterFormats *a,
186 AVFilterFormats *b, int check)
187 {
188 av_assert2(check || (a->refcount && b->refcount));
189
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13236 times.
13236 if (a == b) return 1;
190
191
23/24
✓ Branch 0 taken 8340 times.
✓ Branch 1 taken 4896 times.
✓ Branch 2 taken 8025 times.
✓ Branch 3 taken 315 times.
✓ Branch 4 taken 5968 times.
✓ Branch 5 taken 6953 times.
✓ Branch 6 taken 2861 times.
✓ Branch 7 taken 4092 times.
✓ Branch 8 taken 315 times.
✓ Branch 9 taken 6953 times.
✓ Branch 10 taken 306 times.
✓ Branch 11 taken 695 times.
✓ Branch 12 taken 228 times.
✓ Branch 13 taken 78 times.
✓ Branch 14 taken 1001 times.
✓ Branch 15 taken 9 times.
✓ Branch 16 taken 315 times.
✓ Branch 17 taken 87 times.
✓ Branch 18 taken 9 times.
✓ Branch 19 taken 78 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 7031 times.
✓ Branch 23 taken 28404 times.
✓ Branch 24 taken 7031 times.
42422 MERGE_FORMATS(a, b, formats, nb_formats, AVFilterFormats, check, 1);
192 7031 return 1;
193 }
194
195 /**
196 * See can_merge_pix_fmts().
197 */
198 6205 static int can_merge_samplerates(const void *a, const void *b)
199 {
200 6205 return merge_samplerates_internal((AVFilterFormats *)a, (AVFilterFormats *)b, 1);
201 }
202
203 /**
204 * See merge_pix_fmts().
205 */
206 7031 static int merge_samplerates(void *a, void *b)
207 {
208 7031 return merge_samplerates_internal(a, b, 0);
209 }
210
211 /**
212 * See merge_pix_fmts().
213 */
214 7948 static int merge_channel_layouts_internal(AVFilterChannelLayouts *a,
215 AVFilterChannelLayouts *b, int check)
216 {
217 7948 AVChannelLayout *channel_layouts = NULL;
218 7948 unsigned a_all = a->all_layouts + a->all_counts;
219 7948 unsigned b_all = b->all_layouts + b->all_counts;
220 7948 int ret_max, ret_nb = 0, i, j, round;
221
222 av_assert2(a->refcount && b->refcount);
223
224
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7948 times.
7948 if (a == b) return 1;
225
226 /* Put the most generic set in a, to avoid doing everything twice */
227
2/2
✓ Branch 0 taken 4008 times.
✓ Branch 1 taken 3940 times.
7948 if (a_all < b_all) {
228 4008 FFSWAP(AVFilterChannelLayouts *, a, b);
229 4008 FFSWAP(unsigned, a_all, b_all);
230 }
231
2/2
✓ Branch 0 taken 7597 times.
✓ Branch 1 taken 351 times.
7948 if (a_all) {
232
3/4
✓ Branch 0 taken 70 times.
✓ Branch 1 taken 7527 times.
✓ Branch 2 taken 70 times.
✗ Branch 3 not taken.
7597 if (a_all == 1 && !b_all) {
233 /* keep only known layouts in b; works also for b_all = 1 */
234
2/2
✓ Branch 0 taken 70 times.
✓ Branch 1 taken 70 times.
140 for (i = j = 0; i < b->nb_channel_layouts; i++)
235
2/6
✗ Branch 0 not taken.
✓ Branch 1 taken 70 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 70 times.
70 if (KNOWN(&b->channel_layouts[i]) && i != j++) {
236 ✗ if (check)
237 ✗ return 1;
238 ✗ av_channel_layout_copy(&b->channel_layouts[j], &b->channel_layouts[i]);
239 }
240 /* Not optimal: the unknown layouts of b may become known after
241 another merge. */
242
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 70 times.
70 if (!j)
243 ✗ return 0;
244 70 b->nb_channel_layouts = j;
245 }
246
3/4
✗ Branch 1 not taken.
✓ Branch 2 taken 7597 times.
✓ Branch 3 taken 13167 times.
✓ Branch 4 taken 7597 times.
20764 MERGE_REF(b, a, channel_layouts, AVFilterChannelLayouts, return AVERROR(ENOMEM););
247 7597 return 1;
248 }
249
250 351 ret_max = a->nb_channel_layouts + b->nb_channel_layouts;
251
3/4
✓ Branch 0 taken 91 times.
✓ Branch 1 taken 260 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 91 times.
351 if (!check && !(channel_layouts = av_calloc(ret_max, sizeof(*channel_layouts))))
252 ✗ return AVERROR(ENOMEM);
253
254 /* a[known] intersect b[known] */
255
2/2
✓ Branch 0 taken 351 times.
✓ Branch 1 taken 100 times.
451 for (i = 0; i < a->nb_channel_layouts; i++) {
256
3/4
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 348 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
351 if (!KNOWN(&a->channel_layouts[i]))
257 3 continue;
258
2/2
✓ Branch 0 taken 514 times.
✓ Branch 1 taken 7 times.
521 for (j = 0; j < b->nb_channel_layouts; j++) {
259
2/2
✓ Branch 1 taken 341 times.
✓ Branch 2 taken 173 times.
514 if (!av_channel_layout_compare(&a->channel_layouts[i], &b->channel_layouts[j])) {
260
2/2
✓ Branch 0 taken 251 times.
✓ Branch 1 taken 90 times.
341 if (check)
261 251 return 1;
262 90 av_channel_layout_copy(&channel_layouts[ret_nb++], &a->channel_layouts[i]);
263 90 av_channel_layout_uninit(&a->channel_layouts[i]);
264 90 av_channel_layout_uninit(&b->channel_layouts[j]);
265 90 break;
266 }
267 }
268 }
269 /* 1st round: a[known] intersect b[generic]
270 2nd round: a[generic] intersect b[known] */
271
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 99 times.
299 for (round = 0; round < 2; round++) {
272
2/2
✓ Branch 0 taken 335 times.
✓ Branch 1 taken 199 times.
534 for (i = 0; i < a->nb_channel_layouts; i++) {
273 335 AVChannelLayout *fmt = &a->channel_layouts[i], bfmt = { 0 };
274
5/6
✓ Branch 1 taken 155 times.
✓ Branch 2 taken 180 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 150 times.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
335 if (!av_channel_layout_check(fmt) || !KNOWN(fmt))
275 185 continue;
276 150 bfmt = FF_COUNT2LAYOUT(fmt->nb_channels);
277
2/2
✓ Branch 0 taken 150 times.
✓ Branch 1 taken 149 times.
299 for (j = 0; j < b->nb_channel_layouts; j++)
278
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 149 times.
150 if (!av_channel_layout_compare(&b->channel_layouts[j], &bfmt)) {
279
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (check)
280 1 return 1;
281 ✗ av_channel_layout_copy(&channel_layouts[ret_nb++], fmt);
282 }
283 }
284 /* 1st round: swap to prepare 2nd round; 2nd round: put it back */
285 199 FFSWAP(AVFilterChannelLayouts *, a, b);
286 }
287 /* a[generic] intersect b[generic] */
288
2/2
✓ Branch 0 taken 99 times.
✓ Branch 1 taken 98 times.
197 for (i = 0; i < a->nb_channel_layouts; i++) {
289
4/4
✓ Branch 0 taken 92 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 90 times.
✓ Branch 3 taken 2 times.
99 if (KNOWN(&a->channel_layouts[i]))
290 97 continue;
291
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
3 for (j = 0; j < b->nb_channel_layouts; j++)
292
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 if (!av_channel_layout_compare(&a->channel_layouts[i], &b->channel_layouts[j])) {
293
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 if (check)
294 1 return 1;
295 1 av_channel_layout_copy(&channel_layouts[ret_nb++], &a->channel_layouts[i]);
296 }
297 }
298
299
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 91 times.
98 if (!ret_nb) {
300 7 av_free(channel_layouts);
301 7 return 0;
302 }
303
304
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 70 times.
91 if (a->refcount > b->refcount)
305 21 FFSWAP(AVFilterChannelLayouts *, a, b);
306
307
3/4
✗ Branch 1 not taken.
✓ Branch 2 taken 91 times.
✓ Branch 4 taken 179 times.
✓ Branch 5 taken 91 times.
270 MERGE_REF(b, a, channel_layouts, AVFilterChannelLayouts,
308 { av_free(channel_layouts); return AVERROR(ENOMEM); });
309 91 av_freep(&b->channel_layouts);
310 91 b->channel_layouts = channel_layouts;
311 91 b->nb_channel_layouts = ret_nb;
312 91 return 1;
313 }
314
315 6205 static int can_merge_channel_layouts(const void *a, const void *b)
316 {
317 6205 return merge_channel_layouts_internal((AVFilterChannelLayouts *)a,
318 (AVFilterChannelLayouts *)b, 1);
319 }
320
321 1743 static int merge_channel_layouts(void *a, void *b)
322 {
323 1743 return merge_channel_layouts_internal(a, b, 0);
324 }
325
326 251518 static int merge_generic_internal(AVFilterFormats *a,
327 AVFilterFormats *b, int check)
328 {
329 av_assert2(check || (a->refcount && b->refcount));
330
331
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 251518 times.
251518 if (a == b)
332 ✗ return 1;
333
334
14/16
✓ Branch 0 taken 251518 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 763547 times.
✓ Branch 3 taken 2451815 times.
✓ Branch 4 taken 124771 times.
✓ Branch 5 taken 638776 times.
✓ Branch 6 taken 3215362 times.
✓ Branch 7 taken 25797 times.
✓ Branch 8 taken 789344 times.
✓ Branch 9 taken 126747 times.
✓ Branch 10 taken 212 times.
✓ Branch 11 taken 126535 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 126535 times.
✓ Branch 15 taken 234734 times.
✓ Branch 16 taken 126535 times.
3602640 MERGE_FORMATS(a, b, formats, nb_formats, AVFilterFormats, check, 0);
335
336 126535 return 1;
337 }
338
339 124983 static int can_merge_generic(const void *a, const void *b)
340 {
341 124983 return merge_generic_internal((AVFilterFormats *)a,
342 (AVFilterFormats *)b, 1);
343 }
344
345 126535 static int merge_generic(void *a, void *b)
346 {
347 126535 return merge_generic_internal(a, b, 0);
348 }
349
350 #define PRINT_NAME(type, type_name) \
351 static void print_##type_name(AVBPrint *bp, const void *fmtsp) \
352 { \
353 const AVFilterFormats *fmts = fmtsp; \
354 for (int i = 0; i < fmts->nb_formats; i++) { \
355 const char *name = av_##type_name(fmts->formats[i]); \
356 av_bprint_chars(bp, ' ', i ? 1 : 0); \
357 av_bprint_append_data(bp, name, name ? strlen(name) : 0); \
358 } \
359 }
360
361 ✗ PRINT_NAME(enum AVSampleFormat, get_sample_fmt_name)
362 ✗ PRINT_NAME(enum AVPixelFormat, get_pix_fmt_name)
363 ✗ PRINT_NAME(enum AVColorSpace, color_space_name)
364 ✗ PRINT_NAME(enum AVColorRange, color_range_name)
365 ✗ PRINT_NAME(enum AVAlphaMode, alpha_mode_name)
366 ✗ PRINT_NAME(enum AVChromaLocation, chroma_location_name)
367
368 ✗ static void print_channel_layout_desc(AVBPrint *bp, const void *layoutsp)
369 {
370 ✗ const AVFilterChannelLayouts *layouts = layoutsp;
371 ✗ for (int i = 0; i < layouts->nb_channel_layouts; i++) {
372 ✗ av_bprint_chars(bp, ' ', i ? 1 : 0);
373 ✗ av_channel_layout_describe_bprint(&layouts->channel_layouts[i], bp);
374 }
375 ✗ }
376
377 ✗ static void print_sample_rate(AVBPrint *bp, const void *ratesp)
378 {
379 ✗ const AVFilterFormats *rates = ratesp;
380 ✗ for (int i = 0; i < rates->nb_formats; i++)
381 ✗ av_bprintf(bp, "%s%d", i ? " " : "", rates->formats[i]);
382 ✗ }
383
384 #define CONVERSION_FILTER_SWSCALE \
385 .conversion_filter = "scale", \
386 .conversion_opts_offset = offsetof(AVFilterGraph, scale_sws_opts),
387
388 #define CONVERSION_FILTER_ARESAMPLE \
389 .conversion_filter = "aresample", \
390 .conversion_opts_offset = offsetof(AVFilterGraph, aresample_swr_opts),
391
392 static const AVFilterFormatsMerger mergers_video[] = {
393 {
394 .name = "Pixel formats",
395 .offset = offsetof(AVFilterFormatsConfig, formats),
396 .merge = merge_pix_fmts,
397 .can_merge = can_merge_pix_fmts,
398 .print_list = print_get_pix_fmt_name,
399 CONVERSION_FILTER_SWSCALE
400 },
401 {
402 .name = "Color spaces",
403 .offset = offsetof(AVFilterFormatsConfig, color_spaces),
404 .merge = merge_generic,
405 .can_merge = can_merge_generic,
406 .print_list = print_color_space_name,
407 CONVERSION_FILTER_SWSCALE
408 },
409 {
410 .name = "Color ranges",
411 .offset = offsetof(AVFilterFormatsConfig, color_ranges),
412 .merge = merge_generic,
413 .can_merge = can_merge_generic,
414 .print_list = print_color_range_name,
415 CONVERSION_FILTER_SWSCALE
416 },
417 {
418 .name = "Alpha modes",
419 .offset = offsetof(AVFilterFormatsConfig, alpha_modes),
420 .merge = merge_generic,
421 .can_merge = can_merge_generic,
422 .print_list = print_alpha_mode_name,
423 .conversion_filter = "premultiply_dynamic",
424 },
425 {
426 .name = "Chroma locations",
427 .offset = offsetof(AVFilterFormatsConfig, chroma_locations),
428 .merge = merge_generic,
429 .can_merge = can_merge_generic,
430 .print_list = print_chroma_location_name,
431 CONVERSION_FILTER_SWSCALE
432 },
433 };
434
435 static const AVFilterFormatsMerger mergers_audio[] = {
436 {
437 .name = "Channel layouts",
438 .offset = offsetof(AVFilterFormatsConfig, channel_layouts),
439 .merge = merge_channel_layouts,
440 .can_merge = can_merge_channel_layouts,
441 .print_list = print_channel_layout_desc,
442 CONVERSION_FILTER_ARESAMPLE
443 },
444 {
445 .name = "Sample rates",
446 .offset = offsetof(AVFilterFormatsConfig, samplerates),
447 .merge = merge_samplerates,
448 .can_merge = can_merge_samplerates,
449 .print_list = print_sample_rate,
450 CONVERSION_FILTER_ARESAMPLE
451 },
452 {
453 .name = "Sample formats",
454 .offset = offsetof(AVFilterFormatsConfig, formats),
455 .merge = merge_sample_fmts,
456 .can_merge = can_merge_sample_fmts,
457 .print_list = print_get_sample_fmt_name,
458 CONVERSION_FILTER_ARESAMPLE
459 },
460 };
461
462 static const AVFilterNegotiation negotiate_video = {
463 .nb_mergers = FF_ARRAY_ELEMS(mergers_video),
464 .mergers = mergers_video,
465 };
466
467 static const AVFilterNegotiation negotiate_audio = {
468 .nb_mergers = FF_ARRAY_ELEMS(mergers_audio),
469 .mergers = mergers_audio,
470 };
471
472 65038 const AVFilterNegotiation *ff_filter_get_negotiation(const AVFilterLink *link)
473 {
474
2/3
✓ Branch 0 taken 34058 times.
✓ Branch 1 taken 30980 times.
✗ Branch 2 not taken.
65038 switch (link->type) {
475 34058 case AVMEDIA_TYPE_VIDEO: return &negotiate_video;
476 30980 case AVMEDIA_TYPE_AUDIO: return &negotiate_audio;
477 ✗ default: return NULL;
478 }
479 }
480
481 198 int ff_pixfmt_is_in(enum AVPixelFormat fmt, const enum AVPixelFormat *fmts)
482 {
483
2/2
✓ Branch 0 taken 2209 times.
✓ Branch 1 taken 109 times.
2318 for (; *fmts != AV_PIX_FMT_NONE; ++fmts) {
484
2/2
✓ Branch 0 taken 89 times.
✓ Branch 1 taken 2120 times.
2209 if (fmt == *fmts)
485 89 return 1;
486 }
487 109 return 0;
488 }
489
490 #define MAKE_FORMAT_LIST(type, field, count_field) \
491 type *formats; \
492 int count = 0; \
493 if (fmts) \
494 for (count = 0; fmts[count] != -1; count++) \
495 ; \
496 formats = av_mallocz(sizeof(*formats)); \
497 if (!formats) \
498 return NULL; \
499 formats->count_field = count; \
500 if (count) { \
501 formats->field = av_malloc_array(count, sizeof(*formats->field)); \
502 if (!formats->field) { \
503 av_freep(&formats); \
504 return NULL; \
505 } \
506 }
507
508 #define MAKE_FORMAT_LIST_TYPE(name, type) \
509 AVFilterFormats *ff_make_ ## name ## _list(const type* fmts) \
510 { \
511 MAKE_FORMAT_LIST(AVFilterFormats, formats, nb_formats); \
512 while (count--) \
513 formats->formats[count] = (int)fmts[count]; \
514 return formats; \
515 }
516
517
8/12
✓ Branch 0 taken 1150 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2304 times.
✓ Branch 3 taken 1150 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1150 times.
✓ Branch 7 taken 1150 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1150 times.
✓ Branch 13 taken 2304 times.
✓ Branch 14 taken 1150 times.
5758 MAKE_FORMAT_LIST_TYPE(format, int)
518
8/12
✓ Branch 0 taken 2229 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2851 times.
✓ Branch 3 taken 2229 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2229 times.
✓ Branch 7 taken 2229 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2229 times.
✓ Branch 13 taken 2851 times.
✓ Branch 14 taken 2229 times.
7931 MAKE_FORMAT_LIST_TYPE(sample_format, enum AVSampleFormat)
519
8/12
✓ Branch 0 taken 1704 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 46872 times.
✓ Branch 3 taken 1704 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1704 times.
✓ Branch 7 taken 1704 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1704 times.
✓ Branch 13 taken 46872 times.
✓ Branch 14 taken 1704 times.
95448 MAKE_FORMAT_LIST_TYPE(pixel_format, enum AVPixelFormat)
520
521 377 AVFilterChannelLayouts *ff_make_channel_layout_list(const AVChannelLayout *fmts)
522 {
523 AVFilterChannelLayouts *ch_layouts;
524 377 int count = 0;
525
1/2
✓ Branch 0 taken 377 times.
✗ Branch 1 not taken.
377 if (fmts)
526
2/2
✓ Branch 0 taken 955 times.
✓ Branch 1 taken 377 times.
1332 for (count = 0; fmts[count].nb_channels; count++)
527 ;
528 377 ch_layouts = av_mallocz(sizeof(*ch_layouts));
529
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 377 times.
377 if (!ch_layouts)
530 ✗ return NULL;
531 377 ch_layouts->nb_channel_layouts = count;
532
1/2
✓ Branch 0 taken 377 times.
✗ Branch 1 not taken.
377 if (count) {
533 754 ch_layouts->channel_layouts =
534 377 av_calloc(count, sizeof(*ch_layouts->channel_layouts));
535
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 377 times.
377 if (!ch_layouts->channel_layouts) {
536 ✗ av_freep(&ch_layouts);
537 ✗ return NULL;
538 }
539
2/2
✓ Branch 0 taken 955 times.
✓ Branch 1 taken 377 times.
1332 for (int i = 0; i < count; i++) {
540 955 int ret = av_channel_layout_copy(&ch_layouts->channel_layouts[i], &fmts[i]);
541
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 955 times.
955 if (ret < 0)
542 ✗ goto fail;
543 }
544 }
545
546 377 return ch_layouts;
547
548 ✗ fail:
549 ✗ for (int i = 0; i < count; i++)
550 ✗ av_channel_layout_uninit(&ch_layouts->channel_layouts[i]);
551 ✗ av_free(ch_layouts->channel_layouts);
552 ✗ av_freep(&ch_layouts);
553
554 ✗ return NULL;
555 }
556
557 #define ADD_FORMAT(f, fmt, unref_fn, type, list, nb) \
558 do { \
559 type *fmts; \
560 \
561 if (!(*f) && !(*f = av_mallocz(sizeof(**f)))) { \
562 return AVERROR(ENOMEM); \
563 } \
564 \
565 fmts = av_realloc_array((*f)->list, (*f)->nb + 1, \
566 sizeof(*(*f)->list)); \
567 if (!fmts) { \
568 unref_fn(f); \
569 return AVERROR(ENOMEM); \
570 } \
571 \
572 (*f)->list = fmts; \
573 ASSIGN_FMT(f, fmt, list, nb); \
574 } while (0)
575
576 #define ASSIGN_FMT(f, fmt, list, nb) \
577 do { \
578 (*f)->list[(*f)->nb++] = fmt; \
579 } while (0)
580
581 5137676 int ff_add_format(AVFilterFormats **avff, int64_t fmt)
582 {
583
4/6
✓ Branch 0 taken 296196 times.
✓ Branch 1 taken 4841480 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 296196 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 5137676 times.
5137676 ADD_FORMAT(avff, fmt, ff_formats_unref, int, formats, nb_formats);
584 5137676 return 0;
585 }
586
587 #undef ASSIGN_FMT
588 #define ASSIGN_FMT(f, fmt, list, nb) \
589 do { \
590 int ret; \
591 memset((*f)->list + (*f)->nb, 0, sizeof(*(*f)->list)); \
592 ret = av_channel_layout_copy(&(*f)->list[(*f)->nb], fmt); \
593 if (ret < 0) \
594 return ret; \
595 (*f)->nb++; \
596 } while (0)
597
598 2530 int ff_add_channel_layout(AVFilterChannelLayouts **l,
599 const AVChannelLayout *channel_layout)
600 {
601 av_assert1(!(*l && (*l)->all_layouts));
602
5/8
✓ Branch 0 taken 1635 times.
✓ Branch 1 taken 895 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1635 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2530 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2530 times.
2530 ADD_FORMAT(l, channel_layout, ff_channel_layouts_unref, AVChannelLayout, channel_layouts, nb_channel_layouts);
603 2530 return 0;
604 }
605
606 105 AVFilterFormats *ff_make_formats_list_singleton(int fmt)
607 {
608 105 int fmts[2] = { fmt, -1 };
609 105 return ff_make_format_list(fmts);
610 }
611
612 49173 AVFilterFormats *ff_all_formats(enum AVMediaType type)
613 {
614 49173 AVFilterFormats *ret = NULL;
615
616
2/2
✓ Branch 0 taken 37222 times.
✓ Branch 1 taken 11951 times.
49173 if (type == AVMEDIA_TYPE_VIDEO) {
617 37222 return ff_formats_pixdesc_filter(0, 0);
618
1/2
✓ Branch 0 taken 11951 times.
✗ Branch 1 not taken.
11951 } else if (type == AVMEDIA_TYPE_AUDIO) {
619 11951 enum AVSampleFormat fmt = 0;
620
2/2
✓ Branch 1 taken 155363 times.
✓ Branch 2 taken 11951 times.
167314 while (av_get_sample_fmt_name(fmt)) {
621
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 155363 times.
155363 if (ff_add_format(&ret, fmt) < 0)
622 ✗ return NULL;
623 155363 fmt++;
624 }
625 }
626
627 11951 return ret;
628 }
629
630 37876 AVFilterFormats *ff_formats_pixdesc_filter(unsigned want, unsigned rej)
631 {
632 unsigned nb_formats, fmt, flags;
633 37876 AVFilterFormats *formats = NULL;
634
635 while (1) {
636 75752 nb_formats = 0;
637 20528792 for (fmt = 0;; fmt++) {
638 20528792 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt);
639
2/2
✓ Branch 0 taken 75752 times.
✓ Branch 1 taken 20453040 times.
20528792 if (!desc)
640 75752 break;
641 20453040 flags = desc->flags;
642
2/2
✓ Branch 0 taken 19165256 times.
✓ Branch 1 taken 1287784 times.
20453040 if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL) &&
643
2/2
✓ Branch 0 taken 8938736 times.
✓ Branch 1 taken 10226520 times.
19165256 !(desc->flags & AV_PIX_FMT_FLAG_PLANAR) &&
644
3/4
✓ Branch 0 taken 8181216 times.
✓ Branch 1 taken 757520 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8181216 times.
8938736 (desc->log2_chroma_w || desc->log2_chroma_h))
645 757520 flags |= FF_PIX_FMT_FLAG_SW_FLAT_SUB;
646
2/2
✓ Branch 0 taken 22604 times.
✓ Branch 1 taken 20430436 times.
20453040 if ((flags & (want | rej)) != want)
647 22604 continue;
648
2/2
✓ Branch 0 taken 10215218 times.
✓ Branch 1 taken 10215218 times.
20430436 if (formats)
649 10215218 formats->formats[nb_formats] = fmt;
650 20430436 nb_formats++;
651 }
652
2/2
✓ Branch 0 taken 37876 times.
✓ Branch 1 taken 37876 times.
75752 if (formats) {
653
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37876 times.
37876 av_assert0(formats->nb_formats == nb_formats);
654 37876 return formats;
655 }
656 37876 formats = av_mallocz(sizeof(*formats));
657
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37876 times.
37876 if (!formats)
658 ✗ return NULL;
659 37876 formats->nb_formats = nb_formats;
660
1/2
✓ Branch 0 taken 37876 times.
✗ Branch 1 not taken.
37876 if (nb_formats) {
661 37876 formats->formats = av_malloc_array(nb_formats, sizeof(*formats->formats));
662
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37876 times.
37876 if (!formats->formats) {
663 ✗ av_freep(&formats);
664 ✗ return NULL;
665 }
666 }
667 }
668 }
669
670 65 AVFilterFormats *ff_planar_sample_fmts(void)
671 {
672 65 AVFilterFormats *ret = NULL;
673 int fmt;
674
675
2/2
✓ Branch 1 taken 845 times.
✓ Branch 2 taken 65 times.
910 for (fmt = 0; av_get_bytes_per_sample(fmt)>0; fmt++)
676
2/2
✓ Branch 1 taken 390 times.
✓ Branch 2 taken 455 times.
845 if (av_sample_fmt_is_planar(fmt))
677
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 390 times.
390 if (ff_add_format(&ret, fmt) < 0)
678 ✗ return NULL;
679
680 65 return ret;
681 }
682
683 48590 AVFilterFormats *ff_all_samplerates(void)
684 {
685 48590 AVFilterFormats *ret = av_mallocz(sizeof(*ret));
686 48590 return ret;
687 }
688
689 70 AVFilterChannelLayouts *ff_all_channel_layouts(void)
690 {
691 70 AVFilterChannelLayouts *ret = av_mallocz(sizeof(*ret));
692
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 70 times.
70 if (!ret)
693 ✗ return NULL;
694 70 ret->all_layouts = 1;
695 70 return ret;
696 }
697
698 49251 AVFilterChannelLayouts *ff_all_channel_counts(void)
699 {
700 49251 AVFilterChannelLayouts *ret = av_mallocz(sizeof(*ret));
701
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 49251 times.
49251 if (!ret)
702 ✗ return NULL;
703 49251 ret->all_layouts = ret->all_counts = 1;
704 49251 return ret;
705 }
706
707 60954 AVFilterFormats *ff_all_color_spaces(void)
708 {
709 60954 AVFilterFormats *ret = NULL;
710
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 60954 times.
60954 if (ff_add_format(&ret, AVCOL_SPC_UNSPECIFIED) < 0)
711 ✗ return NULL;
712
2/2
✓ Branch 0 taken 1097172 times.
✓ Branch 1 taken 60954 times.
1158126 for (int csp = 0; csp < AVCOL_SPC_NB; csp++) {
713
4/4
✓ Branch 0 taken 1036218 times.
✓ Branch 1 taken 60954 times.
✓ Branch 2 taken 60954 times.
✓ Branch 3 taken 975264 times.
1097172 if (csp == AVCOL_SPC_RESERVED ||
714 csp == AVCOL_SPC_UNSPECIFIED)
715 121908 continue;
716
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 975264 times.
975264 if (ff_add_format(&ret, csp) < 0)
717 ✗ return NULL;
718 }
719
720 60954 return ret;
721 }
722
723 60954 AVFilterFormats *ff_all_color_ranges(void)
724 {
725 60954 AVFilterFormats *ret = NULL;
726
2/2
✓ Branch 0 taken 182862 times.
✓ Branch 1 taken 60954 times.
243816 for (int range = 0; range < AVCOL_RANGE_NB; range++) {
727
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 182862 times.
182862 if (ff_add_format(&ret, range) < 0)
728 ✗ return NULL;
729 }
730
731 60954 return ret;
732 }
733
734 47209 AVFilterFormats *ff_all_alpha_modes(void)
735 {
736 47209 AVFilterFormats *ret = NULL;
737
2/2
✓ Branch 0 taken 141627 times.
✓ Branch 1 taken 47209 times.
188836 for (int am = 0; am < AVALPHA_MODE_NB; am++) {
738
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 141627 times.
141627 if (ff_add_format(&ret, am) < 0)
739 ✗ return NULL;
740 }
741
742 47209 return ret;
743 }
744
745 60946 AVFilterFormats *ff_all_chroma_locations(void)
746 {
747 60946 AVFilterFormats *ret = NULL;
748
2/2
✓ Branch 0 taken 426622 times.
✓ Branch 1 taken 60946 times.
487568 for (int loc = 0; loc < AVCHROMA_LOC_NB; loc++) {
749
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 426622 times.
426622 if (ff_add_format(&ret, loc) < 0)
750 ✗ return NULL;
751 }
752
753 60946 return ret;
754 }
755
756 #define FORMATS_REF(f, ref, unref_fn) \
757 void *tmp; \
758 \
759 if (!f) \
760 return AVERROR(ENOMEM); \
761 \
762 tmp = av_realloc_array(f->refs, f->refcount + 1, sizeof(*f->refs)); \
763 if (!tmp) { \
764 unref_fn(&f); \
765 return AVERROR(ENOMEM); \
766 } \
767 f->refs = tmp; \
768 f->refs[f->refcount++] = ref; \
769 *ref = f; \
770 return 0
771
772 14062 int ff_channel_layouts_ref(AVFilterChannelLayouts *f, AVFilterChannelLayouts **ref)
773 {
774
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14062 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14062 times.
14062 FORMATS_REF(f, ref, ff_channel_layouts_unref);
775 }
776
777 364194 int ff_formats_ref(AVFilterFormats *f, AVFilterFormats **ref)
778 {
779
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 364194 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 364194 times.
364194 FORMATS_REF(f, ref, ff_formats_unref);
780 }
781
782 #define FIND_REF_INDEX(ref, idx) \
783 do { \
784 int i; \
785 for (i = 0; i < (*ref)->refcount; i ++) \
786 if((*ref)->refs[i] == ref) { \
787 idx = i; \
788 break; \
789 } \
790 } while (0)
791
792 #define FORMATS_UNREF(ref, list) \
793 do { \
794 int idx = -1; \
795 \
796 if (!*ref) \
797 return; \
798 \
799 FIND_REF_INDEX(ref, idx); \
800 \
801 if (idx >= 0) { \
802 memmove((*ref)->refs + idx, (*ref)->refs + idx + 1, \
803 sizeof(*(*ref)->refs) * ((*ref)->refcount - idx - 1)); \
804 --(*ref)->refcount; \
805 } \
806 if (!(*ref)->refcount) { \
807 FREE_LIST(ref, list); \
808 av_free((*ref)->list); \
809 av_free((*ref)->refs); \
810 av_free(*ref); \
811 } \
812 *ref = NULL; \
813 } while (0)
814
815 #define FREE_LIST(ref, list) do { } while(0)
816 1278380 void ff_formats_unref(AVFilterFormats **ref)
817 {
818
10/10
✓ Branch 0 taken 773543 times.
✓ Branch 1 taken 504837 times.
✓ Branch 2 taken 364194 times.
✓ Branch 3 taken 181187 times.
✓ Branch 4 taken 545381 times.
✓ Branch 5 taken 140643 times.
✓ Branch 6 taken 364194 times.
✓ Branch 7 taken 140643 times.
✓ Branch 8 taken 215509 times.
✓ Branch 9 taken 289328 times.
1459567 FORMATS_UNREF(ref, formats);
819 }
820
821 #undef FREE_LIST
822 #define FREE_LIST(ref, list) \
823 do { \
824 for (int i = 0; i < (*ref)->nb_channel_layouts; i++) \
825 av_channel_layout_uninit(&(*ref)->list[i]); \
826 } while(0)
827
828 217061 void ff_channel_layouts_unref(AVFilterChannelLayouts **ref)
829 {
830
12/12
✓ Branch 0 taken 162170 times.
✓ Branch 1 taken 54891 times.
✓ Branch 2 taken 14062 times.
✓ Branch 3 taken 15583 times.
✓ Branch 4 taken 29645 times.
✓ Branch 5 taken 40829 times.
✓ Branch 6 taken 14062 times.
✓ Branch 7 taken 40829 times.
✓ Branch 8 taken 43645 times.
✓ Branch 9 taken 11246 times.
✓ Branch 11 taken 2816 times.
✓ Branch 12 taken 43645 times.
235460 FORMATS_UNREF(ref, channel_layouts);
831 }
832
833 #define FORMATS_CHANGEREF(oldref, newref) \
834 do { \
835 int idx = -1; \
836 \
837 FIND_REF_INDEX(oldref, idx); \
838 \
839 if (idx >= 0) { \
840 (*oldref)->refs[idx] = newref; \
841 *newref = *oldref; \
842 *oldref = NULL; \
843 } \
844 } while (0)
845
846 826 void ff_channel_layouts_changeref(AVFilterChannelLayouts **oldref,
847 AVFilterChannelLayouts **newref)
848 {
849
4/6
✓ Branch 0 taken 826 times.
✓ Branch 1 taken 1895 times.
✓ Branch 2 taken 2721 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 826 times.
✗ Branch 5 not taken.
2721 FORMATS_CHANGEREF(oldref, newref);
850 826 }
851
852 5527 void ff_formats_changeref(AVFilterFormats **oldref, AVFilterFormats **newref)
853 {
854
4/6
✓ Branch 0 taken 5527 times.
✓ Branch 1 taken 8890 times.
✓ Branch 2 taken 14417 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5527 times.
✗ Branch 5 not taken.
14417 FORMATS_CHANGEREF(oldref, newref);
855 5527 }
856
857 #define SET_COMMON_FORMATS(ctx, fmts, media_type, ref_fn, unref_fn) \
858 int i; \
859 \
860 if (!fmts) \
861 return AVERROR(ENOMEM); \
862 \
863 for (i = 0; i < ctx->nb_inputs; i++) { \
864 AVFilterLink *const link = ctx->inputs[i]; \
865 if (link && !link->outcfg.fmts && \
866 (media_type == AVMEDIA_TYPE_UNKNOWN || link->type == media_type)) { \
867 int ret = ref_fn(fmts, &ctx->inputs[i]->outcfg.fmts); \
868 if (ret < 0) { \
869 return ret; \
870 } \
871 } \
872 } \
873 for (i = 0; i < ctx->nb_outputs; i++) { \
874 AVFilterLink *const link = ctx->outputs[i]; \
875 if (link && !link->incfg.fmts && \
876 (media_type == AVMEDIA_TYPE_UNKNOWN || link->type == media_type)) { \
877 int ret = ref_fn(fmts, &ctx->outputs[i]->incfg.fmts); \
878 if (ret < 0) { \
879 return ret; \
880 } \
881 } \
882 } \
883 \
884 if (!fmts->refcount) \
885 unref_fn(&fmts); \
886 \
887 return 0;
888
889 45739 int ff_set_common_channel_layouts(AVFilterContext *ctx,
890 AVFilterChannelLayouts *channel_layouts)
891 {
892
19/24
✗ Branch 0 not taken.
✓ Branch 1 taken 45739 times.
✓ Branch 2 taken 38301 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 36191 times.
✓ Branch 5 taken 2110 times.
✓ Branch 6 taken 4921 times.
✓ Branch 7 taken 31270 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4921 times.
✓ Branch 11 taken 38301 times.
✓ Branch 12 taken 45739 times.
✓ Branch 13 taken 37178 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 33434 times.
✓ Branch 16 taken 3744 times.
✓ Branch 17 taken 3287 times.
✓ Branch 18 taken 30147 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3287 times.
✓ Branch 22 taken 37178 times.
✓ Branch 23 taken 45739 times.
✓ Branch 24 taken 40829 times.
✓ Branch 25 taken 4910 times.
121218 SET_COMMON_FORMATS(ctx, channel_layouts, AVMEDIA_TYPE_AUDIO,
893 ff_channel_layouts_ref, ff_channel_layouts_unref);
894 }
895
896 ✗ int ff_set_common_channel_layouts_from_list(AVFilterContext *ctx,
897 const AVChannelLayout *fmts)
898 {
899 ✗ return ff_set_common_channel_layouts(ctx, ff_make_channel_layout_list(fmts));
900 }
901
902 45739 int ff_set_common_all_channel_counts(AVFilterContext *ctx)
903 {
904 45739 return ff_set_common_channel_layouts(ctx, ff_all_channel_counts());
905 }
906
907 45743 int ff_set_common_samplerates(AVFilterContext *ctx,
908 AVFilterFormats *samplerates)
909 {
910
19/24
✗ Branch 0 not taken.
✓ Branch 1 taken 45743 times.
✓ Branch 2 taken 38311 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 36313 times.
✓ Branch 5 taken 1998 times.
✓ Branch 6 taken 5043 times.
✓ Branch 7 taken 31270 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 5043 times.
✓ Branch 11 taken 38311 times.
✓ Branch 12 taken 45743 times.
✓ Branch 13 taken 37182 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 33611 times.
✓ Branch 16 taken 3571 times.
✓ Branch 17 taken 3464 times.
✓ Branch 18 taken 30147 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 3464 times.
✓ Branch 22 taken 37182 times.
✓ Branch 23 taken 45743 times.
✓ Branch 24 taken 40783 times.
✓ Branch 25 taken 4960 times.
121236 SET_COMMON_FORMATS(ctx, samplerates, AVMEDIA_TYPE_AUDIO,
911 ff_formats_ref, ff_formats_unref);
912 }
913
914 ✗ int ff_set_common_samplerates_from_list(AVFilterContext *ctx,
915 const int *samplerates)
916 {
917 ✗ return ff_set_common_samplerates(ctx, ff_make_format_list(samplerates));
918 }
919
920 45743 int ff_set_common_all_samplerates(AVFilterContext *ctx)
921 {
922 45743 return ff_set_common_samplerates(ctx, ff_all_samplerates());
923 }
924
925 47205 int ff_set_common_color_spaces(AVFilterContext *ctx,
926 AVFilterFormats *color_spaces)
927 {
928
19/24
✗ Branch 0 not taken.
✓ Branch 1 taken 47205 times.
✓ Branch 2 taken 38634 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 31784 times.
✓ Branch 5 taken 6850 times.
✓ Branch 6 taken 24811 times.
✓ Branch 7 taken 6973 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 24811 times.
✓ Branch 11 taken 38634 times.
✓ Branch 12 taken 47205 times.
✓ Branch 13 taken 38644 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 26651 times.
✓ Branch 16 taken 11993 times.
✓ Branch 17 taken 19668 times.
✓ Branch 18 taken 6983 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 19668 times.
✓ Branch 22 taken 38644 times.
✓ Branch 23 taken 47205 times.
✓ Branch 24 taken 20466 times.
✓ Branch 25 taken 26739 times.
124483 SET_COMMON_FORMATS(ctx, color_spaces, AVMEDIA_TYPE_VIDEO,
929 ff_formats_ref, ff_formats_unref);
930 }
931
932 ✗ int ff_set_common_color_spaces_from_list(AVFilterContext *ctx,
933 const int *color_spaces)
934 {
935 ✗ return ff_set_common_color_spaces(ctx, ff_make_format_list(color_spaces));
936 }
937
938 47205 int ff_set_common_all_color_spaces(AVFilterContext *ctx)
939 {
940 47205 return ff_set_common_color_spaces(ctx, ff_all_color_spaces());
941 }
942
943 47205 int ff_set_common_color_ranges(AVFilterContext *ctx,
944 AVFilterFormats *color_ranges)
945 {
946
19/24
✗ Branch 0 not taken.
✓ Branch 1 taken 47205 times.
✓ Branch 2 taken 38634 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 29576 times.
✓ Branch 5 taken 9058 times.
✓ Branch 6 taken 22603 times.
✓ Branch 7 taken 6973 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 22603 times.
✓ Branch 11 taken 38634 times.
✓ Branch 12 taken 47205 times.
✓ Branch 13 taken 38644 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 24443 times.
✓ Branch 16 taken 14201 times.
✓ Branch 17 taken 17460 times.
✓ Branch 18 taken 6983 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 17460 times.
✓ Branch 22 taken 38644 times.
✓ Branch 23 taken 47205 times.
✓ Branch 24 taken 22674 times.
✓ Branch 25 taken 24531 times.
124483 SET_COMMON_FORMATS(ctx, color_ranges, AVMEDIA_TYPE_VIDEO,
947 ff_formats_ref, ff_formats_unref);
948 }
949
950 ✗ int ff_set_common_color_ranges_from_list(AVFilterContext *ctx,
951 const int *color_ranges)
952 {
953 ✗ return ff_set_common_color_ranges(ctx, ff_make_format_list(color_ranges));
954 }
955
956 47205 int ff_set_common_all_color_ranges(AVFilterContext *ctx)
957 {
958 47205 return ff_set_common_color_ranges(ctx, ff_all_color_ranges());
959 }
960
961 47205 int ff_set_common_alpha_modes(AVFilterContext *ctx,
962 AVFilterFormats *alpha_modes)
963 {
964
19/24
✗ Branch 0 not taken.
✓ Branch 1 taken 47205 times.
✓ Branch 2 taken 38634 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 38590 times.
✓ Branch 5 taken 44 times.
✓ Branch 6 taken 31617 times.
✓ Branch 7 taken 6973 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 31617 times.
✓ Branch 11 taken 38634 times.
✓ Branch 12 taken 47205 times.
✓ Branch 13 taken 38644 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 38280 times.
✓ Branch 16 taken 364 times.
✓ Branch 17 taken 31297 times.
✓ Branch 18 taken 6983 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 31297 times.
✓ Branch 22 taken 38644 times.
✓ Branch 23 taken 47205 times.
✓ Branch 24 taken 8834 times.
✓ Branch 25 taken 38371 times.
124483 SET_COMMON_FORMATS(ctx, alpha_modes, AVMEDIA_TYPE_VIDEO,
965 ff_formats_ref, ff_formats_unref);
966 }
967
968 ✗ int ff_set_common_alpha_modes_from_list(AVFilterContext *ctx,
969 const int *alpha_modes)
970 {
971 ✗ return ff_set_common_alpha_modes(ctx, ff_make_format_list(alpha_modes));
972 }
973
974 47205 int ff_set_common_all_alpha_modes(AVFilterContext *ctx)
975 {
976 47205 return ff_set_common_alpha_modes(ctx, ff_all_alpha_modes());
977 }
978
979 47205 int ff_set_common_chroma_locations(AVFilterContext *ctx,
980 AVFilterFormats *chroma_locations)
981 {
982
19/24
✗ Branch 0 not taken.
✓ Branch 1 taken 47205 times.
✓ Branch 2 taken 38634 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 31079 times.
✓ Branch 5 taken 7555 times.
✓ Branch 6 taken 24106 times.
✓ Branch 7 taken 6973 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 24106 times.
✓ Branch 11 taken 38634 times.
✓ Branch 12 taken 47205 times.
✓ Branch 13 taken 38644 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 29997 times.
✓ Branch 16 taken 8647 times.
✓ Branch 17 taken 23014 times.
✓ Branch 18 taken 6983 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 23014 times.
✓ Branch 22 taken 38644 times.
✓ Branch 23 taken 47205 times.
✓ Branch 24 taken 17117 times.
✓ Branch 25 taken 30088 times.
124483 SET_COMMON_FORMATS(ctx, chroma_locations, AVMEDIA_TYPE_VIDEO,
983 ff_formats_ref, ff_formats_unref);
984 }
985
986 ✗ int ff_set_common_chroma_locations_from_list(AVFilterContext *ctx,
987 const int *chroma_locations)
988 {
989 ✗ return ff_set_common_chroma_locations(ctx, ff_make_format_list(chroma_locations));
990 }
991
992 47205 int ff_set_common_all_chroma_locations(AVFilterContext *ctx)
993 {
994 47205 return ff_set_common_chroma_locations(ctx, ff_all_chroma_locations());
995 }
996
997 /**
998 * A helper for query_formats() which sets all links to the same list of
999 * formats. If there are no links hooked to this filter, the list of formats is
1000 * freed.
1001 */
1002 47257 int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
1003 {
1004
15/20
✗ Branch 0 not taken.
✓ Branch 1 taken 47257 times.
✓ Branch 2 taken 38702 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 15378 times.
✓ Branch 5 taken 23324 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 15378 times.
✓ Branch 9 taken 38702 times.
✓ Branch 10 taken 47257 times.
✓ Branch 11 taken 38696 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 7909 times.
✓ Branch 14 taken 30787 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 7909 times.
✓ Branch 18 taken 38696 times.
✓ Branch 19 taken 47257 times.
✓ Branch 20 taken 30759 times.
✓ Branch 21 taken 16498 times.
124655 SET_COMMON_FORMATS(ctx, formats, AVMEDIA_TYPE_UNKNOWN,
1005 ff_formats_ref, ff_formats_unref);
1006 }
1007
1008 ✗ int ff_set_common_formats_from_list(AVFilterContext *ctx, const int *fmts)
1009 {
1010 ✗ return ff_set_common_formats(ctx, ff_make_format_list(fmts));
1011 }
1012
1013 4 int ff_set_sample_formats_from_list(AVFilterContext *ctx, const enum AVSampleFormat *fmts)
1014 {
1015 4 return ff_set_common_formats(ctx, ff_make_sample_format_list(fmts));
1016 }
1017
1018 ✗ int ff_set_pixel_formats_from_list(AVFilterContext *ctx, const enum AVPixelFormat *fmts)
1019 {
1020 ✗ return ff_set_common_formats(ctx, ff_make_pixel_format_list(fmts));
1021 }
1022
1023 #define SET_COMMON_FORMATS2(ctx, cfg_in, cfg_out, fmts, media_type, \
1024 ref_fn, unref_fn) \
1025 if (!fmts) \
1026 return AVERROR(ENOMEM); \
1027 \
1028 for (unsigned i = 0; i < ctx->nb_inputs; i++) { \
1029 const AVFilterLink *const link = ctx->inputs[i]; \
1030 if (!cfg_in[i]->fmts && \
1031 (media_type == AVMEDIA_TYPE_UNKNOWN || \
1032 link->type == media_type)) { \
1033 int ret = ref_fn(fmts, &cfg_in[i]->fmts); \
1034 if (ret < 0) { \
1035 return ret; \
1036 } \
1037 } \
1038 } \
1039 for (unsigned i = 0; i < ctx->nb_outputs; i++) { \
1040 const AVFilterLink *const link = ctx->outputs[i]; \
1041 if (!cfg_out[i]->fmts && \
1042 (media_type == AVMEDIA_TYPE_UNKNOWN || \
1043 link->type == media_type)) { \
1044 int ret = ref_fn(fmts, &cfg_out[i]->fmts); \
1045 if (ret < 0) { \
1046 return ret; \
1047 } \
1048 } \
1049 } \
1050 \
1051 if (!fmts->refcount) \
1052 unref_fn(&fmts); \
1053 \
1054 return 0;
1055
1056 1834 int ff_set_common_channel_layouts2(const AVFilterContext *ctx,
1057 AVFilterFormatsConfig **cfg_in,
1058 AVFilterFormatsConfig **cfg_out,
1059 AVFilterChannelLayouts *channel_layouts)
1060 {
1061
12/20
✗ Branch 0 not taken.
✓ Branch 1 taken 1834 times.
✓ Branch 2 taken 254 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 254 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 254 times.
✓ Branch 9 taken 254 times.
✓ Branch 10 taken 1834 times.
✓ Branch 11 taken 1834 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1834 times.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1834 times.
✓ Branch 18 taken 1834 times.
✓ Branch 19 taken 1834 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1834 times.
3922 SET_COMMON_FORMATS2(ctx, cfg_in, cfg_out, channel_layouts, AVMEDIA_TYPE_AUDIO,
1062 ff_channel_layouts_ref, ff_channel_layouts_unref);
1063 }
1064
1065 374 int ff_set_common_channel_layouts_from_list2(const AVFilterContext *ctx,
1066 AVFilterFormatsConfig **cfg_in,
1067 AVFilterFormatsConfig **cfg_out,
1068 const AVChannelLayout *fmts)
1069 {
1070 374 return ff_set_common_channel_layouts2(ctx, cfg_in, cfg_out, ff_make_channel_layout_list(fmts));
1071 }
1072
1073 ✗ int ff_set_common_all_channel_counts2(const AVFilterContext *ctx,
1074 AVFilterFormatsConfig **cfg_in,
1075 AVFilterFormatsConfig **cfg_out)
1076 {
1077 ✗ return ff_set_common_channel_layouts2(ctx, cfg_in, cfg_out, ff_all_channel_counts());
1078 }
1079
1080 1819 int ff_set_common_samplerates2(const AVFilterContext *ctx,
1081 AVFilterFormatsConfig **cfg_in,
1082 AVFilterFormatsConfig **cfg_out,
1083 AVFilterFormats *samplerates)
1084 {
1085
12/20
✗ Branch 0 not taken.
✓ Branch 1 taken 1819 times.
✓ Branch 2 taken 239 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 239 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 239 times.
✓ Branch 9 taken 239 times.
✓ Branch 10 taken 1819 times.
✓ Branch 11 taken 1819 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1819 times.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1819 times.
✓ Branch 18 taken 1819 times.
✓ Branch 19 taken 1819 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1819 times.
3877 SET_COMMON_FORMATS2(ctx, cfg_in, cfg_out, samplerates, AVMEDIA_TYPE_AUDIO,
1086 ff_formats_ref, ff_formats_unref);
1087 }
1088
1089 359 int ff_set_common_samplerates_from_list2(const AVFilterContext *ctx,
1090 AVFilterFormatsConfig **cfg_in,
1091 AVFilterFormatsConfig **cfg_out,
1092 const int *samplerates)
1093 {
1094 359 return ff_set_common_samplerates2(ctx, cfg_in, cfg_out, ff_make_format_list(samplerates));
1095 }
1096
1097 ✗ int ff_set_common_all_samplerates2(const AVFilterContext *ctx,
1098 AVFilterFormatsConfig **cfg_in,
1099 AVFilterFormatsConfig **cfg_out)
1100 {
1101 ✗ return ff_set_common_samplerates2(ctx, cfg_in, cfg_out, ff_all_samplerates());
1102 }
1103
1104 5150 int ff_set_common_color_spaces2(const AVFilterContext *ctx,
1105 AVFilterFormatsConfig **cfg_in,
1106 AVFilterFormatsConfig **cfg_out,
1107 AVFilterFormats *color_spaces)
1108 {
1109
12/20
✗ Branch 0 not taken.
✓ Branch 1 taken 5150 times.
✓ Branch 2 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 20 times.
✓ Branch 9 taken 20 times.
✓ Branch 10 taken 5150 times.
✓ Branch 11 taken 5150 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 5150 times.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 5150 times.
✓ Branch 18 taken 5150 times.
✓ Branch 19 taken 5150 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 5150 times.
10320 SET_COMMON_FORMATS2(ctx, cfg_in, cfg_out, color_spaces, AVMEDIA_TYPE_VIDEO,
1110 ff_formats_ref, ff_formats_unref);
1111 }
1112
1113 ✗ int ff_set_common_color_spaces_from_list2(const AVFilterContext *ctx,
1114 AVFilterFormatsConfig **cfg_in,
1115 AVFilterFormatsConfig **cfg_out,
1116 const int *color_spaces)
1117 {
1118 ✗ return ff_set_common_color_spaces2(ctx, cfg_in, cfg_out, ff_make_format_list(color_spaces));
1119 }
1120
1121 ✗ int ff_set_common_all_color_spaces2(const AVFilterContext *ctx,
1122 AVFilterFormatsConfig **cfg_in,
1123 AVFilterFormatsConfig **cfg_out)
1124 {
1125 ✗ return ff_set_common_color_spaces2(ctx, cfg_in, cfg_out, ff_all_color_spaces());
1126 }
1127
1128 7358 int ff_set_common_color_ranges2(const AVFilterContext *ctx,
1129 AVFilterFormatsConfig **cfg_in,
1130 AVFilterFormatsConfig **cfg_out,
1131 AVFilterFormats *color_ranges)
1132 {
1133
12/20
✗ Branch 0 not taken.
✓ Branch 1 taken 7358 times.
✓ Branch 2 taken 2228 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2228 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2228 times.
✓ Branch 9 taken 2228 times.
✓ Branch 10 taken 7358 times.
✓ Branch 11 taken 7358 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 7358 times.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 7358 times.
✓ Branch 18 taken 7358 times.
✓ Branch 19 taken 7358 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 7358 times.
16944 SET_COMMON_FORMATS2(ctx, cfg_in, cfg_out, color_ranges, AVMEDIA_TYPE_VIDEO,
1134 ff_formats_ref, ff_formats_unref);
1135 }
1136
1137 ✗ int ff_set_common_color_ranges_from_list2(const AVFilterContext *ctx,
1138 AVFilterFormatsConfig **cfg_in,
1139 AVFilterFormatsConfig **cfg_out,
1140 const int *color_ranges)
1141 {
1142 ✗ return ff_set_common_color_ranges2(ctx, cfg_in, cfg_out, ff_make_format_list(color_ranges));
1143 }
1144
1145 ✗ int ff_set_common_all_color_ranges2(const AVFilterContext *ctx,
1146 AVFilterFormatsConfig **cfg_in,
1147 AVFilterFormatsConfig **cfg_out)
1148 {
1149 ✗ return ff_set_common_color_ranges2(ctx, cfg_in, cfg_out, ff_all_color_ranges());
1150 }
1151
1152 356 int ff_set_common_alpha_modes2(const AVFilterContext *ctx,
1153 AVFilterFormatsConfig **cfg_in,
1154 AVFilterFormatsConfig **cfg_out,
1155 AVFilterFormats *alpha_modes)
1156 {
1157
12/20
✗ Branch 0 not taken.
✓ Branch 1 taken 356 times.
✓ Branch 2 taken 39 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 39 times.
✓ Branch 9 taken 39 times.
✓ Branch 10 taken 356 times.
✓ Branch 11 taken 356 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 356 times.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 356 times.
✓ Branch 18 taken 356 times.
✓ Branch 19 taken 356 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 356 times.
751 SET_COMMON_FORMATS2(ctx, cfg_in, cfg_out, alpha_modes, AVMEDIA_TYPE_VIDEO,
1158 ff_formats_ref, ff_formats_unref);
1159 }
1160
1161 ✗ int ff_set_common_alpha_modes_from_list2(const AVFilterContext *ctx,
1162 AVFilterFormatsConfig **cfg_in,
1163 AVFilterFormatsConfig **cfg_out,
1164 const int *alpha_modes)
1165 {
1166 ✗ return ff_set_common_alpha_modes2(ctx, cfg_in, cfg_out, ff_make_format_list(alpha_modes));
1167 }
1168
1169 ✗ int ff_set_common_all_alpha_modes2(const AVFilterContext *ctx,
1170 AVFilterFormatsConfig **cfg_in,
1171 AVFilterFormatsConfig **cfg_out)
1172 {
1173 ✗ return ff_set_common_alpha_modes2(ctx, cfg_in, cfg_out, ff_all_alpha_modes());
1174 }
1175
1176 1814 int ff_set_common_chroma_locations2(const AVFilterContext *ctx,
1177 AVFilterFormatsConfig **cfg_in,
1178 AVFilterFormatsConfig **cfg_out,
1179 AVFilterFormats *chroma_locations)
1180 {
1181
12/20
✗ Branch 0 not taken.
✓ Branch 1 taken 1814 times.
✓ Branch 2 taken 725 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 725 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 725 times.
✓ Branch 9 taken 725 times.
✓ Branch 10 taken 1814 times.
✓ Branch 11 taken 1814 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1814 times.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1814 times.
✓ Branch 18 taken 1814 times.
✓ Branch 19 taken 1814 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1814 times.
4353 SET_COMMON_FORMATS2(ctx, cfg_in, cfg_out, chroma_locations, AVMEDIA_TYPE_VIDEO,
1182 ff_formats_ref, ff_formats_unref);
1183 }
1184
1185 ✗ int ff_set_common_chroma_locations_from_list2(const AVFilterContext *ctx,
1186 AVFilterFormatsConfig **cfg_in,
1187 AVFilterFormatsConfig **cfg_out,
1188 const int *chroma_locations)
1189 {
1190 ✗ return ff_set_common_chroma_locations2(ctx, cfg_in, cfg_out,
1191 ff_make_format_list(chroma_locations));
1192 }
1193
1194 ✗ int ff_set_common_all_chroma_locations2(const AVFilterContext *ctx,
1195 AVFilterFormatsConfig **cfg_in,
1196 AVFilterFormatsConfig **cfg_out)
1197 {
1198 ✗ return ff_set_common_chroma_locations2(ctx, cfg_in, cfg_out, ff_all_chroma_locations());
1199 }
1200
1201 22100 int ff_set_common_formats2(const AVFilterContext *ctx,
1202 AVFilterFormatsConfig **cfg_in,
1203 AVFilterFormatsConfig **cfg_out,
1204 AVFilterFormats *formats)
1205 {
1206
12/16
✗ Branch 0 not taken.
✓ Branch 1 taken 22100 times.
✓ Branch 2 taken 14622 times.
✓ Branch 3 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 14622 times.
✓ Branch 7 taken 14628 times.
✓ Branch 8 taken 22100 times.
✓ Branch 9 taken 22117 times.
✓ Branch 10 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 22117 times.
✓ Branch 14 taken 22122 times.
✓ Branch 15 taken 22100 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 22100 times.
58850 SET_COMMON_FORMATS2(ctx, cfg_in, cfg_out, formats, AVMEDIA_TYPE_UNKNOWN,
1207 ff_formats_ref, ff_formats_unref);
1208 }
1209
1210 ✗ int ff_set_common_formats_from_list2(const AVFilterContext *ctx,
1211 AVFilterFormatsConfig **cfg_in,
1212 AVFilterFormatsConfig **cfg_out,
1213 const int *fmts)
1214 {
1215 ✗ return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_make_format_list(fmts));
1216 }
1217
1218 2139 int ff_set_sample_formats_from_list2(const AVFilterContext *ctx,
1219 AVFilterFormatsConfig **cfg_in,
1220 AVFilterFormatsConfig **cfg_out,
1221 const enum AVSampleFormat *fmts)
1222 {
1223 2139 return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_make_sample_format_list(fmts));
1224 }
1225
1226 103 int ff_set_pixel_formats_from_list2(const AVFilterContext *ctx,
1227 AVFilterFormatsConfig **cfg_in,
1228 AVFilterFormatsConfig **cfg_out,
1229 const enum AVPixelFormat *fmts)
1230 {
1231 103 return ff_set_common_formats2(ctx, cfg_in, cfg_out, ff_make_pixel_format_list(fmts));
1232 }
1233
1234 47253 int ff_default_query_formats(AVFilterContext *ctx)
1235 {
1236 47253 const FFFilter *const f = fffilter(ctx->filter);
1237 AVFilterFormats *formats;
1238 enum AVMediaType type;
1239 int ret;
1240
1241
5/5
✓ Branch 0 taken 1480 times.
✓ Branch 1 taken 34 times.
✓ Branch 2 taken 34 times.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 45691 times.
47253 switch (f->formats_state) {
1242 1480 case FF_FILTER_FORMATS_PIXFMT_LIST:
1243 1480 type = AVMEDIA_TYPE_VIDEO;
1244 1480 formats = ff_make_pixel_format_list(f->formats.pixels_list);
1245 1480 break;
1246 34 case FF_FILTER_FORMATS_SAMPLEFMTS_LIST:
1247 34 type = AVMEDIA_TYPE_AUDIO;
1248 34 formats = ff_make_sample_format_list(f->formats.samples_list);
1249 34 break;
1250 34 case FF_FILTER_FORMATS_SINGLE_PIXFMT:
1251 34 type = AVMEDIA_TYPE_VIDEO;
1252 34 formats = ff_make_formats_list_singleton(f->formats.pix_fmt);
1253 34 break;
1254 14 case FF_FILTER_FORMATS_SINGLE_SAMPLEFMT:
1255 14 type = AVMEDIA_TYPE_AUDIO;
1256 14 formats = ff_make_formats_list_singleton(f->formats.sample_fmt);
1257 14 break;
1258 45691 default:
1259 av_assert2(!"Unreachable");
1260 av_fallthrough;
1261 case FF_FILTER_FORMATS_PASSTHROUGH:
1262 case FF_FILTER_FORMATS_QUERY_FUNC:
1263 case FF_FILTER_FORMATS_QUERY_FUNC2:
1264 45691 type = AVMEDIA_TYPE_UNKNOWN;
1265
2/2
✓ Branch 0 taken 38098 times.
✓ Branch 1 taken 7593 times.
53284 formats = ff_all_formats(ctx->nb_inputs ? ctx->inputs [0]->type :
1266
1/2
✓ Branch 0 taken 7593 times.
✗ Branch 1 not taken.
7593 ctx->nb_outputs ? ctx->outputs[0]->type :
1267 AVMEDIA_TYPE_VIDEO);
1268 45691 break;
1269 }
1270
1271 47253 ret = ff_set_common_formats(ctx, formats);
1272
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 47253 times.
47253 if (ret < 0)
1273 ✗ return ret;
1274
2/2
✓ Branch 0 taken 47205 times.
✓ Branch 1 taken 48 times.
47253 if (type != AVMEDIA_TYPE_AUDIO) {
1275 47205 ret = ff_set_common_all_color_spaces(ctx);
1276
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 47205 times.
47205 if (ret < 0)
1277 ✗ return ret;
1278 47205 ret = ff_set_common_all_color_ranges(ctx);
1279
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 47205 times.
47205 if (ret < 0)
1280 ✗ return ret;
1281 47205 ret = ff_set_common_all_alpha_modes(ctx);
1282
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 47205 times.
47205 if (ret < 0)
1283 ✗ return ret;
1284 47205 ret = ff_set_common_all_chroma_locations(ctx);
1285
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 47205 times.
47205 if (ret < 0)
1286 ✗ return ret;
1287 }
1288
2/2
✓ Branch 0 taken 45739 times.
✓ Branch 1 taken 1514 times.
47253 if (type != AVMEDIA_TYPE_VIDEO) {
1289 45739 ret = ff_set_common_all_channel_counts(ctx);
1290
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 45739 times.
45739 if (ret < 0)
1291 ✗ return ret;
1292 45739 ret = ff_set_common_all_samplerates(ctx);
1293
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 45739 times.
45739 if (ret < 0)
1294 ✗ return ret;
1295 }
1296
1297 47253 return 0;
1298 }
1299
1300 273125 static int check_list(void *log, const char *name, const AVFilterFormats *fmts)
1301 {
1302 unsigned i, j;
1303
1304
2/2
✓ Branch 0 taken 157600 times.
✓ Branch 1 taken 115525 times.
273125 if (!fmts)
1305 157600 return 0;
1306
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 115525 times.
115525 if (!fmts->nb_formats) {
1307 ✗ av_log(log, AV_LOG_ERROR, "Empty %s list\n", name);
1308 ✗ return AVERROR(EINVAL);
1309 }
1310
2/2
✓ Branch 0 taken 3964297 times.
✓ Branch 1 taken 115525 times.
4079822 for (i = 0; i < fmts->nb_formats; i++) {
1311
2/2
✓ Branch 0 taken 396849992 times.
✓ Branch 1 taken 3964297 times.
400814289 for (j = i + 1; j < fmts->nb_formats; j++) {
1312
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 396849992 times.
396849992 if (fmts->formats[i] == fmts->formats[j]) {
1313 ✗ av_log(log, AV_LOG_ERROR, "Duplicated %s\n", name);
1314 ✗ return AVERROR(EINVAL);
1315 }
1316 }
1317 }
1318 115525 return 0;
1319 }
1320
1321 51866 int ff_formats_check_pixel_formats(void *log, const AVFilterFormats *fmts)
1322 {
1323 51866 return check_list(log, "pixel format", fmts);
1324 }
1325
1326 11093 int ff_formats_check_sample_formats(void *log, const AVFilterFormats *fmts)
1327 {
1328 11093 return check_list(log, "sample format", fmts);
1329 }
1330
1331 11093 int ff_formats_check_sample_rates(void *log, const AVFilterFormats *fmts)
1332 {
1333
4/4
✓ Branch 0 taken 5569 times.
✓ Branch 1 taken 5524 times.
✓ Branch 2 taken 2867 times.
✓ Branch 3 taken 2702 times.
11093 if (!fmts || !fmts->nb_formats)
1334 8391 return 0;
1335 2702 return check_list(log, "sample rate", fmts);
1336 }
1337
1338 51866 int ff_formats_check_color_spaces(void *log, const AVFilterFormats *fmts)
1339 {
1340
4/4
✓ Branch 0 taken 133285 times.
✓ Branch 1 taken 33023 times.
✓ Branch 2 taken 114442 times.
✓ Branch 3 taken 18843 times.
166308 for (int i = 0; fmts && i < fmts->nb_formats; i++) {
1341
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 114442 times.
114442 if (fmts->formats[i] == AVCOL_SPC_RESERVED) {
1342 ✗ av_log(log, AV_LOG_ERROR, "Invalid color space\n");
1343 ✗ return AVERROR(EINVAL);
1344 }
1345 }
1346 51866 return check_list(log, "color space", fmts);
1347 }
1348
1349 51866 int ff_formats_check_color_ranges(void *log, const AVFilterFormats *fmts)
1350 {
1351 51866 return check_list(log, "color range", fmts);
1352 }
1353
1354 51866 int ff_formats_check_alpha_modes(void *log, const AVFilterFormats *fmts)
1355 {
1356 51866 return check_list(log, "alpha mode", fmts);
1357 }
1358
1359 51866 int ff_formats_check_chroma_locations(void *log, const AVFilterFormats *fmts)
1360 {
1361 51866 return check_list(log, "chroma location", fmts);
1362 }
1363
1364 5422 static int layouts_compatible(const AVChannelLayout *a, const AVChannelLayout *b)
1365 {
1366 5422 return !av_channel_layout_compare(a, b) ||
1367
3/12
✓ Branch 0 taken 5422 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5422 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 5422 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
10844 (KNOWN(a) && !KNOWN(b) && a->nb_channels == b->nb_channels) ||
1368
2/10
✗ Branch 0 not taken.
✓ Branch 1 taken 5422 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 5422 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
5422 (KNOWN(b) && !KNOWN(a) && b->nb_channels == a->nb_channels);
1369 }
1370
1371 11093 int ff_formats_check_channel_layouts(void *log, const AVFilterChannelLayouts *fmts)
1372 {
1373 unsigned i, j;
1374
1375
2/2
✓ Branch 0 taken 5239 times.
✓ Branch 1 taken 5854 times.
11093 if (!fmts)
1376 5239 return 0;
1377
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5854 times.
5854 if (fmts->all_layouts < fmts->all_counts) {
1378 ✗ av_log(log, AV_LOG_ERROR, "Inconsistent generic list\n");
1379 ✗ return AVERROR(EINVAL);
1380 }
1381
3/4
✓ Branch 0 taken 2266 times.
✓ Branch 1 taken 3588 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2266 times.
5854 if (!fmts->all_layouts && !fmts->nb_channel_layouts) {
1382 ✗ av_log(log, AV_LOG_ERROR, "Empty channel layout list\n");
1383 ✗ return AVERROR(EINVAL);
1384 }
1385
2/2
✓ Branch 0 taken 3422 times.
✓ Branch 1 taken 5854 times.
9276 for (i = 0; i < fmts->nb_channel_layouts; i++) {
1386
2/2
✓ Branch 0 taken 5422 times.
✓ Branch 1 taken 3422 times.
8844 for (j = i + 1; j < fmts->nb_channel_layouts; j++) {
1387
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 5422 times.
5422 if (layouts_compatible(&fmts->channel_layouts[i], &fmts->channel_layouts[j])) {
1388 ✗ av_log(log, AV_LOG_ERROR, "Duplicated or redundant channel layout\n");
1389 ✗ return AVERROR(EINVAL);
1390 }
1391 }
1392 }
1393 5854 return 0;
1394 }
1395