Merge "Check buffer size after read" into qt-dev
am: 9c5c5a0dfb
Change-Id: I486ad8212efa910dc7c6b4a752d7df3d237f7a58
diff --git a/media/extractors/wav/WAVExtractor.cpp b/media/extractors/wav/WAVExtractor.cpp
index 8b539c2ff..4fa7f27 100644
--- a/media/extractors/wav/WAVExtractor.cpp
+++ b/media/extractors/wav/WAVExtractor.cpp
@@ -505,45 +505,40 @@
// TODO: add capability to return data as float PCM instead of 16 bit PCM.
if (mWaveFormat == WAVE_FORMAT_PCM) {
+ const size_t bytesPerFrame = (mBitsPerSample >> 3) * mNumChannels;
+ const size_t numFrames = n / bytesPerFrame;
+ const size_t numSamples = numFrames * mNumChannels;
if (mOutputFloat) {
float *fdest = (float *)buffer->data();
+ buffer->set_range(0, 4 * numSamples);
switch (mBitsPerSample) {
case 8: {
- buffer->set_range(0, 4 * n);
- memcpy_to_float_from_u8(fdest, (const uint8_t *)buffer->data(), n);
+ memcpy_to_float_from_u8(fdest, (const uint8_t *)buffer->data(), numSamples);
} break;
case 16: {
- const size_t numSamples = n / 2;
- buffer->set_range(0, 4 * numSamples);
memcpy_to_float_from_i16(fdest, (const int16_t *)buffer->data(), numSamples);
} break;
case 24: {
- const size_t numSamples = n / 3;
- buffer->set_range(0, 4 * numSamples);
memcpy_to_float_from_p24(fdest, (const uint8_t *)buffer->data(), numSamples);
} break;
case 32: { // buffer range is correct
- const size_t numSamples = n / 4;
memcpy_to_float_from_i32(fdest, (const int32_t *)buffer->data(), numSamples);
} break;
}
} else {
int16_t *idest = (int16_t *)buffer->data();
+ buffer->set_range(0, 2 * numSamples);
switch (mBitsPerSample) {
case 8: {
- buffer->set_range(0, 2 * n);
- memcpy_to_i16_from_u8(idest, (const uint8_t *)buffer->data(), n);
+ memcpy_to_i16_from_u8(idest, (const uint8_t *)buffer->data(), numSamples);
} break;
case 16:
- break; // no translation needed
+ // no conversion needed
+ break;
case 24: {
- const size_t numSamples = n / 3;
- buffer->set_range(0, 2 * numSamples);
memcpy_to_i16_from_p24(idest, (const uint8_t *)buffer->data(), numSamples);
} break;
case 32: {
- const size_t numSamples = n / 4;
- buffer->set_range(0, 2 * numSamples);
memcpy_to_i16_from_i32(idest, (const int32_t *)buffer->data(), numSamples);
} break;
}