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

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: 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 unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
hlundin-webrtc 2017/01/18 13:08:49 2017
peah-webrtc 2017/01/19 15:33:06 Done.
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_;
hlundin-webrtc 2017/01/18 13:08:50 <inception meme> A vector of vectors of vectors...
peah-webrtc 2017/01/19 15:33:06 :-D Yes, it is almost like a 5D world.
44 int last_insert_index_ = 0;
hlundin-webrtc 2017/01/18 13:08:50 Shouldn't this be size_t?
peah-webrtc 2017/01/19 15:33:05 Done.
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());
hlundin-webrtc 2017/01/18 13:08:49 I gather it is the caller's responsibility to make
peah-webrtc 2017/01/19 15:33:05 Done.
79 const int extract_index_ =
hlundin-webrtc 2017/01/18 13:08:49 size_t?
peah-webrtc 2017/01/19 15:33:05 Done.
80 (last_insert_index_ - delay_ - insert_surplus_ + 1 + buffer_.size()) %
81 buffer_.size();
hlundin-webrtc 2017/01/18 13:08:49 DCHECK that extract_index ends up in the valid ran
peah-webrtc 2017/01/19 15:33:05 Done.
82 RTC_DCHECK_LT(0, insert_surplus_);
83 --insert_surplus_;
84 return buffer_[extract_index_];
85 }
86
87 void RenderDelayBufferImpl::SetDelay(size_t delay) {
88 RTC_DCHECK_GE(MaxDelay(), delay);
hlundin-webrtc 2017/01/18 13:08:49 Also the caller's responsibility. Document in h fi
peah-webrtc 2017/01/19 15:33:05 Done.
89 delay_ = delay;
90 }
91
92 } // namespace
93
94 RenderDelayBuffer* RenderDelayBuffer::Create(size_t size_blocks,
95 size_t num_bands,
96 size_t max_api_jitter_blocks) {
97 return new RenderDelayBufferImpl(size_blocks, num_bands,
98 max_api_jitter_blocks);
99 }
100
101 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698