diff --git a/libavfilter/af_afftdn.c b/libavfilter/af_afftdn.c index 0d24b4620a..b1b3402bf2 100644 --- a/libavfilter/af_afftdn.c +++ b/libavfilter/af_afftdn.c @@ -35,6 +35,13 @@ #define SFM_FLAGS_SIZE (512) #define SFM_FLAGS_MASK (SFM_FLAGS_SIZE - 1) +enum SampleNoiseModes { + SAMPLE_NONE, + SAMPLE_START, + SAMPLE_STOP, + NB_SAMPLEMODES +}; + enum OutModes { IN_MODE, OUT_MODE, @@ -124,8 +131,7 @@ typedef struct AudioFFTDeNoiseContext { int channels; int sample_noise; - int sample_noise_start; - int sample_noise_end; + int sample_noise_mode; float sample_rate; int buffer_length; int fft_length; @@ -204,6 +210,13 @@ static const AVOption afftdn_options[] = { { "average", "average", 0, AV_OPT_TYPE_CONST, {.i64 = AVERAGE_LINK}, 0, 0, AFR, "link" }, { "band_multiplier", "set band multiplier",OFFSET(band_multiplier), AV_OPT_TYPE_FLOAT,{.dbl = 1.25}, 0.2,5, AF }, { "bm", "set band multiplier", OFFSET(band_multiplier), AV_OPT_TYPE_FLOAT,{.dbl = 1.25}, 0.2,5, AF }, + { "sample_noise", "set sample noise mode",OFFSET(sample_noise_mode),AV_OPT_TYPE_INT,{.i64 = SAMPLE_NONE}, 0, NB_SAMPLEMODES-1, AFR, "sample" }, + { "sn", "set sample noise mode",OFFSET(sample_noise_mode),AV_OPT_TYPE_INT,{.i64 = SAMPLE_NONE}, 0, NB_SAMPLEMODES-1, AFR, "sample" }, + { "none", "none", 0, AV_OPT_TYPE_CONST, {.i64 = SAMPLE_NONE}, 0, 0, AFR, "sample" }, + { "start", "start", 0, AV_OPT_TYPE_CONST, {.i64 = SAMPLE_START}, 0, 0, AFR, "sample" }, + { "begin", "start", 0, AV_OPT_TYPE_CONST, {.i64 = SAMPLE_START}, 0, 0, AFR, "sample" }, + { "stop", "stop", 0, AV_OPT_TYPE_CONST, {.i64 = SAMPLE_STOP}, 0, 0, AFR, "sample" }, + { "end", "stop", 0, AV_OPT_TYPE_CONST, {.i64 = SAMPLE_STOP}, 0, 0, AFR, "sample" }, { NULL } }; @@ -1155,13 +1168,13 @@ static int output_frame(AVFilterLink *inlink, AVFrame *in) } } - if (s->sample_noise_start) { + if (s->sample_noise_mode == SAMPLE_START) { for (int ch = 0; ch < inlink->ch_layout.nb_channels; ch++) { DeNoiseChannel *dnch = &s->dnch[ch]; init_sample_noise(dnch); } - s->sample_noise_start = 0; + s->sample_noise_mode = SAMPLE_NONE; s->sample_noise = 1; } @@ -1173,7 +1186,7 @@ static int output_frame(AVFilterLink *inlink, AVFrame *in) } } - if (s->sample_noise_end) { + if (s->sample_noise_mode == SAMPLE_STOP) { for (int ch = 0; ch < inlink->ch_layout.nb_channels; ch++) { DeNoiseChannel *dnch = &s->dnch[ch]; double sample_noise[NB_PROFILE_BANDS]; @@ -1183,7 +1196,7 @@ static int output_frame(AVFilterLink *inlink, AVFrame *in) set_parameters(s, dnch, 1, 1); } s->sample_noise = 0; - s->sample_noise_end = 0; + s->sample_noise_mode = SAMPLE_NONE; } s->block_count++; @@ -1297,36 +1310,23 @@ static int process_command(AVFilterContext *ctx, const char *cmd, const char *ar char *res, int res_len, int flags) { AudioFFTDeNoiseContext *s = ctx->priv; - int need_reset = 0; int ret = 0; - if (!strcmp(cmd, "sample_noise") || - !strcmp(cmd, "sn")) { - if (!strcmp(args, "start")) { - s->sample_noise_start = 1; - s->sample_noise_end = 0; - } else if (!strcmp(args, "end") || - !strcmp(args, "stop")) { - s->sample_noise_start = 0; - s->sample_noise_end = 1; - } - } else { - ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags); - if (ret < 0) - return ret; - need_reset = 1; - } + ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags); + if (ret < 0) + return ret; - if (need_reset) { - for (int ch = 0; ch < s->channels; ch++) { - DeNoiseChannel *dnch = &s->dnch[ch]; + if (!strcmp(cmd, "sample_noise") || !strcmp(cmd, "sn")) + return 0; - dnch->noise_reduction = s->noise_reduction; - dnch->noise_floor = s->noise_floor; - dnch->residual_floor = s->residual_floor; + for (int ch = 0; ch < s->channels; ch++) { + DeNoiseChannel *dnch = &s->dnch[ch]; - set_parameters(s, dnch, 1, 1); - } + dnch->noise_reduction = s->noise_reduction; + dnch->noise_floor = s->noise_floor; + dnch->residual_floor = s->residual_floor; + + set_parameters(s, dnch, 1, 1); } return 0;