diff options
Diffstat (limited to 'webrtc/common_audio/audio_converter.cc')
-rw-r--r-- | webrtc/common_audio/audio_converter.cc | 153 |
1 files changed, 86 insertions, 67 deletions
diff --git a/webrtc/common_audio/audio_converter.cc b/webrtc/common_audio/audio_converter.cc index f1709ae..485ec80 100644 --- a/webrtc/common_audio/audio_converter.cc +++ b/webrtc/common_audio/audio_converter.cc @@ -8,32 +8,36 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "webrtc/common_audio/audio_converter.h" +#include "common_audio/audio_converter.h" #include <cstring> +#include <memory> +#include <utility> +#include <vector> -#include "webrtc/base/checks.h" -#include "webrtc/base/safe_conversions.h" -#include "webrtc/common_audio/channel_buffer.h" -#include "webrtc/common_audio/resampler/push_sinc_resampler.h" -#include "webrtc/system_wrappers/include/scoped_vector.h" - -using rtc::checked_cast; +#include "common_audio/channel_buffer.h" +#include "common_audio/resampler/push_sinc_resampler.h" +#include "rtc_base/checks.h" +#include "rtc_base/numerics/safe_conversions.h" namespace webrtc { class CopyConverter : public AudioConverter { public: - CopyConverter(int src_channels, size_t src_frames, int dst_channels, + CopyConverter(size_t src_channels, + size_t src_frames, + size_t dst_channels, size_t dst_frames) : AudioConverter(src_channels, src_frames, dst_channels, dst_frames) {} - ~CopyConverter() override {}; + ~CopyConverter() override {} - void Convert(const float* const* src, size_t src_size, float* const* dst, + void Convert(const float* const* src, + size_t src_size, + float* const* dst, size_t dst_capacity) override { CheckSizes(src_size, dst_capacity); if (src != dst) { - for (int i = 0; i < src_channels(); ++i) + for (size_t i = 0; i < src_channels(); ++i) std::memcpy(dst[i], src[i], dst_frames() * sizeof(*dst[i])); } } @@ -41,17 +45,21 @@ class CopyConverter : public AudioConverter { class UpmixConverter : public AudioConverter { public: - UpmixConverter(int src_channels, size_t src_frames, int dst_channels, + UpmixConverter(size_t src_channels, + size_t src_frames, + size_t dst_channels, size_t dst_frames) : AudioConverter(src_channels, src_frames, dst_channels, dst_frames) {} - ~UpmixConverter() override {}; + ~UpmixConverter() override {} - void Convert(const float* const* src, size_t src_size, float* const* dst, + void Convert(const float* const* src, + size_t src_size, + float* const* dst, size_t dst_capacity) override { CheckSizes(src_size, dst_capacity); for (size_t i = 0; i < dst_frames(); ++i) { const float value = src[0][i]; - for (int j = 0; j < dst_channels(); ++j) + for (size_t j = 0; j < dst_channels(); ++j) dst[j][i] = value; } } @@ -59,19 +67,22 @@ class UpmixConverter : public AudioConverter { class DownmixConverter : public AudioConverter { public: - DownmixConverter(int src_channels, size_t src_frames, int dst_channels, + DownmixConverter(size_t src_channels, + size_t src_frames, + size_t dst_channels, size_t dst_frames) - : AudioConverter(src_channels, src_frames, dst_channels, dst_frames) { - } - ~DownmixConverter() override {}; + : AudioConverter(src_channels, src_frames, dst_channels, dst_frames) {} + ~DownmixConverter() override {} - void Convert(const float* const* src, size_t src_size, float* const* dst, + void Convert(const float* const* src, + size_t src_size, + float* const* dst, size_t dst_capacity) override { CheckSizes(src_size, dst_capacity); float* dst_mono = dst[0]; for (size_t i = 0; i < src_frames(); ++i) { float sum = 0; - for (int j = 0; j < src_channels(); ++j) + for (size_t j = 0; j < src_channels(); ++j) sum += src[j][i]; dst_mono[i] = sum / src_channels(); } @@ -80,16 +91,21 @@ class DownmixConverter : public AudioConverter { class ResampleConverter : public AudioConverter { public: - ResampleConverter(int src_channels, size_t src_frames, int dst_channels, + ResampleConverter(size_t src_channels, + size_t src_frames, + size_t dst_channels, size_t dst_frames) : AudioConverter(src_channels, src_frames, dst_channels, dst_frames) { resamplers_.reserve(src_channels); - for (int i = 0; i < src_channels; ++i) - resamplers_.push_back(new PushSincResampler(src_frames, dst_frames)); + for (size_t i = 0; i < src_channels; ++i) + resamplers_.push_back(std::unique_ptr<PushSincResampler>( + new PushSincResampler(src_frames, dst_frames))); } - ~ResampleConverter() override {}; + ~ResampleConverter() override {} - void Convert(const float* const* src, size_t src_size, float* const* dst, + void Convert(const float* const* src, + size_t src_size, + float* const* dst, size_t dst_capacity) override { CheckSizes(src_size, dst_capacity); for (size_t i = 0; i < resamplers_.size(); ++i) @@ -97,69 +113,73 @@ class ResampleConverter : public AudioConverter { } private: - ScopedVector<PushSincResampler> resamplers_; + std::vector<std::unique_ptr<PushSincResampler>> resamplers_; }; // Apply a vector of converters in serial, in the order given. At least two // converters must be provided. class CompositionConverter : public AudioConverter { public: - CompositionConverter(ScopedVector<AudioConverter> converters) - : converters_(converters.Pass()) { - RTC_CHECK_GE(converters_.size(), 2u); + explicit CompositionConverter( + std::vector<std::unique_ptr<AudioConverter>> converters) + : converters_(std::move(converters)) { + RTC_CHECK_GE(converters_.size(), 2); // We need an intermediate buffer after every converter. for (auto it = converters_.begin(); it != converters_.end() - 1; ++it) - buffers_.push_back(new ChannelBuffer<float>((*it)->dst_frames(), - (*it)->dst_channels())); + buffers_.push_back( + std::unique_ptr<ChannelBuffer<float>>(new ChannelBuffer<float>( + (*it)->dst_frames(), (*it)->dst_channels()))); } - ~CompositionConverter() override {}; + ~CompositionConverter() override {} - void Convert(const float* const* src, size_t src_size, float* const* dst, + void Convert(const float* const* src, + size_t src_size, + float* const* dst, size_t dst_capacity) override { converters_.front()->Convert(src, src_size, buffers_.front()->channels(), buffers_.front()->size()); for (size_t i = 2; i < converters_.size(); ++i) { - auto src_buffer = buffers_[i - 2]; - auto dst_buffer = buffers_[i - 1]; - converters_[i]->Convert(src_buffer->channels(), - src_buffer->size(), - dst_buffer->channels(), - dst_buffer->size()); + auto& src_buffer = buffers_[i - 2]; + auto& dst_buffer = buffers_[i - 1]; + converters_[i]->Convert(src_buffer->channels(), src_buffer->size(), + dst_buffer->channels(), dst_buffer->size()); } converters_.back()->Convert(buffers_.back()->channels(), buffers_.back()->size(), dst, dst_capacity); } private: - ScopedVector<AudioConverter> converters_; - ScopedVector<ChannelBuffer<float>> buffers_; + std::vector<std::unique_ptr<AudioConverter>> converters_; + std::vector<std::unique_ptr<ChannelBuffer<float>>> buffers_; }; -rtc::scoped_ptr<AudioConverter> AudioConverter::Create(int src_channels, +std::unique_ptr<AudioConverter> AudioConverter::Create(size_t src_channels, size_t src_frames, - int dst_channels, + size_t dst_channels, size_t dst_frames) { - rtc::scoped_ptr<AudioConverter> sp; + std::unique_ptr<AudioConverter> sp; if (src_channels > dst_channels) { if (src_frames != dst_frames) { - ScopedVector<AudioConverter> converters; - converters.push_back(new DownmixConverter(src_channels, src_frames, - dst_channels, src_frames)); - converters.push_back(new ResampleConverter(dst_channels, src_frames, - dst_channels, dst_frames)); - sp.reset(new CompositionConverter(converters.Pass())); + std::vector<std::unique_ptr<AudioConverter>> converters; + converters.push_back(std::unique_ptr<AudioConverter>(new DownmixConverter( + src_channels, src_frames, dst_channels, src_frames))); + converters.push_back( + std::unique_ptr<AudioConverter>(new ResampleConverter( + dst_channels, src_frames, dst_channels, dst_frames))); + sp.reset(new CompositionConverter(std::move(converters))); } else { sp.reset(new DownmixConverter(src_channels, src_frames, dst_channels, dst_frames)); } } else if (src_channels < dst_channels) { if (src_frames != dst_frames) { - ScopedVector<AudioConverter> converters; - converters.push_back(new ResampleConverter(src_channels, src_frames, - src_channels, dst_frames)); - converters.push_back(new UpmixConverter(src_channels, dst_frames, - dst_channels, dst_frames)); - sp.reset(new CompositionConverter(converters.Pass())); + std::vector<std::unique_ptr<AudioConverter>> converters; + converters.push_back( + std::unique_ptr<AudioConverter>(new ResampleConverter( + src_channels, src_frames, src_channels, dst_frames))); + converters.push_back(std::unique_ptr<AudioConverter>(new UpmixConverter( + src_channels, dst_frames, dst_channels, dst_frames))); + sp.reset(new CompositionConverter(std::move(converters))); } else { sp.reset(new UpmixConverter(src_channels, src_frames, dst_channels, dst_frames)); @@ -168,22 +188,21 @@ rtc::scoped_ptr<AudioConverter> AudioConverter::Create(int src_channels, sp.reset(new ResampleConverter(src_channels, src_frames, dst_channels, dst_frames)); } else { - sp.reset(new CopyConverter(src_channels, src_frames, dst_channels, - dst_frames)); + sp.reset( + new CopyConverter(src_channels, src_frames, dst_channels, dst_frames)); } - return sp.Pass(); + return sp; } // For CompositionConverter. AudioConverter::AudioConverter() - : src_channels_(0), - src_frames_(0), - dst_channels_(0), - dst_frames_(0) {} + : src_channels_(0), src_frames_(0), dst_channels_(0), dst_frames_(0) {} -AudioConverter::AudioConverter(int src_channels, size_t src_frames, - int dst_channels, size_t dst_frames) +AudioConverter::AudioConverter(size_t src_channels, + size_t src_frames, + size_t dst_channels, + size_t dst_frames) : src_channels_(src_channels), src_frames_(src_frames), dst_channels_(dst_channels), |