[FFmpeg-soc] [soc]: r4044 - amr/amrnbfloatdec.c
kmalaussene
subversion at mplayerhq.hu
Wed Feb 11 10:08:30 CET 2009
Author: kmalaussene
Date: Wed Feb 11 10:08:30 2009
New Revision: 4044
Log:
More factoring out of lsf2lsp_5 by decoding one LSP vector at a time.
Modified:
amr/amrnbfloatdec.c
Modified: amr/amrnbfloatdec.c
==============================================================================
--- amr/amrnbfloatdec.c Wed Feb 11 08:45:09 2009 (r4043)
+++ amr/amrnbfloatdec.c Wed Feb 11 10:08:30 2009 (r4044)
@@ -226,13 +226,48 @@ static void lsf2lsp(float *lsf, float *l
/**
* Decode a set of 5 split-matrix quantized lsf indexes into an lsp vector.
*
+ * @param p the context
+ * @param lsp output LSP vector
+ * @param prev_lsf previous LSF vector
+ * @param lsf_quantizer pointers to LSF dictionary tables
+ * @param quantizer_offset offset in tables
+ * @param sign for the 3 dictionary table
+ * @param update_prev_lsf_r update the prev_lsf_r in the context if true
+ */
+static void lsf2lsp_for_mode122(AMRContext *p, float lsp[LP_FILTER_ORDER],
+ const float prev_lsf[LP_FILTER_ORDER],
+ const float *lsf_quantizer[5], const int quantizer_offset,
+ const int sign, const int update_prev_lsf_r)
+{
+ float lsf[LP_FILTER_ORDER];
+ int i;
+
+ for(i=0; i<LP_FILTER_ORDER>>1; i++)
+ memcpy(&lsf[2*i], &lsf_quantizer[i][quantizer_offset], 2*sizeof(float));
+
+ if(sign) {
+ lsf[4] *= -1;
+ lsf[5] *= -1;
+ }
+
+ if(update_prev_lsf_r)
+ memcpy(p->prev_lsf_r, lsf, LP_FILTER_ORDER*sizeof(float));
+
+ for(i=0; i<LP_FILTER_ORDER; i++)
+ lsf[i] += prev_lsf[i];
+
+ lsf2lsp(lsf, lsp);
+}
+
+/**
+ * Decode a set of 5 split-matrix quantized lsf indexes into 2 lsp vectors.
+ *
* @param p pointer to the AMRContext
*/
static void lsf2lsp_5(AMRContext *p)
{
- float lsf_r[2][LP_FILTER_ORDER]; // residual LSF vectors
- float lsf_q[2][LP_FILTER_ORDER]; // quantified LSF vectors
+ float prev_lsf[LP_FILTER_ORDER]; // previous quantized LSF vectors
const float *lsf_quantizer[5];
int i;
@@ -242,31 +277,11 @@ static void lsf2lsp_5(AMRContext *p)
lsf_quantizer[3] = lsf_5_4[p->amr_prms[3]];
lsf_quantizer[4] = lsf_5_5[p->amr_prms[4]];
- for(i=0; i<5; i++) {
- memcpy(&lsf_r[0][2*i], &lsf_quantizer[i][0], 2*sizeof(float));
- memcpy(&lsf_r[1][2*i], &lsf_quantizer[i][2], 2*sizeof(float));
- }
-
- // the 1st bit of p->amr_prms[2] is the sign bit
- if (p->amr_prms[2] & 1) {
- lsf_r[0][4] *= -1;
- lsf_r[0][5] *= -1;
- lsf_r[1][4] *= -1;
- lsf_r[1][5] *= -1;
- }
-
- // calculate mean-removed LSF vectors and add mean
- for(i=0; i<LP_FILTER_ORDER; i++) {
- float temp = p->prev_lsf_r[i]*PRED_FAC_MODE_122 + lsf_5_mean[i];
- lsf_q[0][i] = lsf_r[0][i] + temp;
- lsf_q[1][i] = lsf_r[1][i] + temp;
- }
- // update residual LSF vector from previous subframe
- memcpy(p->prev_lsf_r, lsf_r[1], LP_FILTER_ORDER*sizeof(float));
+ for(i=0; i<LP_FILTER_ORDER;i++)
+ prev_lsf[i] = p->prev_lsf_r[i]*PRED_FAC_MODE_122 + lsf_5_mean[i];
- // convert LSF vectors to LSP vectors
- lsf2lsp(lsf_q[0], p->lsp[1]);
- lsf2lsp(lsf_q[1], p->lsp[3]);
+ lsf2lsp_for_mode122(p, p->lsp[1], prev_lsf, lsf_quantizer, 0, p->amr_prms[2] & 1, 0);
+ lsf2lsp_for_mode122(p, p->lsp[3], prev_lsf, lsf_quantizer, 2, p->amr_prms[2] & 1, 1);
}
/**
More information about the FFmpeg-soc
mailing list