Commit c70c6be2 authored by Rob Sykes's avatar Rob Sykes Committed by Michael Niedermayer

swresample: soxr implementation for swr_get_out_samples()

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 1e700867
...@@ -67,7 +67,17 @@ static void destroy(struct ResampleContext * *c){ ...@@ -67,7 +67,17 @@ static void destroy(struct ResampleContext * *c){
} }
static int flush(struct SwrContext *s){ 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); 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; return 0;
} }
...@@ -87,18 +97,34 @@ static int process( ...@@ -87,18 +97,34 @@ static int process(
} }
static int64_t get_delay(struct SwrContext *s, int64_t base){ 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); return (int64_t)(delay_s * base + .5);
} }
static int invert_initial_buffer(struct ResampleContext *c, AudioData *dst, const AudioData *src, 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; 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={ struct Resampler const swri_soxr_resampler={
create, destroy, process, flush, NULL /* set_compensation */, get_delay, create, destroy, process, flush, NULL /* set_compensation */, get_delay,
invert_initial_buffer, invert_initial_buffer, get_out_samples
}; };
...@@ -157,6 +157,7 @@ struct SwrContext { ...@@ -157,6 +157,7 @@ struct SwrContext {
int64_t outpts; ///< output PTS int64_t outpts; ///< output PTS
int64_t firstpts; ///< first PTS int64_t firstpts; ///< first PTS
int drop_output; ///< number of output samples to drop 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 *in_convert; ///< input conversion context
struct AudioConvert *out_convert; ///< output conversion context struct AudioConvert *out_convert; ///< output conversion context
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment