summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/codecs/amrwbenc/src/c2t64fx.c')
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/c2t64fx.c439
1 files changed, 221 insertions, 218 deletions
diff --git a/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c b/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c
index 18698e2..dbb94c6 100644
--- a/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c
+++ b/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c
@@ -17,7 +17,7 @@
/************************************************************************
* File: c2t64fx.c *
* *
-* Description:Performs algebraic codebook search for 6.60kbits mode*
+* Description:Performs algebraic codebook search for 6.60kbits mode*
* *
*************************************************************************/
@@ -45,252 +45,255 @@
**************************************************************************/
void ACELP_2t64_fx(
- Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */
- Word16 cn[], /* (i) <12b : residual after long term prediction */
- Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */
- Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */
- Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */
- Word16 * index /* (o) : index (12): 5+1+5+1 = 11 bits. */
- )
+ Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */
+ Word16 cn[], /* (i) <12b : residual after long term prediction */
+ Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */
+ Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */
+ Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */
+ Word16 * index /* (o) : index (12): 5+1+5+1 = 11 bits. */
+ )
{
- Word32 i, j, k, i0, i1, ix, iy, pos, pos2;
- Word16 ps, psk, ps1, ps2, alpk, alp1, alp2, sq;
- Word16 alp, val, exp, k_cn, k_dn;
- Word16 *p0, *p1, *p2, *psign;
- Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf;
+ Word32 i, j, k, i0, i1, ix, iy, pos, pos2;
+ Word16 ps, psk, ps1, ps2, alpk, alp1, alp2, sq;
+ Word16 alp, val, exp, k_cn, k_dn;
+ Word16 *p0, *p1, *p2, *psign;
+ Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf;
- Word16 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR];
- Word16 h_buf[4 * L_SUBFR] = {0};
- Word16 rrixix[NB_TRACK][NB_POS];
- Word16 rrixiy[MSIZE];
- Word32 s, cor;
+ Word16 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR];
+ Word16 h_buf[4 * L_SUBFR] = {0};
+ Word16 rrixix[NB_TRACK][NB_POS];
+ Word16 rrixiy[MSIZE];
+ Word32 s, cor;
- /*----------------------------------------------------------------*
- * Find sign for each pulse position. *
- *----------------------------------------------------------------*/
- alp = 8192; /* alp = 2.0 (Q12) */
+ /*----------------------------------------------------------------*
+ * Find sign for each pulse position. *
+ *----------------------------------------------------------------*/
+ alp = 8192; /* alp = 2.0 (Q12) */
- /* calculate energy for normalization of cn[] and dn[] */
- /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
+ /* calculate energy for normalization of cn[] and dn[] */
+ /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
#ifdef ASM_OPT /* asm optimization branch */
- s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
+ s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
#else
- s = Dot_product12(cn, cn, L_SUBFR, &exp);
+ s = Dot_product12(cn, cn, L_SUBFR, &exp);
#endif
- Isqrt_n(&s, &exp);
- s = L_shl(s, add1(exp, 5));
- k_cn = vo_round(s);
+ Isqrt_n(&s, &exp);
+ s = L_shl(s, add1(exp, 5));
+ if (s > INT_MAX - 0x8000) {
+ s = INT_MAX - 0x8000;
+ }
+ k_cn = vo_round(s);
- /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
+ /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
#ifdef ASM_OPT /* asm optimization branch */
- s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
+ s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
#else
- s = Dot_product12(dn, dn, L_SUBFR, &exp);
+ s = Dot_product12(dn, dn, L_SUBFR, &exp);
#endif
- Isqrt_n(&s, &exp);
- k_dn = vo_round(L_shl(s, (exp + 8))); /* k_dn = 256..4096 */
- k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */
+ Isqrt_n(&s, &exp);
+ k_dn = voround(L_shl(s, (exp + 8))); /* k_dn = 256..4096 */
+ k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */
- /* mix normalized cn[] and dn[] */
- p0 = cn;
- p1 = dn;
- p2 = dn2;
+ /* mix normalized cn[] and dn[] */
+ p0 = cn;
+ p1 = dn;
+ p2 = dn2;
- for (i = 0; i < L_SUBFR/4; i++)
- {
- s = (k_cn* (*p0++))+(k_dn * (*p1++));
- *p2++ = s >> 7;
- s = (k_cn* (*p0++))+(k_dn * (*p1++));
- *p2++ = s >> 7;
- s = (k_cn* (*p0++))+(k_dn * (*p1++));
- *p2++ = s >> 7;
- s = (k_cn* (*p0++))+(k_dn * (*p1++));
- *p2++ = s >> 7;
- }
+ for (i = 0; i < L_SUBFR/4; i++)
+ {
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ }
- /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */
- for (i = 0; i < L_SUBFR; i ++)
- {
- val = dn[i];
- ps = dn2[i];
- if (ps >= 0)
- {
- sign[i] = 32767; /* sign = +1 (Q12) */
- vec[i] = -32768;
- } else
- {
- sign[i] = -32768; /* sign = -1 (Q12) */
- vec[i] = 32767;
- dn[i] = -val;
- }
- }
- /*------------------------------------------------------------*
- * Compute h_inv[i]. *
- *------------------------------------------------------------*/
- /* impulse response buffer for fast computation */
- h = h_buf + L_SUBFR;
- h_inv = h + (L_SUBFR<<1);
+ /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */
+ for (i = 0; i < L_SUBFR; i ++)
+ {
+ val = dn[i];
+ ps = dn2[i];
+ if (ps >= 0)
+ {
+ sign[i] = 32767; /* sign = +1 (Q12) */
+ vec[i] = -32768;
+ } else
+ {
+ sign[i] = -32768; /* sign = -1 (Q12) */
+ vec[i] = 32767;
+ dn[i] = -val;
+ }
+ }
+ /*------------------------------------------------------------*
+ * Compute h_inv[i]. *
+ *------------------------------------------------------------*/
+ /* impulse response buffer for fast computation */
+ h = h_buf + L_SUBFR;
+ h_inv = h + (L_SUBFR<<1);
- for (i = 0; i < L_SUBFR; i++)
- {
- h[i] = H[i];
- h_inv[i] = vo_negate(h[i]);
- }
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ h[i] = H[i];
+ h_inv[i] = vo_negate(h[i]);
+ }
- /*------------------------------------------------------------*
- * Compute rrixix[][] needed for the codebook search. *
- * Result is multiplied by 0.5 *
- *------------------------------------------------------------*/
- /* Init pointers to last position of rrixix[] */
- p0 = &rrixix[0][NB_POS - 1];
- p1 = &rrixix[1][NB_POS - 1];
+ /*------------------------------------------------------------*
+ * Compute rrixix[][] needed for the codebook search. *
+ * Result is multiplied by 0.5 *
+ *------------------------------------------------------------*/
+ /* Init pointers to last position of rrixix[] */
+ p0 = &rrixix[0][NB_POS - 1];
+ p1 = &rrixix[1][NB_POS - 1];
- ptr_h1 = h;
- cor = 0x00010000L; /* for rounding */
- for (i = 0; i < NB_POS; i++)
- {
- cor += ((*ptr_h1) * (*ptr_h1) << 1);
- ptr_h1++;
- *p1-- = (extract_h(cor) >> 1);
- cor += ((*ptr_h1) * (*ptr_h1) << 1);
- ptr_h1++;
- *p0-- = (extract_h(cor) >> 1);
- }
+ ptr_h1 = h;
+ cor = 0x00010000L; /* for rounding */
+ for (i = 0; i < NB_POS; i++)
+ {
+ cor += ((*ptr_h1) * (*ptr_h1) << 1);
+ ptr_h1++;
+ *p1-- = (extract_h(cor) >> 1);
+ cor += ((*ptr_h1) * (*ptr_h1) << 1);
+ ptr_h1++;
+ *p0-- = (extract_h(cor) >> 1);
+ }
- /*------------------------------------------------------------*
- * Compute rrixiy[][] needed for the codebook search. *
- *------------------------------------------------------------*/
- pos = MSIZE - 1;
- pos2 = MSIZE - 2;
- ptr_hf = h + 1;
+ /*------------------------------------------------------------*
+ * Compute rrixiy[][] needed for the codebook search. *
+ *------------------------------------------------------------*/
+ pos = MSIZE - 1;
+ pos2 = MSIZE - 2;
+ ptr_hf = h + 1;
- for (k = 0; k < NB_POS; k++)
- {
- p1 = &rrixiy[pos];
- p0 = &rrixiy[pos2];
- cor = 0x00008000L; /* for rounding */
- ptr_h1 = h;
- ptr_h2 = ptr_hf;
+ for (k = 0; k < NB_POS; k++)
+ {
+ p1 = &rrixiy[pos];
+ p0 = &rrixiy[pos2];
+ cor = 0x00008000L; /* for rounding */
+ ptr_h1 = h;
+ ptr_h2 = ptr_hf;
- for (i = (k + 1); i < NB_POS; i++)
- {
- cor += ((*ptr_h1) * (*ptr_h2))<<1;
- ptr_h1++;
- ptr_h2++;
- *p1 = extract_h(cor);
- cor += ((*ptr_h1) * (*ptr_h2))<<1;
- ptr_h1++;
- ptr_h2++;
- *p0 = extract_h(cor);
+ for (i = (k + 1); i < NB_POS; i++)
+ {
+ cor += ((*ptr_h1) * (*ptr_h2))<<1;
+ ptr_h1++;
+ ptr_h2++;
+ *p1 = extract_h(cor);
+ cor += ((*ptr_h1) * (*ptr_h2))<<1;
+ ptr_h1++;
+ ptr_h2++;
+ *p0 = extract_h(cor);
- p1 -= (NB_POS + 1);
- p0 -= (NB_POS + 1);
- }
- cor += ((*ptr_h1) * (*ptr_h2))<<1;
- ptr_h1++;
- ptr_h2++;
- *p1 = extract_h(cor);
+ p1 -= (NB_POS + 1);
+ p0 -= (NB_POS + 1);
+ }
+ cor += ((*ptr_h1) * (*ptr_h2))<<1;
+ ptr_h1++;
+ ptr_h2++;
+ *p1 = extract_h(cor);
- pos -= NB_POS;
- pos2--;
- ptr_hf += STEP;
- }
+ pos -= NB_POS;
+ pos2--;
+ ptr_hf += STEP;
+ }
- /*------------------------------------------------------------*
- * Modification of rrixiy[][] to take signs into account. *
- *------------------------------------------------------------*/
- p0 = rrixiy;
- for (i = 0; i < L_SUBFR; i += STEP)
- {
- psign = sign;
- if (psign[i] < 0)
- {
- psign = vec;
- }
- for (j = 1; j < L_SUBFR; j += STEP)
- {
- *p0 = vo_mult(*p0, psign[j]);
- p0++;
- }
- }
- /*-------------------------------------------------------------------*
- * search 2 pulses: *
- * ~@~~~~~~~~~~~~~~ *
- * 32 pos x 32 pos = 1024 tests (all combinaisons is tested) *
- *-------------------------------------------------------------------*/
- p0 = rrixix[0];
- p1 = rrixix[1];
- p2 = rrixiy;
+ /*------------------------------------------------------------*
+ * Modification of rrixiy[][] to take signs into account. *
+ *------------------------------------------------------------*/
+ p0 = rrixiy;
+ for (i = 0; i < L_SUBFR; i += STEP)
+ {
+ psign = sign;
+ if (psign[i] < 0)
+ {
+ psign = vec;
+ }
+ for (j = 1; j < L_SUBFR; j += STEP)
+ {
+ *p0 = vo_mult(*p0, psign[j]);
+ p0++;
+ }
+ }
+ /*-------------------------------------------------------------------*
+ * search 2 pulses: *
+ * ~@~~~~~~~~~~~~~~ *
+ * 32 pos x 32 pos = 1024 tests (all combinaisons is tested) *
+ *-------------------------------------------------------------------*/
+ p0 = rrixix[0];
+ p1 = rrixix[1];
+ p2 = rrixiy;
- psk = -1;
- alpk = 1;
- ix = 0;
- iy = 1;
+ psk = -1;
+ alpk = 1;
+ ix = 0;
+ iy = 1;
- for (i0 = 0; i0 < L_SUBFR; i0 += STEP)
- {
- ps1 = dn[i0];
- alp1 = (*p0++);
- pos = -1;
- for (i1 = 1; i1 < L_SUBFR; i1 += STEP)
- {
- ps2 = add1(ps1, dn[i1]);
- alp2 = add1(alp1, add1(*p1++, *p2++));
- sq = vo_mult(ps2, ps2);
- s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1);
- if (s > 0)
- {
- psk = sq;
- alpk = alp2;
- pos = i1;
- }
- }
- p1 -= NB_POS;
- if (pos >= 0)
- {
- ix = i0;
- iy = pos;
- }
- }
- /*-------------------------------------------------------------------*
- * Build the codeword, the filtered codeword and index of codevector.*
- *-------------------------------------------------------------------*/
+ for (i0 = 0; i0 < L_SUBFR; i0 += STEP)
+ {
+ ps1 = dn[i0];
+ alp1 = (*p0++);
+ pos = -1;
+ for (i1 = 1; i1 < L_SUBFR; i1 += STEP)
+ {
+ ps2 = add1(ps1, dn[i1]);
+ alp2 = add1(alp1, add1(*p1++, *p2++));
+ sq = vo_mult(ps2, ps2);
+ s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1);
+ if (s > 0)
+ {
+ psk = sq;
+ alpk = alp2;
+ pos = i1;
+ }
+ }
+ p1 -= NB_POS;
+ if (pos >= 0)
+ {
+ ix = i0;
+ iy = pos;
+ }
+ }
+ /*-------------------------------------------------------------------*
+ * Build the codeword, the filtered codeword and index of codevector.*
+ *-------------------------------------------------------------------*/
- for (i = 0; i < L_SUBFR; i++)
- {
- code[i] = 0;
- }
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ code[i] = 0;
+ }
- i0 = (ix >> 1); /* pos of pulse 1 (0..31) */
- i1 = (iy >> 1); /* pos of pulse 2 (0..31) */
- if (sign[ix] > 0)
- {
- code[ix] = 512; /* codeword in Q9 format */
- p0 = h - ix;
- } else
- {
- code[ix] = -512;
- i0 += NB_POS;
- p0 = h_inv - ix;
- }
- if (sign[iy] > 0)
- {
- code[iy] = 512;
- p1 = h - iy;
- } else
- {
- code[iy] = -512;
- i1 += NB_POS;
- p1 = h_inv - iy;
- }
- *index = add1((i0 << 6), i1);
- for (i = 0; i < L_SUBFR; i++)
- {
- y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3);
- }
- return;
+ i0 = (ix >> 1); /* pos of pulse 1 (0..31) */
+ i1 = (iy >> 1); /* pos of pulse 2 (0..31) */
+ if (sign[ix] > 0)
+ {
+ code[ix] = 512; /* codeword in Q9 format */
+ p0 = h - ix;
+ } else
+ {
+ code[ix] = -512;
+ i0 += NB_POS;
+ p0 = h_inv - ix;
+ }
+ if (sign[iy] > 0)
+ {
+ code[iy] = 512;
+ p1 = h - iy;
+ } else
+ {
+ code[iy] = -512;
+ i1 += NB_POS;
+ p1 = h_inv - iy;
+ }
+ *index = add1((i0 << 6), i1);
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3);
+ }
+ return;
}