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

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback_unittest.cc

Issue 2633923003: Add rtcp::TransportFeedback::GetReceivedPackets() (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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698