X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Faf_adelay.c;h=c6450cb2b9bf0ca8eb5e66c782c533a64d51d0b0;hb=a04ad248a05e7b613abe09b3bb067f555108d794;hp=eb97039566d7169867e0eb90b51046fd4d4962b2;hpb=29929fc8e2449d2db8bd144b2badc8d1e6347412;p=ffmpeg diff --git a/libavfilter/af_adelay.c b/libavfilter/af_adelay.c index eb97039566d..c6450cb2b9b 100644 --- a/libavfilter/af_adelay.c +++ b/libavfilter/af_adelay.c @@ -28,14 +28,15 @@ #include "internal.h" typedef struct ChanDelay { - int delay; - unsigned delay_index; - unsigned index; + int64_t delay; + size_t delay_index; + size_t index; uint8_t *samples; } ChanDelay; typedef struct AudioDelayContext { const AVClass *class; + int all; char *delays; ChanDelay *chandelay; int nb_delays; @@ -54,6 +55,7 @@ typedef struct AudioDelayContext { static const AVOption adelay_options[] = { { "delays", "set list of delays for each channel", OFFSET(delays), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, A }, + { "all", "use last available delay for remained channels", OFFSET(all), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, A }, { NULL } }; @@ -150,10 +152,13 @@ static int config_input(AVFilterLink *inlink) p = NULL; - ret = av_sscanf(arg, "%d%c", &d->delay, &type); + ret = av_sscanf(arg, "%"SCNd64"%c", &d->delay, &type); if (ret != 2 || type != 'S') { div = type == 's' ? 1.0 : 1000.0; - av_sscanf(arg, "%f", &delay); + if (av_sscanf(arg, "%f", &delay) != 1) { + av_log(ctx, AV_LOG_ERROR, "Invalid syntax for delay.\n"); + return AVERROR(EINVAL); + } d->delay = delay * inlink->sample_rate / div; } @@ -163,6 +168,11 @@ static int config_input(AVFilterLink *inlink) } } + if (s->all && i) { + for (int j = i; j < s->nb_delays; j++) + s->chandelay[j].delay = s->chandelay[i-1].delay; + } + s->padding = s->chandelay[0].delay; for (i = 1; i < s->nb_delays; i++) { ChanDelay *d = &s->chandelay[i]; @@ -184,6 +194,11 @@ static int config_input(AVFilterLink *inlink) if (!d->delay) continue; + if (d->delay > SIZE_MAX) { + av_log(ctx, AV_LOG_ERROR, "Requested delay is too big.\n"); + return AVERROR(EINVAL); + } + d->samples = av_malloc_array(d->delay, s->block_align); if (!d->samples) return AVERROR(ENOMEM); @@ -335,7 +350,7 @@ static const AVFilterPad adelay_outputs[] = { { NULL } }; -AVFilter ff_af_adelay = { +const AVFilter ff_af_adelay = { .name = "adelay", .description = NULL_IF_CONFIG_SMALL("Delay one or more audio channels."), .query_formats = query_formats,