[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