diff options
author | Marco Nelissen <marcone@google.com> | 2010-10-27 11:08:14 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2010-10-27 11:08:14 -0700 |
commit | cd08ada7f1d9601636aaa77084c423dba14a2512 (patch) | |
tree | afb96f5436a00a0837fac82a72df01da30d22803 /media | |
parent | 222f489fc0d23c1dd226858d4135cb401be4c0b4 (diff) | |
parent | 67c7a4ae2ee7ead8fb29e2a6d892c2740d36f219 (diff) | |
download | frameworks_base-cd08ada7f1d9601636aaa77084c423dba14a2512.zip frameworks_base-cd08ada7f1d9601636aaa77084c423dba14a2512.tar.gz frameworks_base-cd08ada7f1d9601636aaa77084c423dba14a2512.tar.bz2 |
am 67c7a4ae: Merge "Fix off-by-two and other bugs in the visualization code. b/3137511" into gingerbread
Diffstat (limited to 'media')
-rw-r--r-- | media/libeffects/visualizer/EffectVisualizer.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/media/libeffects/visualizer/EffectVisualizer.cpp b/media/libeffects/visualizer/EffectVisualizer.cpp index 5505f14..c957dba 100644 --- a/media/libeffects/visualizer/EffectVisualizer.cpp +++ b/media/libeffects/visualizer/EffectVisualizer.cpp @@ -243,19 +243,22 @@ extern "C" int Visualizer_process( // derive capture scaling factor from peak value in current buffer // this gives more interesting captures for display. int32_t shift = 32; - for (size_t i = 0; i < inBuffer->frameCount; i++) { + int len = inBuffer->frameCount * 2; + for (size_t i = 0; i < len; i++) { int32_t smp = inBuffer->s16[i]; - if (smp < 0) smp = -smp; + if (smp < 0) smp = -smp - 1; // take care to keep the max negative in range int32_t clz = __builtin_clz(smp); if (shift > clz) shift = clz; } - // never scale by less than 8 to avoid returning unaltered PCM signal. - // add one to combine the division by 2 needed after summing left and right channels below - if (20 > shift) { - shift = (31 - 8 + 1) - shift; - } else { - shift = (3 + 1); + // A maximum amplitude signal will have 17 leading zeros, which we want to + // translate to a shift of 8 (for converting 16 bit to 8 bit) + shift = 25 - shift; + // Never scale by less than 8 to avoid returning unaltered PCM signal. + if (shift < 3) { + shift = 3; } + // add one to combine the division by 2 needed after summing left and right channels below + shift++; uint32_t captIdx; uint32_t inIdx; @@ -264,7 +267,7 @@ extern "C" int Visualizer_process( inIdx < inBuffer->frameCount && captIdx < pContext->mCaptureSize; inIdx++, captIdx++) { int32_t smp = inBuffer->s16[2 * inIdx] + inBuffer->s16[2 * inIdx + 1]; - smp = (smp + (1 << (shift - 1))) >> shift; + smp = smp >> shift; buf[captIdx] = ((uint8_t)smp)^0x80; } pContext->mCaptureIdx = captIdx; |