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".

Reply via email to