Chromium Code Reviews| Index: webrtc/audio/utility/audio_frame_operations.cc |
| diff --git a/webrtc/audio/utility/audio_frame_operations.cc b/webrtc/audio/utility/audio_frame_operations.cc |
| index 6fcb84e722d5a07cfcf9d04c90641e4e238464fd..b97d1d3c902d81148c74d71b6b255d769f1975b9 100644 |
| --- a/webrtc/audio/utility/audio_frame_operations.cc |
| +++ b/webrtc/audio/utility/audio_frame_operations.cc |
| @@ -114,6 +114,79 @@ int AudioFrameOperations::StereoToMono(AudioFrame* frame) { |
| return 0; |
| } |
| +void AudioFrameOperations::QuadToMono(const int16_t* src_audio, |
|
hlundin-webrtc
2017/02/24 09:46:35
The order of the methods in the .cc file and the .
jens.nielsen
2017/02/24 14:55:48
Done.
|
| + size_t samples_per_channel, |
| + int16_t* dst_audio) { |
| + for (size_t i = 0; i < samples_per_channel; i++) { |
| + dst_audio[i] = (src_audio[4 * i] + src_audio[4 * i + 1] + |
| + src_audio[4 * i + 2] + src_audio[4 * i + 3]) >> 2; |
|
aleloi
2017/02/24 10:39:31
I think this can overflow. If so, can the sum be s
jens.nielsen
2017/02/24 11:11:18
I was too, and was about to fix that here as well
aleloi
2017/02/24 13:32:52
I tried to look it up:
http://en.cppreference.com/
jens.nielsen
2017/02/24 14:55:48
Done.
|
| + } |
| +} |
| + |
| +int AudioFrameOperations::QuadToMono(AudioFrame* frame) { |
| + if (frame->num_channels_ != 4) { |
| + return -1; |
| + } |
| + |
|
aleloi
2017/02/24 10:39:31
I think this is a good place to RTC_DCHECK_LE that
jens.nielsen
2017/02/24 14:55:48
Done. But the damage is already done here if the b
|
| + QuadToMono(frame->data_, frame->samples_per_channel_, frame->data_); |
| + frame->num_channels_ = 1; |
| + |
| + return 0; |
| +} |
| + |
| +void AudioFrameOperations::QuadToStereo(const int16_t* src_audio, |
| + size_t samples_per_channel, |
| + int16_t* dst_audio) { |
| + for (size_t i = 0; i < samples_per_channel; i++) { |
| + dst_audio[i * 2] = (src_audio[4 * i] + src_audio[4 * i + 1]) >> 1; |
| + dst_audio[i * 2 + 1] = (src_audio[4 * i + 2] + src_audio[4 * i + 3]) >> 1; |
|
aleloi
2017/02/24 10:39:31
I have concerns for overflows here as well.
jens.nielsen
2017/02/24 14:55:48
Done.
|
| + } |
| +} |
| + |
| +int AudioFrameOperations::QuadToStereo(AudioFrame* frame) { |
| + if (frame->num_channels_ != 4) { |
| + return -1; |
| + } |
| + |
|
aleloi
2017/02/24 10:39:31
Please add
RTC_DCHECK_LE(samples_per_channel_ * 4
jens.nielsen
2017/02/24 14:55:48
Done.
|
| + QuadToStereo(frame->data_, frame->samples_per_channel_, frame->data_); |
| + frame->num_channels_ = 2; |
| + |
| + return 0; |
| +} |
| + |
| +void AudioFrameOperations::DownmixChannels(const int16_t* src_audio, |
| + size_t src_channels, |
| + size_t samples_per_channel, |
| + int16_t* dst_audio, |
| + size_t dst_channels) { |
| + if (src_channels == 2 && dst_channels == 1) { |
| + StereoToMono(src_audio, samples_per_channel, dst_audio); |
| + } else if (src_channels == 4 && dst_channels == 2) { |
| + QuadToStereo(src_audio, samples_per_channel, dst_audio); |
| + } else if (src_channels == 4 && dst_channels == 1) { |
| + QuadToMono(src_audio, samples_per_channel, dst_audio); |
| + } |
|
hlundin-webrtc
2017/02/24 09:46:36
I'd like to see some kind of DCHECK that the numbe
jens.nielsen
2017/02/24 14:55:48
Done.
|
| +} |
| + |
| +int AudioFrameOperations::DownmixChannels(AudioFrame* frame, |
| + size_t dst_channels) { |
| + if (frame->num_channels_ >= dst_channels) { |
|
hlundin-webrtc
2017/02/24 09:46:35
This is not needed. You are explicitly testing all
jens.nielsen
2017/02/24 14:55:48
Done.
|
| + return -1; |
| + } |
| + |
| + if (frame->num_channels_ == 2 && dst_channels == 1) { |
| + return StereoToMono(frame); |
| + } else if (frame->num_channels_ == 4 && dst_channels == 2) { |
| + return QuadToStereo(frame); |
| + } else if (frame->num_channels_ == 4 && dst_channels == 1) { |
| + return QuadToMono(frame); |
| + } else { |
|
hlundin-webrtc
2017/02/24 09:46:36
Delete the else statement and simply return -1 unc
jens.nielsen
2017/02/24 14:55:48
Done.
|
| + return -1; |
| + } |
| + |
| + return 0; |
| +} |
| + |
| void AudioFrameOperations::SwapStereoChannels(AudioFrame* frame) { |
| RTC_DCHECK(frame); |
| if (frame->num_channels_ != 2) { |