FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
af_compand.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 1999 Chris Bagwell
3  * Copyright (c) 1999 Nick Bailey
4  * Copyright (c) 2007 Rob Sykes <robs@users.sourceforge.net>
5  * Copyright (c) 2013 Paul B Mahol
6  * Copyright (c) 2014 Andrew Kelley
7  *
8  * This file is part of FFmpeg.
9  *
10  * FFmpeg is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2.1 of the License, or (at your option) any later version.
14  *
15  * FFmpeg is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with FFmpeg; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23  */
24 
25 /**
26  * @file
27  * audio compand filter
28  */
29 
30 #include "libavutil/avassert.h"
31 #include "libavutil/avstring.h"
32 #include "libavutil/opt.h"
33 #include "libavutil/samplefmt.h"
34 #include "audio.h"
35 #include "avfilter.h"
36 #include "internal.h"
37 
38 typedef struct ChanParam {
39  double attack;
40  double decay;
41  double volume;
42 } ChanParam;
43 
44 typedef struct CompandSegment {
45  double x, y;
46  double a, b;
48 
49 typedef struct CompandContext {
50  const AVClass *class;
52  char *attacks, *decays, *points;
55  double in_min_lin;
56  double out_min_lin;
57  double curve_dB;
58  double gain_dB;
60  double delay;
65  int64_t pts;
66 
69 
70 #define OFFSET(x) offsetof(CompandContext, x)
71 #define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
72 
73 static const AVOption compand_options[] = {
74  { "attacks", "set time over which increase of volume is determined", OFFSET(attacks), AV_OPT_TYPE_STRING, { .str = "0.3" }, 0, 0, A },
75  { "decays", "set time over which decrease of volume is determined", OFFSET(decays), AV_OPT_TYPE_STRING, { .str = "0.8" }, 0, 0, A },
76  { "points", "set points of transfer function", OFFSET(points), AV_OPT_TYPE_STRING, { .str = "-70/-70|-60/-20" }, 0, 0, A },
77  { "soft-knee", "set soft-knee", OFFSET(curve_dB), AV_OPT_TYPE_DOUBLE, { .dbl = 0.01 }, 0.01, 900, A },
78  { "gain", "set output gain", OFFSET(gain_dB), AV_OPT_TYPE_DOUBLE, { .dbl = 0 }, -900, 900, A },
79  { "volume", "set initial volume", OFFSET(initial_volume), AV_OPT_TYPE_DOUBLE, { .dbl = 0 }, -900, 0, A },
80  { "delay", "set delay for samples before sending them to volume adjuster", OFFSET(delay), AV_OPT_TYPE_DOUBLE, { .dbl = 0 }, 0, 20, A },
81  { NULL }
82 };
83 
84 AVFILTER_DEFINE_CLASS(compand);
85 
86 static av_cold int init(AVFilterContext *ctx)
87 {
88  CompandContext *s = ctx->priv;
89  s->pts = AV_NOPTS_VALUE;
90  return 0;
91 }
92 
93 static av_cold void uninit(AVFilterContext *ctx)
94 {
95  CompandContext *s = ctx->priv;
96 
97  av_freep(&s->channels);
98  av_freep(&s->segments);
100 }
101 
103 {
106  static const enum AVSampleFormat sample_fmts[] = {
109  };
110  int ret;
111 
112  layouts = ff_all_channel_layouts();
113  if (!layouts)
114  return AVERROR(ENOMEM);
115  ret = ff_set_common_channel_layouts(ctx, layouts);
116  if (ret < 0)
117  return ret;
118 
119  formats = ff_make_format_list(sample_fmts);
120  if (!formats)
121  return AVERROR(ENOMEM);
122  ret = ff_set_common_formats(ctx, formats);
123  if (ret < 0)
124  return ret;
125 
126  formats = ff_all_samplerates();
127  if (!formats)
128  return AVERROR(ENOMEM);
129  return ff_set_common_samplerates(ctx, formats);
130 }
131 
132 static void count_items(char *item_str, int *nb_items)
133 {
134  char *p;
135 
136  *nb_items = 1;
137  for (p = item_str; *p; p++) {
138  if (*p == ' ' || *p == '|')
139  (*nb_items)++;
140  }
141 }
142 
143 static void update_volume(ChanParam *cp, double in)
144 {
145  double delta = in - cp->volume;
146 
147  if (delta > 0.0)
148  cp->volume += delta * cp->attack;
149  else
150  cp->volume += delta * cp->decay;
151 }
152 
153 static double get_volume(CompandContext *s, double in_lin)
154 {
155  CompandSegment *cs;
156  double in_log, out_log;
157  int i;
158 
159  if (in_lin < s->in_min_lin)
160  return s->out_min_lin;
161 
162  in_log = log(in_lin);
163 
164  for (i = 1; i < s->nb_segments; i++)
165  if (in_log <= s->segments[i].x)
166  break;
167  cs = &s->segments[i - 1];
168  in_log -= cs->x;
169  out_log = cs->y + in_log * (cs->a * in_log + cs->b);
170 
171  return exp(out_log);
172 }
173 
175 {
176  CompandContext *s = ctx->priv;
177  AVFilterLink *inlink = ctx->inputs[0];
178  const int channels = inlink->channels;
179  const int nb_samples = frame->nb_samples;
180  AVFrame *out_frame;
181  int chan, i;
182  int err;
183 
184  if (av_frame_is_writable(frame)) {
185  out_frame = frame;
186  } else {
187  out_frame = ff_get_audio_buffer(inlink, nb_samples);
188  if (!out_frame) {
189  av_frame_free(&frame);
190  return AVERROR(ENOMEM);
191  }
192  err = av_frame_copy_props(out_frame, frame);
193  if (err < 0) {
194  av_frame_free(&out_frame);
195  av_frame_free(&frame);
196  return err;
197  }
198  }
199 
200  for (chan = 0; chan < channels; chan++) {
201  const double *src = (double *)frame->extended_data[chan];
202  double *dst = (double *)out_frame->extended_data[chan];
203  ChanParam *cp = &s->channels[chan];
204 
205  for (i = 0; i < nb_samples; i++) {
206  update_volume(cp, fabs(src[i]));
207 
208  dst[i] = av_clipd(src[i] * get_volume(s, cp->volume), -1, 1);
209  }
210  }
211 
212  if (frame != out_frame)
213  av_frame_free(&frame);
214 
215  return ff_filter_frame(ctx->outputs[0], out_frame);
216 }
217 
218 #define MOD(a, b) (((a) >= (b)) ? (a) - (b) : (a))
219 
221 {
222  CompandContext *s = ctx->priv;
223  AVFilterLink *inlink = ctx->inputs[0];
224  const int channels = inlink->channels;
225  const int nb_samples = frame->nb_samples;
226  int chan, i, av_uninit(dindex), oindex, av_uninit(count);
227  AVFrame *out_frame = NULL;
228  int err;
229 
230  if (s->pts == AV_NOPTS_VALUE) {
231  s->pts = (frame->pts == AV_NOPTS_VALUE) ? 0 : frame->pts;
232  }
233 
234  av_assert1(channels > 0); /* would corrupt delay_count and delay_index */
235 
236  for (chan = 0; chan < channels; chan++) {
237  AVFrame *delay_frame = s->delay_frame;
238  const double *src = (double *)frame->extended_data[chan];
239  double *dbuf = (double *)delay_frame->extended_data[chan];
240  ChanParam *cp = &s->channels[chan];
241  double *dst;
242 
243  count = s->delay_count;
244  dindex = s->delay_index;
245  for (i = 0, oindex = 0; i < nb_samples; i++) {
246  const double in = src[i];
247  update_volume(cp, fabs(in));
248 
249  if (count >= s->delay_samples) {
250  if (!out_frame) {
251  out_frame = ff_get_audio_buffer(inlink, nb_samples - i);
252  if (!out_frame) {
253  av_frame_free(&frame);
254  return AVERROR(ENOMEM);
255  }
256  err = av_frame_copy_props(out_frame, frame);
257  if (err < 0) {
258  av_frame_free(&out_frame);
259  av_frame_free(&frame);
260  return err;
261  }
262  out_frame->pts = s->pts;
263  s->pts += av_rescale_q(nb_samples - i,
264  (AVRational){ 1, inlink->sample_rate },
265  inlink->time_base);
266  }
267 
268  dst = (double *)out_frame->extended_data[chan];
269  dst[oindex++] = av_clipd(dbuf[dindex] *
270  get_volume(s, cp->volume), -1, 1);
271  } else {
272  count++;
273  }
274 
275  dbuf[dindex] = in;
276  dindex = MOD(dindex + 1, s->delay_samples);
277  }
278  }
279 
280  s->delay_count = count;
281  s->delay_index = dindex;
282 
283  av_frame_free(&frame);
284 
285  if (out_frame) {
286  err = ff_filter_frame(ctx->outputs[0], out_frame);
287  return err;
288  }
289 
290  return 0;
291 }
292 
293 static int compand_drain(AVFilterLink *outlink)
294 {
295  AVFilterContext *ctx = outlink->src;
296  CompandContext *s = ctx->priv;
297  const int channels = outlink->channels;
298  AVFrame *frame = NULL;
299  int chan, i, dindex;
300 
301  /* 2048 is to limit output frame size during drain */
302  frame = ff_get_audio_buffer(outlink, FFMIN(2048, s->delay_count));
303  if (!frame)
304  return AVERROR(ENOMEM);
305  frame->pts = s->pts;
306  s->pts += av_rescale_q(frame->nb_samples,
307  (AVRational){ 1, outlink->sample_rate }, outlink->time_base);
308 
309  av_assert0(channels > 0);
310  for (chan = 0; chan < channels; chan++) {
311  AVFrame *delay_frame = s->delay_frame;
312  double *dbuf = (double *)delay_frame->extended_data[chan];
313  double *dst = (double *)frame->extended_data[chan];
314  ChanParam *cp = &s->channels[chan];
315 
316  dindex = s->delay_index;
317  for (i = 0; i < frame->nb_samples; i++) {
318  dst[i] = av_clipd(dbuf[dindex] * get_volume(s, cp->volume),
319  -1, 1);
320  dindex = MOD(dindex + 1, s->delay_samples);
321  }
322  }
323  s->delay_count -= frame->nb_samples;
324  s->delay_index = dindex;
325 
326  return ff_filter_frame(outlink, frame);
327 }
328 
329 static int config_output(AVFilterLink *outlink)
330 {
331  AVFilterContext *ctx = outlink->src;
332  CompandContext *s = ctx->priv;
333  const int sample_rate = outlink->sample_rate;
334  double radius = s->curve_dB * M_LN10 / 20.0;
335  char *p, *saveptr = NULL;
336  const int channels = outlink->channels;
337  int nb_attacks, nb_decays, nb_points;
338  int new_nb_items, num;
339  int i;
340  int err;
341 
342 
343  count_items(s->attacks, &nb_attacks);
344  count_items(s->decays, &nb_decays);
345  count_items(s->points, &nb_points);
346 
347  if (channels <= 0) {
348  av_log(ctx, AV_LOG_ERROR, "Invalid number of channels: %d\n", channels);
349  return AVERROR(EINVAL);
350  }
351 
352  if (nb_attacks > channels || nb_decays > channels) {
353  av_log(ctx, AV_LOG_ERROR,
354  "Number of attacks/decays bigger than number of channels.\n");
355  return AVERROR(EINVAL);
356  }
357 
358  uninit(ctx);
359 
360  s->channels = av_mallocz_array(channels, sizeof(*s->channels));
361  s->nb_segments = (nb_points + 4) * 2;
362  s->segments = av_mallocz_array(s->nb_segments, sizeof(*s->segments));
363 
364  if (!s->channels || !s->segments) {
365  uninit(ctx);
366  return AVERROR(ENOMEM);
367  }
368 
369  p = s->attacks;
370  for (i = 0, new_nb_items = 0; i < nb_attacks; i++) {
371  char *tstr = av_strtok(p, " |", &saveptr);
372  p = NULL;
373  new_nb_items += sscanf(tstr, "%lf", &s->channels[i].attack) == 1;
374  if (s->channels[i].attack < 0) {
375  uninit(ctx);
376  return AVERROR(EINVAL);
377  }
378  }
379  nb_attacks = new_nb_items;
380 
381  p = s->decays;
382  for (i = 0, new_nb_items = 0; i < nb_decays; i++) {
383  char *tstr = av_strtok(p, " |", &saveptr);
384  p = NULL;
385  new_nb_items += sscanf(tstr, "%lf", &s->channels[i].decay) == 1;
386  if (s->channels[i].decay < 0) {
387  uninit(ctx);
388  return AVERROR(EINVAL);
389  }
390  }
391  nb_decays = new_nb_items;
392 
393  if (nb_attacks != nb_decays) {
394  av_log(ctx, AV_LOG_ERROR,
395  "Number of attacks %d differs from number of decays %d.\n",
396  nb_attacks, nb_decays);
397  uninit(ctx);
398  return AVERROR(EINVAL);
399  }
400 
401 #define S(x) s->segments[2 * ((x) + 1)]
402  p = s->points;
403  for (i = 0, new_nb_items = 0; i < nb_points; i++) {
404  char *tstr = av_strtok(p, " |", &saveptr);
405  p = NULL;
406  if (sscanf(tstr, "%lf/%lf", &S(i).x, &S(i).y) != 2) {
407  av_log(ctx, AV_LOG_ERROR,
408  "Invalid and/or missing input/output value.\n");
409  uninit(ctx);
410  return AVERROR(EINVAL);
411  }
412  if (i && S(i - 1).x > S(i).x) {
413  av_log(ctx, AV_LOG_ERROR,
414  "Transfer function input values must be increasing.\n");
415  uninit(ctx);
416  return AVERROR(EINVAL);
417  }
418  S(i).y -= S(i).x;
419  av_log(ctx, AV_LOG_DEBUG, "%d: x=%f y=%f\n", i, S(i).x, S(i).y);
420  new_nb_items++;
421  }
422  num = new_nb_items;
423 
424  /* Add 0,0 if necessary */
425  if (num == 0 || S(num - 1).x)
426  num++;
427 
428 #undef S
429 #define S(x) s->segments[2 * (x)]
430  /* Add a tail off segment at the start */
431  S(0).x = S(1).x - 2 * s->curve_dB;
432  S(0).y = S(1).y;
433  num++;
434 
435  /* Join adjacent colinear segments */
436  for (i = 2; i < num; i++) {
437  double g1 = (S(i - 1).y - S(i - 2).y) * (S(i - 0).x - S(i - 1).x);
438  double g2 = (S(i - 0).y - S(i - 1).y) * (S(i - 1).x - S(i - 2).x);
439  int j;
440 
441  if (fabs(g1 - g2))
442  continue;
443  num--;
444  for (j = --i; j < num; j++)
445  S(j) = S(j + 1);
446  }
447 
448  for (i = 0; !i || s->segments[i - 2].x; i += 2) {
449  s->segments[i].y += s->gain_dB;
450  s->segments[i].x *= M_LN10 / 20;
451  s->segments[i].y *= M_LN10 / 20;
452  }
453 
454 #define L(x) s->segments[i - (x)]
455  for (i = 4; s->segments[i - 2].x; i += 2) {
456  double x, y, cx, cy, in1, in2, out1, out2, theta, len, r;
457 
458  L(4).a = 0;
459  L(4).b = (L(2).y - L(4).y) / (L(2).x - L(4).x);
460 
461  L(2).a = 0;
462  L(2).b = (L(0).y - L(2).y) / (L(0).x - L(2).x);
463 
464  theta = atan2(L(2).y - L(4).y, L(2).x - L(4).x);
465  len = sqrt(pow(L(2).x - L(4).x, 2.) + pow(L(2).y - L(4).y, 2.));
466  r = FFMIN(radius, len);
467  L(3).x = L(2).x - r * cos(theta);
468  L(3).y = L(2).y - r * sin(theta);
469 
470  theta = atan2(L(0).y - L(2).y, L(0).x - L(2).x);
471  len = sqrt(pow(L(0).x - L(2).x, 2.) + pow(L(0).y - L(2).y, 2.));
472  r = FFMIN(radius, len / 2);
473  x = L(2).x + r * cos(theta);
474  y = L(2).y + r * sin(theta);
475 
476  cx = (L(3).x + L(2).x + x) / 3;
477  cy = (L(3).y + L(2).y + y) / 3;
478 
479  L(2).x = x;
480  L(2).y = y;
481 
482  in1 = cx - L(3).x;
483  out1 = cy - L(3).y;
484  in2 = L(2).x - L(3).x;
485  out2 = L(2).y - L(3).y;
486  L(3).a = (out2 / in2 - out1 / in1) / (in2 - in1);
487  L(3).b = out1 / in1 - L(3).a * in1;
488  }
489  L(3).x = 0;
490  L(3).y = L(2).y;
491 
492  s->in_min_lin = exp(s->segments[1].x);
493  s->out_min_lin = exp(s->segments[1].y);
494 
495  for (i = 0; i < channels; i++) {
496  ChanParam *cp = &s->channels[i];
497 
498  if (cp->attack > 1.0 / sample_rate)
499  cp->attack = 1.0 - exp(-1.0 / (sample_rate * cp->attack));
500  else
501  cp->attack = 1.0;
502  if (cp->decay > 1.0 / sample_rate)
503  cp->decay = 1.0 - exp(-1.0 / (sample_rate * cp->decay));
504  else
505  cp->decay = 1.0;
506  cp->volume = pow(10.0, s->initial_volume / 20);
507  }
508 
509  s->delay_samples = s->delay * sample_rate;
510  if (s->delay_samples <= 0) {
512  return 0;
513  }
514 
516  if (!s->delay_frame) {
517  uninit(ctx);
518  return AVERROR(ENOMEM);
519  }
520 
521  s->delay_frame->format = outlink->format;
524 
525  err = av_frame_get_buffer(s->delay_frame, 32);
526  if (err)
527  return err;
528 
529  outlink->flags |= FF_LINK_FLAG_REQUEST_LOOP;
530  s->compand = compand_delay;
531  return 0;
532 }
533 
534 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
535 {
536  AVFilterContext *ctx = inlink->dst;
537  CompandContext *s = ctx->priv;
538 
539  return s->compand(ctx, frame);
540 }
541 
542 static int request_frame(AVFilterLink *outlink)
543 {
544  AVFilterContext *ctx = outlink->src;
545  CompandContext *s = ctx->priv;
546  int ret = 0;
547 
548  ret = ff_request_frame(ctx->inputs[0]);
549 
550  if (ret == AVERROR_EOF && !ctx->is_disabled && s->delay_count)
551  ret = compand_drain(outlink);
552 
553  return ret;
554 }
555 
556 static const AVFilterPad compand_inputs[] = {
557  {
558  .name = "default",
559  .type = AVMEDIA_TYPE_AUDIO,
560  .filter_frame = filter_frame,
561  },
562  { NULL }
563 };
564 
565 static const AVFilterPad compand_outputs[] = {
566  {
567  .name = "default",
568  .request_frame = request_frame,
569  .config_props = config_output,
570  .type = AVMEDIA_TYPE_AUDIO,
571  },
572  { NULL }
573 };
574 
575 
577  .name = "compand",
578  .description = NULL_IF_CONFIG_SMALL(
579  "Compress or expand audio dynamic range."),
580  .query_formats = query_formats,
581  .priv_size = sizeof(CompandContext),
582  .priv_class = &compand_class,
583  .init = init,
584  .uninit = uninit,
585  .inputs = compand_inputs,
586  .outputs = compand_outputs,
587 };
#define L(x)
static const AVFilterPad compand_inputs[]
Definition: af_compand.c:556
#define NULL
Definition: coverity.c:32
int ff_set_common_channel_layouts(AVFilterContext *ctx, AVFilterChannelLayouts *layouts)
A helper for query_formats() which sets all links to the same list of channel layouts/sample rates...
Definition: formats.c:523
char * points
Definition: af_compand.c:52
const char * s
Definition: avisynth_c.h:631
This structure describes decoded (raw) audio or video data.
Definition: frame.h:171
static const AVOption compand_options[]
Definition: af_compand.c:73
AVOption.
Definition: opt.h:255
static const AVFilterPad outputs[]
Definition: af_ashowinfo.c:248
static double get_volume(CompandContext *s, double in_lin)
Definition: af_compand.c:153
Main libavfilter public API header.
int64_t pts
Definition: af_compand.c:65
AVFILTER_DEFINE_CLASS(compand)
double out_min_lin
Definition: af_compand.c:56
double, planar
Definition: samplefmt.h:71
#define OFFSET(x)
Definition: af_compand.c:70
double in_min_lin
Definition: af_compand.c:55
static enum AVSampleFormat formats[]
double attack
Definition: af_compand.c:39
static const AVFilterPad compand_outputs[]
Definition: af_compand.c:565
static void update_volume(ChanParam *cp, double in)
Definition: af_compand.c:143
int is_disabled
the enabled state from the last expression evaluation
Definition: avfilter.h:686
static av_cold int init(AVFilterContext *ctx)
Definition: af_compand.c:86
AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
Definition: formats.c:283
const char * name
Pad name.
Definition: internal.h:67
AVFilterLink ** inputs
array of pointers to input links
Definition: avfilter.h:641
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1145
#define av_cold
Definition: attributes.h:74
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:135
float delta
AVOptions.
static int compand_delay(AVFilterContext *ctx, AVFrame *frame)
Definition: af_compand.c:220
static int query_formats(AVFilterContext *ctx)
Definition: af_compand.c:102
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:257
static AVFrame * frame
#define AVERROR_EOF
End of file.
Definition: error.h:55
#define av_log(a,...)
A filter pad used for either input or output.
Definition: internal.h:61
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:140
static int compand_nodelay(AVFilterContext *ctx, AVFrame *frame)
Definition: af_compand.c:174
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
int ff_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
A helper for query_formats() which sets all links to the same list of formats.
Definition: formats.c:542
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
Definition: audio.c:70
#define AVERROR(e)
Definition: error.h:43
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:148
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:175
const char * r
Definition: vf_curves.c:107
void * priv
private data for use by the filter
Definition: avfilter.h:654
AVFilter ff_af_compand
Definition: af_compand.c:576
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
simple assert() macros that are a bit more flexible than ISO C assert().
GLsizei count
Definition: opengl_enc.c:109
uint64_t channel_layout
Channel layout of the audio data.
Definition: frame.h:427
static int request_frame(AVFilterLink *outlink)
Definition: af_compand.c:542
ChanParam * channels
Definition: af_compand.c:54
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
#define FFMIN(a, b)
Definition: common.h:66
float y
ret
Definition: avfilter.c:974
char * decays
Definition: af_compand.c:52
CompandSegment * segments
Definition: af_compand.c:53
double delay
Definition: af_compand.c:60
AVFilterChannelLayouts * ff_all_channel_layouts(void)
Construct an empty AVFilterChannelLayouts/AVFilterFormats struct – representing any channel layout (w...
Definition: formats.c:385
A list of supported channel layouts.
Definition: formats.h:85
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
Definition: frame.h:232
sample_rate
AVS_Value src
Definition: avisynth_c.h:482
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:59
int av_frame_is_writable(AVFrame *frame)
Check if the frame data is writable.
Definition: frame.c:488
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;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);returnNULL;}returnac;}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;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->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);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> in
Describe the class of an AVClass context structure.
Definition: log.h:67
#define A
Definition: af_compand.c:71
Filter definition.
Definition: avfilter.h:470
static const AVFilterPad inputs[]
Definition: af_ashowinfo.c:239
rational number numerator/denominator
Definition: rational.h:43
double curve_dB
Definition: af_compand.c:57
#define S(x)
const char * name
Filter name.
Definition: avfilter.h:474
AVFilterLink ** outputs
array of pointers to output links
Definition: avfilter.h:648
enum MovChannelLayoutTag * layouts
Definition: mov_chan.c:434
AVFilterFormats * ff_all_samplerates(void)
Definition: formats.c:379
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
Definition: frame.c:265
Frame requests may need to loop in order to be fulfilled.
Definition: internal.h:359
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()...
Definition: avstring.c:184
#define M_LN10
Definition: mathematics.h:37
static av_cold void uninit(AVFilterContext *ctx)
Definition: af_compand.c:93
double gain_dB
Definition: af_compand.c:58
double decay
Definition: af_compand.c:40
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
Definition: af_compand.c:534
static int config_output(AVFilterLink *outlink)
Definition: af_compand.c:329
static int compand_drain(AVFilterLink *outlink)
Definition: af_compand.c:293
int len
int(* compand)(AVFilterContext *ctx, AVFrame *frame)
Definition: af_compand.c:67
static void count_items(char *item_str, int *nb_items)
Definition: af_compand.c:132
char * attacks
Definition: af_compand.c:52
A list of supported formats for one end of a filter link.
Definition: formats.h:64
An instance of a filter.
Definition: avfilter.h:633
#define av_uninit(x)
Definition: attributes.h:141
AVFrame * delay_frame
Definition: af_compand.c:61
static void * av_mallocz_array(size_t nmemb, size_t size)
Definition: mem.h:228
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:701
#define av_freep(p)
int ff_request_frame(AVFilterLink *link)
Request an input frame from the filter at the other end of the link.
Definition: avfilter.c:343
double initial_volume
Definition: af_compand.c:59
double volume
Definition: af_compand.c:41
internal API functions
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:215
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:225
#define MOD(a, b)
Definition: af_compand.c:218
int ff_set_common_samplerates(AVFilterContext *ctx, AVFilterFormats *samplerates)
Definition: formats.c:530
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:548
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:241