FFmpeg
Data Structures | Macros | Functions | Variables
buffersrc.c File Reference

memory buffer source filter More...

#include <float.h>
#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/fifo.h"
#include "libavutil/frame.h"
#include "libavutil/imgutils.h"
#include "libavutil/internal.h"
#include "libavutil/opt.h"
#include "libavutil/samplefmt.h"
#include "libavutil/timestamp.h"
#include "audio.h"
#include "avfilter.h"
#include "buffersrc.h"
#include "formats.h"
#include "internal.h"
#include "video.h"

Go to the source code of this file.

Data Structures

struct  BufferSourceContext
 

Macros

#define CHECK_VIDEO_PARAM_CHANGE(s, c, width, height, format, pts)
 
#define CHECK_AUDIO_PARAM_CHANGE(s, c, srate, ch_layout, ch_count, format, pts)
 
#define OFFSET(x)   offsetof(BufferSourceContext, x)
 
#define A   AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_AUDIO_PARAM
 
#define V   AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
 

Functions

AVBufferSrcParametersav_buffersrc_parameters_alloc (void)
 Allocate a new AVBufferSrcParameters instance. More...
 
int av_buffersrc_parameters_set (AVFilterContext *ctx, AVBufferSrcParameters *param)
 Initialize the buffersrc or abuffersrc filter with the provided parameters. More...
 
int attribute_align_arg av_buffersrc_write_frame (AVFilterContext *ctx, const AVFrame *frame)
 Add a frame to the buffer source. More...
 
int attribute_align_arg av_buffersrc_add_frame (AVFilterContext *ctx, AVFrame *frame)
 Add a frame to the buffer source. More...
 
static int av_buffersrc_add_frame_internal (AVFilterContext *ctx, AVFrame *frame, int flags)
 
int attribute_align_arg av_buffersrc_add_frame_flags (AVFilterContext *ctx, AVFrame *frame, int flags)
 Add a frame to the buffer source. More...
 
static int push_frame (AVFilterGraph *graph)
 
int av_buffersrc_close (AVFilterContext *ctx, int64_t pts, unsigned flags)
 Close the buffer source after EOF. More...
 
static av_cold int init_video (AVFilterContext *ctx)
 
unsigned av_buffersrc_get_nb_failed_requests (AVFilterContext *buffer_src)
 Get the number of failed requests. More...
 
 AVFILTER_DEFINE_CLASS (buffer)
 
 AVFILTER_DEFINE_CLASS (abuffer)
 
static av_cold int init_audio (AVFilterContext *ctx)
 
static av_cold void uninit (AVFilterContext *ctx)
 
static int query_formats (AVFilterContext *ctx)
 
static int config_props (AVFilterLink *link)
 
static int request_frame (AVFilterLink *link)
 
static int poll_frame (AVFilterLink *link)
 

Variables

static const AVOption buffer_options []
 
static const AVOption abuffer_options []
 
static const AVFilterPad avfilter_vsrc_buffer_outputs []
 
AVFilter ff_vsrc_buffer
 
static const AVFilterPad avfilter_asrc_abuffer_outputs []
 
AVFilter ff_asrc_abuffer
 

Detailed Description

memory buffer source filter

Definition in file buffersrc.c.

Macro Definition Documentation

