[FFmpeg-devel] [PATCH] avfilter/adelay: Add command support

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Wed Jan 19 21:14:36 EET 2022


David Lacko:
> Adds command 'delays' to the adelay filter.
> This command accepts same values as option with one difference, to apply
> delay to all channels prefix 'all:' to the arguments is accepted.
> 
> Signed-off-by: David Lacko <deiwo101 at gmail.com>
> ---
>  libavfilter/af_adelay.c | 183 ++++++++++++++++++++++++++++++++++------
>  1 file changed, 157 insertions(+), 26 deletions(-)
> 
> diff --git a/libavfilter/af_adelay.c b/libavfilter/af_adelay.c
> index ed8a8ae739..1e13cf7fb0 100644
> --- a/libavfilter/af_adelay.c
> +++ b/libavfilter/af_adelay.c
> @@ -31,6 +31,7 @@ typedef struct ChanDelay {
>      int64_t delay;
>      size_t delay_index;
>      size_t index;
> +    unsigned int samples_size;
>      uint8_t *samples;
>  } ChanDelay;
>  
> @@ -48,13 +49,14 @@ typedef struct AudioDelayContext {
>  
>      void (*delay_channel)(ChanDelay *d, int nb_samples,
>                            const uint8_t *src, uint8_t *dst);
> +    int (*resize_channel_samples)(ChanDelay *d, int64_t new_delay);
>  } AudioDelayContext;
>  
>  #define OFFSET(x) offsetof(AudioDelayContext, x)
>  #define A AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
>  
>  static const AVOption adelay_options[] = {
> -    { "delays", "set list of delays for each channel", OFFSET(delays), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, A },
> +    { "delays", "set list of delays for each channel", OFFSET(delays), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, A | AV_OPT_FLAG_RUNTIME_PARAM },
>      { "all",    "use last available delay for remained channels", OFFSET(all), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, A },
>      { NULL }
>  };
> @@ -96,11 +98,92 @@ DELAY(s32, int32_t, 0)
>  DELAY(flt, float,   0)
>  DELAY(dbl, double,  0)
>  
> +#define CHANGE_DELAY(name, type, fill)                                                                  \
> +static int resize_samples_## name ##p(ChanDelay *d, int64_t new_delay)                                  \
> +{                                                                                                       \
> +    type *samples = (type *)d->samples;                                                                 \
> +                                                                                                        \
> +    if (new_delay == d->delay) {                                                                        \
> +        return 0;                                                                                       \
> +    }                                                                                                   \
> +                                                                                                        \
> +    if (new_delay == 0) {                                                                               \
> +        av_freep(&d->samples);                                                                          \
> +        d->samples_size = 0;                                                                            \
> +        d->delay = 0;                                                                                   \
> +        d->index = 0;                                                                                   \
> +        return 0;                                                                                       \
> +    }                                                                                                   \
> +                                                                                                        \
> +    d->samples = av_fast_realloc(d->samples, &d->samples_size, new_delay * sizeof(type));               \
> +    if (!d->samples) {                                                                                  \
> +        av_freep(samples);                                                                              \

av_free(samples) or av_freep(&samples), but not av_freep(samples).
The typical way to write this is btw tmp = av_fast_realloc(buf,...) (in
your case samples = av_fast_realloc(d->samples, ...) with
av_freep(&d->samples); in the error branch and d->samples = samples in
the non-error-case.

> +        return AVERROR(ENOMEM);                                                                         \
> +    }                                                                                                   \




More information about the ffmpeg-devel mailing list