]> git.sesse.net Git - ffmpeg/commitdiff
swr: add swr_get_delay() to find the exact delay the swresampler introduces.
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 18 May 2012 21:02:10 +0000 (23:02 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 18 May 2012 21:02:10 +0000 (23:02 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libswresample/resample.c
libswresample/swresample.h

index 868f3eb949bab8205a153e56aa40e19824e8f165..558401c4595e3f9ff8589d6e689527181cba23da 100644 (file)
@@ -367,3 +367,18 @@ int swri_multiple_resample(ResampleContext *c, AudioData *dst, int dst_size, Aud
 
     return ret;
 }
+
+int64_t swr_get_delay(struct SwrContext *s, int64_t base){
+    ResampleContext *c = s->resample;
+    if(c){
+        int64_t num = s->in_buffer_count - (c->filter_length-1)/2;
+        num <<= c->phase_shift;
+        num -= c->index;
+        num *= c->src_incr;
+        num -= c->frac;
+
+        return av_rescale(num, base, s->in_sample_rate*(int64_t)c->src_incr << c->phase_shift);
+    }else{
+        return (s->in_buffer_count*base + (s->in_sample_rate>>1))/ s->in_sample_rate;
+    }
+}
index 137517d6d2935b19154fe65ac95388d7fcfec727..43112f9c17baeb8e88dc974c4c1afcf33c310c3b 100644 (file)
@@ -30,7 +30,7 @@
 #include "libavutil/samplefmt.h"
 
 #define LIBSWRESAMPLE_VERSION_MAJOR 0
-#define LIBSWRESAMPLE_VERSION_MINOR 11
+#define LIBSWRESAMPLE_VERSION_MINOR 12
 #define LIBSWRESAMPLE_VERSION_MICRO 100
 
 #define LIBSWRESAMPLE_VERSION_INT  AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \
@@ -158,6 +158,24 @@ int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map);
  */
 int swr_set_matrix(struct SwrContext *s, const double *matrix, int stride);
 
+/**
+ * Gets the delay the next input sample will experience relative to the next output sample.
+ *
+ * Swresample can buffer data if more input has been provided than available
+ * output space, also converting between sample rates needs a delay.
+ * This function returns the sum of all such delays.
+ *
+ * @param s     swr context
+ * @param base  timebase in which the returned delay will be
+ *              if its set to 1 the returned delay is in seconds
+ *              if its set to 1000 the returned delay is in milli seconds
+ *              if its set to the input sample rate then the returned delay is in input samples
+ *              if its set to the output sample rate then the returned delay is in output samples
+ *              an exact rounding free delay can be found by using LCM(in_sample_rate, out_sample_rate)
+ * @returns     the delay in 1/base units.
+ */
+int64_t swr_get_delay(struct SwrContext *s, int64_t base);
+
 /**
  * Return the LIBSWRESAMPLE_VERSION_INT constant.
  */