| 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 |