summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2015-12-11 15:46:17 -0800
committerSteve Kondik <steve@cyngn.com>2016-01-08 21:00:13 -0800
commita6e3ed3215d4964586512483895fd8e4f9d75462 (patch)
treeb05bd6ddffce4d5e6c35233ffd478037261d2fd6
parent4f4723abe75dad12f2d080df72f43b2bbf3e64ce (diff)
downloadframeworks_av-a6e3ed3215d4964586512483895fd8e4f9d75462.zip
frameworks_av-a6e3ed3215d4964586512483895fd8e4f9d75462.tar.gz
frameworks_av-a6e3ed3215d4964586512483895fd8e4f9d75462.tar.bz2
Fix more amrwbenc overflows
Bug: 25843966 Change-Id: I16aa3eb0fc4c8d507b92d3a84139cfef6302c96c
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/deemph.c18
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/math_op.c9
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/p_med_ol.c2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c12
4 files changed, 21 insertions, 20 deletions
diff --git a/media/libstagefright/codecs/amrwbenc/src/deemph.c b/media/libstagefright/codecs/amrwbenc/src/deemph.c
index a25a2c8..cc27f6e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/deemph.c
+++ b/media/libstagefright/codecs/amrwbenc/src/deemph.c
@@ -64,24 +64,16 @@ void Deemph2(
Word32 i;
Word32 L_tmp;
L_tmp = x[0] << 15;
- L_tmp += ((*mem) * mu)<<1;
- x[0] = (L_tmp + 0x8000)>>16;
+ i = L_mult(*mem, mu);
+ L_tmp = L_add(L_tmp, i);
+ x[0] = voround(L_tmp);
for (i = 1; i < L; i++)
{
Word32 tmp;
L_tmp = x[i] << 15;
tmp = (x[i - 1] * mu)<<1;
- if (tmp > 0 && L_tmp > INT_MAX - tmp) {
- L_tmp = INT_MAX;
- } else if (tmp < 0 && L_tmp < INT_MIN - tmp) {
- L_tmp = INT_MIN;
- } else {
- L_tmp += tmp;
- }
- if (L_tmp > INT32_MAX - 0x8000) {
- L_tmp = INT_MAX - 0x8000;
- }
- x[i] = (L_tmp + 0x8000)>>16;
+ L_tmp = L_add(L_tmp, tmp);
+ x[i] = voround(L_tmp);
}
*mem = x[L - 1];
return;
diff --git a/media/libstagefright/codecs/amrwbenc/src/math_op.c b/media/libstagefright/codecs/amrwbenc/src/math_op.c
index 3b237da..9d7c74e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/math_op.c
+++ b/media/libstagefright/codecs/amrwbenc/src/math_op.c
@@ -205,9 +205,14 @@ Word32 Dot_product12( /* (o) Q31: normalized result (1 < va
L_sum = 0;
for (i = 0; i < lg; i++)
{
- L_sum += x[i] * y[i];
+ Word32 tmp = (Word32) x[i] * (Word32) y[i];
+ if (tmp == (Word32) 0x40000000L) {
+ tmp = MAX_32;
+ }
+ L_sum = L_add(L_sum, tmp);
}
- L_sum = (L_sum << 1) + 1;
+ L_sum = L_shl2(L_sum, 1);
+ L_sum = L_add(L_sum, 1);
/* Normalize acc in Q31 */
sft = norm_l(L_sum);
L_sum = L_sum << sft;
diff --git a/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c b/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c
index 525bf16..5d2b4bd 100644
--- a/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c
+++ b/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c
@@ -129,7 +129,7 @@ Word16 Pitch_med_ol(
R2 = (R2 << exp_R2);
- R1 = vo_L_mult(vo_round(R1), vo_round(R2));
+ R1 = vo_L_mult(voround(R1), voround(R2));
i = norm_l(R1);
R1 = (R1 << i);
diff --git a/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c b/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c
index 7b578ca..4cafb01 100644
--- a/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c
+++ b/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c
@@ -673,8 +673,10 @@ void coder(
exc2[i] = exc[i] >> Q_new;
}
L_tmp = 0;
- for (i = 0; i < L_FRAME; i++)
- L_tmp += (exc2[i] * exc2[i])<<1;
+ for (i = 0; i < L_FRAME; i++) {
+ Word32 tmp = L_mult(exc2[i], exc2[i]); // (exc2[i] * exc2[i])<<1;
+ L_tmp = L_add(L_tmp, tmp);
+ }
L_tmp >>= 1;
dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);
@@ -1216,10 +1218,12 @@ void coder(
for (i = 0; i < L_SUBFR; i++)
{
+ Word32 tmp;
/* code in Q9, gain_pit in Q14 */
L_tmp = (gain_code * code[i])<<1;
L_tmp = (L_tmp << 5);
- L_tmp += (exc[i + i_subfr] * gain_pit)<<1;
+ tmp = L_mult(exc[i + i_subfr], gain_pit); // (exc[i + i_subfr] * gain_pit)<<1
+ L_tmp = L_add(L_tmp, tmp);
L_tmp = L_shl2(L_tmp, 1);
exc[i + i_subfr] = extract_h(L_add(L_tmp, 0x8000));
}
@@ -1301,7 +1305,7 @@ void coder(
L_tmp = (L_tmp << 5);
L_tmp += (exc2[i] * gain_pit)<<1;
L_tmp = (L_tmp << 1);
- exc2[i] = vo_round(L_tmp);
+ exc2[i] = voround(L_tmp);
}
corr_gain = synthesis(p_Aq, exc2, Q_new, &speech16k[i_subfr * 5 / 4], st);