OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
12 | 12 |
13 #include <limits> | 13 #include <limits> |
14 #include <memory> | 14 #include <memory> |
15 | 15 |
16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 16 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
| 17 #include "webrtc/test/gmock.h" |
17 #include "webrtc/test/gtest.h" | 18 #include "webrtc/test/gtest.h" |
18 | 19 |
19 using webrtc::rtcp::TransportFeedback; | |
20 | |
21 namespace webrtc { | 20 namespace webrtc { |
22 namespace { | 21 namespace { |
23 | 22 |
| 23 using ::testing::ElementsAreArray; |
| 24 using rtcp::TransportFeedback; |
| 25 |
24 static const int kHeaderSize = 20; | 26 static const int kHeaderSize = 20; |
25 static const int kStatusChunkSize = 2; | 27 static const int kStatusChunkSize = 2; |
26 static const int kSmallDeltaSize = 1; | 28 static const int kSmallDeltaSize = 1; |
27 static const int kLargeDeltaSize = 2; | 29 static const int kLargeDeltaSize = 2; |
28 | 30 |
29 static const int64_t kDeltaLimit = 0xFF * TransportFeedback::kDeltaScaleFactor; | 31 static const int64_t kDeltaLimit = 0xFF * TransportFeedback::kDeltaScaleFactor; |
30 | 32 |
31 class FeedbackTester { | 33 class FeedbackTester { |
32 public: | 34 public: |
33 FeedbackTester() | 35 FeedbackTester() |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 | 89 |
88 private: | 90 private: |
89 void VerifyInternal() { | 91 void VerifyInternal() { |
90 if (expected_size_ != kAnySize) { | 92 if (expected_size_ != kAnySize) { |
91 // Round up to whole 32-bit words. | 93 // Round up to whole 32-bit words. |
92 size_t expected_size_words = (expected_size_ + 3) / 4; | 94 size_t expected_size_words = (expected_size_ + 3) / 4; |
93 size_t expected_size_bytes = expected_size_words * 4; | 95 size_t expected_size_bytes = expected_size_words * 4; |
94 EXPECT_EQ(expected_size_bytes, serialized_.size()); | 96 EXPECT_EQ(expected_size_bytes, serialized_.size()); |
95 } | 97 } |
96 | 98 |
97 std::vector<TransportFeedback::StatusSymbol> symbols = | 99 std::vector<uint16_t> actual_seq_nos; |
98 feedback_->GetStatusVector(); | 100 std::vector<int64_t> actual_deltas_us; |
99 uint16_t seq = feedback_->GetBaseSequence(); | 101 for (const auto& packet : feedback_->GetReceivedPackets()) { |
100 auto seq_it = expected_seq_.begin(); | 102 actual_seq_nos.push_back(packet.sequence_number()); |
101 for (TransportFeedback::StatusSymbol symbol : symbols) { | 103 actual_deltas_us.push_back(packet.delta_us()); |
102 bool received = | |
103 (symbol == TransportFeedback::StatusSymbol::kReceivedSmallDelta || | |
104 symbol == TransportFeedback::StatusSymbol::kReceivedLargeDelta); | |
105 if (seq_it != expected_seq_.end()) { | |
106 if (seq == *seq_it) { | |
107 ASSERT_NE(expected_seq_.end(), seq_it); | |
108 ASSERT_TRUE(received) << "Expected received packet @ " << seq; | |
109 ++seq_it; | |
110 } else { | |
111 ASSERT_FALSE(received) << "Did not expect received packet @ " << seq; | |
112 } | |
113 } | |
114 ++seq; | |
115 } | 104 } |
116 ASSERT_EQ(expected_seq_.end(), seq_it); | 105 EXPECT_THAT(actual_seq_nos, ElementsAreArray(expected_seq_)); |
117 | 106 EXPECT_THAT(actual_deltas_us, ElementsAreArray(expected_deltas_)); |
118 std::vector<int64_t> deltas = feedback_->GetReceiveDeltasUs(); | |
119 ASSERT_EQ(expected_deltas_.size(), deltas.size()); | |
120 for (size_t i = 0; i < expected_deltas_.size(); ++i) | |
121 EXPECT_EQ(expected_deltas_[i], deltas[i]) << "Delta mismatch @ " << i; | |
122 } | 107 } |
123 | 108 |
124 void GenerateDeltas(const uint16_t seq[], | 109 void GenerateDeltas(const uint16_t seq[], |
125 const size_t length, | 110 const size_t length, |
126 int64_t* deltas) { | 111 int64_t* deltas) { |
127 uint16_t last_seq = seq[0]; | 112 uint16_t last_seq = seq[0]; |
128 int64_t offset = 0; | 113 int64_t offset = 0; |
129 | 114 |
130 for (size_t i = 0; i < length; ++i) { | 115 for (size_t i = 0; i < length; ++i) { |
131 if (seq[i] < last_seq) | 116 if (seq[i] < last_seq) |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 TransportFeedback feedback; | 322 TransportFeedback feedback; |
338 feedback.SetBase(0, 0); | 323 feedback.SetBase(0, 0); |
339 | 324 |
340 const int kSamples = 100; | 325 const int kSamples = 100; |
341 const int64_t kTooSmallDelta = TransportFeedback::kDeltaScaleFactor / 3; | 326 const int64_t kTooSmallDelta = TransportFeedback::kDeltaScaleFactor / 3; |
342 | 327 |
343 for (int i = 0; i < kSamples; ++i) | 328 for (int i = 0; i < kSamples; ++i) |
344 feedback.AddReceivedPacket(i, i * kTooSmallDelta); | 329 feedback.AddReceivedPacket(i, i * kTooSmallDelta); |
345 | 330 |
346 feedback.Build(); | 331 feedback.Build(); |
347 std::vector<int64_t> deltas = feedback.GetReceiveDeltasUs(); | |
348 | 332 |
349 int64_t accumulated_delta = 0; | 333 int64_t accumulated_delta = 0; |
350 int num_samples = 0; | 334 int num_samples = 0; |
351 for (int64_t delta : deltas) { | 335 for (const auto& packet : feedback.GetReceivedPackets()) { |
352 accumulated_delta += delta; | 336 accumulated_delta += packet.delta_us(); |
353 int64_t expected_time = num_samples * kTooSmallDelta; | 337 int64_t expected_time = num_samples * kTooSmallDelta; |
354 ++num_samples; | 338 ++num_samples; |
355 | 339 |
356 EXPECT_NEAR(expected_time, accumulated_delta, | 340 EXPECT_NEAR(expected_time, accumulated_delta, |
357 TransportFeedback::kDeltaScaleFactor / 2); | 341 TransportFeedback::kDeltaScaleFactor / 2); |
358 } | 342 } |
359 } | 343 } |
360 | 344 |
361 TEST(RtcpPacketTest, TransportFeedback_Limits) { | 345 TEST(RtcpPacketTest, TransportFeedback_Limits) { |
362 // Sequence number wrap above 0x8000. | 346 // Sequence number wrap above 0x8000. |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 rtc::Buffer serialized_packet = feedback.Build(); | 461 rtc::Buffer serialized_packet = feedback.Build(); |
478 std::unique_ptr<TransportFeedback> deserialized_packet = | 462 std::unique_ptr<TransportFeedback> deserialized_packet = |
479 TransportFeedback::ParseFrom(serialized_packet.data(), | 463 TransportFeedback::ParseFrom(serialized_packet.data(), |
480 serialized_packet.size()); | 464 serialized_packet.size()); |
481 EXPECT_TRUE(deserialized_packet.get() != nullptr); | 465 EXPECT_TRUE(deserialized_packet.get() != nullptr); |
482 } | 466 } |
483 } | 467 } |
484 | 468 |
485 } // namespace | 469 } // namespace |
486 } // namespace webrtc | 470 } // namespace webrtc |
OLD | NEW |