On Wed, 30 Apr 2014 22:10:15 +0200
Luca Barbato <[email protected]> wrote:

> Utility function to get the upper bound on the number of samples the
> resampler would output.
> ---
> 
> Now also with a check for the null resampler.
> 
>  doc/APIchanges             |  3 +++
>  libavresample/avresample.h | 22 ++++++++++++++++++----
>  libavresample/utils.c      | 18 ++++++++++++++++++
>  libavresample/version.h    |  2 +-
>  4 files changed, 40 insertions(+), 5 deletions(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 28afc9b..66d3721 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -13,6 +13,9 @@ libavutil:     2013-12-xx
> 
>  API changes, most recent first:
> 
> +2014-04-xx - xxxxxxx - lavr 1.3.0 - avresample.h
> +  Add avresample_max_output_samples
> +
>  2014-04-xx - xxxxxxx - lavc 55.50.0 - dxva2.h
>    Add FF_DXVA2_WORKAROUND_INTEL_CLEARVIDEO for old Intel GPUs.
> 
> diff --git a/libavresample/avresample.h b/libavresample/avresample.h
> index 3358628..691c26a 100644
> --- a/libavresample/avresample.h
> +++ b/libavresample/avresample.h
> @@ -313,11 +313,25 @@ int avresample_set_compensation(AVAudioResampleContext 
> *avr, int sample_delta,
>                                  int compensation_distance);
> 
>  /**
> + * Provide the upper bound on the number of samples the configured
> + * conversion would output.
> + *
> + * @param avr           audio resample context
> + * @param in_nb_samples number of input samples
> + *
> + * @return              number of samples or AVERROR(EINVAL) if the value
> + *                      would exceed INT_MAX
> + */
> +
> +int avresample_max_output_samples(AVAudioResampleContext *avr,
> +                                  int in_nb_samples);
> +
> +
> +/**
>   * Convert input samples and write them to the output FIFO.
>   *
> - * The upper bound on the number of output samples is given by
> - * avresample_available() + (avresample_get_delay() + number of input 
> samples) *
> - * output sample rate / input sample rate.
> + * The upper bound on the number of output samples can be obtained through
> + * avresample_max_output_samples().
>   *
>   * The output data can be NULL or have fewer allocated samples than required.
>   * In this case, any remaining samples not written to the output will be 
> added
> @@ -334,7 +348,7 @@ int avresample_set_compensation(AVAudioResampleContext 
> *avr, int sample_delta,
>   * samples. To get this data as output, either call avresample_convert() with
>   * NULL input or call avresample_read().
>   *
> - * @see avresample_available()
> + * @see avresample_max_output_samples()
>   * @see avresample_read()
>   * @see avresample_get_delay()
>   *
> diff --git a/libavresample/utils.c b/libavresample/utils.c
> index 35bee42..0ba4877 100644
> --- a/libavresample/utils.c
> +++ b/libavresample/utils.c
> @@ -622,6 +622,24 @@ int avresample_available(AVAudioResampleContext *avr)
>      return av_audio_fifo_size(avr->out_fifo);
>  }
> 
> +int avresample_max_output_samples(AVAudioResampleContext *avr,
> +                                  int in_nb_samples)
> +{
> +    int64_t samples = avresample_get_delay(avr) + in_nb_samples;

avresample_get_delay() returns an int - so could this overflow?

Why not just return int64_t in the first place?

Are the sample rates used below sanitized on initialization so they
can't cause overflows, or can they be arbitrary?

> +    if (avr->resample_needed) {
> +        samples = samples * avr->out_sample_rate + avr->in_sample_rate / 2;
> +        samples /= avr->in_sample_rate;
> +    }
> +
> +    samples += avresample_available(avr);
> +
> +    if (samples > INT_MAX)
> +        return AVERROR(EINVAL);
> +
> +    return samples;
> +}
> +
>  int avresample_read(AVAudioResampleContext *avr, uint8_t **output, int 
> nb_samples)
>  {
>      if (!output)
> diff --git a/libavresample/version.h b/libavresample/version.h
> index ca836e4..e740871 100644
> --- a/libavresample/version.h
> +++ b/libavresample/version.h
> @@ -28,7 +28,7 @@
>  #include "libavutil/version.h"
> 
>  #define LIBAVRESAMPLE_VERSION_MAJOR  1
> -#define LIBAVRESAMPLE_VERSION_MINOR  2
> +#define LIBAVRESAMPLE_VERSION_MINOR  3
>  #define LIBAVRESAMPLE_VERSION_MICRO  0
> 
>  #define LIBAVRESAMPLE_VERSION_INT  
> AV_VERSION_INT(LIBAVRESAMPLE_VERSION_MAJOR, \
> --
> 1.9.0
> 
> _______________________________________________
> libav-devel mailing list
> [email protected]
> https://lists.libav.org/mailman/listinfo/libav-devel

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to