40 #define OFFSET(x) offsetof(AVFilterGraph, x)
41 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
46 {
"threads",
"Maximum number of threads",
OFFSET(nb_threads),
48 {
"scale_sws_opts" ,
"default scale filter options" ,
OFFSET(scale_sws_opts) ,
50 {
"aresample_swr_opts" ,
"default aresample filter options" ,
OFFSET(aresample_swr_opts) ,
98 if (graph->
filters[i] == filter) {
112 while ((*graph)->nb_filters)
119 av_freep(&(*graph)->scale_sws_opts);
120 av_freep(&(*graph)->aresample_swr_opts);
121 av_freep(&(*graph)->resample_lavr_opts);
127 #if FF_API_AVFILTER_OPEN
138 filter->
graph = graph;
145 const char *
name,
const char *
args,
void *opaque,
229 "Input pad \"%s\" with type %s of the filter instance \"%s\" of %s not connected to any source\n",
239 "Output pad \"%s\" with type %s of the filter instance \"%s\" of %s not connected to any destination\n",
392 if (is_sample_rate) {
424 int scaler_count = 0, resampler_count = 0;
425 int count_queried = 0;
426 int count_merged = 0;
427 int count_already_merged = 0;
428 int count_delayed = 0;
438 if (ret < 0 && ret !=
AVERROR(EAGAIN))
441 count_queried += ret >= 0;
448 for (j = 0; j < filter->
nb_inputs; j++) {
450 int convert_needed = 0;
469 #define MERGE_DISPATCH(field, statement) \
470 if (!(link->in_ ## field && link->out_ ## field)) { \
472 } else if (link->in_ ## field == link->out_ ## field) { \
473 count_already_merged++; \
474 } else if (!convert_needed) { \
496 #undef MERGE_DISPATCH
498 if (convert_needed) {
502 char scale_args[256];
506 switch (link->
type) {
510 "not present, cannot convert pixel formats.\n");
514 snprintf(inst_name,
sizeof(inst_name),
"auto-inserted scaler %d",
525 "not present, cannot convert audio formats.\n");
529 snprintf(inst_name,
sizeof(inst_name),
"auto-inserted resampler %d",
531 scale_args[0] =
'\0';
533 snprintf(scale_args,
sizeof(scale_args),
"%s",
550 inlink = convert->
inputs[0];
552 av_assert0( inlink-> in_formats->refcount > 0);
554 av_assert0(outlink-> in_formats->refcount > 0);
557 av_assert0( inlink-> in_samplerates->refcount > 0);
559 av_assert0(outlink-> in_samplerates->refcount > 0);
561 av_assert0( inlink-> in_channel_layouts->refcount > 0);
563 av_assert0(outlink-> in_channel_layouts->refcount > 0);
584 "Impossible to convert between the formats supported by the filter "
593 "%d queried, %d merged, %d already done, %d delayed\n",
594 count_queried, count_merged, count_already_merged, count_delayed);
603 if (count_queried || count_merged)
611 "The following filters could not choose their formats: %s\n"
612 "Consider inserting the (a)format filter near their input or "
613 "output.\n", bp.str);
650 return score1 < score2 ? dst_fmt1 : dst_fmt2;
693 " the link between filters %s and %s.\n", link->
src->
name,
702 " the link between filters %s and %s.\n", link->
src->
name,
706 "supported, try specifying a channel layout using "
707 "'aformat=channel_layouts=something'.\n");
728 #define REDUCE_FORMATS(fmt_type, list_type, list, var, nb, add_format, unref_format) \
730 for (i = 0; i < filter->nb_inputs; i++) { \
731 AVFilterLink *link = filter->inputs[i]; \
734 if (!link->out_ ## list || link->out_ ## list->nb != 1) \
736 fmt = link->out_ ## list->var[0]; \
738 for (j = 0; j < filter->nb_outputs; j++) { \
739 AVFilterLink *out_link = filter->outputs[j]; \
742 if (link->type != out_link->type || \
743 out_link->in_ ## list->nb == 1) \
745 fmts = out_link->in_ ## list; \
747 if (!out_link->in_ ## list->nb) { \
748 if ((ret = add_format(&out_link->in_ ##list, fmt)) < 0)\
754 for (k = 0; k < out_link->in_ ## list->nb; k++) \
755 if (fmts->var[k] == fmt) { \
756 fmts->var[0] = fmt; \
767 int i, j, k, ret = 0;
775 for (i = 0; i < filter->
nb_inputs; i++) {
838 for (i = 0; i < filter->
nb_inputs; i++) {
852 int best_idx, best_diff = INT_MAX;
861 if (diff < best_diff) {
879 #define CH_CENTER_PAIR (AV_CH_FRONT_LEFT_OF_CENTER | AV_CH_FRONT_RIGHT_OF_CENTER)
880 #define CH_FRONT_PAIR (AV_CH_FRONT_LEFT | AV_CH_FRONT_RIGHT)
881 #define CH_STEREO_PAIR (AV_CH_STEREO_LEFT | AV_CH_STEREO_RIGHT)
882 #define CH_WIDE_PAIR (AV_CH_WIDE_LEFT | AV_CH_WIDE_RIGHT)
883 #define CH_SIDE_PAIR (AV_CH_SIDE_LEFT | AV_CH_SIDE_RIGHT)
884 #define CH_DIRECT_PAIR (AV_CH_SURROUND_DIRECT_LEFT | AV_CH_SURROUND_DIRECT_RIGHT)
885 #define CH_BACK_PAIR (AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT)
918 for (i = 0; i < filter->
nb_inputs; i++) {
930 int best_idx = -1, best_score = INT_MIN, best_count_diff = INT_MAX;
941 int count_diff = out_channels - in_channels;
942 int matched_channels, extra_channels;
954 score -= 10000 +
FFABS(out_channels - in_channels) +
955 (in_channels > out_channels ? 10000 : 0);
956 in_chlayout = out_chlayout = 0;
963 uint64_t cmp0 = ch_subst[k][0];
964 uint64_t cmp1 = ch_subst[k][1];
965 if (( in_chlayout & cmp0) && (!(out_chlayout & cmp0)) &&
966 (out_chlayout & cmp1) && (!( in_chlayout & cmp1))) {
967 in_chlayout &= ~cmp0;
968 out_chlayout &= ~cmp1;
977 (out_chlayout & AV_CH_LOW_FREQUENCY))
979 in_chlayout &= ~AV_CH_LOW_FREQUENCY;
980 out_chlayout &= ~AV_CH_LOW_FREQUENCY;
986 score += 10 * matched_channels - 5 * extra_channels;
988 if (score > best_score ||
989 (count_diff < best_count_diff && score == best_score)) {
992 best_count_diff = count_diff;
1016 for (i = 0; i < filter->
nb_inputs; i++) {
1017 link = filter->
inputs[i];
1031 int best_idx = -1, best_score = INT_MIN;
1049 if (bps == 4 && out_bps == 8) {
1055 score = -abs(out_bps - bps);
1059 if (score > best_score) {
1089 for (j = 0; j < filter->
nb_inputs; j++){
1166 int sink_links_count = 0,
n = 0;
1181 if (f->
nb_inputs > INT_MAX - sink_links_count)
1186 sinks =
av_calloc(sink_links_count,
sizeof(*sinks));
1226 snprintf(name,
sizeof(name),
"auto-inserted fifo %d", fifo_count++);
1278 if (!strcmp(target,
"all") || (filter->
name && !strcmp(target, filter->
name)) || !strcmp(target, filter->
filter->
name)) {
1281 if ((flags & AVFILTER_CMD_FLAG_ONE) || r < 0)
1299 if(filter && (!strcmp(target,
"all") || !strcmp(target, filter->
name) || !strcmp(target, filter->
filter->
name))){
1301 while (*queue && (*queue)->
time <= ts)
1302 queue = &(*queue)->
next;
1307 (*queue)->time = ts;
1308 (*queue)->flags =
flags;
1309 (*queue)->next =
next;
1326 int parent = (index - 1) >> 1;
1329 links[
index] = links[parent];
1333 links[
index] = link;
1345 int child = 2 * index + 1;
1357 links[
index] = link;
1434 return ret < 0 ? ret : 1;
AVFilterContext ** filters
void avfilter_graph_set_auto_convert(AVFilterGraph *graph, unsigned flags)
Enable or disable automatic format conversion inside the graph.
int frame_wanted_out
True if a frame is currently wanted on the output of this filter.
void av_bprintf(AVBPrint *buf, const char *fmt,...)
AVFilterContext * ff_filter_alloc(const AVFilter *filter, const char *inst_name)
Allocate a new filter context and return it.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
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.
int thread_type
Type of multithreading allowed for filters in this graph.
static void swap_samplerates(AVFilterGraph *graph)
static void swap_sample_fmts(AVFilterGraph *graph)
void avfilter_free(AVFilterContext *filter)
Free a filter context.
static int get_fmt_score(enum AVSampleFormat dst_fmt, enum AVSampleFormat src_fmt)
AVFilterGraph * avfilter_graph_alloc(void)
Allocate a filter graph.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
Main libavfilter public API header.
int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx)
Check validity and configure all the links and formats in the graph.
struct AVFilterInOut * next
next input/input in the list, NULL if this is the last
static int reduce_formats(AVFilterGraph *graph)
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
static const uint64_t ch_subst[][2]
void avfilter_graph_free(AVFilterGraph **graph)
Free a graph, destroy its links, and set *graph to NULL.
enum AVMediaType type
AVFilterPad type.
static int reduce_formats_on_filter(AVFilterContext *filter)
static enum AVSampleFormat formats[]
int(* query_formats)(AVFilterContext *)
Query formats supported by the filter on its inputs and outputs.
AVFilterPad * dstpad
input pad on the dest filter
struct AVFilterChannelLayouts * in_channel_layouts
static int graph_insert_fifos(AVFilterGraph *graph, AVClass *log_ctx)
char * scale_sws_opts
sws options to use for the auto-inserted scale filters
#define AVFILTER_THREAD_SLICE
Process multiple parts of the frame concurrently.
int av_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
struct AVFilterGraph * graph
filtergraph this filter belongs to
const char * name
Pad name.
static int pick_format(AVFilterLink *link, AVFilterLink *ref)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
int ff_filter_graph_run_once(AVFilterGraph *graph)
Run one round of processing on a filter graph.
AVFilterLink ** inputs
array of pointers to input links
char * name
name of this filter instance
#define av_assert0(cond)
assert() equivalent, that is always enabled.
avfilter_execute_func * execute
This callback may be set by the caller immediately after allocating the graph and before adding any f...
AVFilterPad * output_pads
array of output pads
AVS_FilterInfo AVS_Value child
static void filter(int16_t *output, ptrdiff_t out_stride, int16_t *low, ptrdiff_t low_stride, int16_t *high, ptrdiff_t high_stride, int len, uint8_t clip)
#define AV_CH_LOW_FREQUENCY
int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt, const char *name, const char *args, void *opaque, AVFilterGraph *graph_ctx)
Create and add a filter instance into an existing graph.
static int pick_formats(AVFilterGraph *graph)
int nb_threads
Maximum number of threads used by filters in this graph.
int avfilter_config_links(AVFilterContext *filter)
Negotiate the media format, dimensions, etc of all inputs to a filter.
#define AVERROR_EOF
End of file.
AVFilterContext * avfilter_graph_get_filter(AVFilterGraph *graph, const char *name)
Get a filter instance identified by instance name from graph.
enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt)
Get the planar alternative form of the given sample format.
int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
Check if the sample format is planar.
A filter pad used for either input or output.
A link between two filters.
AVFilterPad * input_pads
array of input pads
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int sample_rate
samples per second
unsigned nb_outputs
number of output pads
int64_t current_pts_us
Current timestamp of the link, as defined by the most recent frame(s), in AV_TIME_BASE units...
void av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
uint64_t * channel_layouts
list of channel layouts
int frame_wanted_in
True if a frame is currently wanted on the input of this filter.
simple assert() macros that are a bit more flexible than ISO C assert().
struct AVFilterChannelLayouts * out_channel_layouts
AVFilterFormats * in_formats
Lists of formats and channel layouts supported by the input and output filters respectively.
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.
static void heap_bubble_down(AVFilterGraph *graph, AVFilterLink *link, int index)
#define REDUCE_FORMATS(fmt_type, list_type, list, var, nb, add_format, unref_format)
AVFilterLink ** sink_links
Private fields.
char all_counts
accept any channel layout or count
const AVFilter * avfilter_get_by_name(const char *name)
Get a filter definition matching the given name.
common internal API header
static int graph_config_formats(AVFilterGraph *graph, AVClass *log_ctx)
Configure the formats of all the links in the graph.
uint8_t nb_components
The number of components each pixel has, (1-4)
audio channel layout utility functions
static void sanitize_channel_layouts(void *log, AVFilterChannelLayouts *l)
unsigned nb_inputs
number of input pads
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
static void swap_sample_fmts_on_filter(AVFilterContext *filter)
struct AVFilterCommand * next
static const AVOption filtergraph_options[]
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
static int graph_check_validity(AVFilterGraph *graph, AVClass *log_ctx)
Check for the validity of graph.
static int convert(uint8_t x)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
AVFilterContext * src
source filter
#define AVFILTER_CMD_FLAG_ONE
Stop once a filter understood the command (for target=all for example), fast filters are favored auto...
#define AV_CH_FRONT_CENTER
static enum AVSampleFormat find_best_sample_fmt_of_2(enum AVSampleFormat dst_fmt1, enum AVSampleFormat dst_fmt2, enum AVSampleFormat src_fmt)
int age_index
Index in the age array.
AVFilterFormats * out_samplerates
static AVFilterFormats * clone_filter_formats(AVFilterFormats *arg)
static int can_merge_formats(AVFilterFormats *a_arg, AVFilterFormats *b_arg, enum AVMediaType type, int is_sample_rate)
int format
agreed upon media format
#define FF_ARRAY_ELEMS(a)
A list of supported channel layouts.
int avfilter_init_str(AVFilterContext *filter, const char *args)
Initialize a filter with the supplied parameters.
void * av_memdup(const void *p, size_t size)
Duplicate the buffer p.
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.
void ff_graph_thread_free(AVFilterGraph *graph)
AVFilterFormats * in_samplerates
Lists of channel layouts and sample rates used for automatic negotiation.
#define AV_BPRINT_SIZE_AUTOMATIC
AVSampleFormat
Audio sample formats.
static void heap_bubble_up(AVFilterGraph *graph, AVFilterLink *link, int index)
static int formats_declared(AVFilterContext *f)
AVFilterGraphInternal * internal
Opaque object for libavfilter internal use.
char * av_strdup(const char *s)
Duplicate the string s.
int ff_request_frame_to_filter(AVFilterLink *link)
char all_layouts
accept any known channel layout
static const char * format
static int command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
void ff_avfilter_graph_update_heap(AVFilterGraph *graph, AVFilterLink *link)
Update the position of a link in the age heap.
int avfilter_graph_request_oldest(AVFilterGraph *graph)
Request a frame on the oldest sink link.
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.
Describe the class of an AVClass context structure.
#define AVFILTER_CMD_FLAG_FAST
Only execute command when its fast (like a video out that supports contrast adjustment in hw) ...
const char * name
Filter name.
AVFilterLink ** outputs
array of pointers to output links
static void swap_channel_layouts_on_filter(AVFilterContext *filter)
void * av_calloc(size_t nmemb, size_t size)
Allocate a block of nmemb * size bytes with alignment suitable for all memory accesses (including vec...
static const int8_t filt[NUMTAPS]
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 AVMediaType type
filter media type
#define AV_CH_BACK_CENTER
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
static int query_formats(AVFilterGraph *graph, AVClass *log_ctx)
Perform one round of query_formats() and merging formats lists on the filter graph.
static AVFilterLink * graph_run_once_find_filter(AVFilterGraph *graph)
struct AVFilterGraph * graph
Graph the filter belongs to.
int ff_graph_thread_init(AVFilterGraph *graph)
static int graph_config_links(AVFilterGraph *graph, AVClass *log_ctx)
Configure all the links of graphctx.
static void swap_channel_layouts(AVFilterGraph *graph)
#define MERGE_DISPATCH(field, statement)
enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt)
Get the packed alternative form of the given sample format.
int nb_channel_layouts
number of channel layouts
void * av_realloc(void *ptr, size_t size)
Allocate or reallocate a block of memory.
struct AVFilterCommand * command_queue
uint64_t channel_layout
channel layout of current buffer (see libavutil/channel_layout.h)
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.
int channels
Number of channels.
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...
static void swap_samplerates_on_filter(AVFilterContext *filter)
char * aresample_swr_opts
swr options to use for the auto-inserted aresample filters, Access ONLY through AVOptions ...
void ff_filter_graph_remove_filter(AVFilterGraph *graph, AVFilterContext *filter)
Remove a filter from a graph;.
static av_always_inline int diff(const uint32_t a, const uint32_t b)
avfilter_execute_func * thread_execute
AVFilterContext * avfilter_graph_alloc_filter(AVFilterGraph *graph, const AVFilter *filter, const char *name)
Create a new filter instance in a filter graph.
AVFilterContext * dst
dest filter
static const struct PPFilter filters[]
unsigned refcount
number of references to this list
static const AVClass filtergraph_class
double time
time expressed in seconds
int needs_fifo
The filter expects a fifo to be inserted on its input link, typically because it has a delay...
int ff_request_frame(AVFilterLink *link)
Request an input frame from the filter at the other end of the link.
#define FFSWAP(type, a, b)
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.
static int filter_query_formats(AVFilterContext *ctx)
AVPixelFormat
Pixel format.
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
const AVFilter * filter
the AVFilter of which this is an instance
AVFilterFormats * out_formats
unsigned disable_auto_convert
static int graph_config_pointers(AVFilterGraph *graph, AVClass *log_ctx)