aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-09-29 21:21:26 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-09-29 21:44:03 +0200
commit11512367d3c6f67b093b54c532328763c9b815e2 (patch)
treeee8c5e1e0d293a8c4f2917c1aecc85466c2accfe
parent84f8aef40c7091274ed399a8aeaa933ea76d9476 (diff)
downloadffmpeg-11512367d3c6f67b093b54c532328763c9b815e2.tar.gz
celp_math: cleanup ff_dot_product()
based on code & idea by vitor Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavcodec/celp_math.c12
-rw-r--r--libavcodec/celp_math.h3
-rw-r--r--libavcodec/g723_1.c18
3 files changed, 16 insertions, 17 deletions
diff --git a/libavcodec/celp_math.c b/libavcodec/celp_math.c
index b78edd1ebd..a00bb3964e 100644
--- a/libavcodec/celp_math.c
+++ b/libavcodec/celp_math.c
@@ -197,14 +197,14 @@ int ff_log2(uint32_t value)
return (power_int << 15) + value;
}
-int ff_dot_product(const int16_t *a, const int16_t *b, int length, int shift)
+int ff_dot_product(const int16_t *a, const int16_t *b, int length)
{
- int i, sum = 0;
+ int i;
+ int64_t sum = 0;
+
+ for (i = 0; i < length; i++)
+ sum += MUL16(a[i], b[i]);
- for (i = 0; i < length; i++) {
- int64_t prod = av_clipl_int32(MUL64(a[i], b[i]) << shift);
- sum = av_clipl_int32(sum + prod);
- }
return sum;
}
diff --git a/libavcodec/celp_math.h b/libavcodec/celp_math.h
index 476e668795..4b08c62c0c 100644
--- a/libavcodec/celp_math.h
+++ b/libavcodec/celp_math.h
@@ -68,11 +68,10 @@ static inline int bidir_sal(int value, int offset)
* @param a input data array
* @param b input data array
* @param length number of elements
- * @param shift the result is scaled by 2^shift
*
* @return dot product = sum of elementwise products
*/
-int ff_dot_product(const int16_t *a, const int16_t *b, int length, int shift);
+int ff_dot_product(const int16_t *a, const int16_t *b, int length);
/**
* returns the dot product.
diff --git a/libavcodec/g723_1.c b/libavcodec/g723_1.c
index da4f0d2a04..e0e866e640 100644
--- a/libavcodec/g723_1.c
+++ b/libavcodec/g723_1.c
@@ -553,7 +553,7 @@ static void gen_acb_excitation(int16_t *vector, int16_t *prev_excitation,
/* Calculate adaptive vector */
cb_ptr += subfrm.ad_cb_gain * 20;
for (i = 0; i < SUBFRAME_LEN; i++) {
- sum = ff_dot_product(residual + i, cb_ptr, PITCH_ORDER, 1);
+ sum = ff_dot_product(residual + i, cb_ptr, PITCH_ORDER)<<1;
vector[i] = av_clipl_int32((sum << 1) + (1 << 15)) >> 16;
}
}
@@ -579,7 +579,7 @@ static int autocorr_max(G723_1_Context *p, int offset, int *ccr_max,
limit = FFMIN(FRAME_LEN + PITCH_MAX - offset - length, pitch_lag + 3);
for (i = pitch_lag - 3; i <= limit; i++) {
- ccr = ff_dot_product(buf, buf + dir * i, length, 1);
+ ccr = ff_dot_product(buf, buf + dir * i, length)<<1;
if (ccr > *ccr_max) {
*ccr_max = ccr;
@@ -678,17 +678,17 @@ static void comp_ppf_coeff(G723_1_Context *p, int offset, int pitch_lag,
return;
/* Compute target energy */
- energy[0] = ff_dot_product(buf, buf, SUBFRAME_LEN, 1);
+ energy[0] = ff_dot_product(buf, buf, SUBFRAME_LEN)<<1;
/* Compute forward residual energy */
if (fwd_lag)
energy[2] = ff_dot_product(buf + fwd_lag, buf + fwd_lag,
- SUBFRAME_LEN, 1);
+ SUBFRAME_LEN)<<1;
/* Compute backward residual energy */
if (back_lag)
energy[4] = ff_dot_product(buf - back_lag, buf - back_lag,
- SUBFRAME_LEN, 1);
+ SUBFRAME_LEN)<<1;
/* Normalize and shorten */
temp1 = 0;
@@ -749,7 +749,7 @@ static int comp_interp_index(G723_1_Context *p, int pitch_lag,
ccr = av_clipl_int32((int64_t)ccr + (1 << 15)) >> 16;
/* Compute target energy */
- tgt_eng = ff_dot_product(buf, buf, SUBFRAME_LEN * 2, 1);
+ tgt_eng = ff_dot_product(buf, buf, SUBFRAME_LEN * 2)<<1;
*exc_eng = av_clipl_int32(tgt_eng + (1 << 15)) >> 16;
if (ccr <= 0)
@@ -757,7 +757,7 @@ static int comp_interp_index(G723_1_Context *p, int pitch_lag,
/* Compute best energy */
best_eng = ff_dot_product(buf - index, buf - index,
- SUBFRAME_LEN * 2, 1);
+ SUBFRAME_LEN * 2)<<1;
best_eng = av_clipl_int32((int64_t)best_eng + (1 << 15)) >> 16;
temp = best_eng * *exc_eng >> 3;
@@ -911,9 +911,9 @@ static void formant_postfilter(G723_1_Context *p, int16_t *lpc, int16_t *buf)
/* Compute auto correlation coefficients */
auto_corr[0] = ff_dot_product(temp_vector, temp_vector + 1,
- SUBFRAME_LEN - 1, 1);
+ SUBFRAME_LEN - 1)<<1;
auto_corr[1] = ff_dot_product(temp_vector, temp_vector,
- SUBFRAME_LEN, 1);
+ SUBFRAME_LEN)<<1;
/* Compute reflection coefficient */
temp = auto_corr[1] >> 16;