aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Sykes <aquegg@yahoo.co.uk>2015-06-21 19:45:50 +0000
committerMichael Niedermayer <michaelni@gmx.at>2015-06-21 23:38:44 +0200
commitc70c6be2259759b75c1b1dc7d68a0cf172f2cab8 (patch)
treeae34ddb3e282a339264712246fc93f26b5382352
parent1e7008675b2d930955b0295808ef208d92e5639d (diff)
downloadffmpeg-c70c6be2259759b75c1b1dc7d68a0cf172f2cab8.tar.gz
swresample: soxr implementation for swr_get_out_samples()
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libswresample/soxr_resample.c34
-rw-r--r--libswresample/swresample_internal.h1
2 files changed, 31 insertions, 4 deletions
diff --git a/libswresample/soxr_resample.c b/libswresample/soxr_resample.c
index 0f75bc554c..535e9cee07 100644
--- a/libswresample/soxr_resample.c
+++ b/libswresample/soxr_resample.c
@@ -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
};
diff --git a/libswresample/swresample_internal.h b/libswresample/swresample_internal.h
index 7595588f41..6669cbfd70 100644
--- a/libswresample/swresample_internal.h
+++ b/libswresample/swresample_internal.h
@@ -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