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;
+
+    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

Reply via email to