Chromium Code Reviews

Side by Side 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, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
12
13 #include <string.h>
14 #include <algorithm>
15
16 #include "webrtc/base/checks.h"
17 #include "webrtc/base/constructormagic.h"
18 #include "webrtc/modules/audio_processing/aec3/aec3_constants.h"
19 #include "webrtc/system_wrappers/include/logging.h"
20
21 namespace webrtc {
22 namespace {
23
24 class RenderDelayBufferImpl final : public RenderDelayBuffer {
25 public:
26 RenderDelayBufferImpl(size_t size_blocks,
27 size_t num_bands,
28 size_t max_api_jitter_blocks);
29 ~RenderDelayBufferImpl() override;
30
31 bool Insert(std::vector<std::vector<float>>* block) override;
32 const std::vector<std::vector<float>>& GetNext() override;
33 void SetDelay(size_t delay) override;
34 size_t Delay() const override { return delay_; }
35 size_t MaxDelay() const override {
36 return buffer_.size() - max_api_jitter_blocks_;
37 }
38 bool IsBlockAvailable() const override { return insert_surplus_ > 0; }
39 size_t MaxApiJitter() const override { return max_api_jitter_blocks_; }
40
41 private:
42 const size_t max_api_jitter_blocks_;
43 std::vector<std::vector<std::vector<float>>> buffer_;
44 size_t last_insert_index_ = 0;
45 size_t delay_ = 0;
46 size_t insert_surplus_ = 0;
47
48 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderDelayBufferImpl);
49 };
50
51 RenderDelayBufferImpl::RenderDelayBufferImpl(size_t size_blocks,
52 size_t num_bands,
53 size_t max_api_jitter_blocks)
54 : max_api_jitter_blocks_(max_api_jitter_blocks),
55 buffer_(size_blocks + max_api_jitter_blocks_,
56 std::vector<std::vector<float>>(
57 num_bands,
58 std::vector<float>(kBlockSize, 0.f))) {}
59
60 RenderDelayBufferImpl::~RenderDelayBufferImpl() = default;
61
62 bool RenderDelayBufferImpl::Insert(std::vector<std::vector<float>>* block) {
63 RTC_DCHECK_EQ(block->size(), buffer_[0].size());
64 RTC_DCHECK_EQ((*block)[0].size(), buffer_[0][0].size());
65
66 if (insert_surplus_ == max_api_jitter_blocks_) {
67 return false;
68 }
69 last_insert_index_ = (last_insert_index_ + 1) % buffer_.size();
70 block->swap(buffer_[last_insert_index_]);
71
72 ++insert_surplus_;
73
74 return true;
75 }
76
77 const std::vector<std::vector<float>>& RenderDelayBufferImpl::GetNext() {
78 RTC_DCHECK(IsBlockAvailable());
79 const size_t extract_index_ =
80 (last_insert_index_ - delay_ - insert_surplus_ + 1 + buffer_.size()) %
81 buffer_.size();
82 RTC_DCHECK_LE(0, extract_index_);
83 RTC_DCHECK_GT(buffer_.size(), extract_index_);
84
85 RTC_DCHECK_LT(0, insert_surplus_);
86 --insert_surplus_;
87
88 return buffer_[extract_index_];
89 }
90
91 void RenderDelayBufferImpl::SetDelay(size_t delay) {
92 RTC_DCHECK_GE(MaxDelay(), delay);
93 delay_ = delay;
94 }
95
96 } // namespace
97
98 RenderDelayBuffer* RenderDelayBuffer::Create(size_t size_blocks,
99 size_t num_bands,
100 size_t max_api_jitter_blocks) {
101 return new RenderDelayBufferImpl(size_blocks, num_bands,
102 max_api_jitter_blocks);
103 }
104
105 } // namespace webrtc
OLDNEW

Powered by Google App Engine