swresample: soxr implementation for swr_get_out_samples()
authorRob Sykes <aquegg@yahoo.co.uk>
Sun, 21 Jun 2015 19:45:50 +0000 (19:45 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 21 Jun 2015 21:38:44 +0000 (23:38 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libswresample/soxr_resample.c
libswresample/swresample_internal.h

index 0f75bc5..535e9ce 100644 (file)
@@ -67,7 +67,17 @@ static void destroy(struct ResampleContext * *c){
 }
 
 static int flush(struct SwrContext *s){
+    s->delayed_samples_fixup = soxr_delay((soxr_t)s->resample);
+
     soxr_process((soxr_t)s->resample, NULL, 0, NULL, NULL, 0, NULL);
+
+    {
+        float f;
+        size_t idone, odone;
+        soxr_process((soxr_t)s->resample, &f, 0, &idone, &f, 0, &odone);
+        s->delayed_samples_fixup -= soxr_delay((soxr_t)s->resample);
+    }
+
     return 0;
 }
 
@@ -87,18 +97,34 @@ static int process(
 }
 
 static int64_t get_delay(struct SwrContext *s, int64_t base){
-    double delay_s = soxr_delay((soxr_t)s->resample) / s->out_sample_rate;
+    double delayed_samples = soxr_delay((soxr_t)s->resample);
+    double delay_s;
+
+    if (s->flushed)
+        delayed_samples += s->delayed_samples_fixup;
+
+    delay_s = delayed_samples / s->out_sample_rate;
+
     return (int64_t)(delay_s * base + .5);
 }
 
 static int invert_initial_buffer(struct ResampleContext *c, AudioData *dst, const AudioData *src,
-                                 int in_count, int *out_idx, int *out_sz)
-{
+                                 int in_count, int *out_idx, int *out_sz){
     return 0;
 }
 
+static int64_t get_out_samples(struct SwrContext *s, int in_samples){
+    double out_samples = (double)s->out_sample_rate / s->in_sample_rate * in_samples;
+    double delayed_samples = soxr_delay((soxr_t)s->resample);
+
+    if (s->flushed)
+        delayed_samples += s->delayed_samples_fixup;
+
+    return (int64_t)(out_samples + delayed_samples + 1 + .5);
+}
+
 struct Resampler const swri_soxr_resampler={
     create, destroy, process, flush, NULL /* set_compensation */, get_delay,
-    invert_initial_buffer,
+    invert_initial_buffer, get_out_samples
 };
 
index 7595588..6669cbf 100644 (file)
@@ -157,6 +157,7 @@ struct SwrContext {
     int64_t outpts;                                 ///< output PTS
     int64_t firstpts;                               ///< first PTS
     int drop_output;                                ///< number of output samples to drop
+    double delayed_samples_fixup;                   ///< soxr 0.1.1: needed to fixup delayed_samples after flush has been called.
 
     struct AudioConvert *in_convert;                ///< input conversion context
     struct AudioConvert *out_convert;               ///< output conversion context