| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "webrtc/common_audio/audio_converter.h" | 11 #include "webrtc/common_audio/audio_converter.h" |
| 12 | 12 |
| 13 #include <cstring> | 13 #include <cstring> |
| 14 #include <utility> |
| 14 | 15 |
| 15 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
| 16 #include "webrtc/base/safe_conversions.h" | 17 #include "webrtc/base/safe_conversions.h" |
| 17 #include "webrtc/common_audio/channel_buffer.h" | 18 #include "webrtc/common_audio/channel_buffer.h" |
| 18 #include "webrtc/common_audio/resampler/push_sinc_resampler.h" | 19 #include "webrtc/common_audio/resampler/push_sinc_resampler.h" |
| 19 #include "webrtc/system_wrappers/include/scoped_vector.h" | 20 #include "webrtc/system_wrappers/include/scoped_vector.h" |
| 20 | 21 |
| 21 using rtc::checked_cast; | 22 using rtc::checked_cast; |
| 22 | 23 |
| 23 namespace webrtc { | 24 namespace webrtc { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 | 99 |
| 99 private: | 100 private: |
| 100 ScopedVector<PushSincResampler> resamplers_; | 101 ScopedVector<PushSincResampler> resamplers_; |
| 101 }; | 102 }; |
| 102 | 103 |
| 103 // Apply a vector of converters in serial, in the order given. At least two | 104 // Apply a vector of converters in serial, in the order given. At least two |
| 104 // converters must be provided. | 105 // converters must be provided. |
| 105 class CompositionConverter : public AudioConverter { | 106 class CompositionConverter : public AudioConverter { |
| 106 public: | 107 public: |
| 107 CompositionConverter(ScopedVector<AudioConverter> converters) | 108 CompositionConverter(ScopedVector<AudioConverter> converters) |
| 108 : converters_(converters.Pass()) { | 109 : converters_(std::move(converters)) { |
| 109 RTC_CHECK_GE(converters_.size(), 2u); | 110 RTC_CHECK_GE(converters_.size(), 2u); |
| 110 // We need an intermediate buffer after every converter. | 111 // We need an intermediate buffer after every converter. |
| 111 for (auto it = converters_.begin(); it != converters_.end() - 1; ++it) | 112 for (auto it = converters_.begin(); it != converters_.end() - 1; ++it) |
| 112 buffers_.push_back(new ChannelBuffer<float>((*it)->dst_frames(), | 113 buffers_.push_back(new ChannelBuffer<float>((*it)->dst_frames(), |
| 113 (*it)->dst_channels())); | 114 (*it)->dst_channels())); |
| 114 } | 115 } |
| 115 ~CompositionConverter() override {}; | 116 ~CompositionConverter() override {}; |
| 116 | 117 |
| 117 void Convert(const float* const* src, size_t src_size, float* const* dst, | 118 void Convert(const float* const* src, size_t src_size, float* const* dst, |
| 118 size_t dst_capacity) override { | 119 size_t dst_capacity) override { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 140 int dst_channels, | 141 int dst_channels, |
| 141 size_t dst_frames) { | 142 size_t dst_frames) { |
| 142 rtc::scoped_ptr<AudioConverter> sp; | 143 rtc::scoped_ptr<AudioConverter> sp; |
| 143 if (src_channels > dst_channels) { | 144 if (src_channels > dst_channels) { |
| 144 if (src_frames != dst_frames) { | 145 if (src_frames != dst_frames) { |
| 145 ScopedVector<AudioConverter> converters; | 146 ScopedVector<AudioConverter> converters; |
| 146 converters.push_back(new DownmixConverter(src_channels, src_frames, | 147 converters.push_back(new DownmixConverter(src_channels, src_frames, |
| 147 dst_channels, src_frames)); | 148 dst_channels, src_frames)); |
| 148 converters.push_back(new ResampleConverter(dst_channels, src_frames, | 149 converters.push_back(new ResampleConverter(dst_channels, src_frames, |
| 149 dst_channels, dst_frames)); | 150 dst_channels, dst_frames)); |
| 150 sp.reset(new CompositionConverter(converters.Pass())); | 151 sp.reset(new CompositionConverter(std::move(converters))); |
| 151 } else { | 152 } else { |
| 152 sp.reset(new DownmixConverter(src_channels, src_frames, dst_channels, | 153 sp.reset(new DownmixConverter(src_channels, src_frames, dst_channels, |
| 153 dst_frames)); | 154 dst_frames)); |
| 154 } | 155 } |
| 155 } else if (src_channels < dst_channels) { | 156 } else if (src_channels < dst_channels) { |
| 156 if (src_frames != dst_frames) { | 157 if (src_frames != dst_frames) { |
| 157 ScopedVector<AudioConverter> converters; | 158 ScopedVector<AudioConverter> converters; |
| 158 converters.push_back(new ResampleConverter(src_channels, src_frames, | 159 converters.push_back(new ResampleConverter(src_channels, src_frames, |
| 159 src_channels, dst_frames)); | 160 src_channels, dst_frames)); |
| 160 converters.push_back(new UpmixConverter(src_channels, dst_frames, | 161 converters.push_back(new UpmixConverter(src_channels, dst_frames, |
| 161 dst_channels, dst_frames)); | 162 dst_channels, dst_frames)); |
| 162 sp.reset(new CompositionConverter(converters.Pass())); | 163 sp.reset(new CompositionConverter(std::move(converters))); |
| 163 } else { | 164 } else { |
| 164 sp.reset(new UpmixConverter(src_channels, src_frames, dst_channels, | 165 sp.reset(new UpmixConverter(src_channels, src_frames, dst_channels, |
| 165 dst_frames)); | 166 dst_frames)); |
| 166 } | 167 } |
| 167 } else if (src_frames != dst_frames) { | 168 } else if (src_frames != dst_frames) { |
| 168 sp.reset(new ResampleConverter(src_channels, src_frames, dst_channels, | 169 sp.reset(new ResampleConverter(src_channels, src_frames, dst_channels, |
| 169 dst_frames)); | 170 dst_frames)); |
| 170 } else { | 171 } else { |
| 171 sp.reset(new CopyConverter(src_channels, src_frames, dst_channels, | 172 sp.reset(new CopyConverter(src_channels, src_frames, dst_channels, |
| 172 dst_frames)); | 173 dst_frames)); |
| 173 } | 174 } |
| 174 | 175 |
| 175 return sp.Pass(); | 176 return sp; |
| 176 } | 177 } |
| 177 | 178 |
| 178 // For CompositionConverter. | 179 // For CompositionConverter. |
| 179 AudioConverter::AudioConverter() | 180 AudioConverter::AudioConverter() |
| 180 : src_channels_(0), | 181 : src_channels_(0), |
| 181 src_frames_(0), | 182 src_frames_(0), |
| 182 dst_channels_(0), | 183 dst_channels_(0), |
| 183 dst_frames_(0) {} | 184 dst_frames_(0) {} |
| 184 | 185 |
| 185 AudioConverter::AudioConverter(int src_channels, size_t src_frames, | 186 AudioConverter::AudioConverter(int src_channels, size_t src_frames, |
| 186 int dst_channels, size_t dst_frames) | 187 int dst_channels, size_t dst_frames) |
| 187 : src_channels_(src_channels), | 188 : src_channels_(src_channels), |
| 188 src_frames_(src_frames), | 189 src_frames_(src_frames), |
| 189 dst_channels_(dst_channels), | 190 dst_channels_(dst_channels), |
| 190 dst_frames_(dst_frames) { | 191 dst_frames_(dst_frames) { |
| 191 RTC_CHECK(dst_channels == src_channels || dst_channels == 1 || | 192 RTC_CHECK(dst_channels == src_channels || dst_channels == 1 || |
| 192 src_channels == 1); | 193 src_channels == 1); |
| 193 } | 194 } |
| 194 | 195 |
| 195 void AudioConverter::CheckSizes(size_t src_size, size_t dst_capacity) const { | 196 void AudioConverter::CheckSizes(size_t src_size, size_t dst_capacity) const { |
| 196 RTC_CHECK_EQ(src_size, src_channels() * src_frames()); | 197 RTC_CHECK_EQ(src_size, src_channels() * src_frames()); |
| 197 RTC_CHECK_GE(dst_capacity, dst_channels() * dst_frames()); | 198 RTC_CHECK_GE(dst_capacity, dst_channels() * dst_frames()); |
| 198 } | 199 } |
| 199 | 200 |
| 200 } // namespace webrtc | 201 } // namespace webrtc |
| OLD | NEW |