Go to the documentation of this file.
44 #define OFFSET(x) offsetof(AVFilterGraph, x)
45 #define F AV_OPT_FLAG_FILTERING_PARAM
46 #define V AV_OPT_FLAG_VIDEO_PARAM
47 #define A AV_OPT_FLAG_AUDIO_PARAM
53 { .i64 = 0 }, 0, INT_MAX,
F|
V|
A, .unit =
"threads"},
54 {
"auto",
"autodetect a suitable number of threads to use", 0,
AV_OPT_TYPE_CONST, {.i64 = 0 }, .flags =
F|
V|
A, .unit =
"threads"},
55 {
"scale_sws_opts" ,
"default scale filter options" ,
OFFSET(scale_sws_opts) ,
57 {
"aresample_swr_opts" ,
"default aresample filter options" ,
OFFSET(aresample_swr_opts) ,
59 {
"max_buffered_frames" ,
"maximum number of buffered frames allowed",
OFFSET(max_buffered_frames),
110 for (j = 0; j<
filter->nb_outputs; j++)
141 const char *
name,
const char *args,
void *opaque,
219 for (j = 0; j <
filt->nb_inputs; j++) {
220 if (!
filt->inputs[j] || !
filt->inputs[j]->src) {
221 pad = &
filt->input_pads[j];
223 "Input pad \"%s\" with type %s of the filter instance \"%s\" of %s not connected to any source\n",
229 for (j = 0; j <
filt->nb_outputs; j++) {
230 if (!
filt->outputs[j] || !
filt->outputs[j]->dst) {
231 pad = &
filt->output_pads[j];
233 "Output pad \"%s\" with type %s of the filter instance \"%s\" of %s not connected to any destination\n",
256 if (!
filt->nb_outputs) {
274 for (j = 0; j <
f->nb_outputs; j++) {
301 switch (
link->type) {
334 for (
i = 0;
i <
ctx->nb_inputs;
i++) {
339 for (
i = 0;
i <
ctx->nb_outputs;
i++) {
370 cfg_in =
ctx->nb_inputs ? cfg_in_stack :
NULL;
372 for (
unsigned i = 0;
i <
ctx->nb_inputs;
i++) {
374 cfg_in[
i] = &
l->outcfg;
383 cfg_out = cfg_out_dyn;
385 cfg_out =
ctx->nb_outputs ? cfg_out_stack :
NULL;
387 for (
unsigned i = 0;
i <
ctx->nb_outputs;
i++) {
389 cfg_out[
i] = &
l->incfg;
392 ret =
filter->formats.query_func2(
ctx, cfg_in, cfg_out);
417 for (
i = 0;
i <
f->nb_inputs;
i++) {
418 if (!
f->inputs[
i]->outcfg.formats)
421 !(
f->inputs[
i]->outcfg.color_ranges &&
422 f->inputs[
i]->outcfg.color_spaces &&
423 f->inputs[
i]->outcfg.alpha_modes))
426 !(
f->inputs[
i]->outcfg.samplerates &&
427 f->inputs[
i]->outcfg.channel_layouts))
430 for (
i = 0;
i <
f->nb_outputs;
i++) {
431 if (!
f->outputs[
i]->incfg.formats)
434 !(
f->outputs[
i]->incfg.color_ranges &&
435 f->outputs[
i]->incfg.color_spaces &&
436 f->outputs[
i]->incfg.alpha_modes))
439 !(
f->outputs[
i]->incfg.samplerates &&
440 f->outputs[
i]->incfg.channel_layouts))
447 const AVFilterFormatsMerger *mergers[],
456 av_log(log_ctx,
level,
"Link '%s.%s' -> '%s.%s':\n",
457 l->src->name,
l->srcpad->name,
l->dst->name,
l->dstpad->name);
459 for (
unsigned i = 0;
i < nb_mergers;
i++) {
460 const AVFilterFormatsMerger *m = mergers[
i];
462 m->print_list(&bp,
FF_FIELD_AT(
void *, m->offset,
l->incfg));
467 m->print_list(&bp,
FF_FIELD_AT(
void *, m->offset,
l->outcfg));
484 av_log(log_ctx,
level,
"Filter '%s' formats:\n",
f->name);
485 for (
int i = 0;
i <
f->nb_inputs;
i++) {
488 av_log(log_ctx,
level,
" in[%d] '%s':",
i,
f->input_pads[
i].name);
491 const AVFilterFormatsMerger *m = &neg->
mergers[
i];
494 av_log(log_ctx,
level,
" %s: %s", m->name, bp.str);
499 for (
int i = 0;
i <
f->nb_outputs;
i++) {
502 av_log(log_ctx,
level,
" out[%d] '%s':",
i,
f->output_pads[
i].name);
505 const AVFilterFormatsMerger *m = &neg->
mergers[
i];
508 av_log(log_ctx,
level,
" %s: %s", m->name, bp.str);
529 int converter_count = 0;
530 int count_queried = 0;
531 int count_merged = 0;
532 int count_already_merged = 0;
533 int count_delayed = 0;
554 for (j = 0; j <
filter->nb_inputs; j++) {
558 const AVFilterFormatsMerger *mergers[4];
559 const char *conv_filters[4], *conv_opts[4] = {0};
560 unsigned neg_step, num_conv = 0, num_mergers = 0;
567 for (neg_step = 0; neg_step < neg->
nb_mergers; neg_step++) {
568 const AVFilterFormatsMerger *m = &neg->
mergers[neg_step];
571 if (
a &&
b &&
a !=
b && !m->can_merge(
a,
b)) {
572 for (k = 0; k < num_conv; k++) {
573 if (conv_filters[k] == m->conversion_filter)
578 conv_filters[num_conv] = m->conversion_filter;
579 if (m->conversion_opts_offset)
580 conv_opts[num_conv] =
FF_FIELD_AT(
char *, m->conversion_opts_offset, *graph);
584 mergers[num_mergers++] = m;
587 for (neg_step = 0; neg_step < neg->
nb_mergers; neg_step++) {
588 const AVFilterFormatsMerger *m = &neg->
mergers[neg_step];
594 count_already_merged++;
595 }
else if (!num_conv) {
597 ret = m->merge(
a,
b);
601 mergers[num_mergers++] = m;
602 conv_filters[num_conv] = m->conversion_filter;
603 if (m->conversion_opts_offset)
604 conv_opts[num_conv] =
FF_FIELD_AT(
char *, m->conversion_opts_offset, *graph);
615 for (k = num_conv - 1; k >= 0; k--) {
621 "The filters '%s' and '%s' do not have a common format "
622 "and automatic conversion is disabled.\n",
630 "'%s' filter not present, cannot convert formats.\n",
635 snprintf(inst_name,
sizeof(inst_name),
"auto_%s_%d",
636 conv_filters[k], converter_count++);
638 conv_opts[k],
NULL, graph);
649 for (k = 0; k < num_conv; k++) {
659 av_assert0(outlink-> incfg.color_spaces->refcount > 0);
663 av_assert0(outlink-> incfg.color_ranges->refcount > 0);
667 av_assert0(outlink-> incfg.alpha_modes->refcount > 0);
672 av_assert0(outlink-> incfg.samplerates->refcount > 0);
676 av_assert0(outlink-> incfg.channel_layouts->refcount > 0);
680 #define MERGE(merger, link) \
681 ((merger)->merge(FF_FIELD_AT(void *, (merger)->offset, (link)->incfg), \
682 FF_FIELD_AT(void *, (merger)->offset, (link)->outcfg)))
684 for (neg_step = 0; neg_step < neg->
nb_mergers; neg_step++) {
685 const AVFilterFormatsMerger *m = &neg->
mergers[neg_step];
686 if (m->conversion_filter != conv_filters[k])
693 "Impossible to convert between the formats supported by the filter "
694 "'%s' and the filter '%s'\n",
link->src->name,
link->dst->name);
713 "%d queried, %d merged, %d already done, %d delayed\n",
714 count_queried, count_merged, count_already_merged, count_delayed);
723 if (count_queried || count_merged)
731 "The following filters could not choose their formats: %s\n"
732 "Consider inserting the (a)format filter near their input or "
733 "output.\n", bp.str);
770 return score1 < score2 ? dst_fmt1 : dst_fmt2;
778 if (
desc->nb_components < 3)
811 for (
i = 0;
i <
link->incfg.formats->nb_formats;
i++) {
818 link->incfg.formats->formats[0] = best;
824 for (
i = 0;
i <
link->incfg.formats->nb_formats;
i++) {
831 link->incfg.formats->formats[0] = best;
835 link->incfg.formats->nb_formats = 1;
863 if (!
link->incfg.color_spaces->nb_formats) {
865 " the link between filters %s and %s.\n",
link->src->name,
869 link->incfg.color_spaces->nb_formats = 1;
875 if (!
link->incfg.color_ranges->nb_formats) {
877 " the link between filters %s and %s.\n",
link->src->name,
881 link->incfg.color_ranges->nb_formats = 1;
887 if (!
link->incfg.alpha_modes->nb_formats) {
889 " the link between filters %s and %s.\n",
link->src->name,
893 link->incfg.alpha_modes->nb_formats = 1;
901 if (!
link->incfg.samplerates->nb_formats) {
903 " the link between filters %s and %s.\n",
link->src->name,
907 link->incfg.samplerates->nb_formats = 1;
910 if (
link->incfg.channel_layouts->all_layouts) {
912 " the link between filters %s and %s.\n",
link->src->name,
914 if (!
link->incfg.channel_layouts->all_counts)
916 "supported, try specifying a channel layout using "
917 "'aformat=channel_layouts=something'.\n");
920 link->incfg.channel_layouts->nb_channel_layouts = 1;
942 #define REDUCE_FORMATS(fmt_type, list_type, list, var, nb, add_format) \
944 for (i = 0; i < filter->nb_inputs; i++) { \
945 AVFilterLink *link = filter->inputs[i]; \
948 if (!link->outcfg.list || link->outcfg.list->nb != 1) \
950 fmt = link->outcfg.list->var[0]; \
952 for (j = 0; j < filter->nb_outputs; j++) { \
953 AVFilterLink *out_link = filter->outputs[j]; \
956 if (link->type != out_link->type || \
957 out_link->incfg.list->nb == 1) \
959 fmts = out_link->incfg.list; \
961 if (!out_link->incfg.list->nb) { \
962 if ((ret = add_format(&out_link->incfg.list, fmt)) < 0)\
968 for (k = 0; k < out_link->incfg.list->nb; k++) \
969 if (fmts->var[k] == fmt) { \
970 fmts->var[0] = fmt; \
981 int i, j, k,
ret = 0;
995 for (
i = 0;
i <
filter->nb_inputs;
i++) {
999 if (!
inlink->outcfg.channel_layouts ||
1000 inlink->outcfg.channel_layouts->nb_channel_layouts != 1)
1002 fmt = &
inlink->outcfg.channel_layouts->channel_layouts[0];
1004 for (j = 0; j <
filter->nb_outputs; j++) {
1041 int i, reduced,
ret;
1062 for (
i = 0;
i <
filter->nb_inputs;
i++) {
1066 link->outcfg.samplerates->nb_formats== 1)
1072 sample_rate =
link->outcfg.samplerates->formats[0];
1074 for (
i = 0;
i <
filter->nb_outputs;
i++) {
1076 int best_idx, best_diff = INT_MAX;
1087 if (
diff < best_diff) {
1105 #define CH_CENTER_PAIR (AV_CH_FRONT_LEFT_OF_CENTER | AV_CH_FRONT_RIGHT_OF_CENTER)
1106 #define CH_FRONT_PAIR (AV_CH_FRONT_LEFT | AV_CH_FRONT_RIGHT)
1107 #define CH_STEREO_PAIR (AV_CH_STEREO_LEFT | AV_CH_STEREO_RIGHT)
1108 #define CH_WIDE_PAIR (AV_CH_WIDE_LEFT | AV_CH_WIDE_RIGHT)
1109 #define CH_SIDE_PAIR (AV_CH_SIDE_LEFT | AV_CH_SIDE_RIGHT)
1110 #define CH_DIRECT_PAIR (AV_CH_SURROUND_DIRECT_LEFT | AV_CH_SURROUND_DIRECT_RIGHT)
1111 #define CH_BACK_PAIR (AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT)
1144 for (
i = 0;
i <
filter->nb_inputs;
i++) {
1148 link->outcfg.channel_layouts->nb_channel_layouts == 1)
1154 for (
i = 0;
i <
filter->nb_outputs;
i++) {
1156 int best_idx = -1, best_score = INT_MIN, best_count_diff = INT_MAX;
1167 int matched_channels, extra_channels;
1173 out_channels = out_chlayout.nb_channels;
1174 count_diff = out_channels - in_channels;
1175 if (!
KNOWN(&in_chlayout) || !
KNOWN(&out_chlayout)) {
1180 if (!
KNOWN(&in_chlayout))
1182 if (!
KNOWN(&out_chlayout))
1184 score -= 10000 +
FFABS(out_channels - in_channels) +
1185 (in_channels > out_channels ? 10000 : 0);
1217 score += 10 * matched_channels - 5 * extra_channels;
1219 if (score > best_score ||
1220 (count_diff < best_count_diff && score == best_score)) {
1223 best_count_diff = count_diff;
1247 for (
i = 0;
i <
filter->nb_inputs;
i++) {
1251 link->outcfg.formats->nb_formats == 1)
1260 for (
i = 0;
i <
filter->nb_outputs;
i++) {
1262 int best_idx = -1, best_score = INT_MIN;
1280 if (
bps == 4 && out_bps == 8) {
1286 score = -
abs(out_bps -
bps);
1290 if (score > best_score) {
1320 for (j = 0; j <
filter->nb_inputs; j++){
1321 if (
filter->inputs[j]->incfg.formats &&
filter->inputs[j]->incfg.formats->nb_formats == 1) {
1329 for (j = 0; j <
filter->nb_outputs; j++){
1330 if (
filter->outputs[j]->incfg.formats &&
filter->outputs[j]->incfg.formats->nb_formats == 1) {
1338 for (j = 0; j <
filter->nb_outputs; j++) {
1339 if (
filter->outputs[j]->format<0) {
1352 for (j = 0; j <
filter->nb_inputs; j++)
1355 for (j = 0; j <
filter->nb_outputs; j++)
1396 int sink_links_count = 0, n = 0;
1402 for (j = 0; j <
f->nb_inputs; j++) {
1405 for (j = 0; j <
f->nb_outputs; j++) {
1408 if (!
f->nb_outputs) {
1409 if (
f->nb_inputs > INT_MAX - sink_links_count)
1411 sink_links_count +=
f->nb_inputs;
1414 sinks =
av_calloc(sink_links_count,
sizeof(*sinks));
1419 if (!
f->nb_outputs) {
1420 for (j = 0; j <
f->nb_inputs; j++) {
1471 if (!strcmp(target,
"all") || (
filter->name && !strcmp(target,
filter->name)) || !strcmp(target,
filter->filter->name)) {
1493 if(
filter && (!strcmp(target,
"all") || !strcmp(target,
filter->name) || !strcmp(target,
filter->filter->name))){
1495 while (*queue && (*queue)->
time <= ts)
1496 queue = &(*queue)->
next;
1504 (*queue)->time = ts;
1505 (*queue)->flags =
flags;
1506 (*queue)->next = next;
1523 int parent = (
index - 1) >> 1;
1542 int child = 2 *
index + 1;
1546 links[child + 1]->l.current_pts_us <
links[child]->l.current_pts_us)
1576 oldest = &oldesti->
l.
pub;
avfilter_execute_func * execute
This callback may be set by the caller immediately after allocating the graph and before adding any f...
A list of supported channel layouts.
#define AVFILTER_CMD_FLAG_ONE
Stop once a filter understood the command (for target=all for example), fast filters are favored auto...
enum AVColorRange color_range
MPEG vs JPEG YUV range.
#define AV_BPRINT_SIZE_UNLIMITED
AVPixelFormat
Pixel format.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
static FilterLinkInternal * ff_link_internal(AVFilterLink *link)
static int av_bprint_is_complete(const AVBPrint *buf)
Test if the print buffer is complete (not truncated).
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
@ FF_FILTER_FORMATS_QUERY_FUNC
formats.query active.
int nb_threads
Maximum number of threads used by filters in this graph.
static const uint64_t ch_subst[][2]
#define REDUCE_FORMATS(fmt_type, list_type, list, var, nb, add_format)
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AVERROR_EOF
End of file.
AVFilterPad * dstpad
input pad on the dest filter
int attribute_align_arg av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags)
Get a frame with filtered data from sink and put it in frame.
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
static int filter_query_formats(AVFilterContext *ctx)
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
int ff_filter_activate(AVFilterContext *filter)
enum AVColorSpace colorspace
YUV colorspace type.
static void swap_sample_fmts(AVFilterGraph *graph)
static int graph_check_validity(AVFilterGraph *graph, void *log_ctx)
Check for the validity of graph.
@ AVCOL_RANGE_JPEG
Full range content.
static int query_formats(AVFilterGraph *graph, void *log_ctx)
Perform one round of query_formats() and merging formats lists on the filter graph.
struct FilterLinkInternal ** sink_links
static int pick_formats(AVFilterGraph *graph)
int ff_request_frame(AVFilterLink *link)
Request an input frame from the filter at the other end of the link.
union AVChannelLayout::@488 u
Details about which channels are present in this layout.
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
void(* filter)(uint8_t *src, int stride, int qscale)
static int pick_format(AVFilterLink *link, AVFilterLink *ref)
int ff_filter_graph_run_once(AVFilterGraph *graph)
Run one round of processing on a filter graph.
uint64_t mask
This member must be used for AV_CHANNEL_ORDER_NATIVE, and may be used for AV_CHANNEL_ORDER_AMBISONIC ...
int nb_channels
Number of channels in this layout.
A link between two filters.
int ff_fmt_is_regular_yuv(enum AVPixelFormat fmt)
Returns true if a pixel format is "regular YUV", which includes all pixel formats that are affected b...
AVFilterFormatsConfig outcfg
Lists of supported formats / etc.
AVFilterContext * ff_filter_alloc(const AVFilter *filter, const char *inst_name)
Allocate a new filter context and return it.
int64_t current_pts_us
Current timestamp of the link, as defined by the most recent frame(s), in AV_TIME_BASE units.
static void swap_samplerates(AVFilterGraph *graph)
static const FFFilter * fffilter(const AVFilter *f)
void avfilter_graph_free(AVFilterGraph **graphp)
Free a graph, destroy its links, and set *graph to NULL.
static int get_fmt_score(enum AVSampleFormat dst_fmt, enum AVSampleFormat src_fmt)
size_t max_queued
Maximum number of allowed frames in the queues combined.
int ff_fmt_is_forced_full_range(enum AVPixelFormat fmt)
Returns true if a YUV pixel format is forced full range (i.e.
int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt, const char *name, const char *args, void *opaque, AVFilterGraph *graph_ctx)
A convenience wrapper that allocates and initializes a filter in a single step.
AVFilterContext * avfilter_graph_alloc_filter(AVFilterGraph *graph, const AVFilter *filter, const char *name)
Create a new filter instance in a filter graph.
AVFilterGraph * avfilter_graph_alloc(void)
Allocate a filter graph.
#define AV_PIX_FMT_FLAG_HWACCEL
Pixel format is an HW accelerated format.
int ff_graph_thread_init(FFFilterGraph *graph)
static int reduce_formats(AVFilterGraph *graph)
int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, unsigned filt_srcpad_idx, unsigned filt_dstpad_idx)
Insert a filter in the middle of an existing link.
static int graph_config_formats(AVFilterGraph *graph, void *log_ctx)
Configure the formats of all the links in the graph.
void av_opt_free(void *obj)
Free all allocated objects in obj.
#define AV_BPRINT_SIZE_AUTOMATIC
enum AVAlphaMode alpha_mode
Indicates how the alpha channel of the video is to be handled.
AVChannelLayout ch_layout
Channel layout of the audio data.
AVFilterContext p
The public AVFilterContext.
#define AVFILTER_THREAD_SLICE
Process multiple parts of the frame concurrently.
Callbacks and properties to describe the steps of a format negotiation.
static void heap_bubble_up(FFFilterGraph *graph, FilterLinkInternal *li, int index)
int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of a plane of an image with...
A filter pad used for either input or output.
enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt)
Get the planar alternative form of the given sample format.
int ff_filter_config_links(AVFilterContext *filter)
Negotiate the media format, dimensions, etc of all inputs to a filter.
@ AV_PIX_FMT_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
static int reduce_formats_on_filter(AVFilterContext *filter)
enum AVMediaType type
filter media type
avfilter_execute_func * thread_execute
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define FF_ARRAY_ELEMS(a)
#define MERGE(merger, link)
#define AV_CH_LOW_FREQUENCY
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
#define AV_BUFFERSINK_FLAG_PEEK
Tell av_buffersink_get_buffer_ref() to read video/samples buffer reference, but not remove it from th...
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
int avfilter_process_command(AVFilterContext *filter, const char *cmd, const char *arg, char *res, int res_len, int flags)
Make the filter instance process a command.
int av_channel_layout_from_mask(AVChannelLayout *channel_layout, uint64_t mask)
Initialize a native channel layout from a bitmask indicating which channels are present.
static void print_filter_formats(void *log_ctx, int level, const AVFilterContext *f)
#define filters(fmt, type, inverse, clp, inverset, clip, one, clip_fn, packed)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
Check if the sample format is planar.
static const AVOption filtergraph_options[]
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
static int graph_config_pointers(AVFilterGraph *graph, void *log_ctx)
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
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.
const AVFilterFormatsMerger * mergers
static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a link
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
static int conv(int samples, float **pcm, char *buf, int channels)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
int av_log_get_level(void)
Get the current log level.
const AVFilter * avfilter_get_by_name(const char *name)
Get a filter definition matching the given name.
#define LIBAVUTIL_VERSION_INT
int(* activate)(AVFilterContext *ctx)
Filter activation function.
Describe the class of an AVClass context structure.
int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx)
Check validity and configure all the links and formats in the graph.
New swscale design to change SwsGraph is what coordinates multiple passes These can include cascaded scaling error diffusion and so on Or we could have separate passes for the vertical and horizontal scaling In between each SwsPass lies a fully allocated image buffer Graph passes may have different levels of e g we can have a single threaded error diffusion pass following a multi threaded scaling pass SwsGraph is internally recreated whenever the image format
uint8_t nb_components
The number of components each pixel has, (1-4)
void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned flags)
Enable or disable automatic format conversion inside the graph.
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
AVFilterContext ** filters
const char * av_default_item_name(void *ptr)
Return the context name.
char * name
name of this filter instance
static FFFilterGraph * fffiltergraph(AVFilterGraph *graph)
AVFilterContext * avfilter_graph_get_filter(AVFilterGraph *graph, const char *name)
Get a filter instance identified by instance name from graph.
int avfilter_graph_request_oldest(AVFilterGraph *graph)
Request a frame on the oldest sink link.
static int graph_config_links(AVFilterGraph *graph, void *log_ctx)
Configure all the links of graphctx.
static void print_link_formats(void *log_ctx, int level, const AVFilterLink *l, const AVFilterFormatsMerger *mergers[], int nb_mergers)
@ AV_OPT_TYPE_UINT
Underlying C type is unsigned int.
#define AV_CH_FRONT_CENTER
@ AVCOL_RANGE_UNSPECIFIED
static FilterLink * ff_filter_link(AVFilterLink *link)
@ AV_CLASS_CATEGORY_FILTER
struct AVFilterCommand * command_queue
void ff_graph_thread_free(FFFilterGraph *graph)
#define FFERROR_BUFFERSRC_EMPTY
int av_bprint_finalize(AVBPrint *buf, char **ret_str)
Finalize a print buffer.
An AVChannelLayout holds information about the channel layout of audio data.
int age_index
Index in the age array.
void ff_avfilter_graph_update_heap(AVFilterGraph *graph, FilterLinkInternal *li)
Update the position of a link in the age heap.
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
struct AVFilterCommand * next
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
int sample_rate
Sample rate of the audio data.
int avfilter_graph_queue_command(AVFilterGraph *graph, const char *target, const char *command, const char *arg, int flags, double ts)
Queue a command for one or more filter instances.
AVChannelLayout * channel_layouts
list of channel layouts
FFFrameQueueGlobal frame_queues
AVFilterContext * dst
dest filter
char all_layouts
accept any known channel layout
char all_counts
accept any channel layout or count
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
AVFilterFormatsConfig incfg
Lists of supported formats / etc.
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
static enum AVSampleFormat find_best_sample_fmt_of_2(enum AVSampleFormat dst_fmt1, enum AVSampleFormat dst_fmt2, enum AVSampleFormat src_fmt)
int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1)
Check whether two channel layouts are semantically the same, i.e.
int avfilter_init_str(AVFilterContext *filter, const char *args)
Initialize a filter with the supplied parameters.
int frame_blocked_in
If set, the source filter can not generate a frame as is.
static int filter_link_check_formats(void *log, AVFilterLink *link, AVFilterFormatsConfig *cfg)
static void swap_sample_fmts_on_filter(AVFilterContext *filter)
#define i(width, name, range_min, range_max)
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
unsigned disable_auto_convert
static FFFilterContext * fffilterctx(AVFilterContext *ctx)
static void swap_channel_layouts_on_filter(AVFilterContext *filter)
static int graph_check_links(AVFilterGraph *graph, void *log_ctx)
#define av_malloc_array(a, b)
int status_in
Link input status.
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
AVSampleFormat
Audio sample formats.
#define AV_CH_BACK_CENTER
int frame_wanted_out
True if a frame is currently wanted on the output of this filter.
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
int thread_type
Type of multithreading allowed for filters in this graph.
static const int8_t filt[NUMTAPS *2]
const char * name
Pad name.
void * av_calloc(size_t nmemb, size_t size)
static void swap_channel_layouts(AVFilterGraph *graph)
#define AVFILTER_CMD_FLAG_FAST
Only execute command when its fast (like a video out that supports contrast adjustment in hw)
unsigned ready
Ready status of the filter.
enum AVMediaType type
AVFilterPad type.
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 links
#define FFSWAP(type, a, b)
@ AVALPHA_MODE_UNSPECIFIED
Unknown alpha handling, or no alpha channel.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
static void heap_bubble_down(FFFilterGraph *graph, FilterLinkInternal *li, int index)
void av_bprintf(AVBPrint *buf, const char *fmt,...)
@ FF_FILTER_FORMATS_QUERY_FUNC2
formats.query_func2 active.
static int formats_declared(AVFilterContext *f)
const char * av_get_media_type_string(enum AVMediaType media_type)
Return a string describing the media_type enum, NULL if media_type is unknown.
enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2, enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
Compute what kind of losses will occur when converting from one specific pixel format to another.
uint64_t av_channel_layout_subset(const AVChannelLayout *channel_layout, uint64_t mask)
Find out what channels from a given set are present in a channel layout, without regard for their pos...
#define AV_PIX_FMT_FLAG_XYZ
The pixel format contains XYZ-like data (as opposed to YUV/RGB/grayscale).
void ff_filter_graph_remove_filter(AVFilterGraph *graph, AVFilterContext *filter)
Remove a filter from a graph;.
int av_channel_layout_index_from_channel(const AVChannelLayout *channel_layout, enum AVChannel channel)
Get the index of a given channel in a channel layout.
void ff_framequeue_global_init(FFFrameQueueGlobal *fqg)
Init a global structure.
@ AV_OPT_TYPE_INT
Underlying C type is int.
void av_bprint_clear(AVBPrint *buf)
Reset the string to "" but keep internal allocated data.
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt)
Get the packed alternative form of the given sample format.
static int ref[MAX_W *MAX_W]
struct AVFilterGraph * graph
Graph the filter belongs to.
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
AVFilterGraph p
The public AVFilterGraph.
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
char * av_strdup(const char *s)
Duplicate a string.
int nb_channel_layouts
number of channel layouts
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
void avfilter_free(AVFilterContext *filter)
Free a filter context.
static void swap_samplerates_on_filter(AVFilterContext *filter)
unsigned max_buffered_frames
Sets the maximum number of buffered frames in the filtergraph combined.
@ AV_OPT_TYPE_FLAGS
Underlying C type is unsigned int.
int avfilter_graph_send_command(AVFilterGraph *graph, const char *target, const char *cmd, const char *arg, char *res, int res_len, int flags)
Send a command to one or more filter instances.
#define FF_FIELD_AT(type, off, obj)
Access a field in a structure by its offset.
const AVFilter * filter
the AVFilter of which this is an instance
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
unsigned refcount
number of references to this list
static int filter_check_formats(AVFilterContext *ctx)
Check the validity of the formats / etc.
#define AV_PIX_FMT_FLAG_PAL
Pixel format has a palette in data[1], values are indexes in this palette.
@ AV_SAMPLE_FMT_S32
signed 32 bits
static const AVClass filtergraph_class
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
double time
time expressed in seconds