FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavfilter/buffersrc.c
Date: 2022-11-26 13:19:19
Exec Total Coverage
Lines: 137 211 64.9%
Branches: 79 168 47.0%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2008 Vitor Sessak
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 /**
22 * @file
23 * memory buffer source filter
24 */
25
26 #include <float.h>
27
28 #include "libavutil/channel_layout.h"
29 #include "libavutil/common.h"
30 #include "libavutil/frame.h"
31 #include "libavutil/imgutils.h"
32 #include "libavutil/internal.h"
33 #include "libavutil/opt.h"
34 #include "libavutil/samplefmt.h"
35 #include "libavutil/timestamp.h"
36 #include "audio.h"
37 #include "avfilter.h"
38 #include "buffersrc.h"
39 #include "formats.h"
40 #include "internal.h"
41 #include "video.h"
42
43 typedef struct BufferSourceContext {
44 const AVClass *class;
45 AVRational time_base; ///< time_base to set in the output link
46 AVRational frame_rate; ///< frame_rate to set in the output link
47 unsigned nb_failed_requests;
48
49 /* video only */
50 int w, h;
51 enum AVPixelFormat pix_fmt;
52 AVRational pixel_aspect;
53 #if FF_API_SWS_PARAM_OPTION
54 char *sws_param;
55 #endif
56
57 AVBufferRef *hw_frames_ctx;
58
59 /* audio only */
60 int sample_rate;
61 enum AVSampleFormat sample_fmt;
62 int channels;
63 char *channel_layout_str;
64 AVChannelLayout ch_layout;
65
66 int eof;
67 } BufferSourceContext;
68
69 #define CHECK_VIDEO_PARAM_CHANGE(s, c, width, height, format, pts)\
70 if (c->w != width || c->h != height || c->pix_fmt != format) {\
71 av_log(s, AV_LOG_INFO, "filter context - w: %d h: %d fmt: %d, incoming frame - w: %d h: %d fmt: %d pts_time: %s\n",\
72 c->w, c->h, c->pix_fmt, width, height, format, av_ts2timestr(pts, &s->outputs[0]->time_base));\
73 av_log(s, AV_LOG_WARNING, "Changing video frame properties on the fly is not supported by all filters.\n");\
74 }
75
76 #define CHECK_AUDIO_PARAM_CHANGE(s, c, srate, layout, format, pts)\
77 if (c->sample_fmt != format || c->sample_rate != srate ||\
78 av_channel_layout_compare(&c->ch_layout, &layout) || c->channels != layout.nb_channels) {\
79 av_log(s, AV_LOG_INFO, "filter context - fmt: %s r: %d layout: %"PRIX64" ch: %d, incoming frame - fmt: %s r: %d layout: %"PRIX64" ch: %d pts_time: %s\n",\
80 av_get_sample_fmt_name(c->sample_fmt), c->sample_rate, c->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ? c->ch_layout.u.mask : 0, c->channels,\
81 av_get_sample_fmt_name(format), srate, layout.order == AV_CHANNEL_ORDER_NATIVE ? layout.u.mask : 0, layout.nb_channels, av_ts2timestr(pts, &s->outputs[0]->time_base));\
82 av_log(s, AV_LOG_ERROR, "Changing audio frame properties on the fly is not supported.\n");\
83 return AVERROR(EINVAL);\
84 }
85
86 5007 AVBufferSrcParameters *av_buffersrc_parameters_alloc(void)
87 {
88 5007 AVBufferSrcParameters *par = av_mallocz(sizeof(*par));
89
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5007 times.
5007 if (!par)
90 return NULL;
91
92 5007 par->format = -1;
93
94 5007 return par;
95 }
96
97 5007 int av_buffersrc_parameters_set(AVFilterContext *ctx, AVBufferSrcParameters *param)
98 {
99 5007 BufferSourceContext *s = ctx->priv;
100
101
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5007 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5007 if (param->time_base.num > 0 && param->time_base.den > 0)
102 s->time_base = param->time_base;
103
104
1/3
✓ Branch 0 taken 5007 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
5007 switch (ctx->filter->outputs[0].type) {
105 5007 case AVMEDIA_TYPE_VIDEO:
106
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5007 times.
5007 if (param->format != AV_PIX_FMT_NONE) {
107 s->pix_fmt = param->format;
108 }
109
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5007 times.
5007 if (param->width > 0)
110 s->w = param->width;
111
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5007 times.
5007 if (param->height > 0)
112 s->h = param->height;
113
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5007 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5007 if (param->sample_aspect_ratio.num > 0 && param->sample_aspect_ratio.den > 0)
114 s->pixel_aspect = param->sample_aspect_ratio;
115
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5007 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5007 if (param->frame_rate.num > 0 && param->frame_rate.den > 0)
116 s->frame_rate = param->frame_rate;
117
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5007 times.
5007 if (param->hw_frames_ctx) {
118 av_buffer_unref(&s->hw_frames_ctx);
119 s->hw_frames_ctx = av_buffer_ref(param->hw_frames_ctx);
120 if (!s->hw_frames_ctx)
121 return AVERROR(ENOMEM);
122 }
123 5007 break;
124 case AVMEDIA_TYPE_AUDIO:
125 if (param->format != AV_SAMPLE_FMT_NONE) {
126 s->sample_fmt = param->format;
127 }
128 if (param->sample_rate > 0)
129 s->sample_rate = param->sample_rate;
130 #if FF_API_OLD_CHANNEL_LAYOUT
131 FF_DISABLE_DEPRECATION_WARNINGS
132 // if the old/new fields are set inconsistently, prefer the old ones
133 if (param->channel_layout && (param->ch_layout.order != AV_CHANNEL_ORDER_NATIVE ||
134 param->ch_layout.u.mask != param->channel_layout)) {
135 av_channel_layout_uninit(&s->ch_layout);
136 av_channel_layout_from_mask(&s->ch_layout, param->channel_layout);
137 FF_ENABLE_DEPRECATION_WARNINGS
138 } else
139 #endif
140 if (param->ch_layout.nb_channels) {
141 int ret = av_channel_layout_copy(&s->ch_layout, &param->ch_layout);
142 if (ret < 0)
143 return ret;
144 }
145 break;
146 default:
147 return AVERROR_BUG;
148 }
149
150 5007 return 0;
151 }
152
153 int attribute_align_arg av_buffersrc_write_frame(AVFilterContext *ctx, const AVFrame *frame)
154 {
155 return av_buffersrc_add_frame_flags(ctx, (AVFrame *)frame,
156 AV_BUFFERSRC_FLAG_KEEP_REF);
157 }
158
159 39 int attribute_align_arg av_buffersrc_add_frame(AVFilterContext *ctx, AVFrame *frame)
160 {
161 39 return av_buffersrc_add_frame_flags(ctx, frame, 0);
162 }
163
164 2804856 static int push_frame(AVFilterGraph *graph)
165 {
166 int ret;
167
168 while (1) {
169 2804856 ret = ff_filter_graph_run_once(graph);
170
2/2
✓ Branch 0 taken 404606 times.
✓ Branch 1 taken 2400250 times.
2804856 if (ret == AVERROR(EAGAIN))
171 404606 break;
172
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2400250 times.
2400250 if (ret < 0)
173 return ret;
174 }
175 404606 return 0;
176 }
177
178 398506 int attribute_align_arg av_buffersrc_add_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags)
179 {
180 398506 BufferSourceContext *s = ctx->priv;
181 AVFrame *copy;
182 int refcounted, ret;
183
184 #if FF_API_OLD_CHANNEL_LAYOUT
185 FF_DISABLE_DEPRECATION_WARNINGS
186
4/4
✓ Branch 0 taken 398501 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 294846 times.
✓ Branch 3 taken 103655 times.
398506 if (frame && frame->channel_layout &&
187
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 294846 times.
294846 av_get_channel_layout_nb_channels(frame->channel_layout) != frame->channels) {
188 av_log(ctx, AV_LOG_ERROR, "Layout indicates a different number of channels than actually present\n");
189 return AVERROR(EINVAL);
190 }
191 FF_ENABLE_DEPRECATION_WARNINGS
192 #endif
193
194 398506 s->nb_failed_requests = 0;
195
196
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 398501 times.
398506 if (!frame)
197 5 return av_buffersrc_close(ctx, AV_NOPTS_VALUE, flags);
198
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 398501 times.
398501 if (s->eof)
199 return AVERROR(EINVAL);
200
201 398501 refcounted = !!frame->buf[0];
202
203
1/2
✓ Branch 0 taken 398501 times.
✗ Branch 1 not taken.
398501 if (!(flags & AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT)) {
204
205
2/3
✓ Branch 0 taken 102778 times.
✓ Branch 1 taken 295723 times.
✗ Branch 2 not taken.
398501 switch (ctx->outputs[0]->type) {
206 102778 case AVMEDIA_TYPE_VIDEO:
207
3/6
✓ Branch 0 taken 102778 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 102778 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 102778 times.
102778 CHECK_VIDEO_PARAM_CHANGE(ctx, s, frame->width, frame->height,
208 frame->format, frame->pts);
209 102778 break;
210 295723 case AVMEDIA_TYPE_AUDIO:
211 /* For layouts unknown on input but known on link after negotiation. */
212 #if FF_API_OLD_CHANNEL_LAYOUT
213 FF_DISABLE_DEPRECATION_WARNINGS
214
2/2
✓ Branch 0 taken 877 times.
✓ Branch 1 taken 294846 times.
295723 if (!frame->channel_layout)
215 877 frame->channel_layout = s->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
216
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 877 times.
877 s->ch_layout.u.mask : 0;
217 FF_ENABLE_DEPRECATION_WARNINGS
218 #endif
219
2/2
✓ Branch 0 taken 901 times.
✓ Branch 1 taken 294822 times.
295723 if (frame->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC) {
220 901 ret = av_channel_layout_copy(&frame->ch_layout, &s->ch_layout);
221
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 901 times.
901 if (ret < 0)
222 return ret;
223 }
224
4/12
✓ Branch 0 taken 295723 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 295723 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 295723 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 295723 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
295723 CHECK_AUDIO_PARAM_CHANGE(ctx, s, frame->sample_rate, frame->ch_layout,
225 frame->format, frame->pts);
226 295723 break;
227 default:
228 return AVERROR(EINVAL);
229 }
230
231 }
232
233
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 398501 times.
398501 if (!(copy = av_frame_alloc()))
234 return AVERROR(ENOMEM);
235
236
3/4
✓ Branch 0 taken 398501 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 396767 times.
✓ Branch 3 taken 1734 times.
398501 if (refcounted && !(flags & AV_BUFFERSRC_FLAG_KEEP_REF)) {
237 396767 av_frame_move_ref(copy, frame);
238 } else {
239 1734 ret = av_frame_ref(copy, frame);
240
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1734 times.
1734 if (ret < 0) {
241 av_frame_free(&copy);
242 return ret;
243 }
244 }
245
246 #if FF_API_PKT_DURATION
247 FF_DISABLE_DEPRECATION_WARNINGS
248
3/4
✓ Branch 0 taken 389275 times.
✓ Branch 1 taken 9226 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 389275 times.
398501 if (copy->pkt_duration && copy->pkt_duration != copy->duration)
249 copy->duration = copy->pkt_duration;
250 FF_ENABLE_DEPRECATION_WARNINGS
251 #endif
252
253 398501 ret = ff_filter_frame(ctx->outputs[0], copy);
254
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 398501 times.
398501 if (ret < 0)
255 return ret;
256
257
2/2
✓ Branch 0 taken 398467 times.
✓ Branch 1 taken 34 times.
398501 if ((flags & AV_BUFFERSRC_FLAG_PUSH)) {
258 398467 ret = push_frame(ctx->graph);
259
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 398467 times.
398467 if (ret < 0)
260 return ret;
261 }
262
263 398501 return 0;
264 }
265
266 6144 int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, unsigned flags)
267 {
268 6144 BufferSourceContext *s = ctx->priv;
269
270 6144 s->eof = 1;
271 6144 ff_avfilter_link_set_in_status(ctx->outputs[0], AVERROR_EOF, pts);
272
2/2
✓ Branch 0 taken 6139 times.
✓ Branch 1 taken 5 times.
6144 return (flags & AV_BUFFERSRC_FLAG_PUSH) ? push_frame(ctx->graph) : 0;
273 }
274
275 5007 static av_cold int init_video(AVFilterContext *ctx)
276 {
277 5007 BufferSourceContext *c = ctx->priv;
278
279
4/8
✓ Branch 0 taken 5007 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5007 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5007 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 5007 times.
10014 if (c->pix_fmt == AV_PIX_FMT_NONE || !c->w || !c->h ||
280 5007 av_q2d(c->time_base) <= 0) {
281 av_log(ctx, AV_LOG_ERROR, "Invalid parameters provided.\n");
282 return AVERROR(EINVAL);
283 }
284
285 5007 av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d pixfmt:%s tb:%d/%d fr:%d/%d sar:%d/%d\n",
286 c->w, c->h, av_get_pix_fmt_name(c->pix_fmt),
287 c->time_base.num, c->time_base.den, c->frame_rate.num, c->frame_rate.den,
288 c->pixel_aspect.num, c->pixel_aspect.den);
289
290 #if FF_API_SWS_PARAM_OPTION
291
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5007 times.
5007 if (c->sws_param)
292 av_log(ctx, AV_LOG_WARNING, "sws_param option is deprecated and ignored\n");
293 #endif
294
295 5007 return 0;
296 }
297
298 384033 unsigned av_buffersrc_get_nb_failed_requests(AVFilterContext *buffer_src)
299 {
300 384033 return ((BufferSourceContext *)buffer_src->priv)->nb_failed_requests;
301 }
302
303 #define OFFSET(x) offsetof(BufferSourceContext, x)
304 #define A AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_AUDIO_PARAM
305 #define V AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
306
307 static const AVOption buffer_options[] = {
308 { "width", NULL, OFFSET(w), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, V },
309 { "video_size", NULL, OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, .flags = V },
310 { "height", NULL, OFFSET(h), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, V },
311 { "pix_fmt", NULL, OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, { .i64 = AV_PIX_FMT_NONE }, .min = AV_PIX_FMT_NONE, .max = INT_MAX, .flags = V },
312 { "sar", "sample aspect ratio", OFFSET(pixel_aspect), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
313 { "pixel_aspect", "sample aspect ratio", OFFSET(pixel_aspect), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
314 { "time_base", NULL, OFFSET(time_base), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
315 { "frame_rate", NULL, OFFSET(frame_rate), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
316 #if FF_API_SWS_PARAM_OPTION
317 { "sws_param", NULL, OFFSET(sws_param), AV_OPT_TYPE_STRING, .flags = V },
318 #endif
319 { NULL },
320 };
321
322 AVFILTER_DEFINE_CLASS(buffer);
323
324 static const AVOption abuffer_options[] = {
325 { "time_base", NULL, OFFSET(time_base), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, INT_MAX, A },
326 { "sample_rate", NULL, OFFSET(sample_rate), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, A },
327 { "sample_fmt", NULL, OFFSET(sample_fmt), AV_OPT_TYPE_SAMPLE_FMT, { .i64 = AV_SAMPLE_FMT_NONE }, .min = AV_SAMPLE_FMT_NONE, .max = INT_MAX, .flags = A },
328 { "channel_layout", NULL, OFFSET(channel_layout_str), AV_OPT_TYPE_STRING, .flags = A },
329 { "channels", NULL, OFFSET(channels), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, A },
330 { NULL },
331 };
332
333 AVFILTER_DEFINE_CLASS(abuffer);
334
335 1186 static av_cold int init_audio(AVFilterContext *ctx)
336 {
337 1186 BufferSourceContext *s = ctx->priv;
338 char buf[128];
339 1186 int ret = 0;
340
341
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1186 times.
1186 if (s->sample_fmt == AV_SAMPLE_FMT_NONE) {
342 av_log(ctx, AV_LOG_ERROR, "Sample format was not set or was invalid\n");
343 return AVERROR(EINVAL);
344 }
345
346
3/4
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 1175 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 11 times.
1186 if (s->channel_layout_str || s->ch_layout.nb_channels) {
347 int n;
348
349
1/2
✓ Branch 0 taken 1175 times.
✗ Branch 1 not taken.
1175 if (!s->ch_layout.nb_channels) {
350 1175 ret = av_channel_layout_from_string(&s->ch_layout, s->channel_layout_str);
351
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1175 times.
1175 if (ret < 0) {
352 #if FF_API_OLD_CHANNEL_LAYOUT
353 uint64_t mask;
354 FF_DISABLE_DEPRECATION_WARNINGS
355 mask = av_get_channel_layout(s->channel_layout_str);
356 if (!mask) {
357 #endif
358 av_log(ctx, AV_LOG_ERROR, "Invalid channel layout %s.\n",
359 s->channel_layout_str);
360 return AVERROR(EINVAL);
361 #if FF_API_OLD_CHANNEL_LAYOUT
362 }
363 FF_ENABLE_DEPRECATION_WARNINGS
364 av_log(ctx, AV_LOG_WARNING, "Channel layout '%s' uses a deprecated syntax.\n",
365 s->channel_layout_str);
366 av_channel_layout_from_mask(&s->ch_layout, mask);
367 #endif
368 }
369 }
370
371 1175 n = s->ch_layout.nb_channels;
372 1175 av_channel_layout_describe(&s->ch_layout, buf, sizeof(buf));
373
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1175 times.
1175 if (s->channels) {
374 if (n != s->channels) {
375 av_log(ctx, AV_LOG_ERROR,
376 "Mismatching channel count %d and layout '%s' "
377 "(%d channels)\n",
378 s->channels, buf, n);
379 return AVERROR(EINVAL);
380 }
381 }
382 1175 s->channels = n;
383
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
11 } else if (!s->channels) {
384 av_log(ctx, AV_LOG_ERROR, "Neither number of channels nor "
385 "channel layout specified\n");
386 return AVERROR(EINVAL);
387 } else {
388 11 s->ch_layout = FF_COUNT2LAYOUT(s->channels);
389 11 av_channel_layout_describe(&s->ch_layout, buf, sizeof(buf));
390 }
391
392
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1186 times.
1186 if (!s->time_base.num)
393 s->time_base = (AVRational){1, s->sample_rate};
394
395 1186 av_log(ctx, AV_LOG_VERBOSE,
396 "tb:%d/%d samplefmt:%s samplerate:%d chlayout:%s\n",
397 s->time_base.num, s->time_base.den, av_get_sample_fmt_name(s->sample_fmt),
398 s->sample_rate, buf);
399
400 1186 return ret;
401 }
402
403 6193 static av_cold void uninit(AVFilterContext *ctx)
404 {
405 6193 BufferSourceContext *s = ctx->priv;
406 6193 av_buffer_unref(&s->hw_frames_ctx);
407 6193 av_channel_layout_uninit(&s->ch_layout);
408 6193 }
409
410 6193 static int query_formats(AVFilterContext *ctx)
411 {
412 6193 BufferSourceContext *c = ctx->priv;
413 6193 AVFilterChannelLayouts *channel_layouts = NULL;
414 6193 AVFilterFormats *formats = NULL;
415 6193 AVFilterFormats *samplerates = NULL;
416 int ret;
417
418
2/3
✓ Branch 0 taken 5007 times.
✓ Branch 1 taken 1186 times.
✗ Branch 2 not taken.
6193 switch (ctx->outputs[0]->type) {
419 5007 case AVMEDIA_TYPE_VIDEO:
420
2/4
✓ Branch 1 taken 5007 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 5007 times.
10014 if ((ret = ff_add_format (&formats, c->pix_fmt)) < 0 ||
421 5007 (ret = ff_set_common_formats (ctx , formats )) < 0)
422 return ret;
423 5007 break;
424 1186 case AVMEDIA_TYPE_AUDIO:
425
2/4
✓ Branch 1 taken 1186 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1186 times.
✗ Branch 4 not taken.
2372 if ((ret = ff_add_format (&formats , c->sample_fmt )) < 0 ||
426
1/2
✓ Branch 1 taken 1186 times.
✗ Branch 2 not taken.
2372 (ret = ff_set_common_formats (ctx , formats )) < 0 ||
427
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1186 times.
2372 (ret = ff_add_format (&samplerates, c->sample_rate)) < 0 ||
428 1186 (ret = ff_set_common_samplerates (ctx , samplerates )) < 0)
429 return ret;
430
431
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1186 times.
1186 if ((ret = ff_add_channel_layout(&channel_layouts, &c->ch_layout)) < 0)
432 return ret;
433
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1186 times.
1186 if ((ret = ff_set_common_channel_layouts(ctx, channel_layouts)) < 0)
434 return ret;
435 1186 break;
436 default:
437 return AVERROR(EINVAL);
438 }
439
440 6193 return 0;
441 }
442
443 6193 static int config_props(AVFilterLink *link)
444 {
445 6193 BufferSourceContext *c = link->src->priv;
446
447
2/3
✓ Branch 0 taken 5007 times.
✓ Branch 1 taken 1186 times.
✗ Branch 2 not taken.
6193 switch (link->type) {
448 5007 case AVMEDIA_TYPE_VIDEO:
449 5007 link->w = c->w;
450 5007 link->h = c->h;
451 5007 link->sample_aspect_ratio = c->pixel_aspect;
452
453
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5007 times.
5007 if (c->hw_frames_ctx) {
454 link->hw_frames_ctx = av_buffer_ref(c->hw_frames_ctx);
455 if (!link->hw_frames_ctx)
456 return AVERROR(ENOMEM);
457 }
458 5007 break;
459 1186 case AVMEDIA_TYPE_AUDIO:
460
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1186 times.
1186 if (!c->ch_layout.nb_channels) {
461 int ret = av_channel_layout_copy(&c->ch_layout, &link->ch_layout);
462 if (ret < 0)
463 return ret;
464 }
465 1186 break;
466 default:
467 return AVERROR(EINVAL);
468 }
469
470 6193 link->time_base = c->time_base;
471 6193 link->frame_rate = c->frame_rate;
472 6193 return 0;
473 }
474
475 364506 static int request_frame(AVFilterLink *link)
476 {
477 364506 BufferSourceContext *c = link->src->priv;
478
479
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 364506 times.
364506 if (c->eof)
480 return AVERROR_EOF;
481 364506 c->nb_failed_requests++;
482 364506 return AVERROR(EAGAIN);
483 }
484
485 static const AVFilterPad avfilter_vsrc_buffer_outputs[] = {
486 {
487 .name = "default",
488 .type = AVMEDIA_TYPE_VIDEO,
489 .request_frame = request_frame,
490 .config_props = config_props,
491 },
492 };
493
494 const AVFilter ff_vsrc_buffer = {
495 .name = "buffer",
496 .description = NULL_IF_CONFIG_SMALL("Buffer video frames, and make them accessible to the filterchain."),
497 .priv_size = sizeof(BufferSourceContext),
498
499 .init = init_video,
500 .uninit = uninit,
501
502 .inputs = NULL,
503 FILTER_OUTPUTS(avfilter_vsrc_buffer_outputs),
504 FILTER_QUERY_FUNC(query_formats),
505 .priv_class = &buffer_class,
506 };
507
508 static const AVFilterPad avfilter_asrc_abuffer_outputs[] = {
509 {
510 .name = "default",
511 .type = AVMEDIA_TYPE_AUDIO,
512 .request_frame = request_frame,
513 .config_props = config_props,
514 },
515 };
516
517 const AVFilter ff_asrc_abuffer = {
518 .name = "abuffer",
519 .description = NULL_IF_CONFIG_SMALL("Buffer audio frames, and make them accessible to the filterchain."),
520 .priv_size = sizeof(BufferSourceContext),
521
522 .init = init_audio,
523 .uninit = uninit,
524
525 .inputs = NULL,
526 FILTER_OUTPUTS(avfilter_asrc_abuffer_outputs),
527 FILTER_QUERY_FUNC(query_formats),
528 .priv_class = &abuffer_class,
529 };
530