diff options
author | Christopher R. Palmer <crpalmer@gmail.com> | 2017-01-29 09:14:56 -0500 |
---|---|---|
committer | Zhao Wei Liew <zhaoweiliew@gmail.com> | 2017-01-31 10:05:23 +0000 |
commit | cd72c7579b663004090a4c10f85c43cbf679777b (patch) | |
tree | e76acfdf57de083b4b1c525eb0f52e7b32db063f | |
parent | 7938c6d5c6d60cfc28e946c8a018072a4d7fa5de (diff) | |
download | frameworks_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.cpp | 43 |
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) { |