ffmpeg | branch: release/2.7 | Rob Sykes <aqu...@yahoo.co.uk> | Sun Jun 21 19:45:50 2015 +0000| [d403242a289aee3a346d536864485230052b7c57] | committer: Michael Niedermayer
swresample: soxr implementation for swr_get_out_samples() Signed-off-by: Michael Niedermayer <michae...@gmx.at> (cherry picked from commit c70c6be2259759b75c1b1dc7d68a0cf172f2cab8) Signed-off-by: Michael Niedermayer <michae...@gmx.at> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d403242a289aee3a346d536864485230052b7c57 --- libswresample/soxr_resample.c | 34 ++++++++++++++++++++++++++++++---- libswresample/swresample_internal.h | 1 + 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/libswresample/soxr_resample.c b/libswresample/soxr_resample.c index 0f75bc5..535e9ce 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 7595588..6669cbf 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 _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog