summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c')
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c852
1 files changed, 426 insertions, 426 deletions
diff --git a/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c b/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c
index c711cd0..bec334e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c
+++ b/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c
@@ -36,13 +36,13 @@
/* private functions */
static void VQ_stage1(
- Word16 * x, /* input : ISF residual vector */
- Word16 * dico, /* input : quantization codebook */
- Word16 dim, /* input : dimention of vector */
- Word16 dico_size, /* input : size of quantization codebook */
- Word16 * index, /* output: indices of survivors */
- Word16 surv /* input : number of survivor */
- );
+ Word16 * x, /* input : ISF residual vector */
+ Word16 * dico, /* input : quantization codebook */
+ Word16 dim, /* input : dimention of vector */
+ Word16 dico_size, /* input : size of quantization codebook */
+ Word16 * index, /* output: indices of survivors */
+ Word16 surv /* input : number of survivor */
+ );
/**************************************************************************
* Function: Qpisf_2s_46B() *
@@ -54,84 +54,84 @@ static void VQ_stage1(
***************************************************************************/
void Qpisf_2s_46b(
- Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
- Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
- Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
- Word16 * indice, /* (o) : quantization indices */
- Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
- )
+ Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
+ Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
+ Word16 * indice, /* (o) : quantization indices */
+ Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
+ )
{
- Word16 tmp_ind[5];
- Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */
- Word32 i, k, temp, min_err, distance;
- Word16 isf[ORDER];
- Word16 isf_stage2[ORDER];
-
- for (i = 0; i < ORDER; i++)
- {
- isf[i] = vo_sub(isf1[i], mean_isf[i]);
- isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
- }
-
- VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
-
- distance = MAX_32;
-
- for (k = 0; k < nb_surv; k++)
- {
- for (i = 0; i < 9; i++)
- {
- isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
- }
- tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err);
- temp = min_err;
- tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err);
- temp = vo_L_add(temp, min_err);
- tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err);
- temp = vo_L_add(temp, min_err);
-
- if(temp < distance)
- {
- distance = temp;
- indice[0] = surv1[k];
- for (i = 0; i < 3; i++)
- {
- indice[i + 2] = tmp_ind[i];
- }
- }
- }
-
-
- VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
-
- distance = MAX_32;
-
- for (k = 0; k < nb_surv; k++)
- {
- for (i = 0; i < 7; i++)
- {
- isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
- }
-
- tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err);
- temp = min_err;
- tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err);
- temp = vo_L_add(temp, min_err);
-
- if(temp < distance)
- {
- distance = temp;
- indice[1] = surv1[k];
- for (i = 0; i < 2; i++)
- {
- indice[i + 5] = tmp_ind[i];
- }
- }
- }
-
- Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
-
- return;
+ Word16 tmp_ind[5];
+ Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */
+ Word32 i, k, temp, min_err, distance;
+ Word16 isf[ORDER];
+ Word16 isf_stage2[ORDER];
+
+ for (i = 0; i < ORDER; i++)
+ {
+ isf[i] = vo_sub(isf1[i], mean_isf[i]);
+ isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
+ }
+
+ VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
+
+ distance = MAX_32;
+
+ for (k = 0; k < nb_surv; k++)
+ {
+ for (i = 0; i < 9; i++)
+ {
+ isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
+ }
+ tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err);
+ temp = min_err;
+ tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err);
+ temp = vo_L_add(temp, min_err);
+ tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err);
+ temp = vo_L_add(temp, min_err);
+
+ if(temp < distance)
+ {
+ distance = temp;
+ indice[0] = surv1[k];
+ for (i = 0; i < 3; i++)
+ {
+ indice[i + 2] = tmp_ind[i];
+ }
+ }
+ }
+
+
+ VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
+
+ distance = MAX_32;
+
+ for (k = 0; k < nb_surv; k++)
+ {
+ for (i = 0; i < 7; i++)
+ {
+ isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
+ }
+
+ tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err);
+ temp = min_err;
+ tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err);
+ temp = vo_L_add(temp, min_err);
+
+ if(temp < distance)
+ {
+ distance = temp;
+ indice[1] = surv1[k];
+ for (i = 0; i < 2; i++)
+ {
+ indice[i + 5] = tmp_ind[i];
+ }
+ }
+ }
+
+ Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
+
+ return;
}
/*****************************************************************************
@@ -144,76 +144,76 @@ void Qpisf_2s_46b(
******************************************************************************/
void Qpisf_2s_36b(
- Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
- Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
- Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
- Word16 * indice, /* (o) : quantization indices */
- Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
- )
+ Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
+ Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
+ Word16 * indice, /* (o) : quantization indices */
+ Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
+ )
{
- Word16 i, k, tmp_ind[5];
- Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */
- Word32 temp, min_err, distance;
- Word16 isf[ORDER];
- Word16 isf_stage2[ORDER];
-
- for (i = 0; i < ORDER; i++)
- {
- isf[i] = vo_sub(isf1[i], mean_isf[i]);
- isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
- }
-
- VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
-
- distance = MAX_32;
-
- for (k = 0; k < nb_surv; k++)
- {
- for (i = 0; i < 9; i++)
- {
- isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
- }
-
- tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err);
- temp = min_err;
- tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err);
- temp = vo_L_add(temp, min_err);
-
- if(temp < distance)
- {
- distance = temp;
- indice[0] = surv1[k];
- for (i = 0; i < 2; i++)
- {
- indice[i + 2] = tmp_ind[i];
- }
- }
- }
-
- VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
- distance = MAX_32;
-
- for (k = 0; k < nb_surv; k++)
- {
- for (i = 0; i < 7; i++)
- {
- isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
- }
-
- tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err);
- temp = min_err;
-
- if(temp < distance)
- {
- distance = temp;
- indice[1] = surv1[k];
- indice[4] = tmp_ind[0];
- }
- }
-
- Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
-
- return;
+ Word16 i, k, tmp_ind[5];
+ Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */
+ Word32 temp, min_err, distance;
+ Word16 isf[ORDER];
+ Word16 isf_stage2[ORDER];
+
+ for (i = 0; i < ORDER; i++)
+ {
+ isf[i] = vo_sub(isf1[i], mean_isf[i]);
+ isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
+ }
+
+ VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
+
+ distance = MAX_32;
+
+ for (k = 0; k < nb_surv; k++)
+ {
+ for (i = 0; i < 9; i++)
+ {
+ isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
+ }
+
+ tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err);
+ temp = min_err;
+ tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err);
+ temp = vo_L_add(temp, min_err);
+
+ if(temp < distance)
+ {
+ distance = temp;
+ indice[0] = surv1[k];
+ for (i = 0; i < 2; i++)
+ {
+ indice[i + 2] = tmp_ind[i];
+ }
+ }
+ }
+
+ VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
+ distance = MAX_32;
+
+ for (k = 0; k < nb_surv; k++)
+ {
+ for (i = 0; i < 7; i++)
+ {
+ isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
+ }
+
+ tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err);
+ temp = min_err;
+
+ if(temp < distance)
+ {
+ distance = temp;
+ indice[1] = surv1[k];
+ indice[4] = tmp_ind[0];
+ }
+ }
+
+ Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
+
+ return;
}
/*********************************************************************
@@ -223,90 +223,90 @@ void Qpisf_2s_36b(
**********************************************************************/
void Dpisf_2s_46b(
- Word16 * indice, /* input: quantization indices */
- Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
- Word16 * past_isfq, /* i/0 : past ISF quantizer */
- Word16 * isfold, /* input : past quantized ISF */
- Word16 * isf_buf, /* input : isf buffer */
- Word16 bfi, /* input : Bad frame indicator */
- Word16 enc_dec
- )
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
+ Word16 * past_isfq, /* i/0 : past ISF quantizer */
+ Word16 * isfold, /* input : past quantized ISF */
+ Word16 * isf_buf, /* input : isf buffer */
+ Word16 bfi, /* input : Bad frame indicator */
+ Word16 enc_dec
+ )
{
- Word16 ref_isf[M], tmp;
- Word32 i, j, L_tmp;
-
- if (bfi == 0) /* Good frame */
- {
- for (i = 0; i < 9; i++)
- {
- isf_q[i] = dico1_isf[indice[0] * 9 + i];
- }
- for (i = 0; i < 7; i++)
- {
- isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
- }
-
- for (i = 0; i < 3; i++)
- {
- isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]);
- isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]);
- isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]);
- isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]);
- }
-
- for (i = 0; i < 4; i++)
- {
- isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]);
- }
-
- for (i = 0; i < ORDER; i++)
- {
- tmp = isf_q[i];
- isf_q[i] = add1(tmp, mean_isf[i]);
- isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
- past_isfq[i] = tmp;
- }
-
- if (enc_dec)
- {
- for (i = 0; i < M; i++)
- {
- for (j = (L_MEANBUF - 1); j > 0; j--)
- {
- isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
- }
- isf_buf[i] = isf_q[i];
- }
- }
- } else
- { /* bad frame */
- for (i = 0; i < M; i++)
- {
- L_tmp = mean_isf[i] << 14;
- for (j = 0; j < L_MEANBUF; j++)
- {
- L_tmp += (isf_buf[j * M + i] << 14);
- }
- ref_isf[i] = vo_round(L_tmp);
- }
-
- /* use the past ISFs slightly shifted towards their mean */
- for (i = 0; i < ORDER; i++)
- {
- isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
- }
-
- /* estimate past quantized residual to be used in next frame */
- for (i = 0; i < ORDER; i++)
- {
- tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */
- past_isfq[i] = vo_sub(isf_q[i], tmp);
- past_isfq[i] = (past_isfq[i] >> 1); /* past_isfq[i] *= 0.5 */
- }
- }
-
- Reorder_isf(isf_q, ISF_GAP, ORDER);
- return;
+ Word16 ref_isf[M], tmp;
+ Word32 i, j, L_tmp;
+
+ if (bfi == 0) /* Good frame */
+ {
+ for (i = 0; i < 9; i++)
+ {
+ isf_q[i] = dico1_isf[indice[0] * 9 + i];
+ }
+ for (i = 0; i < 7; i++)
+ {
+ isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]);
+ isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]);
+ isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]);
+ isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]);
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]);
+ }
+
+ for (i = 0; i < ORDER; i++)
+ {
+ tmp = isf_q[i];
+ isf_q[i] = add1(tmp, mean_isf[i]);
+ isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
+ past_isfq[i] = tmp;
+ }
+
+ if (enc_dec)
+ {
+ for (i = 0; i < M; i++)
+ {
+ for (j = (L_MEANBUF - 1); j > 0; j--)
+ {
+ isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
+ }
+ isf_buf[i] = isf_q[i];
+ }
+ }
+ } else
+ { /* bad frame */
+ for (i = 0; i < M; i++)
+ {
+ L_tmp = mean_isf[i] << 14;
+ for (j = 0; j < L_MEANBUF; j++)
+ {
+ L_tmp += (isf_buf[j * M + i] << 14);
+ }
+ ref_isf[i] = vo_round(L_tmp);
+ }
+
+ /* use the past ISFs slightly shifted towards their mean */
+ for (i = 0; i < ORDER; i++)
+ {
+ isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
+ }
+
+ /* estimate past quantized residual to be used in next frame */
+ for (i = 0; i < ORDER; i++)
+ {
+ tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */
+ past_isfq[i] = vo_sub(isf_q[i], tmp);
+ past_isfq[i] = (past_isfq[i] >> 1); /* past_isfq[i] *= 0.5 */
+ }
+ }
+
+ Reorder_isf(isf_q, ISF_GAP, ORDER);
+ return;
}
/*********************************************************************
@@ -316,92 +316,92 @@ void Dpisf_2s_46b(
*********************************************************************/
void Dpisf_2s_36b(
- Word16 * indice, /* input: quantization indices */
- Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
- Word16 * past_isfq, /* i/0 : past ISF quantizer */
- Word16 * isfold, /* input : past quantized ISF */
- Word16 * isf_buf, /* input : isf buffer */
- Word16 bfi, /* input : Bad frame indicator */
- Word16 enc_dec
- )
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
+ Word16 * past_isfq, /* i/0 : past ISF quantizer */
+ Word16 * isfold, /* input : past quantized ISF */
+ Word16 * isf_buf, /* input : isf buffer */
+ Word16 bfi, /* input : Bad frame indicator */
+ Word16 enc_dec
+ )
{
- Word16 ref_isf[M], tmp;
- Word32 i, j, L_tmp;
-
- if (bfi == 0) /* Good frame */
- {
- for (i = 0; i < 9; i++)
- {
- isf_q[i] = dico1_isf[indice[0] * 9 + i];
- }
- for (i = 0; i < 7; i++)
- {
- isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
- }
-
- for (i = 0; i < 5; i++)
- {
- isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]);
- }
- for (i = 0; i < 4; i++)
- {
- isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]);
- }
- for (i = 0; i < 7; i++)
- {
- isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]);
- }
-
- for (i = 0; i < ORDER; i++)
- {
- tmp = isf_q[i];
- isf_q[i] = add1(tmp, mean_isf[i]);
- isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
- past_isfq[i] = tmp;
- }
-
-
- if (enc_dec)
- {
- for (i = 0; i < M; i++)
- {
- for (j = (L_MEANBUF - 1); j > 0; j--)
- {
- isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
- }
- isf_buf[i] = isf_q[i];
- }
- }
- } else
- { /* bad frame */
- for (i = 0; i < M; i++)
- {
- L_tmp = (mean_isf[i] << 14);
- for (j = 0; j < L_MEANBUF; j++)
- {
- L_tmp += (isf_buf[j * M + i] << 14);
- }
- ref_isf[i] = vo_round(L_tmp);
- }
-
- /* use the past ISFs slightly shifted towards their mean */
- for (i = 0; i < ORDER; i++)
- {
- isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
- }
-
- /* estimate past quantized residual to be used in next frame */
- for (i = 0; i < ORDER; i++)
- {
- tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */
- past_isfq[i] = vo_sub(isf_q[i], tmp);
- past_isfq[i] = past_isfq[i] >> 1; /* past_isfq[i] *= 0.5 */
- }
- }
-
- Reorder_isf(isf_q, ISF_GAP, ORDER);
-
- return;
+ Word16 ref_isf[M], tmp;
+ Word32 i, j, L_tmp;
+
+ if (bfi == 0) /* Good frame */
+ {
+ for (i = 0; i < 9; i++)
+ {
+ isf_q[i] = dico1_isf[indice[0] * 9 + i];
+ }
+ for (i = 0; i < 7; i++)
+ {
+ isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
+ }
+
+ for (i = 0; i < 5; i++)
+ {
+ isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]);
+ }
+ for (i = 0; i < 4; i++)
+ {
+ isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]);
+ }
+ for (i = 0; i < 7; i++)
+ {
+ isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]);
+ }
+
+ for (i = 0; i < ORDER; i++)
+ {
+ tmp = isf_q[i];
+ isf_q[i] = add1(tmp, mean_isf[i]);
+ isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
+ past_isfq[i] = tmp;
+ }
+
+
+ if (enc_dec)
+ {
+ for (i = 0; i < M; i++)
+ {
+ for (j = (L_MEANBUF - 1); j > 0; j--)
+ {
+ isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
+ }
+ isf_buf[i] = isf_q[i];
+ }
+ }
+ } else
+ { /* bad frame */
+ for (i = 0; i < M; i++)
+ {
+ L_tmp = (mean_isf[i] << 14);
+ for (j = 0; j < L_MEANBUF; j++)
+ {
+ L_tmp += (isf_buf[j * M + i] << 14);
+ }
+ ref_isf[i] = vo_round(L_tmp);
+ }
+
+ /* use the past ISFs slightly shifted towards their mean */
+ for (i = 0; i < ORDER; i++)
+ {
+ isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
+ }
+
+ /* estimate past quantized residual to be used in next frame */
+ for (i = 0; i < ORDER; i++)
+ {
+ tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */
+ past_isfq[i] = vo_sub(isf_q[i], tmp);
+ past_isfq[i] = past_isfq[i] >> 1; /* past_isfq[i] *= 0.5 */
+ }
+ }
+
+ Reorder_isf(isf_q, ISF_GAP, ORDER);
+
+ return;
}
@@ -419,122 +419,122 @@ void Dpisf_2s_36b(
****************************************************************************/
void Reorder_isf(
- Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
- Word16 min_dist, /* (i) Q15 : minimum distance to keep */
- Word16 n /* (i) : number of ISF */
- )
+ Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
+ Word16 min_dist, /* (i) Q15 : minimum distance to keep */
+ Word16 n /* (i) : number of ISF */
+ )
{
- Word32 i;
- Word16 isf_min;
-
- isf_min = min_dist;
- for (i = 0; i < n - 1; i++)
- {
- if(isf[i] < isf_min)
- {
- isf[i] = isf_min;
- }
- isf_min = (isf[i] + min_dist);
- }
- return;
+ Word32 i;
+ Word16 isf_min;
+
+ isf_min = min_dist;
+ for (i = 0; i < n - 1; i++)
+ {
+ if(isf[i] < isf_min)
+ {
+ isf[i] = isf_min;
+ }
+ isf_min = (isf[i] + min_dist);
+ }
+ return;
}
Word16 Sub_VQ( /* output: return quantization index */
- Word16 * x, /* input : ISF residual vector */
- Word16 * dico, /* input : quantization codebook */
- Word16 dim, /* input : dimention of vector */
- Word16 dico_size, /* input : size of quantization codebook */
- Word32 * distance /* output: error of quantization */
- )
+ Word16 * x, /* input : ISF residual vector */
+ Word16 * dico, /* input : quantization codebook */
+ Word16 dim, /* input : dimention of vector */
+ Word16 dico_size, /* input : size of quantization codebook */
+ Word32 * distance /* output: error of quantization */
+ )
{
- Word16 temp, *p_dico;
- Word32 i, j, index;
- Word32 dist_min, dist;
-
- dist_min = MAX_32;
- p_dico = dico;
-
- index = 0;
- for (i = 0; i < dico_size; i++)
- {
- dist = 0;
-
- for (j = 0; j < dim; j++)
- {
- temp = x[j] - (*p_dico++);
- dist += (temp * temp)<<1;
- }
-
- if(dist < dist_min)
- {
- dist_min = dist;
- index = i;
- }
- }
-
- *distance = dist_min;
-
- /* Reading the selected vector */
- p_dico = &dico[index * dim];
- for (j = 0; j < dim; j++)
- {
- x[j] = *p_dico++;
- }
-
- return index;
+ Word16 temp, *p_dico;
+ Word32 i, j, index;
+ Word32 dist_min, dist;
+
+ dist_min = MAX_32;
+ p_dico = dico;
+
+ index = 0;
+ for (i = 0; i < dico_size; i++)
+ {
+ dist = 0;
+
+ for (j = 0; j < dim; j++)
+ {
+ temp = x[j] - (*p_dico++);
+ dist += (temp * temp)<<1;
+ }
+
+ if(dist < dist_min)
+ {
+ dist_min = dist;
+ index = i;
+ }
+ }
+
+ *distance = dist_min;
+
+ /* Reading the selected vector */
+ p_dico = &dico[index * dim];
+ for (j = 0; j < dim; j++)
+ {
+ x[j] = *p_dico++;
+ }
+
+ return index;
}
static void VQ_stage1(
- Word16 * x, /* input : ISF residual vector */
- Word16 * dico, /* input : quantization codebook */
- Word16 dim, /* input : dimention of vector */
- Word16 dico_size, /* input : size of quantization codebook */
- Word16 * index, /* output: indices of survivors */
- Word16 surv /* input : number of survivor */
- )
+ Word16 * x, /* input : ISF residual vector */
+ Word16 * dico, /* input : quantization codebook */
+ Word16 dim, /* input : dimention of vector */
+ Word16 dico_size, /* input : size of quantization codebook */
+ Word16 * index, /* output: indices of survivors */
+ Word16 surv /* input : number of survivor */
+ )
{
- Word16 temp, *p_dico;
- Word32 i, j, k, l;
- Word32 dist_min[N_SURV_MAX], dist;
-
- dist_min[0] = MAX_32;
- dist_min[1] = MAX_32;
- dist_min[2] = MAX_32;
- dist_min[3] = MAX_32;
- index[0] = 0;
- index[1] = 1;
- index[2] = 2;
- index[3] = 3;
-
- p_dico = dico;
-
- for (i = 0; i < dico_size; i++)
- {
- dist = 0;
- for (j = 0; j < dim; j++)
- {
- temp = x[j] - (*p_dico++);
- dist += (temp * temp)<<1;
- }
-
- for (k = 0; k < surv; k++)
- {
- if(dist < dist_min[k])
- {
- for (l = surv - 1; l > k; l--)
- {
- dist_min[l] = dist_min[l - 1];
- index[l] = index[l - 1];
- }
- dist_min[k] = dist;
- index[k] = i;
- break;
- }
- }
- }
- return;
+ Word16 temp, *p_dico;
+ Word32 i, j, k, l;
+ Word32 dist_min[N_SURV_MAX], dist;
+
+ dist_min[0] = MAX_32;
+ dist_min[1] = MAX_32;
+ dist_min[2] = MAX_32;
+ dist_min[3] = MAX_32;
+ index[0] = 0;
+ index[1] = 1;
+ index[2] = 2;
+ index[3] = 3;
+
+ p_dico = dico;
+
+ for (i = 0; i < dico_size; i++)
+ {
+ dist = 0;
+ for (j = 0; j < dim; j++)
+ {
+ temp = x[j] - (*p_dico++);
+ dist += (temp * temp)<<1;
+ }
+
+ for (k = 0; k < surv; k++)
+ {
+ if(dist < dist_min[k])
+ {
+ for (l = surv - 1; l > k; l--)
+ {
+ dist_min[l] = dist_min[l - 1];
+ index[l] = index[l - 1];
+ }
+ dist_min[k] = dist;
+ index[k] = i;
+ break;
+ }
+ }
+ }
+ return;
}