FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavfilter/avfilter.c
Date: 2026-08-15 14:54:27
Exec Total Coverage
Lines: 677 853 79.4%
Functions: 58 66 87.9%
Branches: 367 516 71.1%

Line Branch Exec Source
1 /*
2 * filter layer
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/avstring.h"
24 #include "libavutil/bprint.h"
25 #include "libavutil/buffer.h"
26 #include "libavutil/channel_layout.h"
27 #include "libavutil/common.h"
28 #include "libavutil/eval.h"
29 #include "libavutil/frame.h"
30 #include "libavutil/hwcontext.h"
31 #include "libavutil/internal.h"
32 #include "libavutil/mem.h"
33 #include "libavutil/opt.h"
34 #include "libavutil/pixdesc.h"
35 #include "libavutil/rational.h"
36 #include "libavutil/samplefmt.h"
37
38 #include "audio.h"
39 #include "avfilter.h"
40 #include "avfilter_internal.h"
41 #include "filters.h"
42 #include "formats.h"
43 #include "framequeue.h"
44 #include "framepool.h"
45 #include "video.h"
46
47 1720623 static void tlog_ref(void *ctx, AVFrame *ref, int end)
48 {
49 #ifdef TRACE
50 ff_tlog(ctx,
51 "ref[%p buf:%p data:%p linesize[%d, %d, %d, %d] pts:%"PRId64,
52 ref, ref->buf, ref->data[0],
53 ref->linesize[0], ref->linesize[1], ref->linesize[2], ref->linesize[3],
54 ref->pts);
55
56 if (ref->width) {
57 ff_tlog(ctx, " a:%d/%d s:%dx%d i:%c iskey:%d type:%c",
58 ref->sample_aspect_ratio.num, ref->sample_aspect_ratio.den,
59 ref->width, ref->height,
60 !(ref->flags & AV_FRAME_FLAG_INTERLACED) ? 'P' : /* Progressive */
61 (ref->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST) ? 'T' : 'B', /* Top / Bottom */
62 !!(ref->flags & AV_FRAME_FLAG_KEY),
63 av_get_picture_type_char(ref->pict_type));
64 }
65 if (ref->nb_samples) {
66 AVBPrint bprint;
67
68 av_bprint_init(&bprint, 1, AV_BPRINT_SIZE_UNLIMITED);
69 av_channel_layout_describe_bprint(&ref->ch_layout, &bprint);
70 ff_tlog(ctx, " cl:%s n:%d r:%d",
71 bprint.str,
72 ref->nb_samples,
73 ref->sample_rate);
74 av_bprint_finalize(&bprint, NULL);
75 }
76
77 ff_tlog(ctx, "]%s", end ? "\n" : "");
78 #endif
79 1720623 }
80
81 static void command_queue_pop(AVFilterContext *filter)
82 {
83 FFFilterContext *ctxi = fffilterctx(filter);
84 AVFilterCommand *c = ctxi->command_queue;
85 av_freep(&c->arg);
86 av_freep(&c->command);
87 ctxi->command_queue = c->next;
88 av_free(c);
89 }
90
91 /**
92 * Append a new pad.
93 *
94 * @param count Pointer to the number of pads in the list
95 * @param pads Pointer to the pointer to the beginning of the list of pads
96 * @param links Pointer to the pointer to the beginning of the list of links
97 * @param newpad The new pad to add. A copy is made when adding.
98 * @return >= 0 in case of success, a negative AVERROR code on error
99 */
100 580 static int append_pad(unsigned *count, AVFilterPad **pads,
101 AVFilterLink ***links, AVFilterPad *newpad)
102 {
103 AVFilterLink **newlinks;
104 AVFilterPad *newpads;
105 580 unsigned idx = *count;
106
107 580 newpads = av_realloc_array(*pads, idx + 1, sizeof(*newpads));
108 580 newlinks = av_realloc_array(*links, idx + 1, sizeof(*newlinks));
109
1/2
✓ Branch 0 taken 580 times.
✗ Branch 1 not taken.
580 if (newpads)
110 580 *pads = newpads;
111
1/2
✓ Branch 0 taken 580 times.
✗ Branch 1 not taken.
580 if (newlinks)
112 580 *links = newlinks;
113
2/4
✓ Branch 0 taken 580 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 580 times.
580 if (!newpads || !newlinks) {
114 if (newpad->flags & AVFILTERPAD_FLAG_FREE_NAME)
115 av_freep(&newpad->name);
116 return AVERROR(ENOMEM);
117 }
118
119 580 memcpy(*pads + idx, newpad, sizeof(AVFilterPad));
120 580 (*links)[idx] = NULL;
121
122 580 (*count)++;
123
124 580 return 0;
125 }
126
127 289 int ff_append_inpad(AVFilterContext *f, AVFilterPad *p)
128 {
129 289 return append_pad(&f->nb_inputs, &f->input_pads, &f->inputs, p);
130 }
131
132 270 int ff_append_inpad_free_name(AVFilterContext *f, AVFilterPad *p)
133 {
134 270 p->flags |= AVFILTERPAD_FLAG_FREE_NAME;
135 270 return ff_append_inpad(f, p);
136 }
137
138 291 int ff_append_outpad(AVFilterContext *f, AVFilterPad *p)
139 {
140 291 return append_pad(&f->nb_outputs, &f->output_pads, &f->outputs, p);
141 }
142
143 149 int ff_append_outpad_free_name(AVFilterContext *f, AVFilterPad *p)
144 {
145 149 p->flags |= AVFILTERPAD_FLAG_FREE_NAME;
146 149 return ff_append_outpad(f, p);
147 }
148
149 47761 int avfilter_link(AVFilterContext *src, unsigned srcpad,
150 AVFilterContext *dst, unsigned dstpad)
151 {
152 FilterLinkInternal *li;
153 AVFilterLink *link;
154
155
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 47761 times.
47761 av_assert0(src->graph);
156
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 47761 times.
47761 av_assert0(dst->graph);
157
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 47761 times.
47761 av_assert0(src->graph == dst->graph);
158
159
2/4
✓ Branch 0 taken 47761 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 47761 times.
✗ Branch 3 not taken.
47761 if (src->nb_outputs <= srcpad || dst->nb_inputs <= dstpad ||
160
2/4
✓ Branch 0 taken 47761 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 47761 times.
47761 src->outputs[srcpad] || dst->inputs[dstpad])
161 return AVERROR(EINVAL);
162
163
1/2
✓ Branch 1 taken 47761 times.
✗ Branch 2 not taken.
47761 if (!(fffilterctx(src)->state_flags & AV_CLASS_STATE_INITIALIZED) ||
164
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 47761 times.
47761 !(fffilterctx(dst)->state_flags & AV_CLASS_STATE_INITIALIZED)) {
165 av_log(src, AV_LOG_ERROR, "Filters must be initialized before linking.\n");
166 return AVERROR(EINVAL);
167 }
168
169
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 47761 times.
47761 if (src->output_pads[srcpad].type != dst->input_pads[dstpad].type) {
170 av_log(src, AV_LOG_ERROR,
171 "Media type mismatch between the '%s' filter output pad %d (%s) and the '%s' filter input pad %d (%s)\n",
172 src->name, srcpad, (char *)av_x_if_null(av_get_media_type_string(src->output_pads[srcpad].type), "?"),
173 dst->name, dstpad, (char *)av_x_if_null(av_get_media_type_string(dst-> input_pads[dstpad].type), "?"));
174 return AVERROR(EINVAL);
175 }
176
177 47761 li = av_mallocz(sizeof(*li));
178
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 47761 times.
47761 if (!li)
179 return AVERROR(ENOMEM);
180 47761 link = &li->l.pub;
181
182 47761 src->outputs[srcpad] = dst->inputs[dstpad] = link;
183
184 47761 link->src = src;
185 47761 link->dst = dst;
186 47761 link->srcpad = &src->output_pads[srcpad];
187 47761 link->dstpad = &dst->input_pads[dstpad];
188 47761 link->type = src->output_pads[srcpad].type;
189 47761 li->l.graph = src->graph;
190 av_assert0(AV_PIX_FMT_NONE == -1 && AV_SAMPLE_FMT_NONE == -1);
191 47761 link->format = -1;
192 47761 link->colorspace = AVCOL_SPC_UNSPECIFIED;
193 47761 ff_framequeue_init(&li->fifo, &fffiltergraph(src->graph)->frame_queues);
194
195 47761 return 0;
196 }
197
198 47893 static void link_free(AVFilterLink **link)
199 {
200 FilterLinkInternal *li;
201
202
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 47893 times.
47893 if (!*link)
203 return;
204 47893 li = ff_link_internal(*link);
205
206 47893 ff_framequeue_free(&li->fifo);
207 47893 ff_frame_pool_uninit(&li->frame_pool);
208 47893 av_channel_layout_uninit(&(*link)->ch_layout);
209 47893 av_frame_side_data_free(&(*link)->side_data, &(*link)->nb_side_data);
210
211 47893 av_buffer_unref(&li->l.hw_frames_ctx);
212
213 47893 av_freep(link);
214 }
215
216 1732397 static void update_link_current_pts(FilterLinkInternal *li, int64_t pts)
217 {
218 1732397 AVFilterLink *const link = &li->l.pub;
219
220
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1732392 times.
1732397 if (pts == AV_NOPTS_VALUE)
221 5 return;
222 1732392 li->l.current_pts = pts;
223 1732392 li->l.current_pts_us = av_rescale_q(pts, link->time_base, AV_TIME_BASE_Q);
224 /* TODO use duration */
225
3/4
✓ Branch 0 taken 1732392 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 467259 times.
✓ Branch 3 taken 1265133 times.
1732392 if (li->l.graph && li->age_index >= 0)
226 467259 ff_avfilter_graph_update_heap(li->l.graph, li);
227 }
228
229 4295191 void ff_filter_set_ready(AVFilterContext *filter, unsigned priority)
230 {
231 4295191 FFFilterContext *ctxi = fffilterctx(filter);
232 4295191 ctxi->ready = FFMAX(ctxi->ready, priority);
233 4295191 }
234
235 /**
236 * Clear frame_blocked_in on all outputs.
237 * This is necessary whenever something changes on input.
238 */
239 2563399 static void filter_unblock(AVFilterContext *filter)
240 {
241 unsigned i;
242
243
2/2
✓ Branch 0 taken 2096238 times.
✓ Branch 1 taken 2563399 times.
4659637 for (i = 0; i < filter->nb_outputs; i++) {
244 2096238 FilterLinkInternal * const li = ff_link_internal(filter->outputs[i]);
245 2096238 li->frame_blocked_in = 0;
246 }
247 2563399 }
248
249
250 20041 void ff_avfilter_link_set_in_status(AVFilterLink *link, int status, int64_t pts)
251 {
252 20041 FilterLinkInternal * const li = ff_link_internal(link);
253
254
2/2
✓ Branch 0 taken 5701 times.
✓ Branch 1 taken 14340 times.
20041 if (li->status_in == status)
255 5701 return;
256
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 14340 times.
14340 av_assert0(!li->status_in);
257 14340 li->status_in = status;
258 14340 li->status_in_pts = pts;
259 14340 li->frame_wanted_out = 0;
260 14340 li->frame_blocked_in = 0;
261 14340 filter_unblock(link->dst);
262 14340 ff_filter_set_ready(link->dst, 200);
263 }
264
265 /**
266 * Set the status field of a link from the destination filter.
267 * The pts should probably be left unset (AV_NOPTS_VALUE).
268 */
269 8742 static void link_set_out_status(AVFilterLink *link, int status, int64_t pts)
270 {
271 8742 FilterLinkInternal * const li = ff_link_internal(link);
272
273
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8742 times.
8742 av_assert0(!li->frame_wanted_out);
274
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8742 times.
8742 av_assert0(!li->status_out);
275 8742 li->status_out = status;
276
2/2
✓ Branch 0 taken 6204 times.
✓ Branch 1 taken 2538 times.
8742 if (pts != AV_NOPTS_VALUE)
277 6204 update_link_current_pts(li, pts);
278 8742 filter_unblock(link->dst);
279 8742 ff_filter_set_ready(link->src, 200);
280 8742 }
281
282 1306 int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
283 unsigned filt_srcpad_idx, unsigned filt_dstpad_idx)
284 {
285 int ret;
286 1306 unsigned dstpad_idx = link->dstpad - link->dst->input_pads;
287
288 1306 av_log(link->dst, AV_LOG_VERBOSE, "auto-inserting filter '%s' "
289 "between the filter '%s' and the filter '%s'\n",
290 1306 filt->name, link->src->name, link->dst->name);
291
292 1306 link->dst->inputs[dstpad_idx] = NULL;
293
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1306 times.
1306 if ((ret = avfilter_link(filt, filt_dstpad_idx, link->dst, dstpad_idx)) < 0) {
294 /* failed to link output filter to new filter */
295 link->dst->inputs[dstpad_idx] = link;
296 return ret;
297 }
298
299 /* re-hookup the link to the new destination filter we inserted */
300 1306 link->dst = filt;
301 1306 link->dstpad = &filt->input_pads[filt_srcpad_idx];
302 1306 filt->inputs[filt_srcpad_idx] = link;
303
304 /* if any information on supported media formats already exists on the
305 * link, we need to preserve that */
306
1/2
✓ Branch 0 taken 1306 times.
✗ Branch 1 not taken.
1306 if (link->outcfg.formats)
307 1306 ff_formats_changeref(&link->outcfg.formats,
308 1306 &filt->outputs[filt_dstpad_idx]->outcfg.formats);
309
2/2
✓ Branch 0 taken 634 times.
✓ Branch 1 taken 672 times.
1306 if (link->outcfg.color_spaces)
310 634 ff_formats_changeref(&link->outcfg.color_spaces,
311 634 &filt->outputs[filt_dstpad_idx]->outcfg.color_spaces);
312
2/2
✓ Branch 0 taken 634 times.
✓ Branch 1 taken 672 times.
1306 if (link->outcfg.color_ranges)
313 634 ff_formats_changeref(&link->outcfg.color_ranges,
314 634 &filt->outputs[filt_dstpad_idx]->outcfg.color_ranges);
315
2/2
✓ Branch 0 taken 634 times.
✓ Branch 1 taken 672 times.
1306 if (link->outcfg.alpha_modes)
316 634 ff_formats_changeref(&link->outcfg.alpha_modes,
317 634 &filt->outputs[filt_dstpad_idx]->outcfg.alpha_modes);
318
2/2
✓ Branch 0 taken 672 times.
✓ Branch 1 taken 634 times.
1306 if (link->outcfg.samplerates)
319 672 ff_formats_changeref(&link->outcfg.samplerates,
320 672 &filt->outputs[filt_dstpad_idx]->outcfg.samplerates);
321
2/2
✓ Branch 0 taken 672 times.
✓ Branch 1 taken 634 times.
1306 if (link->outcfg.channel_layouts)
322 672 ff_channel_layouts_changeref(&link->outcfg.channel_layouts,
323 672 &filt->outputs[filt_dstpad_idx]->outcfg.channel_layouts);
324
325 1306 return 0;
326 }
327
328 45834 int ff_filter_config_links(AVFilterContext *filter)
329 {
330 int (*config_link)(AVFilterLink *);
331 unsigned i;
332 int ret;
333
334
2/2
✓ Branch 0 taken 37495 times.
✓ Branch 1 taken 45830 times.
83325 for (i = 0; i < filter->nb_inputs; i ++) {
335 37495 AVFilterLink *link = filter->inputs[i];
336 AVFilterLink *inlink;
337 37495 FilterLinkInternal *li = ff_link_internal(link);
338 FilterLinkInternal *li_in;
339
340
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37495 times.
37495 if (!link) continue;
341
2/4
✓ Branch 0 taken 37495 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 37495 times.
37495 if (!link->src || !link->dst) {
342 av_log(filter, AV_LOG_ERROR,
343 "Not all input and output are properly linked (%d).\n", i);
344 return AVERROR(EINVAL);
345 }
346
347
2/2
✓ Branch 0 taken 28954 times.
✓ Branch 1 taken 8541 times.
37495 inlink = link->src->nb_inputs ? link->src->inputs[0] : NULL;
348
2/2
✓ Branch 0 taken 28954 times.
✓ Branch 1 taken 8541 times.
37495 li_in = inlink ? ff_link_internal(inlink) : NULL;
349 37495 li->l.current_pts =
350 37495 li->l.current_pts_us = AV_NOPTS_VALUE;
351
352
3/4
✓ Branch 0 taken 111 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 37382 times.
✗ Branch 3 not taken.
37495 switch (li->init_state) {
353 111 case AVLINK_INIT:
354 111 continue;
355 2 case AVLINK_STARTINIT:
356 2 av_log(filter, AV_LOG_INFO, "circular filter chain detected\n");
357 2 return 0;
358 37382 case AVLINK_UNINIT:
359 37382 li->init_state = AVLINK_STARTINIT;
360
361
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 37381 times.
37382 if ((ret = ff_filter_config_links(link->src)) < 0)
362 1 return ret;
363
364
2/2
✓ Branch 0 taken 19578 times.
✓ Branch 1 taken 17803 times.
37381 if (!(config_link = link->srcpad->config_props)) {
365
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 19578 times.
19578 if (link->src->nb_inputs != 1) {
366 av_log(link->src, AV_LOG_ERROR, "Source filters and filters "
367 "with more than one input "
368 "must set config_props() "
369 "callbacks on all outputs\n");
370 return AVERROR(EINVAL);
371 }
372 }
373
374 /* Copy side data before link->srcpad->config_props() is called, so the filter
375 * may remove it for the next filter in the chain */
376
5/6
✓ Branch 0 taken 28874 times.
✓ Branch 1 taken 8507 times.
✓ Branch 2 taken 311 times.
✓ Branch 3 taken 28563 times.
✓ Branch 4 taken 311 times.
✗ Branch 5 not taken.
37381 if (inlink && inlink->nb_side_data && !link->nb_side_data) {
377
2/2
✓ Branch 0 taken 355 times.
✓ Branch 1 taken 311 times.
666 for (int j = 0; j < inlink->nb_side_data; j++) {
378 355 ret = av_frame_side_data_clone(&link->side_data, &link->nb_side_data,
379 355 inlink->side_data[j], 0);
380
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 355 times.
355 if (ret < 0) {
381 av_frame_side_data_free(&link->side_data, &link->nb_side_data);
382 return ret;
383 }
384 }
385 }
386
387
4/4
✓ Branch 0 taken 17803 times.
✓ Branch 1 taken 19578 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 17802 times.
37381 if (config_link && (ret = config_link(link)) < 0) {
388 1 av_log(link->src, AV_LOG_ERROR,
389 "Failed to configure output pad on %s\n",
390 1 link->src->name);
391 1 return ret;
392 }
393
394
2/3
✓ Branch 0 taken 31126 times.
✓ Branch 1 taken 6254 times.
✗ Branch 2 not taken.
37380 switch (link->type) {
395 31126 case AVMEDIA_TYPE_VIDEO:
396
3/4
✓ Branch 0 taken 23815 times.
✓ Branch 1 taken 7311 times.
✓ Branch 2 taken 23815 times.
✗ Branch 3 not taken.
31126 if (!link->time_base.num && !link->time_base.den)
397
1/2
✓ Branch 0 taken 23815 times.
✗ Branch 1 not taken.
23815 link->time_base = inlink ? inlink->time_base : AV_TIME_BASE_Q;
398
399
4/4
✓ Branch 0 taken 26599 times.
✓ Branch 1 taken 4527 times.
✓ Branch 2 taken 16935 times.
✓ Branch 3 taken 9664 times.
31126 if (!link->sample_aspect_ratio.num && !link->sample_aspect_ratio.den)
400 16935 link->sample_aspect_ratio = inlink ?
401
2/2
✓ Branch 0 taken 16920 times.
✓ Branch 1 taken 15 times.
16935 inlink->sample_aspect_ratio : (AVRational){1,1};
402
403
2/2
✓ Branch 0 taken 24081 times.
✓ Branch 1 taken 7045 times.
31126 if (inlink) {
404
3/4
✓ Branch 0 taken 23858 times.
✓ Branch 1 taken 223 times.
✓ Branch 2 taken 23858 times.
✗ Branch 3 not taken.
24081 if (!li->l.frame_rate.num && !li->l.frame_rate.den)
405 23858 li->l.frame_rate = li_in->l.frame_rate;
406
2/2
✓ Branch 0 taken 16432 times.
✓ Branch 1 taken 7649 times.
24081 if (!link->w)
407 16432 link->w = inlink->w;
408
2/2
✓ Branch 0 taken 16432 times.
✓ Branch 1 taken 7649 times.
24081 if (!link->h)
409 16432 link->h = inlink->h;
410
2/4
✓ Branch 0 taken 7045 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7045 times.
7045 } else if (!link->w || !link->h) {
411 av_log(link->src, AV_LOG_ERROR,
412 "Video source filters must set their output link's "
413 "width and height\n");
414 return AVERROR(EINVAL);
415 }
416 31126 break;
417
418 6254 case AVMEDIA_TYPE_AUDIO:
419
2/2
✓ Branch 0 taken 4792 times.
✓ Branch 1 taken 1462 times.
6254 if (inlink) {
420
3/4
✓ Branch 0 taken 3241 times.
✓ Branch 1 taken 1551 times.
✓ Branch 2 taken 3241 times.
✗ Branch 3 not taken.
4792 if (!link->time_base.num && !link->time_base.den)
421 3241 link->time_base = inlink->time_base;
422 }
423
424
3/4
✓ Branch 0 taken 86 times.
✓ Branch 1 taken 6168 times.
✓ Branch 2 taken 86 times.
✗ Branch 3 not taken.
6254 if (!link->time_base.num && !link->time_base.den)
425 86 link->time_base = (AVRational) {1, link->sample_rate};
426 }
427
428
2/2
✓ Branch 0 taken 28873 times.
✓ Branch 1 taken 8507 times.
37380 if (link->src->nb_inputs &&
429
1/2
✓ Branch 1 taken 28873 times.
✗ Branch 2 not taken.
28873 !(fffilter(link->src->filter)->flags_internal & FF_FILTER_FLAG_HWFRAME_AWARE)) {
430 28873 FilterLink *l0 = ff_filter_link(link->src->inputs[0]);
431
432
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 28873 times.
28873 av_assert0(!li->l.hw_frames_ctx &&
433 "should not be set by non-hwframe-aware filter");
434
435
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 28873 times.
28873 if (l0->hw_frames_ctx) {
436 li->l.hw_frames_ctx = av_buffer_ref(l0->hw_frames_ctx);
437 if (!li->l.hw_frames_ctx)
438 return AVERROR(ENOMEM);
439 }
440 }
441
442
2/2
✓ Branch 0 taken 5033 times.
✓ Branch 1 taken 32347 times.
37380 if ((config_link = link->dstpad->config_props))
443
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 5033 times.
5033 if ((ret = config_link(link)) < 0) {
444 av_log(link->dst, AV_LOG_ERROR,
445 "Failed to configure input pad on %s\n",
446 link->dst->name);
447 return ret;
448 }
449
450 37380 li->init_state = AVLINK_INIT;
451 }
452 }
453
454 45830 return 0;
455 }
456
457 #ifdef TRACE
458 void ff_tlog_link(void *ctx, AVFilterLink *link, int end)
459 {
460 if (link->type == AVMEDIA_TYPE_VIDEO) {
461 ff_tlog(ctx,
462 "link[%p s:%dx%d fmt:%s %s->%s]%s",
463 link, link->w, link->h,
464 av_get_pix_fmt_name(link->format),
465 link->src ? link->src->filter->name : "",
466 link->dst ? link->dst->filter->name : "",
467 end ? "\n" : "");
468 } else {
469 char buf[128];
470 av_channel_layout_describe(&link->ch_layout, buf, sizeof(buf));
471
472 ff_tlog(ctx,
473 "link[%p r:%d cl:%s fmt:%s %s->%s]%s",
474 link, (int)link->sample_rate, buf,
475 av_get_sample_fmt_name(link->format),
476 link->src ? link->src->filter->name : "",
477 link->dst ? link->dst->filter->name : "",
478 end ? "\n" : "");
479 }
480 }
481 #endif
482
483 820131 int ff_request_frame(AVFilterLink *link)
484 {
485 820131 FilterLinkInternal * const li = ff_link_internal(link);
486
487 FF_TPRINTF_START(NULL, request_frame); ff_tlog_link(NULL, link, 1);
488
489 av_assert1(!fffilter(link->dst->filter)->activate);
490
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 820122 times.
820131 if (li->status_out)
491 9 return li->status_out;
492
2/2
✓ Branch 0 taken 6205 times.
✓ Branch 1 taken 813917 times.
820122 if (li->status_in) {
493
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6205 times.
6205 if (ff_framequeue_queued_frames(&li->fifo)) {
494 av_assert1(!li->frame_wanted_out);
495 av_assert1(fffilterctx(link->dst)->ready >= 300);
496 return 0;
497 } else {
498 /* Acknowledge status change. Filters using ff_request_frame() will
499 handle the change automatically. Filters can also check the
500 status directly but none do yet. */
501 6205 link_set_out_status(link, li->status_in, li->status_in_pts);
502 6205 return li->status_out;
503 }
504 }
505 813917 li->frame_wanted_out = 1;
506 813917 ff_filter_set_ready(link->src, 100);
507 813917 return 0;
508 }
509
510 6197 static int64_t guess_status_pts(AVFilterContext *ctx, int status, AVRational link_time_base)
511 {
512 unsigned i;
513 6197 int64_t r = INT64_MAX;
514
515
2/2
✓ Branch 0 taken 6196 times.
✓ Branch 1 taken 6197 times.
12393 for (i = 0; i < ctx->nb_inputs; i++) {
516 6196 FilterLinkInternal * const li = ff_link_internal(ctx->inputs[i]);
517
1/2
✓ Branch 0 taken 6196 times.
✗ Branch 1 not taken.
6196 if (li->status_out == status)
518 6196 r = FFMIN(r, av_rescale_q(li->l.current_pts, ctx->inputs[i]->time_base, link_time_base));
519 }
520
2/2
✓ Branch 0 taken 6196 times.
✓ Branch 1 taken 1 times.
6197 if (r < INT64_MAX)
521 6196 return r;
522 1 av_log(ctx, AV_LOG_WARNING, "EOF timestamp not reliable\n");
523
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 for (i = 0; i < ctx->nb_inputs; i++) {
524 FilterLinkInternal * const li = ff_link_internal(ctx->inputs[i]);
525 r = FFMIN(r, av_rescale_q(li->status_in_pts, ctx->inputs[i]->time_base, link_time_base));
526 }
527
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (r < INT64_MAX)
528 return r;
529 1 return AV_NOPTS_VALUE;
530 }
531
532 820435 static int request_frame_to_filter(AVFilterLink *link)
533 {
534 820435 FilterLinkInternal * const li = ff_link_internal(link);
535 820435 int ret = -1;
536
537 FF_TPRINTF_START(NULL, request_frame_to_filter); ff_tlog_link(NULL, link, 1);
538 /* Assume the filter is blocked, let the method clear it if not */
539 820435 li->frame_blocked_in = 1;
540
2/2
✓ Branch 0 taken 2021 times.
✓ Branch 1 taken 818414 times.
820435 if (link->srcpad->request_frame)
541 2021 ret = link->srcpad->request_frame(link);
542
1/2
✓ Branch 0 taken 818414 times.
✗ Branch 1 not taken.
818414 else if (link->src->inputs[0])
543 818414 ret = ff_request_frame(link->src->inputs[0]);
544
2/2
✓ Branch 0 taken 6197 times.
✓ Branch 1 taken 814238 times.
820435 if (ret < 0) {
545
2/4
✓ Branch 0 taken 6197 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6197 times.
✗ Branch 3 not taken.
6197 if (ret != AVERROR(EAGAIN) && ret != li->status_in)
546 6197 ff_avfilter_link_set_in_status(link, ret, guess_status_pts(link->src, ret, link->time_base));
547
1/2
✓ Branch 0 taken 6197 times.
✗ Branch 1 not taken.
6197 if (ret == AVERROR_EOF)
548 6197 ret = 0;
549 }
550 820435 return ret;
551 }
552
553 static const char *const var_names[] = {
554 "t",
555 "n",
556 "w",
557 "h",
558 NULL
559 };
560
561 enum {
562 VAR_T,
563 VAR_N,
564 VAR_W,
565 VAR_H,
566 VAR_VARS_NB
567 };
568
569 6 static int set_enable_expr(FFFilterContext *ctxi, const char *expr)
570 {
571 6 AVFilterContext *ctx = &ctxi->p;
572 int ret;
573 char *expr_dup;
574 6 AVExpr *old = ctxi->enable;
575
576
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (!(ctx->filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE)) {
577 av_log(ctx, AV_LOG_ERROR, "Timeline ('enable' option) not supported "
578 "with filter '%s'\n", ctx->filter->name);
579 return AVERROR_PATCHWELCOME;
580 }
581
582 6 expr_dup = av_strdup(expr);
583
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (!expr_dup)
584 return AVERROR(ENOMEM);
585
586
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 if (!ctxi->var_values) {
587 6 ctxi->var_values = av_calloc(VAR_VARS_NB, sizeof(*ctxi->var_values));
588
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (!ctxi->var_values) {
589 av_free(expr_dup);
590 return AVERROR(ENOMEM);
591 }
592 }
593
594 6 ret = av_expr_parse(&ctxi->enable, expr_dup, var_names,
595 NULL, NULL, NULL, NULL, 0, ctx->priv);
596
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (ret < 0) {
597 av_log(ctx->priv, AV_LOG_ERROR,
598 "Error when evaluating the expression '%s' for enable\n",
599 expr_dup);
600 av_free(expr_dup);
601 return ret;
602 }
603
604 6 av_expr_free(old);
605 6 av_free(ctx->enable_str);
606 6 ctx->enable_str = expr_dup;
607 6 return 0;
608 }
609
610 int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags)
611 {
612 if(!strcmp(cmd, "ping")){
613 char local_res[256] = {0};
614
615 if (!res) {
616 res = local_res;
617 res_len = sizeof(local_res);
618 }
619 av_strlcatf(res, res_len, "pong from:%s %s\n", filter->filter->name, filter->name);
620 if (res == local_res)
621 av_log(filter, AV_LOG_INFO, "%s", res);
622 return 0;
623 }else if(!strcmp(cmd, "enable")) {
624 return set_enable_expr(fffilterctx(filter), arg);
625 }else if (fffilter(filter->filter)->process_command) {
626 return fffilter(filter->filter)->process_command(filter, cmd, arg, res, res_len, flags);
627 }
628 return AVERROR(ENOSYS);
629 }
630
631 unsigned avfilter_filter_pad_count(const AVFilter *filter, int is_output)
632 {
633 return is_output ? fffilter(filter)->nb_outputs : fffilter(filter)->nb_inputs;
634 }
635
636 596 static const char *default_filter_name(void *filter_ctx)
637 {
638 596 AVFilterContext *ctx = filter_ctx;
639
1/2
✓ Branch 0 taken 596 times.
✗ Branch 1 not taken.
596 return ctx->name ? ctx->name : ctx->filter->name;
640 }
641
642 57680 static void *filter_child_next(void *obj, void *prev)
643 {
644 57680 AVFilterContext *ctx = obj;
645
5/8
✓ Branch 0 taken 57674 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 57674 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 57674 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 57674 times.
✗ Branch 7 not taken.
57680 if (!prev && ctx->filter && ctx->filter->priv_class && ctx->priv)
646 57674 return ctx->priv;
647 6 return NULL;
648 }
649
650 static const AVClass *filter_child_class_iterate(void **iter)
651 {
652 const AVFilter *f;
653
654 while ((f = av_filter_iterate(iter)))
655 if (f->priv_class)
656 return f->priv_class;
657
658 return NULL;
659 }
660
661 #define OFFSET(x) offsetof(AVFilterContext, x)
662 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM
663 #define TFLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
664 static const AVOption avfilter_options[] = {
665 { "thread_type", "Allowed thread types", OFFSET(thread_type), AV_OPT_TYPE_FLAGS,
666 { .i64 = AVFILTER_THREAD_SLICE }, 0, INT_MAX, FLAGS, .unit = "thread_type" },
667 { "slice", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVFILTER_THREAD_SLICE }, .flags = FLAGS, .unit = "thread_type" },
668 { "enable", "set enable expression", OFFSET(enable_str), AV_OPT_TYPE_STRING, {.str=NULL}, .flags = TFLAGS },
669 { "threads", "Allowed number of threads", OFFSET(nb_threads), AV_OPT_TYPE_INT,
670 { .i64 = 0 }, 0, INT_MAX, FLAGS, .unit = "threads" },
671 {"auto", "autodetect a suitable number of threads to use", 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, .flags = FLAGS, .unit = "threads"},
672 { "extra_hw_frames", "Number of extra hardware frames to allocate for the user",
673 OFFSET(extra_hw_frames), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, FLAGS },
674 { NULL },
675 };
676
677 static const AVClass avfilter_class = {
678 .class_name = "AVFilter",
679 .item_name = default_filter_name,
680 .version = LIBAVUTIL_VERSION_INT,
681 .category = AV_CLASS_CATEGORY_FILTER,
682 .child_next = filter_child_next,
683 .child_class_iterate = filter_child_class_iterate,
684 .option = avfilter_options,
685 .state_flags_offset = offsetof(FFFilterContext, state_flags),
686 };
687
688 1373 static int default_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg,
689 int *ret, int nb_jobs)
690 {
691 int i;
692
693
2/2
✓ Branch 0 taken 1429 times.
✓ Branch 1 taken 1373 times.
2802 for (i = 0; i < nb_jobs; i++) {
694 1429 int r = func(ctx, arg, i, nb_jobs);
695
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1429 times.
1429 if (ret)
696 ret[i] = r;
697 }
698 1373 return 0;
699 }
700
701 64415 AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name)
702 {
703 FFFilterContext *ctx;
704 AVFilterContext *ret;
705 64415 const FFFilter *const fi = fffilter(filter);
706 64415 int preinited = 0;
707
708
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64415 times.
64415 if (!filter)
709 return NULL;
710
711 64415 ctx = av_mallocz(sizeof(*ctx));
712
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64415 times.
64415 if (!ctx)
713 return NULL;
714 64415 ret = &ctx->p;
715
716 64415 ret->av_class = &avfilter_class;
717 64415 ret->filter = filter;
718
1/2
✓ Branch 0 taken 64415 times.
✗ Branch 1 not taken.
64415 ret->name = inst_name ? av_strdup(inst_name) : NULL;
719
2/2
✓ Branch 0 taken 57458 times.
✓ Branch 1 taken 6957 times.
64415 if (fi->priv_size) {
720 57458 ret->priv = av_mallocz(fi->priv_size);
721
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 57458 times.
57458 if (!ret->priv)
722 goto err;
723 }
724
2/2
✓ Branch 0 taken 13751 times.
✓ Branch 1 taken 50664 times.
64415 if (fi->preinit) {
725
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 13751 times.
13751 if (fi->preinit(ret) < 0)
726 goto err;
727 13751 preinited = 1;
728 }
729
730 64415 av_opt_set_defaults(ret);
731
2/2
✓ Branch 0 taken 56199 times.
✓ Branch 1 taken 8216 times.
64415 if (filter->priv_class) {
732 56199 *(const AVClass**)ret->priv = filter->priv_class;
733 56199 av_opt_set_defaults(ret->priv);
734 }
735
736 64415 ctx->execute = default_execute;
737
738 64415 ret->nb_inputs = fi->nb_inputs;
739
2/2
✓ Branch 0 taken 54555 times.
✓ Branch 1 taken 9860 times.
64415 if (ret->nb_inputs ) {
740 54555 ret->input_pads = av_memdup(filter->inputs, ret->nb_inputs * sizeof(*filter->inputs));
741
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54555 times.
54555 if (!ret->input_pads)
742 goto err;
743 54555 ret->inputs = av_calloc(ret->nb_inputs, sizeof(*ret->inputs));
744
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54555 times.
54555 if (!ret->inputs)
745 goto err;
746 }
747
748 64415 ret->nb_outputs = fi->nb_outputs;
749
2/2
✓ Branch 0 taken 55868 times.
✓ Branch 1 taken 8547 times.
64415 if (ret->nb_outputs) {
750 55868 ret->output_pads = av_memdup(filter->outputs, ret->nb_outputs * sizeof(*filter->outputs));
751
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 55868 times.
55868 if (!ret->output_pads)
752 goto err;
753 55868 ret->outputs = av_calloc(ret->nb_outputs, sizeof(*ret->outputs));
754
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 55868 times.
55868 if (!ret->outputs)
755 goto err;
756 }
757
758 64415 return ret;
759
760 err:
761 if (preinited)
762 fi->uninit(ret);
763 av_freep(&ret->name);
764 av_freep(&ret->inputs);
765 av_freep(&ret->input_pads);
766 ret->nb_inputs = 0;
767 av_freep(&ret->outputs);
768 av_freep(&ret->output_pads);
769 ret->nb_outputs = 0;
770 av_freep(&ret->priv);
771 av_free(ret);
772 return NULL;
773 }
774
775 111103 static void free_link(AVFilterLink *link)
776 {
777
2/2
✓ Branch 0 taken 63210 times.
✓ Branch 1 taken 47893 times.
111103 if (!link)
778 63210 return;
779
780
2/2
✓ Branch 0 taken 47761 times.
✓ Branch 1 taken 132 times.
47893 if (link->src)
781 47761 link->src->outputs[link->srcpad - link->src->output_pads] = NULL;
782
2/2
✓ Branch 0 taken 47761 times.
✓ Branch 1 taken 132 times.
47893 if (link->dst)
783 47761 link->dst->inputs[link->dstpad - link->dst->input_pads] = NULL;
784
785 47893 ff_formats_unref(&link->incfg.formats);
786 47893 ff_formats_unref(&link->outcfg.formats);
787 47893 ff_formats_unref(&link->incfg.color_spaces);
788 47893 ff_formats_unref(&link->outcfg.color_spaces);
789 47893 ff_formats_unref(&link->incfg.color_ranges);
790 47893 ff_formats_unref(&link->outcfg.color_ranges);
791 47893 ff_formats_unref(&link->incfg.alpha_modes);
792 47893 ff_formats_unref(&link->outcfg.alpha_modes);
793 47893 ff_formats_unref(&link->incfg.samplerates);
794 47893 ff_formats_unref(&link->outcfg.samplerates);
795 47893 ff_channel_layouts_unref(&link->incfg.channel_layouts);
796 47893 ff_channel_layouts_unref(&link->outcfg.channel_layouts);
797 47893 link_free(&link);
798 }
799
800 64415 void avfilter_free(AVFilterContext *filter)
801 {
802 FFFilterContext *ctxi;
803 int i;
804
805
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64415 times.
64415 if (!filter)
806 return;
807 64415 ctxi = fffilterctx(filter);
808
809
1/2
✓ Branch 0 taken 64415 times.
✗ Branch 1 not taken.
64415 if (filter->graph)
810 64415 ff_filter_graph_remove_filter(filter->graph, filter);
811
812
2/2
✓ Branch 1 taken 50033 times.
✓ Branch 2 taken 14382 times.
64415 if (fffilter(filter->filter)->uninit)
813 50033 fffilter(filter->filter)->uninit(filter);
814
815
2/2
✓ Branch 0 taken 54940 times.
✓ Branch 1 taken 64415 times.
119355 for (i = 0; i < filter->nb_inputs; i++) {
816 54940 free_link(filter->inputs[i]);
817
2/2
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 54670 times.
54940 if (filter->input_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
818 270 av_freep(&filter->input_pads[i].name);
819 }
820
2/2
✓ Branch 0 taken 56163 times.
✓ Branch 1 taken 64415 times.
120578 for (i = 0; i < filter->nb_outputs; i++) {
821 56163 free_link(filter->outputs[i]);
822
2/2
✓ Branch 0 taken 285 times.
✓ Branch 1 taken 55878 times.
56163 if (filter->output_pads[i].flags & AVFILTERPAD_FLAG_FREE_NAME)
823 285 av_freep(&filter->output_pads[i].name);
824 }
825
826
2/2
✓ Branch 0 taken 56199 times.
✓ Branch 1 taken 8216 times.
64415 if (filter->filter->priv_class)
827 56199 av_opt_free(filter->priv);
828
829 64415 av_buffer_unref(&filter->hw_device_ctx);
830
831 64415 av_freep(&filter->name);
832 64415 av_freep(&filter->input_pads);
833 64415 av_freep(&filter->output_pads);
834 64415 av_freep(&filter->inputs);
835 64415 av_freep(&filter->outputs);
836 64415 av_freep(&filter->priv);
837
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64415 times.
64415 while (ctxi->command_queue)
838 command_queue_pop(filter);
839 64415 av_opt_free(filter);
840 64415 av_expr_free(ctxi->enable);
841 64415 ctxi->enable = NULL;
842 64415 av_freep(&ctxi->var_values);
843 64415 av_free(filter);
844 }
845
846 19546 int ff_filter_get_nb_threads(AVFilterContext *ctx)
847 {
848
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 19546 times.
19546 if (ctx->nb_threads > 0)
849 return FFMIN(ctx->nb_threads, ctx->graph->nb_threads);
850 19546 return ctx->graph->nb_threads;
851 }
852
853 34446 int ff_filter_opt_parse(void *logctx, const AVClass *priv_class,
854 AVDictionary **options, const char *args)
855 {
856 34446 const AVOption *o = NULL;
857 int ret;
858 34446 int offset= -1;
859
860
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34446 times.
34446 if (!args)
861 return 0;
862
863
2/2
✓ Branch 0 taken 59470 times.
✓ Branch 1 taken 34446 times.
93916 while (*args) {
864 char *parsed_key, *value;
865 const char *key;
866 59470 const char *shorthand = NULL;
867 59470 int additional_flags = 0;
868
869
4/4
✓ Branch 0 taken 46080 times.
✓ Branch 1 taken 13390 times.
✓ Branch 3 taken 44798 times.
✓ Branch 4 taken 1282 times.
59470 if (priv_class && (o = av_opt_next(&priv_class, o))) {
870
4/4
✓ Branch 0 taken 43028 times.
✓ Branch 1 taken 1770 times.
✓ Branch 2 taken 4600 times.
✓ Branch 3 taken 38428 times.
44798 if (o->type == AV_OPT_TYPE_CONST || o->offset == offset)
871 6370 continue;
872 38428 offset = o->offset;
873 38428 shorthand = o->name;
874 }
875
876 53100 ret = av_opt_get_key_value(&args, "=", ":",
877 shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
878 &parsed_key, &value);
879
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 53100 times.
53100 if (ret < 0) {
880 if (ret == AVERROR(EINVAL))
881 av_log(logctx, AV_LOG_ERROR, "No option name near '%s'\n", args);
882 else
883 av_log(logctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", args,
884 av_err2str(ret));
885 return ret;
886 }
887
2/2
✓ Branch 0 taken 27686 times.
✓ Branch 1 taken 25414 times.
53100 if (*args)
888 27686 args++;
889
2/2
✓ Branch 0 taken 31998 times.
✓ Branch 1 taken 21102 times.
53100 if (parsed_key) {
890 31998 key = parsed_key;
891 31998 additional_flags = AV_DICT_DONT_STRDUP_KEY;
892 31998 priv_class = NULL; /* reject all remaining shorthand */
893 } else {
894 21102 key = shorthand;
895 }
896
897 53100 av_log(logctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
898
899 53100 av_dict_set(options, key, value,
900 additional_flags | AV_DICT_DONT_STRDUP_VAL | AV_DICT_MULTIKEY);
901 }
902
903 34446 return 0;
904 }
905
906 int ff_filter_process_command(AVFilterContext *ctx, const char *cmd,
907 const char *arg, char *res, int res_len, int flags)
908 {
909 const AVOption *o;
910
911 if (!ctx->filter->priv_class)
912 return 0;
913 o = av_opt_find2(ctx->priv, cmd, NULL, AV_OPT_FLAG_RUNTIME_PARAM | AV_OPT_FLAG_FILTERING_PARAM, AV_OPT_SEARCH_CHILDREN, NULL);
914 if (!o)
915 return AVERROR(ENOSYS);
916 return av_opt_set(ctx->priv, cmd, arg, 0);
917 }
918
919 64415 int avfilter_init_dict(AVFilterContext *ctx, AVDictionary **options)
920 {
921 64415 FFFilterContext *ctxi = fffilterctx(ctx);
922 64415 int ret = 0;
923
924
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64415 times.
64415 if (ctxi->state_flags & AV_CLASS_STATE_INITIALIZED) {
925 av_log(ctx, AV_LOG_ERROR, "Filter already initialized\n");
926 return AVERROR(EINVAL);
927 }
928
929 64415 ret = av_opt_set_dict2(ctx, options, AV_OPT_SEARCH_CHILDREN);
930
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64415 times.
64415 if (ret < 0) {
931 av_log(ctx, AV_LOG_ERROR, "Error applying generic filter options.\n");
932 return ret;
933 }
934
935
2/2
✓ Branch 0 taken 1254 times.
✓ Branch 1 taken 63161 times.
64415 if (ctx->filter->flags & AVFILTER_FLAG_SLICE_THREADS &&
936
2/2
✓ Branch 0 taken 154 times.
✓ Branch 1 taken 1100 times.
1254 ctx->thread_type & ctx->graph->thread_type & AVFILTER_THREAD_SLICE &&
937
1/2
✓ Branch 1 taken 154 times.
✗ Branch 2 not taken.
154 fffiltergraph(ctx->graph)->thread_execute) {
938 154 ctx->thread_type = AVFILTER_THREAD_SLICE;
939 154 ctxi->execute = fffiltergraph(ctx->graph)->thread_execute;
940 } else {
941 64261 ctx->thread_type = 0;
942 }
943
944
2/2
✓ Branch 1 taken 50865 times.
✓ Branch 2 taken 13550 times.
64415 if (fffilter(ctx->filter)->init)
945 50865 ret = fffilter(ctx->filter)->init(ctx);
946
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 64414 times.
64415 if (ret < 0)
947 1 return ret;
948
949
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 64408 times.
64414 if (ctx->enable_str) {
950 6 ret = set_enable_expr(ctxi, ctx->enable_str);
951
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (ret < 0)
952 return ret;
953 }
954
955 64414 ctxi->state_flags |= AV_CLASS_STATE_INITIALIZED;
956
957 64414 return 0;
958 }
959
960 21170 int avfilter_init_str(AVFilterContext *filter, const char *args)
961 {
962 21170 AVDictionary *options = NULL;
963 const AVDictionaryEntry *e;
964 21170 int ret = 0;
965
966
3/4
✓ Branch 0 taken 10573 times.
✓ Branch 1 taken 10597 times.
✓ Branch 2 taken 10573 times.
✗ Branch 3 not taken.
21170 if (args && *args) {
967 10573 ret = ff_filter_opt_parse(filter, filter->filter->priv_class, &options, args);
968
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10573 times.
10573 if (ret < 0)
969 goto fail;
970 }
971
972 21170 ret = avfilter_init_dict(filter, &options);
973
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 21170 times.
21170 if (ret < 0)
974 goto fail;
975
976
1/2
✓ Branch 1 taken 21170 times.
✗ Branch 2 not taken.
21170 if ((e = av_dict_iterate(options, NULL))) {
977 av_log(filter, AV_LOG_ERROR, "No such option: %s.\n", e->key);
978 ret = AVERROR_OPTION_NOT_FOUND;
979 goto fail;
980 }
981
982 21170 fail:
983 21170 av_dict_free(&options);
984
985 21170 return ret;
986 }
987
988 15411 const char *avfilter_pad_get_name(const AVFilterPad *pads, int pad_idx)
989 {
990 15411 return pads[pad_idx].name;
991 }
992
993 31180 enum AVMediaType avfilter_pad_get_type(const AVFilterPad *pads, int pad_idx)
994 {
995 31180 return pads[pad_idx].type;
996 }
997
998 AVBufferRef *avfilter_link_get_hw_frames_ctx(AVFilterLink *link)
999 {
1000 FilterLink *plink = ff_filter_link(link);
1001 if (plink->hw_frames_ctx)
1002 return av_buffer_ref(plink->hw_frames_ctx);
1003
1004 return NULL;
1005 }
1006
1007 799234 static int default_filter_frame(AVFilterLink *link, AVFrame *frame)
1008 {
1009 799234 return ff_filter_frame(link->dst->outputs[0], frame);
1010 }
1011
1012 /**
1013 * Evaluate the timeline expression of the link for the time and properties
1014 * of the frame.
1015 * @return >0 if enabled, 0 if disabled
1016 * @note It does not update link->dst->is_disabled.
1017 */
1018 2535037 static int evaluate_timeline_at_frame(AVFilterLink *link, const AVFrame *frame)
1019 {
1020 2535037 FilterLink *l = ff_filter_link(link);
1021 2535037 AVFilterContext *dstctx = link->dst;
1022 2535037 FFFilterContext *dsti = fffilterctx(dstctx);
1023 2535037 int64_t pts = frame->pts;
1024
1025
2/2
✓ Branch 0 taken 2534839 times.
✓ Branch 1 taken 198 times.
2535037 if (!dstctx->enable_str)
1026 2534839 return 1;
1027
1028 198 dsti->var_values[VAR_N] = l->frame_count_out;
1029
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 dsti->var_values[VAR_T] = pts == AV_NOPTS_VALUE ? NAN : pts * av_q2d(link->time_base);
1030 198 dsti->var_values[VAR_W] = link->w;
1031 198 dsti->var_values[VAR_H] = link->h;
1032
1033 198 return fabs(av_expr_eval(dsti->enable, dsti->var_values, NULL)) >= 0.5;
1034 }
1035
1036 819694 static int filter_frame_framed(AVFilterLink *link, AVFrame *frame)
1037 {
1038 819694 FilterLink *l = ff_filter_link(link);
1039 int (*filter_frame)(AVFilterLink *, AVFrame *);
1040 819694 AVFilterContext *dstctx = link->dst;
1041 819694 AVFilterPad *dst = link->dstpad;
1042 int ret;
1043
1044
2/2
✓ Branch 0 taken 799225 times.
✓ Branch 1 taken 20469 times.
819694 if (!(filter_frame = dst->filter_frame))
1045 799225 filter_frame = default_filter_frame;
1046
1047
2/2
✓ Branch 0 taken 2993 times.
✓ Branch 1 taken 816701 times.
819694 if (dst->flags & AVFILTERPAD_FLAG_NEEDS_WRITABLE) {
1048 2993 ret = ff_inlink_make_frame_writable(link, &frame);
1049
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2993 times.
2993 if (ret < 0)
1050 goto fail;
1051 }
1052
1053 819694 ff_inlink_process_commands(link, frame);
1054 819694 dstctx->is_disabled = !evaluate_timeline_at_frame(link, frame);
1055
1056
2/2
✓ Branch 0 taken 19 times.
✓ Branch 1 taken 819675 times.
819694 if (dstctx->is_disabled &&
1057
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 10 times.
19 (dstctx->filter->flags & AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC))
1058 9 filter_frame = default_filter_frame;
1059 819694 ret = filter_frame(link, frame);
1060 819694 l->frame_count_out++;
1061 819694 return ret;
1062
1063 fail:
1064 av_frame_free(&frame);
1065 return ret;
1066 }
1067
1068 1720623 int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
1069 {
1070 1720623 FilterLinkInternal * const li = ff_link_internal(link);
1071 int ret;
1072 1720623 FF_TPRINTF_START(NULL, filter_frame); ff_tlog_link(NULL, link, 1); ff_tlog(NULL, " "); tlog_ref(NULL, frame, 1);
1073
1074 /* Consistency checks */
1075
2/2
✓ Branch 0 taken 586270 times.
✓ Branch 1 taken 1134353 times.
1720623 if (link->type == AVMEDIA_TYPE_VIDEO) {
1076
2/2
✓ Branch 0 taken 436098 times.
✓ Branch 1 taken 150172 times.
586270 if (strcmp(link->dst->filter->name, "buffersink") &&
1077
2/2
✓ Branch 0 taken 259854 times.
✓ Branch 1 taken 176244 times.
436098 strcmp(link->dst->filter->name, "format") &&
1078
2/2
✓ Branch 0 taken 259827 times.
✓ Branch 1 taken 27 times.
259854 strcmp(link->dst->filter->name, "idet") &&
1079
2/2
✓ Branch 0 taken 168309 times.
✓ Branch 1 taken 91518 times.
259827 strcmp(link->dst->filter->name, "null") &&
1080
2/2
✓ Branch 0 taken 57726 times.
✓ Branch 1 taken 110583 times.
168309 strcmp(link->dst->filter->name, "scale") &&
1081
1/2
✓ Branch 0 taken 57726 times.
✗ Branch 1 not taken.
57726 strcmp(link->dst->filter->name, "libplacebo") &&
1082
2/2
✓ Branch 0 taken 57603 times.
✓ Branch 1 taken 123 times.
57726 strcmp(link->dst->filter->name, "hqdn3d")) {
1083 av_assert1(frame->format == link->format);
1084 av_assert1(frame->width == link->w);
1085 av_assert1(frame->height == link->h);
1086 57603 if (av_pix_fmt_desc_get(link->format)->flags & AV_PIX_FMT_FLAG_ALPHA)
1087 av_assert1(frame->alpha_mode == link->alpha_mode);
1088 }
1089 } else {
1090
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1134353 times.
1134353 if (frame->format != link->format) {
1091 av_log(link->dst, AV_LOG_ERROR, "Format change is not supported\n");
1092 goto error;
1093 }
1094
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1134353 times.
1134353 if (av_channel_layout_compare(&frame->ch_layout, &link->ch_layout)) {
1095 av_log(link->dst, AV_LOG_ERROR, "Channel layout change is not supported\n");
1096 goto error;
1097 }
1098
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1134353 times.
1134353 if (frame->sample_rate != link->sample_rate) {
1099 av_log(link->dst, AV_LOG_ERROR, "Sample rate change is not supported\n");
1100 goto error;
1101 }
1102
1103 1134353 frame->duration = av_rescale_q(frame->nb_samples, (AVRational){ 1, frame->sample_rate },
1104 link->time_base);
1105 }
1106
1107 1720623 li->frame_blocked_in = li->frame_wanted_out = 0;
1108 1720623 li->l.frame_count_in++;
1109 1720623 li->l.sample_count_in += frame->nb_samples;
1110 1720623 filter_unblock(link->dst);
1111 1720623 ret = ff_framequeue_add(&li->fifo, frame);
1112
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1720623 times.
1720623 if (ret < 0) {
1113 const FFFrameQueueGlobal *global = li->fifo.global;
1114 if (ret == AVERROR(ENOMEM) && global->queued >= global->max_queued)
1115 av_log(link->dst, AV_LOG_ERROR, "Exhausted frame queue capacity (%zu frames)\n", global->max_queued);
1116 av_frame_free(&frame);
1117 return ret;
1118 }
1119 1720623 ff_filter_set_ready(link->dst, 300);
1120 1720623 return 0;
1121
1122 error:
1123 av_frame_free(&frame);
1124 return AVERROR_PATCHWELCOME;
1125 }
1126
1127 2454441 static int samples_ready(FilterLinkInternal *link, unsigned min)
1128 {
1129
2/2
✓ Branch 1 taken 819828 times.
✓ Branch 2 taken 1634613 times.
3274269 return ff_framequeue_queued_frames(&link->fifo) &&
1130
2/2
✓ Branch 1 taken 135 times.
✓ Branch 2 taken 819693 times.
819828 (ff_framequeue_queued_samples(&link->fifo) >= min ||
1131
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 134 times.
135 link->status_in);
1132 }
1133
1134 2933 static int take_samples(FilterLinkInternal *li, unsigned min, unsigned max,
1135 AVFrame **rframe)
1136 {
1137 2933 FilterLink *l = &li->l;
1138 2933 AVFilterLink *link = &l->pub;
1139 AVFrame *frame0, *frame, *buf;
1140 unsigned nb_samples, nb_frames, i, p;
1141 int ret;
1142
1143 /* Note: this function relies on no format changes and must only be
1144 called with enough samples. */
1145 av_assert1(samples_ready(li, l->min_samples));
1146 2933 frame0 = frame = ff_framequeue_peek(&li->fifo, 0);
1147
6/6
✓ Branch 0 taken 1415 times.
✓ Branch 1 taken 1518 times.
✓ Branch 2 taken 1300 times.
✓ Branch 3 taken 115 times.
✓ Branch 4 taken 1024 times.
✓ Branch 5 taken 276 times.
2933 if (!li->fifo.samples_skipped && frame->nb_samples >= min && frame->nb_samples <= max) {
1148 1024 *rframe = ff_framequeue_take(&li->fifo);
1149 1024 return 0;
1150 }
1151 1909 nb_frames = 0;
1152 1909 nb_samples = 0;
1153 while (1) {
1154
2/2
✓ Branch 0 taken 1663 times.
✓ Branch 1 taken 1480 times.
3143 if (nb_samples + frame->nb_samples > max) {
1155
2/2
✓ Branch 0 taken 1521 times.
✓ Branch 1 taken 142 times.
1663 if (nb_samples < min)
1156 1521 nb_samples = max;
1157 1663 break;
1158 }
1159 1480 nb_samples += frame->nb_samples;
1160 1480 nb_frames++;
1161
2/2
✓ Branch 1 taken 246 times.
✓ Branch 2 taken 1234 times.
1480 if (nb_frames == ff_framequeue_queued_frames(&li->fifo))
1162 246 break;
1163 1234 frame = ff_framequeue_peek(&li->fifo, nb_frames);
1164 }
1165
1166 1909 buf = ff_get_audio_buffer(link, nb_samples);
1167
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1909 times.
1909 if (!buf)
1168 return AVERROR(ENOMEM);
1169 1909 ret = av_frame_copy_props(buf, frame0);
1170
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1909 times.
1909 if (ret < 0) {
1171 av_frame_free(&buf);
1172 return ret;
1173 }
1174
1175 1909 p = 0;
1176
2/2
✓ Branch 0 taken 1480 times.
✓ Branch 1 taken 1909 times.
3389 for (i = 0; i < nb_frames; i++) {
1177 1480 frame = ff_framequeue_take(&li->fifo);
1178 1480 av_samples_copy(buf->extended_data, frame->extended_data, p, 0,
1179 1480 frame->nb_samples, link->ch_layout.nb_channels, link->format);
1180 1480 p += frame->nb_samples;
1181 1480 av_frame_free(&frame);
1182 }
1183
2/2
✓ Branch 0 taken 1521 times.
✓ Branch 1 taken 388 times.
1909 if (p < nb_samples) {
1184 1521 unsigned n = nb_samples - p;
1185 1521 frame = ff_framequeue_peek(&li->fifo, 0);
1186 1521 av_samples_copy(buf->extended_data, frame->extended_data, p, 0, n,
1187 1521 link->ch_layout.nb_channels, link->format);
1188 1521 ff_framequeue_skip_samples(&li->fifo, n, link->time_base);
1189 }
1190
1191 1909 *rframe = buf;
1192 1909 return 0;
1193 }
1194
1195 819694 static int filter_frame_to_filter(AVFilterLink *link)
1196 {
1197 819694 FilterLinkInternal * const li = ff_link_internal(link);
1198 819694 AVFrame *frame = NULL;
1199 819694 AVFilterContext *dst = link->dst;
1200 int ret;
1201
1202 av_assert1(ff_framequeue_queued_frames(&li->fifo));
1203 1639388 ret = li->l.min_samples ?
1204
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 819658 times.
819694 ff_inlink_consume_samples(link, li->l.min_samples, li->l.max_samples, &frame) :
1205 819658 ff_inlink_consume_frame(link, &frame);
1206 av_assert1(ret);
1207
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 819694 times.
819694 if (ret < 0) {
1208 av_assert1(!frame);
1209 return ret;
1210 }
1211 /* The filter will soon have received a new frame, that may allow it to
1212 produce one or more: unblock its outputs. */
1213 819694 filter_unblock(dst);
1214 /* AVFilterPad.filter_frame() expect frame_count_out to have the value
1215 before the frame; filter_frame_framed() will re-increment it. */
1216 819694 li->l.frame_count_out--;
1217 819694 ret = filter_frame_framed(link, frame);
1218
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 819694 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
819694 if (ret < 0 && ret != li->status_out) {
1219 link_set_out_status(link, ret, AV_NOPTS_VALUE);
1220 } else {
1221 /* Run once again, to see if several frames were available, or if
1222 the input status has also changed, or any other reason. */
1223 819694 ff_filter_set_ready(dst, 300);
1224 }
1225 819694 return ret;
1226 }
1227
1228 6205 static int forward_status_change(AVFilterContext *filter, FilterLinkInternal *li_in)
1229 {
1230 6205 AVFilterLink *in = &li_in->l.pub;
1231 6205 unsigned out = 0, progress = 0;
1232 int ret;
1233
1234
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6205 times.
6205 av_assert0(!li_in->status_out);
1235
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6204 times.
6205 if (!filter->nb_outputs) {
1236 /* not necessary with the current API and sinks */
1237 1 return 0;
1238 }
1239
2/2
✓ Branch 0 taken 6204 times.
✓ Branch 1 taken 6204 times.
12408 while (!li_in->status_out) {
1240 6204 FilterLinkInternal *li_out = ff_link_internal(filter->outputs[out]);
1241
1242
1/2
✓ Branch 0 taken 6204 times.
✗ Branch 1 not taken.
6204 if (!li_out->status_in) {
1243 6204 progress++;
1244 6204 ret = request_frame_to_filter(filter->outputs[out]);
1245
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6204 times.
6204 if (ret < 0)
1246 return ret;
1247 }
1248
1/2
✓ Branch 0 taken 6204 times.
✗ Branch 1 not taken.
6204 if (++out == filter->nb_outputs) {
1249
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6204 times.
6204 if (!progress) {
1250 /* Every output already closed: input no longer interesting
1251 (example: overlay in shortest mode, other input closed). */
1252 link_set_out_status(in, li_in->status_in, li_in->status_in_pts);
1253 return 0;
1254 }
1255 6204 progress = 0;
1256 6204 out = 0;
1257 }
1258 }
1259 6204 ff_filter_set_ready(filter, 200);
1260 6204 return 0;
1261 }
1262
1263 2461815 static int filter_activate_default(AVFilterContext *filter)
1264 {
1265 unsigned i;
1266 2461815 int nb_eofs = 0;
1267
1268
2/2
✓ Branch 0 taken 2461758 times.
✓ Branch 1 taken 2461815 times.
4923573 for (i = 0; i < filter->nb_outputs; i++)
1269 2461758 nb_eofs += ff_outlink_get_status(filter->outputs[i]) == AVERROR_EOF;
1270
4/4
✓ Branch 0 taken 2461758 times.
✓ Branch 1 taken 57 times.
✓ Branch 2 taken 7106 times.
✓ Branch 3 taken 2454652 times.
2461815 if (filter->nb_outputs && nb_eofs == filter->nb_outputs) {
1271
2/2
✓ Branch 0 taken 7106 times.
✓ Branch 1 taken 7106 times.
14212 for (int j = 0; j < filter->nb_inputs; j++)
1272 7106 ff_inlink_set_status(filter->inputs[j], AVERROR_EOF);
1273 7106 return 0;
1274 }
1275
1276
2/2
✓ Branch 0 taken 2454441 times.
✓ Branch 1 taken 1635015 times.
4089456 for (i = 0; i < filter->nb_inputs; i++) {
1277 2454441 FilterLinkInternal *li = ff_link_internal(filter->inputs[i]);
1278
2/2
✓ Branch 1 taken 819694 times.
✓ Branch 2 taken 1634747 times.
2454441 if (samples_ready(li, li->l.min_samples)) {
1279 819694 return filter_frame_to_filter(filter->inputs[i]);
1280 }
1281 }
1282
2/2
✓ Branch 0 taken 1634747 times.
✓ Branch 1 taken 1628810 times.
3263557 for (i = 0; i < filter->nb_inputs; i++) {
1283 1634747 FilterLinkInternal * const li = ff_link_internal(filter->inputs[i]);
1284
4/4
✓ Branch 0 taken 6236 times.
✓ Branch 1 taken 1628511 times.
✓ Branch 2 taken 6205 times.
✓ Branch 3 taken 31 times.
1634747 if (li->status_in && !li->status_out) {
1285 av_assert1(!ff_framequeue_queued_frames(&li->fifo));
1286 6205 return forward_status_change(filter, li);
1287 }
1288 }
1289
2/2
✓ Branch 0 taken 1628782 times.
✓ Branch 1 taken 819598 times.
2448380 for (i = 0; i < filter->nb_outputs; i++) {
1290 1628782 FilterLinkInternal * const li = ff_link_internal(filter->outputs[i]);
1291
2/2
✓ Branch 0 taken 814231 times.
✓ Branch 1 taken 814551 times.
1628782 if (li->frame_wanted_out &&
1292
2/2
✓ Branch 0 taken 809212 times.
✓ Branch 1 taken 5019 times.
814231 !li->frame_blocked_in) {
1293 809212 return request_frame_to_filter(filter->outputs[i]);
1294 }
1295 }
1296
2/2
✓ Branch 0 taken 819570 times.
✓ Branch 1 taken 814579 times.
1634149 for (i = 0; i < filter->nb_outputs; i++) {
1297 819570 FilterLinkInternal * const li = ff_link_internal(filter->outputs[i]);
1298
2/2
✓ Branch 0 taken 5019 times.
✓ Branch 1 taken 814551 times.
819570 if (li->frame_wanted_out)
1299 5019 return request_frame_to_filter(filter->outputs[i]);
1300 }
1301
2/2
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 814551 times.
814579 if (!filter->nb_outputs) {
1302 28 ff_inlink_request_frame(filter->inputs[0]);
1303 28 return 0;
1304 }
1305 814551 return FFERROR_NOT_READY;
1306 }
1307
1308 /*
1309 Filter scheduling and activation
1310
1311 When a filter is activated, it must:
1312 - if possible, output a frame;
1313 - else, if relevant, forward the input status change;
1314 - else, check outputs for wanted frames and forward the requests.
1315
1316 The following AVFilterLink fields are used for activation:
1317
1318 - frame_wanted_out:
1319
1320 This field indicates if a frame is needed on this input of the
1321 destination filter. A positive value indicates that a frame is needed
1322 to process queued frames or internal data or to satisfy the
1323 application; a zero value indicates that a frame is not especially
1324 needed but could be processed anyway; a negative value indicates that a
1325 frame would just be queued.
1326
1327 It is set by filters using ff_request_frame() or ff_request_no_frame(),
1328 when requested by the application through a specific API or when it is
1329 set on one of the outputs.
1330
1331 It is cleared when a frame is sent from the source using
1332 ff_filter_frame().
1333
1334 It is also cleared when a status change is sent from the source using
1335 ff_avfilter_link_set_in_status().
1336
1337 - frame_blocked_in:
1338
1339 This field means that the source filter can not generate a frame as is.
1340 Its goal is to avoid repeatedly calling the request_frame() method on
1341 the same link.
1342
1343 It is set by the framework on all outputs of a filter before activating it.
1344
1345 It is automatically cleared by ff_filter_frame().
1346
1347 It is also automatically cleared by ff_avfilter_link_set_in_status().
1348
1349 It is also cleared on all outputs (using filter_unblock()) when
1350 something happens on an input: processing a frame or changing the
1351 status.
1352
1353 - fifo:
1354
1355 Contains the frames queued on a filter input. If it contains frames and
1356 frame_wanted_out is not set, then the filter can be activated. If that
1357 result in the filter not able to use these frames, the filter must set
1358 frame_wanted_out to ask for more frames.
1359
1360 - status_in and status_in_pts:
1361
1362 Status (EOF or error code) of the link and timestamp of the status
1363 change (in link time base, same as frames) as seen from the input of
1364 the link. The status change is considered happening after the frames
1365 queued in fifo.
1366
1367 It is set by the source filter using ff_avfilter_link_set_in_status().
1368
1369 - status_out:
1370
1371 Status of the link as seen from the output of the link. The status
1372 change is considered having already happened.
1373
1374 It is set by the destination filter using
1375 link_set_out_status().
1376
1377 Filters are activated according to the ready field, set using the
1378 ff_filter_set_ready(). Eventually, a priority queue will be used.
1379 ff_filter_set_ready() is called whenever anything could cause progress to
1380 be possible. Marking a filter ready when it is not is not a problem,
1381 except for the small overhead it causes.
1382
1383 Conditions that cause a filter to be marked ready are:
1384
1385 - frames added on an input link;
1386
1387 - changes in the input or output status of an input link;
1388
1389 - requests for a frame on an output link;
1390
1391 - after any actual processing using the legacy methods (filter_frame(),
1392 and request_frame() to acknowledge status changes), to run once more
1393 and check if enough input was present for several frames.
1394
1395 Examples of scenarios to consider:
1396
1397 - buffersrc: activate if frame_wanted_out to notify the application;
1398 activate when the application adds a frame to push it immediately.
1399
1400 - testsrc: activate only if frame_wanted_out to produce and push a frame.
1401
1402 - concat (not at stitch points): can process a frame on any output.
1403 Activate if frame_wanted_out on output to forward on the corresponding
1404 input. Activate when a frame is present on input to process it
1405 immediately.
1406
1407 - framesync: needs at least one frame on each input; extra frames on the
1408 wrong input will accumulate. When a frame is first added on one input,
1409 set frame_wanted_out<0 on it to avoid getting more (would trigger
1410 testsrc) and frame_wanted_out>0 on the other to allow processing it.
1411
1412 Activation of old filters:
1413
1414 In order to activate a filter implementing the legacy filter_frame() and
1415 request_frame() methods, perform the first possible of the following
1416 actions:
1417
1418 - If an input has frames in fifo and frame_wanted_out == 0, dequeue a
1419 frame and call filter_frame().
1420
1421 Rationale: filter frames as soon as possible instead of leaving them
1422 queued; frame_wanted_out < 0 is not possible since the old API does not
1423 set it nor provides any similar feedback; frame_wanted_out > 0 happens
1424 when min_samples > 0 and there are not enough samples queued.
1425
1426 - If an input has status_in set but not status_out, try to call
1427 request_frame() on one of the outputs in the hope that it will trigger
1428 request_frame() on the input with status_in and acknowledge it. This is
1429 awkward and fragile, filters with several inputs or outputs should be
1430 updated to direct activation as soon as possible.
1431
1432 - If an output has frame_wanted_out > 0 and not frame_blocked_in, call
1433 request_frame().
1434
1435 Rationale: checking frame_blocked_in is necessary to avoid requesting
1436 repeatedly on a blocked input if another is not blocked (example:
1437 [buffersrc1][testsrc1][buffersrc2][testsrc2]concat=v=2).
1438
1439 - If an output has frame_wanted_out > 0 call request_frame().
1440
1441 Rationale: even if all inputs are blocked an activate callback should
1442 request a frame on some if its inputs if a frame is requested on any of
1443 its output.
1444
1445 - Request a frame on the input for sinks.
1446
1447 Rationale: sinks using the old api have no way to request a frame on their
1448 input, so we need to do it for them.
1449 */
1450
1451 4280906 int ff_filter_activate(AVFilterContext *filter)
1452 {
1453 4280906 FFFilterContext *ctxi = fffilterctx(filter);
1454 4280906 const FFFilter *const fi = fffilter(filter->filter);
1455 int ret;
1456
1457 /* Generic timeline support is not yet implemented but should be easy */
1458 av_assert1(!(fi->p.flags & AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC &&
1459 fi->activate));
1460 4280906 ctxi->ready = 0;
1461
2/2
✓ Branch 0 taken 1819091 times.
✓ Branch 1 taken 2461815 times.
4280906 ret = fi->activate ? fi->activate(filter) : filter_activate_default(filter);
1462
2/2
✓ Branch 0 taken 815427 times.
✓ Branch 1 taken 3465479 times.
4280906 if (ret == FFERROR_NOT_READY)
1463 815427 ret = 0;
1464 4280906 return ret;
1465 }
1466
1467 3856127 int ff_inlink_acknowledge_status(AVFilterLink *link, int *rstatus, int64_t *rpts)
1468 {
1469 3856127 FilterLinkInternal * const li = ff_link_internal(link);
1470 3856127 *rpts = li->l.current_pts;
1471
2/2
✓ Branch 1 taken 2206 times.
✓ Branch 2 taken 3853921 times.
3856127 if (ff_framequeue_queued_frames(&li->fifo))
1472 2206 return *rstatus = 0;
1473
2/2
✓ Branch 0 taken 8053 times.
✓ Branch 1 taken 3845868 times.
3853921 if (li->status_out)
1474 8053 return *rstatus = li->status_out;
1475
2/2
✓ Branch 0 taken 3837747 times.
✓ Branch 1 taken 8121 times.
3845868 if (!li->status_in)
1476 3837747 return *rstatus = 0;
1477 8121 *rstatus = li->status_out = li->status_in;
1478 8121 update_link_current_pts(li, li->status_in_pts);
1479 8121 *rpts = li->l.current_pts;
1480 8121 return 1;
1481 }
1482
1483 1934 size_t ff_inlink_queued_frames(AVFilterLink *link)
1484 {
1485 1934 FilterLinkInternal * const li = ff_link_internal(link);
1486 1934 return ff_framequeue_queued_frames(&li->fifo);
1487 }
1488
1489 5563973 int ff_inlink_check_available_frame(AVFilterLink *link)
1490 {
1491 5563973 FilterLinkInternal * const li = ff_link_internal(link);
1492 5563973 return ff_framequeue_queued_frames(&li->fifo) > 0;
1493 }
1494
1495 8329 int ff_inlink_queued_samples(AVFilterLink *link)
1496 {
1497 8329 FilterLinkInternal * const li = ff_link_internal(link);
1498 8329 return ff_framequeue_queued_samples(&li->fifo);
1499 }
1500
1501 4830 int ff_inlink_check_available_samples(AVFilterLink *link, unsigned min)
1502 {
1503 4830 FilterLinkInternal * const li = ff_link_internal(link);
1504 4830 uint64_t samples = ff_framequeue_queued_samples(&li->fifo);
1505 av_assert1(min);
1506
6/6
✓ Branch 0 taken 1903 times.
✓ Branch 1 taken 2927 times.
✓ Branch 2 taken 66 times.
✓ Branch 3 taken 1837 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 60 times.
4830 return samples >= min || (li->status_in && samples);
1507 }
1508
1509 1718072 static void consume_update(FilterLinkInternal *li, const AVFrame *frame)
1510 {
1511 1718072 AVFilterLink *const link = &li->l.pub;
1512 1718072 update_link_current_pts(li, frame->pts);
1513 1718072 ff_inlink_process_commands(link, frame);
1514
2/2
✓ Branch 0 taken 1715343 times.
✓ Branch 1 taken 2729 times.
1718072 if (link == link->dst->inputs[0])
1515 1715343 link->dst->is_disabled = !evaluate_timeline_at_frame(link, frame);
1516 1718072 li->l.frame_count_out++;
1517 1718072 li->l.sample_count_out += frame->nb_samples;
1518 1718072 }
1519
1520 5561712 int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe)
1521 {
1522 5561712 FilterLinkInternal * const li = ff_link_internal(link);
1523 AVFrame *frame;
1524
1525 5561712 *rframe = NULL;
1526
2/2
✓ Branch 1 taken 3846569 times.
✓ Branch 2 taken 1715143 times.
5561712 if (!ff_inlink_check_available_frame(link))
1527 3846569 return 0;
1528
1529
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1715139 times.
1715143 if (li->fifo.samples_skipped) {
1530 4 frame = ff_framequeue_peek(&li->fifo, 0);
1531 4 return ff_inlink_consume_samples(link, frame->nb_samples, frame->nb_samples, rframe);
1532 }
1533
1534 1715139 frame = ff_framequeue_take(&li->fifo);
1535 1715139 consume_update(li, frame);
1536 1715139 *rframe = frame;
1537 1715139 return 1;
1538 }
1539
1540 4830 int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max,
1541 AVFrame **rframe)
1542 {
1543 4830 FilterLinkInternal * const li = ff_link_internal(link);
1544 AVFrame *frame;
1545 int ret;
1546
1547 av_assert1(min);
1548 4830 *rframe = NULL;
1549
2/2
✓ Branch 1 taken 1897 times.
✓ Branch 2 taken 2933 times.
4830 if (!ff_inlink_check_available_samples(link, min))
1550 1897 return 0;
1551
2/2
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 2905 times.
2933 if (li->status_in)
1552
2/2
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 22 times.
28 min = FFMIN(min, ff_framequeue_queued_samples(&li->fifo));
1553 2933 ret = take_samples(li, min, max, &frame);
1554
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2933 times.
2933 if (ret < 0)
1555 return ret;
1556 2933 consume_update(li, frame);
1557 2933 *rframe = frame;
1558 2933 return 1;
1559 }
1560
1561 210 AVFrame *ff_inlink_peek_frame(AVFilterLink *link, size_t idx)
1562 {
1563 210 FilterLinkInternal * const li = ff_link_internal(link);
1564 210 return ff_framequeue_peek(&li->fifo, idx);
1565 }
1566
1567 5183 int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe)
1568 {
1569 5183 AVFrame *frame = *rframe;
1570 AVFrame *out;
1571 int ret;
1572
1573
2/2
✓ Branch 1 taken 2277 times.
✓ Branch 2 taken 2906 times.
5183 if (av_frame_is_writable(frame))
1574 2277 return 0;
1575 2906 av_log(link->dst, AV_LOG_DEBUG, "Copying data in avfilter.\n");
1576
1577
1/3
✓ Branch 0 taken 2906 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
2906 switch (link->type) {
1578 2906 case AVMEDIA_TYPE_VIDEO:
1579 2906 out = ff_get_video_buffer(link, link->w, link->h);
1580 2906 break;
1581 case AVMEDIA_TYPE_AUDIO:
1582 out = ff_get_audio_buffer(link, frame->nb_samples);
1583 break;
1584 default:
1585 return AVERROR(EINVAL);
1586 }
1587
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2906 times.
2906 if (!out)
1588 return AVERROR(ENOMEM);
1589
1590 2906 ret = av_frame_copy_props(out, frame);
1591
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2906 times.
2906 if (ret < 0) {
1592 av_frame_free(&out);
1593 return ret;
1594 }
1595
1596 2906 ret = av_frame_copy(out, frame);
1597
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2906 times.
2906 if (ret < 0) {
1598 av_frame_free(&out);
1599 return ret;
1600 }
1601
1602 2906 av_frame_free(&frame);
1603 2906 *rframe = out;
1604 2906 return 0;
1605 }
1606
1607 2537766 int ff_inlink_process_commands(AVFilterLink *link, const AVFrame *frame)
1608 {
1609 2537766 FFFilterContext *ctxi = fffilterctx(link->dst);
1610 2537766 AVFilterCommand *cmd = ctxi->command_queue;
1611
1612
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2537766 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
2537766 while(cmd && cmd->time <= frame->pts * av_q2d(link->time_base)){
1613 av_log(link->dst, AV_LOG_DEBUG,
1614 "Processing command time:%f command:%s arg:%s\n",
1615 cmd->time, cmd->command, cmd->arg);
1616 avfilter_process_command(link->dst, cmd->command, cmd->arg, 0, 0, cmd->flags);
1617 command_queue_pop(link->dst);
1618 cmd = ctxi->command_queue;
1619 }
1620 2537766 return 0;
1621 }
1622
1623 905521 void ff_inlink_request_frame(AVFilterLink *link)
1624 {
1625 905521 av_unused FilterLinkInternal *li = ff_link_internal(link);
1626 av_assert1(!li->status_in);
1627 av_assert1(!li->status_out);
1628 905521 li->frame_wanted_out = 1;
1629 905521 ff_filter_set_ready(link->src, 100);
1630 905521 }
1631
1632 11283 void ff_inlink_set_status(AVFilterLink *link, int status)
1633 {
1634 11283 FilterLinkInternal * const li = ff_link_internal(link);
1635
2/2
✓ Branch 0 taken 8746 times.
✓ Branch 1 taken 2537 times.
11283 if (li->status_out)
1636 8746 return;
1637 2537 li->frame_wanted_out = 0;
1638 2537 li->frame_blocked_in = 0;
1639 2537 link_set_out_status(link, status, AV_NOPTS_VALUE);
1640
2/2
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2537 times.
2543 while (ff_framequeue_queued_frames(&li->fifo)) {
1641 6 AVFrame *frame = ff_framequeue_take(&li->fifo);
1642 6 av_frame_free(&frame);
1643 }
1644
2/2
✓ Branch 0 taken 2534 times.
✓ Branch 1 taken 3 times.
2537 if (!li->status_in)
1645 2534 li->status_in = status;
1646 }
1647
1648 4204388 int ff_outlink_get_status(AVFilterLink *link)
1649 {
1650 4204388 FilterLinkInternal * const li = ff_link_internal(link);
1651 4204388 return li->status_in;
1652 }
1653
1654 1776 int ff_inoutlink_check_flow(AVFilterLink *inlink, AVFilterLink *outlink)
1655 {
1656 1776 FilterLinkInternal * const li_in = ff_link_internal(inlink);
1657
2/2
✓ Branch 1 taken 1056 times.
✓ Branch 2 taken 70 times.
2902 return ff_outlink_frame_wanted(outlink) ||
1658
2/2
✓ Branch 0 taken 1126 times.
✓ Branch 1 taken 650 times.
2902 ff_inlink_check_available_frame(inlink) ||
1659
2/2
✓ Branch 0 taken 59 times.
✓ Branch 1 taken 997 times.
1056 li_in->status_out;
1660 }
1661
1662
1663 const AVClass *avfilter_get_class(void)
1664 {
1665 return &avfilter_class;
1666 }
1667
1668 int ff_filter_init_hw_frames(AVFilterContext *avctx, AVFilterLink *link,
1669 int default_pool_size)
1670 {
1671 FilterLink *l = ff_filter_link(link);
1672 AVHWFramesContext *frames;
1673
1674 // Must already be set by caller.
1675 av_assert0(l->hw_frames_ctx);
1676
1677 frames = (AVHWFramesContext*)l->hw_frames_ctx->data;
1678
1679 if (frames->initial_pool_size == 0) {
1680 // Dynamic allocation is necessarily supported.
1681 } else if (avctx->extra_hw_frames >= 0) {
1682 frames->initial_pool_size += avctx->extra_hw_frames;
1683 } else {
1684 frames->initial_pool_size = default_pool_size;
1685 }
1686
1687 return 0;
1688 }
1689
1690 492741 int ff_outlink_frame_wanted(AVFilterLink *link)
1691 {
1692 492741 FilterLinkInternal * const li = ff_link_internal(link);
1693 492741 return li->frame_wanted_out;
1694 }
1695
1696 5102 int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func,
1697 void *arg, int *ret, int nb_jobs)
1698 {
1699 5102 return fffilterctx(ctx)->execute(ctx, func, arg, ret, nb_jobs);
1700 }
1701