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; | ||||
| }; | }; | ||||