summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/WAVExtractor.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-01-29 13:23:55 -0800
committerAndreas Huber <andih@google.com>2010-01-29 14:13:30 -0800
commit984d8f40c15e7fd757a9fdc007aad75549aa0fce (patch)
tree901d3c6e2161996f9c45ec633ab1e9e18b5a6372 /media/libstagefright/WAVExtractor.cpp
parent0fc863291096e9818fa83f8edc459f7f9c9cf794 (diff)
downloadframeworks_av-984d8f40c15e7fd757a9fdc007aad75549aa0fce.zip
frameworks_av-984d8f40c15e7fd757a9fdc007aad75549aa0fce.tar.gz
frameworks_av-984d8f40c15e7fd757a9fdc007aad75549aa0fce.tar.bz2
Support 24-bit LE PCM wave files in stagefright.
related-to-bug: 2300197
Diffstat (limited to 'media/libstagefright/WAVExtractor.cpp')
-rw-r--r--media/libstagefright/WAVExtractor.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/media/libstagefright/WAVExtractor.cpp b/media/libstagefright/WAVExtractor.cpp
index da8fe79..7365dfa 100644
--- a/media/libstagefright/WAVExtractor.cpp
+++ b/media/libstagefright/WAVExtractor.cpp
@@ -178,7 +178,8 @@ status_t WAVExtractor::init() {
mBitsPerSample = U16_LE_AT(&formatSpec[14]);
- if (mBitsPerSample != 8 && mBitsPerSample != 16) {
+ if (mBitsPerSample != 8 && mBitsPerSample != 16
+ && mBitsPerSample != 24) {
return ERROR_UNSUPPORTED;
}
@@ -329,6 +330,24 @@ status_t WAVSource::read(
buffer->release();
buffer = tmp;
+ } else if (mBitsPerSample == 24) {
+ // Convert 24-bit signed samples to 16-bit signed.
+
+ const uint8_t *src =
+ (const uint8_t *)buffer->data() + buffer->range_offset();
+ int16_t *dst = (int16_t *)src;
+
+ size_t numSamples = buffer->range_length() / 3;
+ for (size_t i = 0; i < numSamples; ++i) {
+ int32_t x = (int32_t)(src[0] | src[1] << 8 | src[2] << 16);
+ x = (x << 8) >> 8; // sign extension
+
+ x = x >> 8;
+ *dst++ = (int16_t)x;
+ src += 3;
+ }
+
+ buffer->set_range(buffer->range_offset(), 2 * numSamples);
}
size_t bytesPerSample = mBitsPerSample >> 3;