#define CHECK_VIDEO_PARAM_CHANGE (   s,
  c,
  width,
  height,
  format,
  pts 
)
Value:
if (c->w != width || c->h != height || c->pix_fmt != format) {\
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",\
c->w, c->h, c->pix_fmt, width, height, format, av_ts2timestr(pts, &s->outputs[0]->time_base));\
av_log(s, AV_LOG_WARNING, "Changing video frame properties on the fly is not supported by all filters.\n");\
}
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate.The lists are not just lists
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
#define height
#define av_log(a,...)
#define av_ts2timestr(ts, tb)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: timestamp.h:76
#define width
#define s(width, name)
Definition: cbs_vp9.c:257
#define AV_LOG_INFO
Standard information.
Definition: log.h:187
static int64_t pts

Definition at line 71 of file buffersrc.c.

Referenced by av_buffersrc_add_frame_internal().

#define CHECK_AUDIO_PARAM_CHANGE (   s,
  c,
  srate,
  ch_layout,
  ch_count,
  format,
  pts 
)
Value:
if (c->sample_fmt != format || c->sample_rate != srate ||\
c->channel_layout != ch_layout || c->channels != ch_count) {\
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",\
av_get_sample_fmt_name(c->sample_fmt), c->sample_rate, c->channel_layout, c->channels,\
av_get_sample_fmt_name(format), srate, ch_layout, ch_count, av_ts2timestr(pts, &s->outputs[0]->time_base));\
av_log(s, AV_LOG_ERROR, "Changing audio frame properties on the fly is not supported.\n");\
return AVERROR(EINVAL);\
}
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate.The lists are not just lists
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
#define av_log(a,...)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
#define av_ts2timestr(ts, tb)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: timestamp.h:76
const char * av_get_sample_fmt_name(enum AVSampleFormat sample_fmt)
Return the name of sample_fmt, or NULL if sample_fmt is not recognized.
Definition: samplefmt.c:49
#define s(width, name)
Definition: cbs_vp9.c:257
#define AV_LOG_INFO
Standard information.
Definition: log.h:187
static int64_t pts
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a it should return
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions

Definition at line 78 of file buffersrc.c.

Referenced by av_buffersrc_add_frame_internal().

#define OFFSET (   x)    offsetof(BufferSourceContext, x)

Definition at line 304 of file buffersrc.c.

Definition at line 305 of file buffersrc.c.

Definition at line 306 of file buffersrc.c.

Function Documentation

static int av_buffersrc_add_frame_internal ( AVFilterContext ctx,
AVFrame frame,
int  flags 
)
static

Definition at line 196 of file buffersrc.c.

Referenced by av_buffersrc_add_frame(), and av_buffersrc_add_frame_flags().

static int push_frame ( AVFilterGraph graph)
static

Definition at line 182 of file buffersrc.c.

Referenced by av_buffersrc_add_frame_internal(), and av_buffersrc_close().

static av_cold int init_video ( AVFilterContext ctx)
static

Definition at line 278 of file buffersrc.c.

AVFILTER_DEFINE_CLASS ( buffer  )
AVFILTER_DEFINE_CLASS ( abuffer  )
static av_cold int init_audio ( AVFilterContext ctx)
static

Definition at line 334 of file buffersrc.c.

static av_cold void uninit ( AVFilterContext ctx)
static

Definition at line 387 of file buffersrc.c.

static int query_formats ( AVFilterContext ctx)
static

Definition at line 399 of file buffersrc.c.

static int config_props ( AVFilterLink link)
static

Definition at line 434 of file buffersrc.c.

static int request_frame ( AVFilterLink link)
static

Definition at line 463 of file buffersrc.c.

static int poll_frame ( AVFilterLink link)
static

Definition at line 482 of file buffersrc.c.

Variable Documentation

const AVOption buffer_options[]
static
Initial value:
= {
{ "width", NULL, OFFSET(w), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, V },
{ "video_size", NULL, OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE, .flags = V },
{ "height", NULL, OFFSET(h), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, V },
{ "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 },
{ "sar", "sample aspect ratio", OFFSET(pixel_aspect), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
{ "pixel_aspect", "sample aspect ratio", OFFSET(pixel_aspect), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
{ "time_base", NULL, OFFSET(time_base), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
{ "frame_rate", NULL, OFFSET(frame_rate), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, V },
{ "sws_param", NULL, OFFSET(sws_param), AV_OPT_TYPE_STRING, .flags = V },
{ NULL },
}
#define NULL
Definition: coverity.c:32
static enum AVPixelFormat pix_fmt
#define OFFSET(x)
Definition: buffersrc.c:304
uint8_t w
Definition: llviddspenc.c:38
#define V
Definition: buffersrc.c:306
offset must point to two consecutive integers
Definition: opt.h:233

Definition at line 308 of file buffersrc.c.

const AVOption abuffer_options[]
static
Initial value:
= {
{ "time_base", NULL, OFFSET(time_base), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, INT_MAX, A },
{ "sample_rate", NULL, OFFSET(sample_rate), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, A },
{ "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 },
{ "channel_layout", NULL, OFFSET(channel_layout_str), AV_OPT_TYPE_STRING, .flags = A },
{ "channels", NULL, OFFSET(channels), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, A },
{ NULL },
}
#define NULL
Definition: coverity.c:32
channels
Definition: aptx.c:30
#define OFFSET(x)
Definition: buffersrc.c:304
#define A
Definition: buffersrc.c:305
sample_rate

Definition at line 323 of file buffersrc.c.

const AVFilterPad avfilter_vsrc_buffer_outputs[]
static
Initial value:
= {
{
.name = "default",
.request_frame = request_frame,
.poll_frame = poll_frame,
.config_props = config_props,
},
{ NULL }
}
#define NULL
Definition: coverity.c:32
static int poll_frame(AVFilterLink *link)
Definition: buffersrc.c:482
static int request_frame(AVFilterLink *link)
Definition: buffersrc.c:463
static int config_props(AVFilterLink *link)
Definition: buffersrc.c:434

Definition at line 491 of file buffersrc.c.

AVFilter ff_vsrc_buffer
Initial value:
= {
.name = "buffer",
.description = NULL_IF_CONFIG_SMALL("Buffer video frames, and make them accessible to the filterchain."),
.priv_size = sizeof(BufferSourceContext),
.priv_class = &buffer_class,
}
#define NULL
Definition: coverity.c:32
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static av_cold int init_video(AVFilterContext *ctx)
Definition: buffersrc.c:278
static const AVFilterPad avfilter_vsrc_buffer_outputs[]
Definition: buffersrc.c:491
static av_cold void uninit(AVFilterContext *ctx)
Definition: buffersrc.c:387
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
static const AVFilterPad outputs[]
Definition: af_acontrast.c:203
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several inputs
static int query_formats(AVFilterContext *ctx)
Definition: buffersrc.c:399

Definition at line 502 of file buffersrc.c.

const AVFilterPad avfilter_asrc_abuffer_outputs[]
static
Initial value:
= {
{
.name = "default",
.request_frame = request_frame,
.poll_frame = poll_frame,
.config_props = config_props,
},
{ NULL }
}
#define NULL
Definition: coverity.c:32
static int poll_frame(AVFilterLink *link)
Definition: buffersrc.c:482
static int request_frame(AVFilterLink *link)
Definition: buffersrc.c:463
static int config_props(AVFilterLink *link)
Definition: buffersrc.c:434

Definition at line 516 of file buffersrc.c.

AVFilter ff_asrc_abuffer
Initial value:
= {
.name = "abuffer",
.description = NULL_IF_CONFIG_SMALL("Buffer audio frames, and make them accessible to the filterchain."),
.priv_size = sizeof(BufferSourceContext),
.priv_class = &abuffer_class,
}
#define NULL
Definition: coverity.c:32
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static av_cold void uninit(AVFilterContext *ctx)
Definition: buffersrc.c:387
static const AVFilterPad avfilter_asrc_abuffer_outputs[]
Definition: buffersrc.c:516
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
static av_cold int init_audio(AVFilterContext *ctx)
Definition: buffersrc.c:334
static const AVFilterPad outputs[]
Definition: af_acontrast.c:203
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several inputs
static int query_formats(AVFilterContext *ctx)
Definition: buffersrc.c:399

Definition at line 527 of file buffersrc.c.