mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-27 13:30:45 +00:00
resample: split linear into its own function
This commit is contained in:
parent
be394968c8
commit
254c95cdd1
@ -181,22 +181,22 @@ ResampleContext *ff_audio_resample_init(AVAudioResampleContext *avr)
|
||||
|
||||
switch (avr->internal_sample_fmt) {
|
||||
case AV_SAMPLE_FMT_DBLP:
|
||||
c->resample_one = resample_one_dbl;
|
||||
c->resample_one = c->linear ? resample_linear_dbl : resample_one_dbl;
|
||||
c->resample_nearest = resample_nearest_dbl;
|
||||
c->set_filter = set_filter_dbl;
|
||||
break;
|
||||
case AV_SAMPLE_FMT_FLTP:
|
||||
c->resample_one = resample_one_flt;
|
||||
c->resample_one = c->linear ? resample_linear_flt : resample_one_flt;
|
||||
c->resample_nearest = resample_nearest_flt;
|
||||
c->set_filter = set_filter_flt;
|
||||
break;
|
||||
case AV_SAMPLE_FMT_S32P:
|
||||
c->resample_one = resample_one_s32;
|
||||
c->resample_one = c->linear ? resample_linear_s32 : resample_one_s32;
|
||||
c->resample_nearest = resample_nearest_s32;
|
||||
c->set_filter = set_filter_s32;
|
||||
break;
|
||||
case AV_SAMPLE_FMT_S16P:
|
||||
c->resample_one = resample_one_s16;
|
||||
c->resample_one = c->linear ? resample_linear_s16 : resample_one_s16;
|
||||
c->resample_nearest = resample_nearest_s16;
|
||||
c->set_filter = set_filter_s16;
|
||||
break;
|
||||
|
@ -61,6 +61,27 @@ static void SET_TYPE(resample_nearest)(void *dst0, int dst_index, const void *sr
|
||||
dst[dst_index] = src[index];
|
||||
}
|
||||
|
||||
static void SET_TYPE(resample_linear)(ResampleContext *c, void *dst0, int dst_index,
|
||||
const void *src0, unsigned int index, int frac)
|
||||
{
|
||||
FELEM *dst = dst0;
|
||||
const FELEM *src = src0;
|
||||
int i;
|
||||
unsigned int sample_index = index >> c->phase_shift;
|
||||
FELEM2 val = 0;
|
||||
FELEM *filter = ((FELEM *)c->filter_bank) +
|
||||
c->filter_length * (index & c->phase_mask);
|
||||
FELEM2 v2 = 0;
|
||||
|
||||
for (i = 0; i < c->filter_length; i++) {
|
||||
val += src[sample_index + i] * (FELEM2)filter[i];
|
||||
v2 += src[sample_index + i] * (FELEM2)filter[i + c->filter_length];
|
||||
}
|
||||
val += (v2 - val) * (FELEML)frac / c->src_incr;
|
||||
|
||||
OUT(dst[dst_index], val);
|
||||
}
|
||||
|
||||
static void SET_TYPE(resample_one)(ResampleContext *c,
|
||||
void *dst0, int dst_index, const void *src0,
|
||||
unsigned int index, int frac)
|
||||
@ -73,17 +94,8 @@ static void SET_TYPE(resample_one)(ResampleContext *c,
|
||||
FELEM *filter = ((FELEM *)c->filter_bank) +
|
||||
c->filter_length * (index & c->phase_mask);
|
||||
|
||||
if (c->linear) {
|
||||
FELEM2 v2 = 0;
|
||||
for (i = 0; i < c->filter_length; i++) {
|
||||
val += src[sample_index + i] * (FELEM2)filter[i];
|
||||
v2 += src[sample_index + i] * (FELEM2)filter[i + c->filter_length];
|
||||
}
|
||||
val += (v2 - val) * (FELEML)frac / c->src_incr;
|
||||
} else {
|
||||
for (i = 0; i < c->filter_length; i++)
|
||||
val += src[sample_index + i] * (FELEM2)filter[i];
|
||||
}
|
||||
for (i = 0; i < c->filter_length; i++)
|
||||
val += src[sample_index + i] * (FELEM2)filter[i];
|
||||
|
||||
OUT(dst[dst_index], val);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user