OLD | NEW |
---|---|
(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 | |
OLD | NEW |