summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher R. Palmer <crpalmer@gmail.com>2017-01-29 09:14:56 -0500
committerZhao Wei Liew <zhaoweiliew@gmail.com>2017-01-31 10:05:23 +0000
commitcd72c7579b663004090a4c10f85c43cbf679777b (patch)
treee76acfdf57de083b4b1c525eb0f52e7b32db063f
parent7938c6d5c6d60cfc28e946c8a018072a4d7fa5de (diff)
downloadframeworks_av-staging/cm-14.1-cafrebase.tar.gz
frameworks_av-staging/cm-14.1-cafrebase.tar.bz2
frameworks_av-staging/cm-14.1-cafrebase.zip
libstagefright: Restore AOSP's handling of 24/32-bit wav filesstaging/cm-14.1-cafrebase
Presumably Steve changed this to make it better, but since it is broken lets restore the downsampling code from AOSP and at least the audio tracks won't be corrupted until someone really fixes what he was trying to backport here. This fixes, for example, Google Allo's notification sounds being corrupt (static). Change-Id: I58a0d4e4ea8650014919c95b6f9895981db93208 (cherry picked from commit e690119930488c8cd363dfa764e8bff514724fba)
-rw-r--r--media/libstagefright/WAVExtractor.cpp43
1 files changed, 16 insertions, 27 deletions
diff --git a/media/libstagefright/WAVExtractor.cpp b/media/libstagefright/WAVExtractor.cpp
index bf03f612a4..ad2f4d0fe4 100644
--- a/media/libstagefright/WAVExtractor.cpp
+++ b/media/libstagefright/WAVExtractor.cpp
@@ -390,8 +390,8 @@ status_t WAVSource::start(MetaData * /* params */) {
// some WAV files may have large audio buffers that use shared memory transfer.
mGroup = new MediaBufferGroup(4 /* buffers */, kMaxFrameSize);
- if (mBitsPerSample == 8 || mBitsPerSample == 24) {
- // As a temporary buffer for 8->16/24->32 bit conversion.
+ if (mBitsPerSample == 8) {
+ // As a temporary buffer for 8->16 bit conversion.
mGroup->add_buffer(new MediaBuffer(kMaxFrameSize));
}
@@ -455,13 +455,9 @@ status_t WAVSource::read(
}
// make sure that maxBytesToRead is multiple of 3, in 24-bit case
- size_t maxBytesToRead;
- if(8 == mBitsPerSample)
- maxBytesToRead = kMaxFrameSize / 2;
- else if (24 == mBitsPerSample) {
- maxBytesToRead = 3*(kMaxFrameSize/4);
- } else
- maxBytesToRead = kMaxFrameSize;
+ size_t maxBytesToRead =
+ mBitsPerSample == 8 ? kMaxFrameSize / 2 :
+ (mBitsPerSample == 24 ? 3*(kMaxFrameSize/3): kMaxFrameSize);
ALOGV("%s mBitsPerSample %d, kMaxFrameSize %zu, ",
__func__, mBitsPerSample, kMaxFrameSize);
@@ -513,24 +509,17 @@ status_t WAVSource::read(
buffer->release();
buffer = tmp;
} else if (mBitsPerSample == 24) {
- // Padding done here to convert to 32-bit samples
- MediaBuffer *tmp;
- CHECK_EQ(mGroup->acquire_buffer(&tmp), (status_t)OK);
- ssize_t numBytes = buffer->range_length() / 3;
- tmp->set_range(0, 4 * numBytes);
- int8_t *dst = (int8_t *)tmp->data();
- const uint8_t *src = (const uint8_t *)buffer->data();
- ALOGV("numBytes = %zu", numBytes);
- while(numBytes-- > 0) {
- *dst++ = 0x0;
- *dst++ = src[0];
- *dst++ = src[1];
- *dst++ = src[2];
- src += 3;
- }
- buffer->release();
- buffer = tmp;
- ALOGV("length = %zu", buffer->range_length());
+ // Convert 24-bit signed samples to 16-bit signed in place
+ const size_t numSamples = n / 3;
+
+ memcpy_to_i16_from_p24((int16_t *)buffer->data(), (const uint8_t *)buffer->data(), numSamples);
+ buffer->set_range(0, 2 * numSamples);
+ } else if (mBitsPerSample == 32) {
+ // Convert 32-bit signed samples to 16-bit signed in place
+ const size_t numSamples = n / 4;
+
+ memcpy_to_i16_from_i32((int16_t *)buffer->data(), (const int32_t *)buffer->data(), numSamples);
+ buffer->set_range(0, 2 * numSamples);
}
} else if (mWaveFormat == WAVE_FORMAT_IEEE_FLOAT) {
if (mBitsPerSample == 32) {