Mercurial > libavcodec.hg
changeset 10532:ca88470521db libavcodec
Implement ff_decode_pitch_lag() that is used by both AMR and SIPR.
Based on code written by Colin McQuillan during his SoC project.
author | vitor |
---|---|
date | Sun, 15 Nov 2009 10:41:46 +0000 |
parents | 142645a57180 |
children | d5339724d6ce |
files | acelp_pitch_delay.c acelp_pitch_delay.h |
diffstat | 2 files changed, 62 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/acelp_pitch_delay.c Sat Nov 14 11:49:48 2009 +0000 +++ b/acelp_pitch_delay.c Sun Nov 15 10:41:46 2009 +0000 @@ -140,3 +140,47 @@ return val; } + +void ff_decode_pitch_lag(int *lag_int, int *lag_frac, int pitch_index, + const int prev_lag_int, const int subframe, + int third_as_first, int resolution) +{ + /* Note n * 10923 >> 15 is floor(x/3) for 0 <= n <= 32767 */ + if (subframe == 0 || (subframe == 2 && third_as_first)) { + + if (pitch_index < 197) + pitch_index += 59; + else + pitch_index = 3 * pitch_index - 335; + + } else { + if (resolution == 4) { + int search_range_min = av_clip(prev_lag_int - 5, PITCH_DELAY_MIN, + PITCH_DELAY_MAX - 9); + + // decoding with 4-bit resolution + if (pitch_index < 4) { + // integer only precision for [search_range_min, search_range_min+3] + pitch_index = 3 * (pitch_index + search_range_min) + 1; + } else if (pitch_index < 12) { + // 1/3 fractional precision for [search_range_min+3 1/3, search_range_min+5 2/3] + pitch_index += 3 * search_range_min + 7; + } else { + // integer only precision for [search_range_min+6, search_range_min+9] + pitch_index = 3 * (pitch_index + search_range_min - 6) + 1; + } + } else { + // decoding with 5 or 6 bit resolution, 1/3 fractional precision + pitch_index--; + + if (resolution == 5) { + pitch_index += 3 * av_clip(prev_lag_int - 10, PITCH_DELAY_MIN, + PITCH_DELAY_MAX - 19); + } else + pitch_index += 3 * av_clip(prev_lag_int - 5, PITCH_DELAY_MIN, + PITCH_DELAY_MAX - 9); + } + } + *lag_int = pitch_index * 10923 >> 15; + *lag_frac = pitch_index - 3 * *lag_int - 1; +}
--- a/acelp_pitch_delay.h Sat Nov 14 11:49:48 2009 +0000 +++ b/acelp_pitch_delay.h Sun Nov 15 10:41:46 2009 +0000 @@ -234,4 +234,22 @@ float *prediction_error, float energy_mean, const float *pred_table); + +/** + * Decode the adaptive codebook index to the integer and fractional parts + * of the pitch lag for one subframe at 1/3 fractional precision. + * + * The choice of pitch lag is described in 3GPP TS 26.090 section 5.6.1. + * + * @param lag_int integer part of pitch lag of the current subframe + * @param lag_frac fractional part of pitch lag of the current subframe + * @param pitch_index parsed adaptive codebook (pitch) index + * @param prev_lag_int integer part of pitch lag for the previous subframe + * @param subframe current subframe number + * @param third_as_first treat the third frame the same way as the first + */ +void ff_decode_pitch_lag(int *lag_int, int *lag_frac, int pitch_index, + const int prev_lag_int, const int subframe, + int third_as_first, int resolution); + #endif /* AVCODEC_ACELP_PITCH_DELAY_H */