Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Unified Diff: webrtc/modules/audio_processing/aec3/render_delay_buffer.cc

Issue 2611223003: Adding second layer of the echo canceller 3 functionality. (Closed)
Patch Set: Disabled DEATH tests that were causing memory leakage reports on test bots Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/audio_processing/aec3/render_delay_buffer.cc
diff --git a/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc b/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc
new file mode 100644
index 0000000000000000000000000000000000000000..8fc6b926b19126130cd78341dc4b65121d4bdfbe
--- /dev/null
+++ b/webrtc/modules/audio_processing/aec3/render_delay_buffer.cc
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
+
+#include <string.h>
+#include <algorithm>
+
+#include "webrtc/base/checks.h"
+#include "webrtc/base/constructormagic.h"
+#include "webrtc/modules/audio_processing/aec3/aec3_constants.h"
+#include "webrtc/system_wrappers/include/logging.h"
+
+namespace webrtc {
+namespace {
+
+class RenderDelayBufferImpl final : public RenderDelayBuffer {
+ public:
+ RenderDelayBufferImpl(size_t size_blocks,
+ size_t num_bands,
+ size_t max_api_jitter_blocks);
+ ~RenderDelayBufferImpl() override;
+
+ bool Insert(std::vector<std::vector<float>>* block) override;
+ const std::vector<std::vector<float>>& GetNext() override;
+ void SetDelay(size_t delay) override;
+ size_t Delay() const override { return delay_; }
+ size_t MaxDelay() const override {
+ return buffer_.size() - max_api_jitter_blocks_;
+ }
+ bool IsBlockAvailable() const override { return insert_surplus_ > 0; }
+ size_t MaxApiJitter() const override { return max_api_jitter_blocks_; }
+
+ private:
+ const size_t max_api_jitter_blocks_;
+ std::vector<std::vector<std::vector<float>>> buffer_;
+ size_t last_insert_index_ = 0;
+ size_t delay_ = 0;
+ size_t insert_surplus_ = 0;
+
+ RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderDelayBufferImpl);
+};
+
+RenderDelayBufferImpl::RenderDelayBufferImpl(size_t size_blocks,
+ size_t num_bands,
+ size_t max_api_jitter_blocks)
+ : max_api_jitter_blocks_(max_api_jitter_blocks),
+ buffer_(size_blocks + max_api_jitter_blocks_,
+ std::vector<std::vector<float>>(
+ num_bands,
+ std::vector<float>(kBlockSize, 0.f))) {}
+
+RenderDelayBufferImpl::~RenderDelayBufferImpl() = default;
+
+bool RenderDelayBufferImpl::Insert(std::vector<std::vector<float>>* block) {
+ RTC_DCHECK_EQ(block->size(), buffer_[0].size());
+ RTC_DCHECK_EQ((*block)[0].size(), buffer_[0][0].size());
+
+ if (insert_surplus_ == max_api_jitter_blocks_) {
+ return false;
+ }
+ last_insert_index_ = (last_insert_index_ + 1) % buffer_.size();
+ block->swap(buffer_[last_insert_index_]);
+
+ ++insert_surplus_;
+
+ return true;
+}
+
+const std::vector<std::vector<float>>& RenderDelayBufferImpl::GetNext() {
+ RTC_DCHECK(IsBlockAvailable());
+ const size_t extract_index_ =
+ (last_insert_index_ - delay_ - insert_surplus_ + 1 + buffer_.size()) %
+ buffer_.size();
+ RTC_DCHECK_LE(0, extract_index_);
+ RTC_DCHECK_GT(buffer_.size(), extract_index_);
+
+ RTC_DCHECK_LT(0, insert_surplus_);
+ --insert_surplus_;
+
+ return buffer_[extract_index_];
+}
+
+void RenderDelayBufferImpl::SetDelay(size_t delay) {
+ RTC_DCHECK_GE(MaxDelay(), delay);
+ delay_ = delay;
+}
+
+} // namespace
+
+RenderDelayBuffer* RenderDelayBuffer::Create(size_t size_blocks,
+ size_t num_bands,
+ size_t max_api_jitter_blocks) {
+ return new RenderDelayBufferImpl(size_blocks, num_bands,
+ max_api_jitter_blocks);
+}
+
+} // namespace webrtc

Powered by Google App Engine
This is Rietveld 408576698