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

Side by Side Diff: webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter_unittest.cc

Issue 1329083005: Add TransportFeedback adapter, adapting remote feedback to bwe estiamtor (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Bad merge, test issue Created 5 years, 3 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) 2015 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 <limits>
12 #include <vector>
13
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 #include "webrtc/base/checks.h"
18 #include "webrtc/base/scoped_ptr.h"
19 #include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitra te_estimator.h"
20 #include "webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h"
21 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
22 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
23 #include "webrtc/modules/utility/interface/mock/mock_process_thread.h"
24 #include "webrtc/system_wrappers/interface/clock.h"
25
26 using ::testing::_;
27 using ::testing::Invoke;
28
29 namespace webrtc {
30 namespace test {
31
32 class TransportFeedbackAdapterTest : public ::testing::Test {
33 public:
34 TransportFeedbackAdapterTest()
35 : clock_(0),
36 bitrate_estimator_(nullptr),
37 receiver_estimated_bitrate_(0) {}
38
39 virtual ~TransportFeedbackAdapterTest() {}
40
41 virtual void SetUp() {
42 adapter_.reset(new TransportFeedbackAdapter(
43 new RtcpBandwidthObserverAdapter(this), &clock_, &process_thread_));
44
45 bitrate_estimator_ = new MockRemoteBitrateEstimator();
46 EXPECT_CALL(process_thread_, RegisterModule(bitrate_estimator_)).Times(1);
47 adapter_->SetBitrateEstimator(bitrate_estimator_);
48 }
49
50 virtual void TearDown() {
51 EXPECT_CALL(process_thread_, DeRegisterModule(bitrate_estimator_)).Times(1);
52 adapter_.reset();
53 }
54
55 protected:
56 // Proxy class used since TransportFeedbackAdapter will own the instance
57 // passed at construction.
58 class RtcpBandwidthObserverAdapter : public RtcpBandwidthObserver {
59 public:
60 explicit RtcpBandwidthObserverAdapter(TransportFeedbackAdapterTest* owner)
61 : owner_(owner) {}
62
63 void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
64 owner_->receiver_estimated_bitrate_ = bitrate;
65 }
66
67 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
68 int64_t rtt,
69 int64_t now_ms) override {
70 RTC_NOTREACHED();
71 }
72
73 TransportFeedbackAdapterTest* const owner_;
74 };
75
76 void OnReceivedEstimatedBitrate(uint32_t bitrate) {}
77
78 void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
79 int64_t rtt,
80 int64_t now_ms) {}
81
82 void ComparePacketVectors(const std::vector<PacketInfo>& truth,
83 const std::vector<PacketInfo>& input) {
84 ASSERT_EQ(truth.size(), input.size());
85 size_t len = truth.size();
86 // truth contains the input data for the test, and input is what will be
87 // sent to the bandwidth estimator. truth.arrival_tims_ms is used to
88 // populate the transport feedback messages. As these times may be changed
89 // (because of resolution limits in the packets, and because of the time
90 // base adjustment performed by the TransportFeedbackAdapter at the first
91 // packet, the truth[x].arrival_time and input[x].arrival_time may not be
92 // equal. However, the difference must be the same for all x.
93 int64_t arrival_time_delta =
94 truth[0].arrival_time_ms - input[0].arrival_time_ms;
95 for (size_t i = 0; i < len; ++i) {
96 EXPECT_EQ(truth[i].arrival_time_ms,
97 input[i].arrival_time_ms + arrival_time_delta);
98 EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms);
99 EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number);
100 EXPECT_EQ(truth[i].payload_size, input[i].payload_size);
101 EXPECT_EQ(truth[i].was_paced, input[i].was_paced);
102 }
103 }
104
105 // Utility method, to reset arrival_time_ms before adding send time.
106 void OnPacketSent(PacketInfo info) {
107 info.arrival_time_ms = 0;
108 adapter_->OnPacketSent(info);
109 }
110
111 SimulatedClock clock_;
112 MockProcessThread process_thread_;
113 MockRemoteBitrateEstimator* bitrate_estimator_;
114 rtc::scoped_ptr<TransportFeedbackAdapter> adapter_;
115
116 uint32_t receiver_estimated_bitrate_;
117 };
118
119 TEST_F(TransportFeedbackAdapterTest, AdaptsFeedbackAndPopulatesSendTimes) {
120 std::vector<PacketInfo> packets;
121 packets.push_back(PacketInfo(100, 200, 0, 1500, true));
122 packets.push_back(PacketInfo(110, 210, 1, 1500, true));
123 packets.push_back(PacketInfo(120, 220, 2, 1500, true));
124 packets.push_back(PacketInfo(130, 230, 3, 1500, true));
125 packets.push_back(PacketInfo(140, 240, 4, 1500, true));
126
127 for (const PacketInfo& packet : packets)
128 OnPacketSent(packet);
129
130 rtcp::TransportFeedback feedback;
131 feedback.WithBase(packets[0].sequence_number,
132 packets[0].arrival_time_ms * 1000);
133
134 for (const PacketInfo& packet : packets) {
135 EXPECT_TRUE(feedback.WithReceivedPacket(packet.sequence_number,
136 packet.arrival_time_ms * 1000));
137 }
138
139 feedback.Build();
140
141 EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_))
142 .Times(1)
143 .WillOnce(Invoke(
144 [packets, this](const std::vector<PacketInfo>& feedback_vector) {
145 ComparePacketVectors(packets, feedback_vector);
146 }));
147 adapter_->OnTransportFeedback(feedback);
148 }
149
150 TEST_F(TransportFeedbackAdapterTest, HandlesDroppedPackets) {
151 std::vector<PacketInfo> packets;
152 packets.push_back(PacketInfo(100, 200, 0, 1500, true));
153 packets.push_back(PacketInfo(110, 210, 1, 1500, true));
154 packets.push_back(PacketInfo(120, 220, 2, 1500, true));
155 packets.push_back(PacketInfo(130, 230, 3, 1500, true));
156 packets.push_back(PacketInfo(140, 240, 4, 1500, true));
157
158 const uint16_t kSendSideDropBefore = 1;
159 const uint16_t kReceiveSideDropAfter = 3;
160
161 for (const PacketInfo& packet : packets) {
162 if (packet.sequence_number >= kSendSideDropBefore)
163 OnPacketSent(packet);
164 }
165
166 rtcp::TransportFeedback feedback;
167 feedback.WithBase(packets[0].sequence_number,
168 packets[0].arrival_time_ms * 1000);
169
170 for (const PacketInfo& packet : packets) {
171 if (packet.sequence_number <= kReceiveSideDropAfter) {
172 EXPECT_TRUE(feedback.WithReceivedPacket(packet.sequence_number,
173 packet.arrival_time_ms * 1000));
174 }
175 }
176
177 feedback.Build();
178
179 std::vector<PacketInfo> expected_packets(
180 packets.begin() + kSendSideDropBefore,
181 packets.begin() + kReceiveSideDropAfter + 1);
182
183 EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_))
184 .Times(1)
185 .WillOnce(Invoke([expected_packets,
186 this](const std::vector<PacketInfo>& feedback_vector) {
187 ComparePacketVectors(expected_packets, feedback_vector);
188 }));
189 adapter_->OnTransportFeedback(feedback);
190 }
191
192 TEST_F(TransportFeedbackAdapterTest, SendTimeWrapsBothWays) {
193 int64_t kHighArrivalTimeMs = rtcp::TransportFeedback::kDeltaScaleFactor *
194 static_cast<int64_t>(1 << 8) *
195 static_cast<int64_t>((1 << 23) - 1) / 1000;
196 std::vector<PacketInfo> packets;
197 packets.push_back(PacketInfo(kHighArrivalTimeMs - 64, 200, 0, 1500, true));
198 packets.push_back(PacketInfo(kHighArrivalTimeMs + 64, 210, 1, 1500, true));
199 packets.push_back(PacketInfo(kHighArrivalTimeMs, 220, 2, 1500, true));
200
201 for (const PacketInfo& packet : packets)
202 OnPacketSent(packet);
203
204 for (size_t i = 0; i < packets.size(); ++i) {
205 rtc::scoped_ptr<rtcp::TransportFeedback> feedback(
206 new rtcp::TransportFeedback());
207 feedback->WithBase(packets[i].sequence_number,
208 packets[i].arrival_time_ms * 1000);
209
210 EXPECT_TRUE(feedback->WithReceivedPacket(
211 packets[i].sequence_number, packets[i].arrival_time_ms * 1000));
212
213 rtc::scoped_ptr<rtcp::RawPacket> raw_packet = feedback->Build();
214 feedback = rtcp::TransportFeedback::ParseFrom(raw_packet->Buffer(),
215 raw_packet->Length());
216
217 std::vector<PacketInfo> expected_packets;
218 expected_packets.push_back(packets[i]);
219
220 EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_))
221 .Times(1)
222 .WillOnce(Invoke([expected_packets, this](
223 const std::vector<PacketInfo>& feedback_vector) {
224 ComparePacketVectors(expected_packets, feedback_vector);
225 }));
226 adapter_->OnTransportFeedback(*feedback.get());
227 }
228 }
229
230 TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) {
231 std::vector<PacketInfo> sent_packets;
232 const int64_t kSmallDeltaUs =
233 rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1);
234 const int64_t kLargePositiveDeltaUs =
235 rtcp::TransportFeedback::kDeltaScaleFactor *
236 std::numeric_limits<int16_t>::max();
237 const int64_t kLargeNegativeDeltaUs =
238 rtcp::TransportFeedback::kDeltaScaleFactor *
239 std::numeric_limits<int16_t>::min();
240
241 PacketInfo info(100, 200, 0, 1500, true);
242 sent_packets.push_back(info);
243
244 info.send_time_ms += kSmallDeltaUs / 1000;
245 info.arrival_time_ms += kSmallDeltaUs / 1000;
246 ++info.sequence_number;
247 sent_packets.push_back(info);
248
249 info.send_time_ms += kLargePositiveDeltaUs / 1000;
250 info.arrival_time_ms += kLargePositiveDeltaUs / 1000;
251 ++info.sequence_number;
252 sent_packets.push_back(info);
253
254 info.send_time_ms += kLargeNegativeDeltaUs / 1000;
255 info.arrival_time_ms += kLargeNegativeDeltaUs / 1000;
256 ++info.sequence_number;
257 sent_packets.push_back(info);
258
259 // Too large, delta - will need two feedback messages.
260 info.send_time_ms += (kLargePositiveDeltaUs + 1000) / 1000;
261 info.arrival_time_ms += (kLargePositiveDeltaUs + 1000) / 1000;
262 ++info.sequence_number;
263
264 // Packets will be added to send history.
265 for (const PacketInfo& packet : sent_packets)
266 OnPacketSent(packet);
267 OnPacketSent(info);
268
269 // Create expected feedback and send into adapter.
270 rtc::scoped_ptr<rtcp::TransportFeedback> feedback(
271 new rtcp::TransportFeedback());
272 feedback->WithBase(sent_packets[0].sequence_number,
273 sent_packets[0].arrival_time_ms * 1000);
274
275 for (const PacketInfo& packet : sent_packets) {
276 EXPECT_TRUE(feedback->WithReceivedPacket(packet.sequence_number,
277 packet.arrival_time_ms * 1000));
278 }
279 EXPECT_FALSE(feedback->WithReceivedPacket(info.sequence_number,
280 info.arrival_time_ms * 1000));
281
282 rtc::scoped_ptr<rtcp::RawPacket> raw_packet = feedback->Build();
283 feedback = rtcp::TransportFeedback::ParseFrom(raw_packet->Buffer(),
284 raw_packet->Length());
285
286 std::vector<PacketInfo> received_feedback;
287
288 EXPECT_TRUE(feedback.get() != nullptr);
289 EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_))
290 .Times(1)
291 .WillOnce(Invoke([sent_packets, &received_feedback](
292 const std::vector<PacketInfo>& feedback_vector) {
293 EXPECT_EQ(sent_packets.size(), feedback_vector.size());
294 received_feedback = feedback_vector;
295 }));
296 adapter_->OnTransportFeedback(*feedback.get());
297
298 // Create a new feedback message and add the trailing item.
299 feedback.reset(new rtcp::TransportFeedback());
300 feedback->WithBase(info.sequence_number, info.arrival_time_ms * 1000);
301 EXPECT_TRUE(feedback->WithReceivedPacket(info.sequence_number,
302 info.arrival_time_ms * 1000));
303 raw_packet = feedback->Build();
304 feedback = rtcp::TransportFeedback::ParseFrom(raw_packet->Buffer(),
305 raw_packet->Length());
306
307 EXPECT_TRUE(feedback.get() != nullptr);
308 EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_))
309 .Times(1)
310 .WillOnce(Invoke(
311 [&received_feedback](const std::vector<PacketInfo>& feedback_vector) {
312 EXPECT_EQ(1u, feedback_vector.size());
313 received_feedback.push_back(feedback_vector[0]);
314 }));
315 adapter_->OnTransportFeedback(*feedback.get());
316
317 sent_packets.push_back(info);
318
319 ComparePacketVectors(sent_packets, received_feedback);
320 }
321
322 } // namespace test
323 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698