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) {
117 while ((*graph)->nb_filters)
124 av_freep(&(*graph)->scale_sws_opts);
125 av_freep(&(*graph)->aresample_swr_opts);
126 av_freep(&(*graph)->resample_lavr_opts);
132 #if FF_API_AVFILTER_OPEN
143 filter->
graph = graph;
150 const char *
name,
const char *
args,
void *opaque,
234 "Input pad \"%s\" with type %s of the filter instance \"%s\" of %s not connected to any source\n",
244 "Output pad \"%s\" with type %s of the filter instance \"%s\" of %s not connected to any destination\n",
397 if (is_sample_rate) {
429 int scaler_count = 0, resampler_count = 0;
430 int count_queried = 0;
431 int count_merged = 0;
432 int count_already_merged = 0;
433 int count_delayed = 0;
443 if (ret < 0 && ret !=
AVERROR(EAGAIN))
446 count_queried += ret >= 0;
453 for (j = 0; j < filter->
nb_inputs; j++) {
455 int convert_needed = 0;
474 #define MERGE_DISPATCH(field, statement) \
475 if (!(link->in_ ## field && link->out_ ## field)) { \
477 } else if (link->in_ ## field == link->out_ ## field) { \
478 count_already_merged++; \
479 } else if (!convert_needed) { \
501 #undef MERGE_DISPATCH
503 if (convert_needed) {
507 char scale_args[256];
512 "The filters '%s' and '%s' do not have a common format "
513 "and automatic conversion is disabled.\n",
519 switch (link->
type) {
523 "not present, cannot convert pixel formats.\n");
527 snprintf(inst_name,
sizeof(inst_name),
"auto-inserted scaler %d",
538 "not present, cannot convert audio formats.\n");
542 snprintf(inst_name,
sizeof(inst_name),
"auto-inserted resampler %d",
544 scale_args[0] =
'\0';
546 snprintf(scale_args,
sizeof(scale_args),
"%s",
563 inlink = convert->
inputs[0];
565 av_assert0( inlink-> in_formats->refcount > 0);
567 av_assert0(outlink-> in_formats->refcount > 0);
570 av_assert0( inlink-> in_samplerates->refcount > 0);
572 av_assert0(outlink-> in_samplerates->refcount > 0);
574 av_assert0( inlink-> in_channel_layouts->refcount > 0);
576 av_assert0(outlink-> in_channel_layouts->refcount > 0);
597 "Impossible to convert between the formats supported by the filter "
606 "%d queried, %d merged, %d already done, %d delayed\n",
607 count_queried, count_merged, count_already_merged, count_delayed);
616 if (count_queried || count_merged)
624 "The following filters could not choose their formats: %s\n"
625 "Consider inserting the (a)format filter near their input or "
626 "output.\n", bp.str);
663 return score1 < score2 ? dst_fmt1 : dst_fmt2;
706 " the link between filters %s and %s.\n", link->
src->
name,
715 " the link between filters %s and %s.\n", link->
src->
name,
719 "supported, try specifying a channel layout using "
720 "'aformat=channel_layouts=something'.\n");
741 #define REDUCE_FORMATS(fmt_type, list_type, list, var, nb, add_format, unref_format) \
743 for (i = 0; i < filter->nb_inputs; i++) { \
744 AVFilterLink *link = filter->inputs[i]; \
747 if (!link->out_ ## list || link->out_ ## list->nb != 1) \
749 fmt = link->out_ ## list->var[0]; \
751 for (j = 0; j < filter->nb_outputs; j++) { \
752 AVFilterLink *out_link = filter->outputs[j]; \
755 if (link->type != out_link->type || \
756 out_link->in_ ## list->nb == 1) \
758 fmts = out_link->in_ ## list; \
760 if (!out_link->in_ ## list->nb) { \
761 if ((ret = add_format(&out_link->in_ ##list, fmt)) < 0)\
767 for (k = 0; k < out_link->in_ ## list->nb; k++) \
768 if (fmts->var[k] == fmt) { \
769 fmts->var[0] = fmt; \
780 int i, j, k, ret = 0;
788 for (i = 0; i < filter->
nb_inputs; i++) {
851 for (i = 0; i < filter->
nb_inputs; i++) {
865 int best_idx, best_diff = INT_MAX;
874 if (diff < best_diff) {
892 #define CH_CENTER_PAIR (AV_CH_FRONT_LEFT_OF_CENTER | AV_CH_FRONT_RIGHT_OF_CENTER)
893 #define CH_FRONT_PAIR (AV_CH_FRONT_LEFT | AV_CH_FRONT_RIGHT)
894 #define CH_STEREO_PAIR (AV_CH_STEREO_LEFT | AV_CH_STEREO_RIGHT)
895 #define CH_WIDE_PAIR (AV_CH_WIDE_LEFT | AV_CH_WIDE_RIGHT)
896 #define CH_SIDE_PAIR (AV_CH_SIDE_LEFT | AV_CH_SIDE_RIGHT)
897 #define CH_DIRECT_PAIR (AV_CH_SURROUND_DIRECT_LEFT | AV_CH_SURROUND_DIRECT_RIGHT)
898 #define CH_BACK_PAIR (AV_CH_BACK_LEFT | AV_CH_BACK_RIGHT)
931 for (i = 0; i < filter->
nb_inputs; i++) {
943 int best_idx = -1, best_score = INT_MIN, best_count_diff = INT_MAX;
954 int count_diff = out_channels - in_channels;
955 int matched_channels, extra_channels;
967 score -= 10000 +
FFABS(out_channels - in_channels) +
968 (in_channels > out_channels ? 10000 : 0);
969 in_chlayout = out_chlayout = 0;
976 uint64_t cmp0 = ch_subst[k][0];
977 uint64_t cmp1 = ch_subst[k][1];
978 if (( in_chlayout & cmp0) && (!(out_chlayout & cmp0)) &&
979 (out_chlayout & cmp1) && (!( in_chlayout & cmp1))) {
980 in_chlayout &= ~cmp0;
981 out_chlayout &= ~cmp1;
990 (out_chlayout & AV_CH_LOW_FREQUENCY))
992 in_chlayout &= ~AV_CH_LOW_FREQUENCY;
993 out_chlayout &= ~AV_CH_LOW_FREQUENCY;
999 score += 10 * matched_channels - 5 * extra_channels;
1001 if (score > best_score ||
1002 (count_diff < best_count_diff && score == best_score)) {
1005 best_count_diff = count_diff;
1029 for (i = 0; i < filter->
nb_inputs; i++) {
1030 link = filter->
inputs[i];
1044 int best_idx = -1, best_score = INT_MIN;
1062 if (bps == 4 && out_bps == 8) {
1068 score = -abs(out_bps - bps);
1072 if (score > best_score) {
1102 for (j = 0; j < filter->
nb_inputs; j++){
1179 int sink_links_count = 0,
n = 0;
1194 if (f->
nb_inputs > INT_MAX - sink_links_count)
1199 sinks =
av_calloc(sink_links_count,
sizeof(*sinks));
1239 snprintf(name,
sizeof(name),
"auto-inserted fifo %d", fifo_count++);
1291 if (!strcmp(target,
"all") || (filter->
name && !strcmp(target, filter->
name)) || !strcmp(target, filter->
filter->
name)) {
1294 if ((flags & AVFILTER_CMD_FLAG_ONE) || r < 0)
1312 if(filter && (!strcmp(target,
"all") || !strcmp(target, filter->
name) || !strcmp(target, filter->
filter->
name))){
1314 while (*queue && (*queue)->
time <= ts)
1315 queue = &(*queue)->
next;
1320 (*queue)->time = ts;
1321 (*queue)->flags =
flags;
1322 (*queue)->next =
next;
1339 int parent = (index - 1) >> 1;
1342 links[
index] = links[parent];
1346 links[
index] = link;
1358 int child = 2 * index + 1;
1370 links[
index] = link;
1447 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)
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
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]
static enum AVSampleFormat formats[]
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)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
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
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
#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)
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
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.
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
char * av_strdup(const char *s)
Duplicate a string.
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.
int ff_request_frame_to_filter(AVFilterLink *link)
char all_layouts
accept any known channel layout
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.
static const char * format
static const uint16_t channel_layouts[7]
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)
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.
static int ref[MAX_W *MAX_W]
int nb_channel_layouts
number of channel layouts
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.
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)