swresample: soxr implementation for swr_get_out_samples()
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
1e7008675b
commit
c70c6be225
@ -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(
|
|||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
|||||||
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user