avresample: Add avresample_get_out_samples
authorLuca Barbato <lu_zero@gentoo.org>
Wed, 30 Apr 2014 17:56:05 +0000 (19:56 +0200)
committerLuca Barbato <lu_zero@gentoo.org>
Wed, 28 May 2014 20:04:56 +0000 (22:04 +0200)
Utility function to get the upper bound on the number of samples the
resampler would output.

doc/APIchanges
libavresample/avresample.h
libavresample/utils.c
libavresample/version.h

index c77a607..279cf66 100644 (file)
@@ -13,6 +13,9 @@ libavutil:     2013-12-xx
 
 API changes, most recent first:
 
 
 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.
 2014-05-24 - xxxxxxx - lavf 55.19.0 - avformat.h
   Add strict_std_compliance and related AVOptions to support experimental
   muxing.
index 3358628..6105759 100644 (file)
@@ -76,9 +76,8 @@
  * while (get_input(&input, &in_linesize, &in_samples)) {
  *     uint8_t *output
  *     int out_linesize;
  * 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,
  *     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/channel_layout.h"
 #include "libavutil/dict.h"
 #include "libavutil/log.h"
+#include "libavutil/mathematics.h"
 
 #include "libavresample/version.h"
 
 
 #include "libavresample/version.h"
 
@@ -313,11 +313,23 @@ int avresample_set_compensation(AVAudioResampleContext *avr, int sample_delta,
                                 int compensation_distance);
 
 /**
                                 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.
  *
  * 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
  *
  * 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().
  *
  * 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()
  *
  * @see avresample_read()
  * @see avresample_get_delay()
  *
index 35bee42..8c5a9e2 100644 (file)
@@ -622,6 +622,25 @@ int avresample_available(AVAudioResampleContext *avr)
     return av_audio_fifo_size(avr->out_fifo);
 }
 
     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)
 int avresample_read(AVAudioResampleContext *avr, uint8_t **output, int nb_samples)
 {
     if (!output)
index ca836e4..e740871 100644 (file)
@@ -28,7 +28,7 @@
 #include "libavutil/version.h"
 
 #define LIBAVRESAMPLE_VERSION_MAJOR  1
 #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, \
 #define LIBAVRESAMPLE_VERSION_MICRO  0
 
 #define LIBAVRESAMPLE_VERSION_INT  AV_VERSION_INT(LIBAVRESAMPLE_VERSION_MAJOR, \