summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Caldwell <saintdev@gmail.com>2010-11-01 07:45:13 +0000
committerAlex Converse <alex.converse@gmail.com>2010-11-01 07:45:13 +0000
commitd56920e206b639d9e2a4e22b90acc680c6e4ca04 (patch)
treef82f7da1cd86521226ec1f9e1219752679c5a7ce
parent3ea12f65ba7b68f840f029119c76e718e7c05a3e (diff)
aacenc: Correct spreading calculation for high spreading.
The 3GPP spec uses the following calculation for high spreading: thr'_spr = max(thr_scaled, s_h(n) * thr_scaled(n-1)) where, n is defined as the current band, and s_h() is defined as "[...] the distance of adjacent bands in Bark and a constant slope that is 15 dB/Bark [...]". This is a little ambiguous as you would assume you want the Bark width of the previous band for this calculation. However, this assumption appears to be incorrect, and you really want the Bark width of the current band. Coincidentally this is exactly what the spec calls for! =P This noticeably improves Tom's Diner at low bitrates (I tested at 64kbps, with mid/side disabled). Patch by: Nathan Caldwell <saintdev@gmail.com> Originally committed as revision 25622 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/aacpsy.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/libavcodec/aacpsy.c b/libavcodec/aacpsy.c
index 1f295c08a7..a987be0abb 100644
--- a/libavcodec/aacpsy.c
+++ b/libavcodec/aacpsy.c
@@ -414,7 +414,7 @@ static void psy_3gpp_analyze(FFPsyContext *ctx, int channel,
for (w = 0; w < wi->num_windows*16; w += 16) {
AacPsyBand *band = &pch->band[w];
for (g = 1; g < num_bands; g++)
- band[g].thr = FFMAX(band[g].thr, band[g-1].thr * coeffs->spread_hi [g-1]);
+ band[g].thr = FFMAX(band[g].thr, band[g-1].thr * coeffs->spread_hi [g]);
for (g = num_bands - 2; g >= 0; g--)
band[g].thr = FFMAX(band[g].thr, band[g+1].thr * coeffs->spread_low[g]);
for (g = 0; g < num_bands; g++) {