31 #define FILTER_ORDER 4
75 #define OFFSET(x) offsetof(AudioNEqualizerContext, x)
76 #define A AV_OPT_FLAG_AUDIO_PARAM
77 #define V AV_OPT_FLAG_VIDEO_PARAM
78 #define F AV_OPT_FLAG_FILTERING_PARAM
88 {
"colors",
"set channels curves colors",
OFFSET(colors),
AV_OPT_TYPE_STRING, {.str =
"red|green|blue|yellow|orange|lime|pink|magenta|brown" }, 0, 0,
V|
F },
104 memset(
out->data[0], 0,
s->h *
out->linesize[0]);
106 for (ch = 0; ch < inlink->
channels; ch++) {
107 uint8_t fg[4] = { 0xff, 0xff, 0xff, 0xff };
115 for (
f = 0;
f <
s->w;
f++) {
116 double zr, zi, zr2, zi2;
122 w =
M_PI * (
s->fscale ? pow(
s->w - 1,
f /
s->w) :
f) / (
s->w - 1);
128 for (n = 0; n <
s->nb_filters; n++) {
129 if (
s->filters[n].channel != ch ||
130 s->filters[n].ignore)
139 Hr =
S->b4*(1-8*zr2*zi2) +
S->b2*(zr2-zi2) + zr*(
S->b1+
S->b3*(zr2-3*zi2))+
S->b0;
140 Hi = zi*(
S->b3*(3*zr2-zi2) +
S->b1 + 2*zr*(2*
S->b4*(zr2-zi2) +
S->b2));
141 Hmag *=
hypot(Hr, Hi);
142 Hr =
S->a4*(1-8*zr2*zi2) +
S->a2*(zr2-zi2) + zr*(
S->a1+
S->a3*(zr2-3*zi2))+
S->a0;
143 Hi = zi*(
S->a3*(3*zr2-zi2) +
S->a1 + 2*zr*(2*
S->a4*(zr2-zi2) +
S->a2));
144 Hmag /=
hypot(Hr, Hi);
148 v =
av_clip((1. + -20 * log10(Hmag) /
s->mag) *
s->h / 2, 0,
s->h - 1);
153 for (y = v; y <= prev_v; y++)
156 for (y = prev_v; y <= v; y++)
203 if (
s->draw_curves) {
231 if (
s->draw_curves) {
267 double si,
double g,
double g0,
270 if (c0 == 1 || c0 == -1) {
271 S->b0 = (
g*
g*beta*beta + 2*
g*g0*si*beta + g0*g0)/
D;
272 S->b1 = 2*c0*(
g*
g*beta*beta - g0*g0)/
D;
273 S->b2 = (
g*
g*beta*beta - 2*g0*
g*beta*si + g0*g0)/
D;
278 S->a1 = 2*c0*(beta*beta - 1)/
D;
279 S->a2 = (beta*beta - 2*beta*si + 1)/
D;
283 S->b0 = (
g*
g*beta*beta + 2*
g*g0*si*beta + g0*g0)/
D;
284 S->b1 = -4*c0*(g0*g0 +
g*g0*si*beta)/
D;
285 S->b2 = 2*(g0*g0*(1 + 2*c0*c0) -
g*
g*beta*beta)/
D;
286 S->b3 = -4*c0*(g0*g0 -
g*g0*si*beta)/
D;
287 S->b4 = (
g*
g*beta*beta - 2*
g*g0*si*beta + g0*g0)/
D;
290 S->a1 = -4*c0*(1 + si*beta)/
D;
291 S->a2 = 2*(1 + 2*c0*c0 - beta*beta)/
D;
292 S->a3 = -4*c0*(1 - si*beta)/
D;
293 S->a4 = (beta*beta - 2*si*beta + 1)/
D;
298 int N,
double w0,
double wb,
299 double G,
double Gb,
double G0)
301 double g, c0, g0, beta;
307 if (
G == 0 && G0 == 0) {
308 f->section[0].a0 = 1;
309 f->section[0].b0 = 1;
310 f->section[1].a0 = 1;
311 f->section[1].b0 = 1;
319 epsilon = sqrt((
G *
G - Gb * Gb) / (Gb * Gb - G0 * G0));
321 g0 = pow(G0, 1.0 /
N);
322 beta = pow(epsilon, -1.0 /
N) * tan(wb/2);
325 for (
i = 1;
i <=
L;
i++) {
326 double ui = (2.0 *
i - 1) /
N;
327 double si = sin(
M_PI *
ui / 2.0);
328 double Di = beta * beta + 2 * si * beta + 1;
335 double c,
double tetta_b,
336 double g0,
double si,
double b,
339 if (c0 == 1 || c0 == -1) {
340 S->b0 = (tetta_b*tetta_b*(
b*
b+g0*g0*
c*
c) + 2*g0*
b*si*tetta_b*tetta_b + g0*g0)/
D;
341 S->b1 = 2*c0*(tetta_b*tetta_b*(
b*
b+g0*g0*
c*
c) - g0*g0)/
D;
342 S->b2 = (tetta_b*tetta_b*(
b*
b+g0*g0*
c*
c) - 2*g0*
b*si*tetta_b + g0*g0)/
D;
347 S->a1 = 2*c0*(tetta_b*tetta_b*(
a*
a+
c*
c) - 1)/
D;
348 S->a2 = (tetta_b*tetta_b*(
a*
a+
c*
c) - 2*
a*si*tetta_b + 1)/
D;
352 S->b0 = ((
b*
b + g0*g0*
c*
c)*tetta_b*tetta_b + 2*g0*
b*si*tetta_b + g0*g0)/
D;
353 S->b1 = -4*c0*(g0*g0 + g0*
b*si*tetta_b)/
D;
354 S->b2 = 2*(g0*g0*(1 + 2*c0*c0) - (
b*
b + g0*g0*
c*
c)*tetta_b*tetta_b)/
D;
355 S->b3 = -4*c0*(g0*g0 - g0*
b*si*tetta_b)/
D;
356 S->b4 = ((
b*
b + g0*g0*
c*
c)*tetta_b*tetta_b - 2*g0*
b*si*tetta_b + g0*g0)/
D;
359 S->a1 = -4*c0*(1 +
a*si*tetta_b)/
D;
360 S->a2 = 2*(1 + 2*c0*c0 - (
a*
a +
c*
c)*tetta_b*tetta_b)/
D;
361 S->a3 = -4*c0*(1 -
a*si*tetta_b)/
D;
362 S->a4 = ((
a*
a +
c*
c)*tetta_b*tetta_b - 2*
a*si*tetta_b + 1)/
D;
367 int N,
double w0,
double wb,
368 double G,
double Gb,
double G0)
370 double a,
b, c0, g0, alfa, beta, tetta_b;
376 if (
G == 0 && G0 == 0) {
377 f->section[0].a0 = 1;
378 f->section[0].b0 = 1;
379 f->section[1].a0 = 1;
380 f->section[1].b0 = 1;
388 epsilon = sqrt((
G*
G - Gb*Gb) / (Gb*Gb - G0*G0));
390 alfa = pow(1.0/epsilon + sqrt(1 + 1/(epsilon*epsilon)), 1.0/
N);
391 beta = pow(
G/epsilon + Gb * sqrt(1 + 1/(epsilon*epsilon)), 1.0/
N);
392 a = 0.5 * (alfa - 1.0/alfa);
393 b = 0.5 * (beta - g0*g0*(1/beta));
397 for (
i = 1;
i <=
L;
i++) {
398 double ui = (2.0*
i-1.0)/
N;
399 double ci = cos(
M_PI*
ui/2.0);
400 double si = sin(
M_PI*
ui/2.0);
401 double Di = (
a*
a + ci*ci)*tetta_b*tetta_b + 2.0*
a*si*tetta_b + 1;
408 double c,
double tetta_b,
409 double g,
double si,
double b,
412 if (c0 == 1 || c0 == -1) {
413 S->b0 = (
g*
g*tetta_b*tetta_b + 2*tetta_b*
g*
b*si +
b*
b +
g*
g*
c*
c)/
D;
414 S->b1 = 2*c0*(
g*
g*tetta_b*tetta_b -
b*
b -
g*
g*
c*
c)/
D;
415 S->b2 = (
g*
g*tetta_b*tetta_b - 2*tetta_b*
g*
b*si +
b*
b +
g*
g*
c*
c)/
D;
420 S->a1 = 2*c0*(tetta_b*tetta_b -
a*
a -
c*
c)/
D;
421 S->a2 = (tetta_b*tetta_b - 2*tetta_b*
a*si +
a*
a +
c*
c)/
D;
425 S->b0 = (
g*
g*tetta_b*tetta_b + 2*
g*
b*si*tetta_b +
b*
b +
g*
g*
c*
c)/
D;
426 S->b1 = -4*c0*(
b*
b +
g*
g*
c*
c +
g*
b*si*tetta_b)/
D;
427 S->b2 = 2*((
b*
b +
g*
g*
c*
c)*(1 + 2*c0*c0) -
g*
g*tetta_b*tetta_b)/
D;
428 S->b3 = -4*c0*(
b*
b +
g*
g*
c*
c -
g*
b*si*tetta_b)/
D;
429 S->b4 = (
g*
g*tetta_b*tetta_b - 2*
g*
b*si*tetta_b +
b*
b +
g*
g*
c*
c)/
D;
432 S->a1 = -4*c0*(
a*
a +
c*
c +
a*si*tetta_b)/
D;
433 S->a2 = 2*((
a*
a +
c*
c)*(1 + 2*c0*c0) - tetta_b*tetta_b)/
D;
434 S->a3 = -4*c0*(
a*
a +
c*
c -
a*si*tetta_b)/
D;
435 S->a4 = (tetta_b*tetta_b - 2*
a*si*tetta_b +
a*
a +
c*
c)/
D;
440 int N,
double w0,
double wb,
441 double G,
double Gb,
double G0)
443 double a,
b, c0, tetta_b;
444 double epsilon,
g, eu, ew;
449 if (
G == 0 && G0 == 0) {
450 f->section[0].a0 = 1;
451 f->section[0].b0 = 1;
452 f->section[1].a0 = 1;
453 f->section[1].b0 = 1;
461 epsilon = sqrt((
G*
G - Gb*Gb) / (Gb*Gb - G0*G0));
463 eu = pow(epsilon + sqrt(1 + epsilon*epsilon), 1.0/
N);
464 ew = pow(G0*epsilon + Gb*sqrt(1 + epsilon*epsilon), 1.0/
N);
465 a = (eu - 1.0/eu)/2.0;
466 b = (ew -
g*
g/ew)/2.0;
470 for (
i = 1;
i <=
L;
i++) {
471 double ui = (2.0 *
i - 1.0)/
N;
472 double ci = cos(
M_PI *
ui / 2.0);
473 double si = sin(
M_PI *
ui / 2.0);
474 double Di = tetta_b*tetta_b + 2*
a*si*tetta_b +
a*
a + ci*ci;
486 else if(gain > -6 && gain < 6)
487 bw_gain = gain * 0.5;
500 else if(gain > -6 && gain < 6)
501 bw_gain = gain * 0.9;
514 else if(gain > -6 && gain < 6)
515 bw_gain = gain * 0.3;
553 if (
s->nb_filters >=
s->nb_allocated - 1) {
559 memcpy(
filters,
s->filters,
sizeof(*
s->filters) *
s->nb_allocated);
562 s->nb_allocated *= 2;
574 char *saveptr =
NULL;
594 s->filters[
s->nb_filters].type = 0;
595 if (sscanf(
arg,
"c%d f=%lf w=%lf g=%lf t=%d", &
s->filters[
s->nb_filters].channel,
596 &
s->filters[
s->nb_filters].freq,
597 &
s->filters[
s->nb_filters].width,
598 &
s->filters[
s->nb_filters].gain,
599 &
s->filters[
s->nb_filters].type) != 5 &&
600 sscanf(
arg,
"c%d f=%lf w=%lf g=%lf", &
s->filters[
s->nb_filters].channel,
601 &
s->filters[
s->nb_filters].freq,
602 &
s->filters[
s->nb_filters].width,
603 &
s->filters[
s->nb_filters].gain) != 4 ) {
608 if (
s->filters[
s->nb_filters].freq < 0 ||
610 s->filters[
s->nb_filters].ignore = 1;
612 if (
s->filters[
s->nb_filters].channel < 0 ||
613 s->filters[
s->nb_filters].channel >= inlink->
channels)
614 s->filters[
s->nb_filters].ignore = 1;
628 char *res,
int res_len,
int flags)
634 if (!strcmp(cmd,
"change")) {
635 double freq,
width, gain;
638 if (sscanf(args,
"%d|f=%lf|w=%lf|g=%lf", &
filter, &freq, &
width, &gain) != 4)
641 if (filter < 0 || filter >=
s->nb_filters)
647 s->filters[
filter].freq = freq;
649 s->filters[
filter].gain = gain;
665 out+=
S->b1 *
S->num[0] -
S->denum[0] *
S->a1;
666 out+=
S->b2 *
S->num[1] -
S->denum[1] *
S->a2;
667 out+=
S->b3 *
S->num[2] -
S->denum[2] *
S->a3;
668 out+=
S->b4 *
S->num[3] -
S->denum[3] *
S->a4;
670 S->num[3] =
S->num[2];
671 S->num[2] =
S->num[1];
672 S->num[1] =
S->num[0];
675 S->denum[3] =
S->denum[2];
676 S->denum[2] =
S->denum[1];
677 S->denum[1] =
S->denum[0];
697 int jobnr,
int nb_jobs)
701 const int start = (buf->
channels * jobnr) / nb_jobs;
702 const int end = (buf->
channels * (jobnr+1)) / nb_jobs;
704 for (
int i = 0;
i <
s->nb_filters;
i++) {
708 if (
f->gain == 0. ||
f->ignore)
710 if (
f->channel < start ||
732 if (!
ctx->is_disabled)
736 if (
s->draw_curves) {
768 .
name =
"anequalizer",
771 .priv_class = &anequalizer_class,
static enum AVSampleFormat sample_fmts[]
static const AVFilterPad outputs[]
static double chebyshev2_compute_bw_gain_db(double gain)
static int config_video(AVFilterLink *outlink)
static double section_process(FoSection *S, double in)
static void chebyshev1_fo_section(FoSection *S, double a, double c, double tetta_b, double g0, double si, double b, double D, double c0)
static void chebyshev2_bp_filter(EqualizatorFilter *f, int N, double w0, double wb, double G, double Gb, double G0)
static void chebyshev2_fo_section(FoSection *S, double a, double c, double tetta_b, double g, double si, double b, double D, double c0)
static int query_formats(AVFilterContext *ctx)
static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static int config_input(AVFilterLink *inlink)
static const AVFilterPad inputs[]
static double process_sample(FoSection *s1, double in)
static int filter_frame(AVFilterLink *inlink, AVFrame *buf)
static void chebyshev1_bp_filter(EqualizatorFilter *f, int N, double w0, double wb, double G, double Gb, double G0)
AVFilter ff_af_anequalizer
static double butterworth_compute_bw_gain_db(double gain)
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
static av_cold int init(AVFilterContext *ctx)
static void butterworth_fo_section(FoSection *S, double beta, double si, double g, double g0, double D, double c0)
static av_cold void uninit(AVFilterContext *ctx)
static void butterworth_bp_filter(EqualizatorFilter *f, int N, double w0, double wb, double G, double Gb, double G0)
static void draw_curves(AVFilterContext *ctx, AVFilterLink *inlink, AVFrame *out)
AVFILTER_DEFINE_CLASS(anequalizer)
static int add_filter(AudioNEqualizerContext *s, AVFilterLink *inlink)
static void equalizer(EqualizatorFilter *f, double sample_rate)
static double chebyshev1_compute_bw_gain_db(double gain)
static double hz_2_rad(double x, double fs)
static const AVOption anequalizer_options[]
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Main libavfilter public API header.
#define flags(name, subs,...)
#define fs(width, name, subs,...)
static av_always_inline void filter(int16_t *output, ptrdiff_t out_stride, const int16_t *low, ptrdiff_t low_stride, const int16_t *high, ptrdiff_t high_stride, int len, int clip)
internal math functions header
static av_always_inline double ff_exp10(double x)
Compute 10^x for floating point values.
@ AV_OPT_TYPE_IMAGE_SIZE
offset must point to two consecutive integers
#define AVFILTER_FLAG_DYNAMIC_OUTPUTS
The number of the filter outputs is not determined just by AVFilter.outputs.
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL
Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will have its filter_frame() c...
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
char * av_strdup(const char *s)
Duplicate a string.
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
AVSampleFormat
Audio sample formats.
@ AV_SAMPLE_FMT_DBLP
double, planar
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok().
static int ff_insert_outpad(AVFilterContext *f, unsigned index, AVFilterPad *p)
Insert a new output pad for the filter.
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
static av_const double hypot(double x, double y)
static const uint32_t color[16+AV_CLASS_CATEGORY_NB]
enum MovChannelLayoutTag * layouts
int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, void *log_ctx)
Put the RGBA values that correspond to color_string in rgba_color.
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
static const struct PPFilter filters[]
Describe the class of an AVClass context structure.
A list of supported channel layouts.
A link between two filters.
AVFilterFormatsConfig incfg
Lists of supported formats / etc.
int w
agreed upon image width
int h
agreed upon image height
int channels
Number of channels.
AVFilterFormatsConfig outcfg
Lists of supported formats / etc.
AVFilterContext * src
source filter
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link.
int sample_rate
samples per second
AVRational sample_aspect_ratio
agreed upon sample aspect ratio
AVFilterContext * dst
dest filter
A filter pad used for either input or output.
const char * name
Pad name.
const char * name
Filter name.
AVFormatInternal * internal
An opaque field for libavformat internal usage.
This structure describes decoded (raw) audio or video data.
int nb_samples
number of audio samples (per channel) described by this frame
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
int channels
number of audio channels, only used for audio.
uint8_t ** extended_data
pointers to the data planes/channels.
Rational number (pair of numerator and denominator).
EqualizatorFilter * filters
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.