| Index: media/base/android/webaudio_media_codec_bridge.cc
|
| diff --git a/media/base/android/webaudio_media_codec_bridge.cc b/media/base/android/webaudio_media_codec_bridge.cc
|
| index 6024a5916f5bdf832451662035cbde29478ead6f..94f059a9a1e82f99a47e91ddfcdd768b8c0c4ec7 100644
|
| --- a/media/base/android/webaudio_media_codec_bridge.cc
|
| +++ b/media/base/android/webaudio_media_codec_bridge.cc
|
| @@ -17,6 +17,7 @@
|
| #include "base/basictypes.h"
|
| #include "base/logging.h"
|
| #include "base/posix/eintr_wrapper.h"
|
| +#include "base/stl_util.h"
|
| #include "jni/WebAudioMediaCodecBridge_jni.h"
|
| #include "media/base/android/webaudio_media_codec_info.h"
|
|
|
| @@ -148,15 +149,35 @@ void WebAudioMediaCodecBridge::OnChunkDecoded(
|
| JNIEnv* env,
|
| jobject /*java object*/,
|
| jobject buf,
|
| - jint buf_size) {
|
| + jint buf_size,
|
| + jint input_channel_count,
|
| + jint output_channel_count) {
|
|
|
| if (buf_size <= 0 || !buf)
|
| return;
|
|
|
| int8_t* buffer =
|
| static_cast<int8_t*>(env->GetDirectBufferAddress(buf));
|
| -
|
| size_t count = static_cast<size_t>(buf_size);
|
| + std::vector<int16_t> decoded_data;
|
| +
|
| + if (input_channel_count == 1 && output_channel_count == 2) {
|
| + // See crbug.com/266006. The file has one channel, but the
|
| + // decoder decided to return two channels. To be consistent with
|
| + // the number of channels in the file, only send one channel (the
|
| + // first).
|
| + int16_t* data = static_cast<int16_t*>(env->GetDirectBufferAddress(buf));
|
| + int frame_count = buf_size / sizeof(*data) / 2;
|
| +
|
| + decoded_data.resize(frame_count);
|
| + for (int k = 0; k < frame_count; ++k) {
|
| + decoded_data[k] = *data;
|
| + data += 2;
|
| + }
|
| + buffer = reinterpret_cast<int8_t*>(vector_as_array(&decoded_data));
|
| + DCHECK(buffer);
|
| + count = frame_count * sizeof(*data);
|
| + }
|
|
|
| // Write out the data to the pipe in small chunks if necessary.
|
| while (count > 0) {
|
|
|