diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2014-04-30 19:56:05 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2014-05-28 22:04:56 +0200 |
commit | b2d45654220503224aa94e78cdff19ec624e9342 (patch) | |
tree | 7aa8f0cd4eed0bef5865ea8b58c0267ac89032ec | |
parent | c94e2e85cb6af8a570d8542a830556243bd32873 (diff) | |
download | ffmpeg-b2d45654220503224aa94e78cdff19ec624e9342.tar.gz |
avresample: Add avresample_get_out_samples
Utility function to get the upper bound on the number of samples the
resampler would output.
-rw-r--r-- | doc/APIchanges | 3 | ||||
-rw-r--r-- | libavresample/avresample.h | 26 | ||||
-rw-r--r-- | libavresample/utils.c | 19 | ||||
-rw-r--r-- | libavresample/version.h | 2 |
4 files changed, 42 insertions, 8 deletions
diff --git a/doc/APIchanges b/doc/APIchanges index c77a6070c8..279cf66527 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-05-24 - xxxxxxx - lavf 55.19.0 - avformat.h Add strict_std_compliance and related AVOptions to support experimental muxing. diff --git a/libavresample/avresample.h b/libavresample/avresample.h index 3358628e37..6105759399 100644 --- a/libavresample/avresample.h +++ b/libavresample/avresample.h @@ -76,9 +76,8 @@ * while (get_input(&input, &in_linesize, &in_samples)) { * uint8_t *output * int out_linesize; - * int out_samples = avresample_available(avr) + - * av_rescale_rnd(avresample_get_delay(avr) + - * in_samples, 44100, 48000, AV_ROUND_UP); + * int out_samples = avresample_get_out_samples(avr, in_samples); + * * av_samples_alloc(&output, &out_linesize, 2, out_samples, * AV_SAMPLE_FMT_S16, 0); * out_samples = avresample_convert(avr, &output, out_linesize, out_samples, @@ -97,6 +96,7 @@ #include "libavutil/channel_layout.h" #include "libavutil/dict.h" #include "libavutil/log.h" +#include "libavutil/mathematics.h" #include "libavresample/version.h" @@ -313,11 +313,23 @@ 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_get_out_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_get_out_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 +346,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_get_out_samples() * @see avresample_read() * @see avresample_get_delay() * diff --git a/libavresample/utils.c b/libavresample/utils.c index 35bee42b50..8c5a9e2ec2 100644 --- a/libavresample/utils.c +++ b/libavresample/utils.c @@ -622,6 +622,25 @@ int avresample_available(AVAudioResampleContext *avr) return av_audio_fifo_size(avr->out_fifo); } +int avresample_get_out_samples(AVAudioResampleContext *avr, int in_nb_samples) +{ + int64_t samples = avresample_get_delay(avr) + (int64_t)in_nb_samples; + + if (avr->resample_needed) { + samples = av_rescale_rnd(samples, + avr->out_sample_rate, + avr->in_sample_rate, + AV_ROUND_UP); + } + + 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 ca836e4a56..e74087165b 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, \ |