I would maybe even remove the av_freep(..) call, to keep the original buffer and the original delay. The user would only get an error code that the delay could not be changed.
st 19. 1. 2022 o 20:14 Andreas Rheinhardt <andreas.rheinha...@outlook.com> napĂsal(a): > 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 <deiwo...@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); > \ > > + } > \ > > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".