[FFmpeg-soc] [soc]: r5445 - in amr: amrnbdata.h amrnbdec.c
vitor
subversion at mplayerhq.hu
Sun Nov 15 11:47:55 CET 2009
Author: vitor
Date: Sun Nov 15 11:47:55 2009
New Revision: 5445
Log:
Use function ff_decode_pitch_lag() that has been committed to main svn.
Modified:
amr/amrnbdata.h
amr/amrnbdec.c
Modified: amr/amrnbdata.h
==============================================================================
--- amr/amrnbdata.h Thu Nov 12 15:48:55 2009 (r5444)
+++ amr/amrnbdata.h Sun Nov 15 11:47:55 2009 (r5445)
@@ -1527,8 +1527,6 @@ static const float pred_fac[LP_FILTER_OR
#define LSF_R_FAC (8000.0/32768.0) ///< LSF residual tables to Hertz
#define MIN_LSF_SPACING 50.0488 ///< Ensures stability of LPC filter
-#define PITCH_LAG_MAX 143 ///< Upper bound on decoded lag search
-#define PITCH_LAG_MIN 20 ///< Lower bound on decoded lag search
#define PITCH_LAG_MIN_MODE_12k2 18 ///< Lower bound on decoded lag search in 12.2kbit/s mode
/** b60 hamming windowed sinc function coefficients */
Modified: amr/amrnbdec.c
==============================================================================
--- amr/amrnbdec.c Thu Nov 12 15:48:55 2009 (r5444)
+++ amr/amrnbdec.c Sun Nov 15 11:47:55 2009 (r5445)
@@ -71,7 +71,7 @@ typedef struct AMRContext {
uint8_t pitch_lag_int; ///< integer part of pitch lag from current subframe
- float excitation_buf[PITCH_LAG_MAX + LP_FILTER_ORDER + 1 + AMR_SUBFRAME_SIZE]; ///< current excitation and all necessary excitation history
+ float excitation_buf[PITCH_DELAY_MAX + LP_FILTER_ORDER + 1 + AMR_SUBFRAME_SIZE]; ///< current excitation and all necessary excitation history
float *excitation; ///< pointer to the current excitation vector in excitation_buf
float pitch_vector[AMR_SUBFRAME_SIZE]; ///< adaptive code book (pitch) vector
@@ -128,7 +128,7 @@ static av_cold int amrnb_decode_init(AVC
avctx->sample_fmt = SAMPLE_FMT_FLT;
// p->excitation always points to the same position in p->excitation_buf
- p->excitation = &p->excitation_buf[PITCH_LAG_MAX + LP_FILTER_ORDER + 1];
+ p->excitation = &p->excitation_buf[PITCH_DELAY_MAX + LP_FILTER_ORDER + 1];
reset_state(p);
@@ -348,77 +348,24 @@ static void lsp2lpc(const float *lsp, fl
/// @{
/**
- * Decode the adaptive codebook index to the integer and fractional parts
- * of the pitch lag for one subframe at 1/6 resolution for MODE_12k2,
- * 1/3 for other modes.
- *
- * 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 mode mode of the current frame
+ * Like ff_decode_pitch_lag(), but with 1/6 resolution
*/
-static void decode_pitch_lag(int *lag_int, int *lag_frac, int pitch_index,
- const int prev_lag_int, const int subframe,
- const enum Mode mode)
+static void decode_pitch_lag_1_6(int *lag_int, int *lag_frac, int pitch_index,
+ const int prev_lag_int, const int subframe)
{
- /* Note n * 10923 >> 15 is floor(x/3) for 0 <= n <= 32767 */
- if (subframe == 0 ||
- (subframe == 2 && mode != MODE_4k75 && mode != MODE_5k15)) {
- if (mode == MODE_12k2) {
- if (pitch_index < 463) {
- *lag_int = (pitch_index + 107) * 10923 >> 16;
- *lag_frac = pitch_index - *lag_int * 6 + 105;
- } else {
- *lag_int = pitch_index - 368;
- *lag_frac = 0;
- }
- } else if (pitch_index < 197) {
- *lag_int = (pitch_index + 59) * 10923 >> 15;
- *lag_frac = pitch_index - *lag_int * 3 + 58;
+ if (subframe == 0 || subframe == 2) {
+ if (pitch_index < 463) {
+ *lag_int = (pitch_index + 107) * 10923 >> 16;
+ *lag_frac = pitch_index - *lag_int * 6 + 105;
} else {
- *lag_int = pitch_index - 112;
+ *lag_int = pitch_index - 368;
*lag_frac = 0;
}
} else {
- if (mode == MODE_12k2) {
- *lag_int = ((pitch_index + 5) * 10923 >> 16) - 1;
- *lag_frac = pitch_index - *lag_int * 6 - 3;
- *lag_int += av_clip(prev_lag_int - 5, PITCH_LAG_MIN_MODE_12k2,
- PITCH_LAG_MAX - 9);
- } else if (mode <= MODE_6k7) {
- int search_range_min = av_clip(prev_lag_int - 5, PITCH_LAG_MIN,
- PITCH_LAG_MAX - 9);
-
- // decoding with 4-bit resolution
- if (pitch_index < 4) {
- // integer only precision for [search_range_min, search_range_min+3]
- *lag_int = pitch_index + search_range_min;
- *lag_frac = 0;
- } else if (pitch_index < 12) {
- // 1/3 fractional precision for [search_range_min+3 1/3, search_range_min+5 2/3]
- *lag_int = (pitch_index + 1) * 10923 >> 15;
- *lag_frac = pitch_index - *lag_int * 3;
- *lag_int += search_range_min + 2;
- } else {
- // integer only precision for [search_range_min+6, search_range_min+9]
- *lag_int = pitch_index + search_range_min - 6;
- *lag_frac = 0;
- }
- } else {
- // decoding with 5 or 6 bit resolution, 1/3 fractional precision
- *lag_int = ((pitch_index + 2) * 10923 >> 15) - 1;
- *lag_frac = pitch_index - *lag_int * 3 - 2;
- if (mode == MODE_7k95) {
- *lag_int += av_clip(prev_lag_int - 10, PITCH_LAG_MIN,
- PITCH_LAG_MAX - 19);
- } else
- *lag_int += av_clip(prev_lag_int - 5, PITCH_LAG_MIN,
- PITCH_LAG_MAX - 9);
- }
+ *lag_int = ((pitch_index + 5) * 10923 >> 16) - 1;
+ *lag_frac = pitch_index - *lag_int * 6 - 3;
+ *lag_int += av_clip(prev_lag_int - 5, PITCH_LAG_MIN_MODE_12k2,
+ PITCH_DELAY_MAX - 9);
}
}
@@ -427,9 +374,18 @@ static void decode_pitch_vector(AMRConte
const int subframe)
{
int pitch_lag_int, pitch_lag_frac;
+ enum Mode mode = p->cur_frame_mode;
- decode_pitch_lag(&pitch_lag_int, &pitch_lag_frac, amr_subframe->p_lag,
- p->pitch_lag_int, subframe, p->cur_frame_mode);
+ if (p->cur_frame_mode == MODE_12k2) {
+ decode_pitch_lag_1_6(&pitch_lag_int, &pitch_lag_frac,
+ amr_subframe->p_lag, p->pitch_lag_int,
+ subframe);
+ } else
+ ff_decode_pitch_lag(&pitch_lag_int, &pitch_lag_frac,
+ amr_subframe->p_lag,
+ p->pitch_lag_int, subframe,
+ mode != MODE_4k75 && mode != MODE_5k15,
+ mode <= MODE_6k7 ? 4 : (mode == MODE_7k95 ? 5 : 6));
p->pitch_lag_int = pitch_lag_int; // store previous lag in a uint8_t
@@ -983,7 +939,7 @@ static void update_state(AMRContext *p)
memcpy(p->prev_lsp_sub4, p->lsp[3], LP_FILTER_ORDER * sizeof(float));
memmove(&p->excitation_buf[0], &p->excitation_buf[AMR_SUBFRAME_SIZE],
- (PITCH_LAG_MAX + LP_FILTER_ORDER + 1) * sizeof(float));
+ (PITCH_DELAY_MAX + LP_FILTER_ORDER + 1) * sizeof(float));
memmove(&p->pitch_gain[0], &p->pitch_gain[1], 4 * sizeof(float));
memmove(&p->fixed_gain[0], &p->fixed_gain[1], 4 * sizeof(float));
More information about the FFmpeg-soc
mailing list