diff options
| author | 2010-01-29 14:54:15 -0800 | |
|---|---|---|
| committer | 2010-01-29 14:54:15 -0800 | |
| commit | e6c73c2018bcd61aa1f9c1ce735a6813d40fe84d (patch) | |
| tree | 6c239142cb085f96d3584edad9132e774056da19 | |
| parent | bf124e7e41f7850ac1b7be808221a462db6f3447 (diff) | |
| parent | 00aa8ec727cd3027942e5c150523484d7e2e3c5d (diff) | |
Merge "Support 24-bit LE PCM wave files in stagefright."
| -rw-r--r-- | media/libstagefright/WAVExtractor.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/media/libstagefright/WAVExtractor.cpp b/media/libstagefright/WAVExtractor.cpp index da8fe795da95..7365dfafcb52 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; |