[FFmpeg-cvslog] avfilter/af_asubboost: add channels option
Paul B Mahol
git at videolan.org
Fri May 13 23:07:04 EEST 2022
ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Fri May 13 22:00:08 2022 +0200| [b90341d1d5585b7181873ac4d85a7c373eb3b2ae] | committer: Paul B Mahol
avfilter/af_asubboost: add channels option
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b90341d1d5585b7181873ac4d85a7c373eb3b2ae
---
doc/filters.texi | 3 +++
libavfilter/af_asubboost.c | 23 +++++++++++++++++++++++
2 files changed, 26 insertions(+)
diff --git a/doc/filters.texi b/doc/filters.texi
index e7623b7967..45ebcccf1c 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -3159,6 +3159,9 @@ Default value is 0.5.
@item delay
Set delay. Allowed range is from 1 to 100.
Default value is 20.
+
+ at item channels
+Set the channels to process. Default value is all available.
@end table
@subsection Commands
diff --git a/libavfilter/af_asubboost.c b/libavfilter/af_asubboost.c
index 1eb079e3b6..29a1f66ce6 100644
--- a/libavfilter/af_asubboost.c
+++ b/libavfilter/af_asubboost.c
@@ -38,6 +38,9 @@ typedef struct ASubBoostContext {
double a0, a1, a2;
double b0, b1, b2;
+ char *ch_layout_str;
+ AVChannelLayout ch_layout;
+
int *write_pos;
int buffer_samples;
@@ -114,9 +117,18 @@ static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jo
double *buffer = (double *)s->buffer->extended_data[ch];
double *w = (double *)s->w->extended_data[ch];
int write_pos = s->write_pos[ch];
+ enum AVChannel channel = av_channel_layout_channel_from_index(&in->ch_layout, ch);
+ const int bypass = av_channel_layout_index_from_channel(&s->ch_layout, channel) < 0;
const double a = 0.00001;
const double b = 1. - a;
+ if (bypass) {
+ if (in != out)
+ memcpy(out->extended_data[ch], in->extended_data[ch],
+ in->nb_samples * sizeof(double));
+ continue;
+ }
+
for (int n = 0; n < in->nb_samples; n++) {
double out_sample, boost;
@@ -143,9 +155,18 @@ static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jo
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
{
AVFilterContext *ctx = inlink->dst;
+ ASubBoostContext *s = ctx->priv;
AVFilterLink *outlink = ctx->outputs[0];
ThreadData td;
AVFrame *out;
+ int ret;
+
+ ret = av_channel_layout_copy(&s->ch_layout, &inlink->ch_layout);
+ if (ret < 0)
+ return ret;
+ if (strcmp(s->ch_layout_str, "all"))
+ av_channel_layout_from_string(&s->ch_layout,
+ s->ch_layout_str);
if (av_frame_is_writable(in)) {
out = in;
@@ -171,6 +192,7 @@ static av_cold void uninit(AVFilterContext *ctx)
{
ASubBoostContext *s = ctx->priv;
+ av_channel_layout_uninit(&s->ch_layout);
av_frame_free(&s->buffer);
av_frame_free(&s->w);
av_freep(&s->write_pos);
@@ -200,6 +222,7 @@ static const AVOption asubboost_options[] = {
{ "cutoff", "set cutoff", OFFSET(cutoff), AV_OPT_TYPE_DOUBLE, {.dbl=100}, 50, 900, FLAGS },
{ "slope", "set slope", OFFSET(slope), AV_OPT_TYPE_DOUBLE, {.dbl=0.5}, 0.0001, 1, FLAGS },
{ "delay", "set delay", OFFSET(delay), AV_OPT_TYPE_DOUBLE, {.dbl=20}, 1, 100, FLAGS },
+ { "channels", "set channels to filter", OFFSET(ch_layout_str), AV_OPT_TYPE_STRING, {.str="all"}, 0, 0, FLAGS },
{ NULL }
};
More information about the ffmpeg-cvslog
mailing list