Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.1
@@ -344,10 +344,27 @@ static int64_t get_delay(struct SwrContext *s, int64_t base){ | |||||
return av_rescale(num, base, s->in_sample_rate*(int64_t)c->src_incr << c->phase_shift); | return av_rescale(num, base, s->in_sample_rate*(int64_t)c->src_incr << c->phase_shift); | ||||
} | } | ||||
static int resample_flush(struct SwrContext *s) { | |||||
AudioData *a= &s->in_buffer; | |||||
int i, j, ret; | |||||
if((ret = swri_realloc_audio(a, s->in_buffer_index + 2*s->in_buffer_count)) < 0) | |||||
return ret; | |||||
av_assert0(a->planar); | |||||
for(i=0; i<a->ch_count; i++){ | |||||
for(j=0; j<s->in_buffer_count; j++){ | |||||
memcpy(a->ch[i] + (s->in_buffer_index+s->in_buffer_count+j )*a->bps, | |||||
a->ch[i] + (s->in_buffer_index+s->in_buffer_count-j-1)*a->bps, a->bps); | |||||
} | |||||
} | |||||
s->in_buffer_count += (s->in_buffer_count+1)/2; | |||||
return 0; | |||||
} | |||||
struct Resampler const swri_resampler={ | struct Resampler const swri_resampler={ | ||||
resample_init, | resample_init, | ||||
resample_free, | resample_free, | ||||
multiple_resample, | multiple_resample, | ||||
resample_flush, | |||||
set_compensation, | set_compensation, | ||||
get_delay, | get_delay, | ||||
}; | }; |
@@ -662,24 +662,12 @@ int swr_convert(struct SwrContext *s, uint8_t *out_arg[SWR_CH_MAX], int out_coun | |||||
} | } | ||||
if(!in_arg){ | if(!in_arg){ | ||||
if(s->in_buffer_count){ | |||||
if (s->resample && !s->flushed) { | |||||
AudioData *a= &s->in_buffer; | |||||
int i, j, ret; | |||||
if((ret=swri_realloc_audio(a, s->in_buffer_index + 2*s->in_buffer_count)) < 0) | |||||
return ret; | |||||
av_assert0(a->planar); | |||||
for(i=0; i<a->ch_count; i++){ | |||||
for(j=0; j<s->in_buffer_count; j++){ | |||||
memcpy(a->ch[i] + (s->in_buffer_index+s->in_buffer_count+j )*a->bps, | |||||
a->ch[i] + (s->in_buffer_index+s->in_buffer_count-j-1)*a->bps, a->bps); | |||||
} | |||||
} | |||||
s->in_buffer_count += (s->in_buffer_count+1)/2; | |||||
s->resample_in_constraint = 0; | |||||
s->flushed = 1; | |||||
} | |||||
}else{ | |||||
if(s->resample){ | |||||
if (!s->flushed) | |||||
s->resampler->flush(s); | |||||
s->resample_in_constraint = 0; | |||||
s->flushed = 1; | |||||
}else if(!s->in_buffer_count){ | |||||
return 0; | return 0; | ||||
} | } | ||||
}else | }else | ||||
@@ -128,6 +128,7 @@ typedef struct ResampleContext * (* resample_init_func)(struct ResampleContext * | |||||
double cutoff, enum AVSampleFormat format, enum SwrFilterType filter_type, int kaiser_beta); | double cutoff, enum AVSampleFormat format, enum SwrFilterType filter_type, int kaiser_beta); | ||||
typedef void (* resample_free_func)(struct ResampleContext **c); | typedef void (* resample_free_func)(struct ResampleContext **c); | ||||
typedef int (* multiple_resample_func)(struct ResampleContext *c, AudioData *dst, int dst_size, AudioData *src, int src_size, int *consumed); | typedef int (* multiple_resample_func)(struct ResampleContext *c, AudioData *dst, int dst_size, AudioData *src, int src_size, int *consumed); | ||||
typedef int (* resample_flush_func)(struct SwrContext *c); | |||||
typedef int (* set_compensation_func)(struct ResampleContext *c, int sample_delta, int compensation_distance); | typedef int (* set_compensation_func)(struct ResampleContext *c, int sample_delta, int compensation_distance); | ||||
typedef int64_t (* get_delay_func)(struct SwrContext *s, int64_t base); | typedef int64_t (* get_delay_func)(struct SwrContext *s, int64_t base); | ||||
@@ -135,6 +136,7 @@ struct Resampler { | |||||
resample_init_func init; | resample_init_func init; | ||||
resample_free_func free; | resample_free_func free; | ||||
multiple_resample_func multiple_resample; | multiple_resample_func multiple_resample; | ||||
resample_flush_func flush; | |||||
set_compensation_func set_compensation; | set_compensation_func set_compensation; | ||||
get_delay_func get_delay; | get_delay_func get_delay; | ||||
}; | }; | ||||