diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-04-23 22:50:22 +0400 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-05-29 23:16:20 +0400 |
commit | 8dfc122719f3e1fa88fa9356a820843e6840df16 (patch) | |
tree | ae85b489e0476dc001b3c6a4719b6c48eb8ec07e /libavresample | |
parent | 528995589f2911280f40df88a56f4d5bffaa892e (diff) |
lavr: add C functions for mixing 2 to 1 channels with s16p format
Diffstat (limited to 'libavresample')
-rw-r--r-- | libavresample/audio_mix.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/libavresample/audio_mix.c b/libavresample/audio_mix.c index 76f10eaab2..7ab11b0d4d 100644 --- a/libavresample/audio_mix.c +++ b/libavresample/audio_mix.c @@ -115,6 +115,50 @@ static void mix_2_to_1_fltp_flt_c(float **samples, float **matrix, int len, } } +static void mix_2_to_1_s16p_flt_c(int16_t **samples, float **matrix, int len, + int out_ch, int in_ch) +{ + int16_t *src0 = samples[0]; + int16_t *src1 = samples[1]; + int16_t *dst = src0; + float m0 = matrix[0][0]; + float m1 = matrix[0][1]; + + while (len > 4) { + *dst++ = av_clip_int16(lrintf(*src0++ * m0 + *src1++ * m1)); + *dst++ = av_clip_int16(lrintf(*src0++ * m0 + *src1++ * m1)); + *dst++ = av_clip_int16(lrintf(*src0++ * m0 + *src1++ * m1)); + *dst++ = av_clip_int16(lrintf(*src0++ * m0 + *src1++ * m1)); + len -= 4; + } + while (len > 0) { + *dst++ = av_clip_int16(lrintf(*src0++ * m0 + *src1++ * m1)); + len--; + } +} + +static void mix_2_to_1_s16p_q8_c(int16_t **samples, int16_t **matrix, int len, + int out_ch, int in_ch) +{ + int16_t *src0 = samples[0]; + int16_t *src1 = samples[1]; + int16_t *dst = src0; + int16_t m0 = matrix[0][0]; + int16_t m1 = matrix[0][1]; + + while (len > 4) { + *dst++ = (*src0++ * m0 + *src1++ * m1) >> 8; + *dst++ = (*src0++ * m0 + *src1++ * m1) >> 8; + *dst++ = (*src0++ * m0 + *src1++ * m1) >> 8; + *dst++ = (*src0++ * m0 + *src1++ * m1) >> 8; + len -= 4; + } + while (len > 0) { + *dst++ = (*src0++ * m0 + *src1++ * m1) >> 8; + len--; + } +} + static void mix_1_to_2_fltp_flt_c(float **samples, float **matrix, int len, int out_ch, int in_ch) { @@ -229,6 +273,12 @@ static int mix_function_init(AudioMix *am) ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT, 2, 1, 1, 1, "C", mix_2_to_1_fltp_flt_c); + ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT, + 2, 1, 1, 1, "C", mix_2_to_1_s16p_flt_c); + + ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_Q8, + 2, 1, 1, 1, "C", mix_2_to_1_s16p_q8_c); + ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT, 1, 2, 1, 1, "C", mix_1_to_2_fltp_flt_c); |