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 | 15 |
15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
16 | 17 |
17 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 18 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
18 | 19 |
19 using webrtc::rtcp::TransportFeedback; | 20 using webrtc::rtcp::TransportFeedback; |
20 | 21 |
21 namespace webrtc { | 22 namespace webrtc { |
22 namespace { | 23 namespace { |
23 | 24 |
(...skipping 12 matching lines...) Expand all Loading... |
36 | 37 |
37 void WithExpectedSize(size_t expected_size) { | 38 void WithExpectedSize(size_t expected_size) { |
38 expected_size_ = expected_size; | 39 expected_size_ = expected_size; |
39 } | 40 } |
40 | 41 |
41 void WithDefaultDelta(int64_t delta) { default_delta_ = delta; } | 42 void WithDefaultDelta(int64_t delta) { default_delta_ = delta; } |
42 | 43 |
43 void WithInput(const uint16_t received_seq[], | 44 void WithInput(const uint16_t received_seq[], |
44 const int64_t received_ts[], | 45 const int64_t received_ts[], |
45 uint16_t length) { | 46 uint16_t length) { |
46 rtc::scoped_ptr<int64_t[]> temp_deltas; | 47 std::unique_ptr<int64_t[]> temp_deltas; |
47 if (received_ts == nullptr) { | 48 if (received_ts == nullptr) { |
48 temp_deltas.reset(new int64_t[length]); | 49 temp_deltas.reset(new int64_t[length]); |
49 GenerateDeltas(received_seq, length, temp_deltas.get()); | 50 GenerateDeltas(received_seq, length, temp_deltas.get()); |
50 received_ts = temp_deltas.get(); | 51 received_ts = temp_deltas.get(); |
51 } | 52 } |
52 | 53 |
53 expected_seq_.clear(); | 54 expected_seq_.clear(); |
54 expected_deltas_.clear(); | 55 expected_deltas_.clear(); |
55 feedback_.reset(new TransportFeedback()); | 56 feedback_.reset(new TransportFeedback()); |
56 | 57 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 last_seq = seq[i]; | 130 last_seq = seq[i]; |
130 | 131 |
131 deltas[i] = offset + (last_seq * default_delta_); | 132 deltas[i] = offset + (last_seq * default_delta_); |
132 } | 133 } |
133 } | 134 } |
134 | 135 |
135 std::vector<uint16_t> expected_seq_; | 136 std::vector<uint16_t> expected_seq_; |
136 std::vector<int64_t> expected_deltas_; | 137 std::vector<int64_t> expected_deltas_; |
137 size_t expected_size_; | 138 size_t expected_size_; |
138 int64_t default_delta_; | 139 int64_t default_delta_; |
139 rtc::scoped_ptr<TransportFeedback> feedback_; | 140 std::unique_ptr<TransportFeedback> feedback_; |
140 rtc::Buffer serialized_; | 141 rtc::Buffer serialized_; |
141 }; | 142 }; |
142 | 143 |
143 TEST(RtcpPacketTest, TransportFeedback_OneBitVector) { | 144 TEST(RtcpPacketTest, TransportFeedback_OneBitVector) { |
144 const uint16_t kReceived[] = {1, 2, 7, 8, 9, 10, 13}; | 145 const uint16_t kReceived[] = {1, 2, 7, 8, 9, 10, 13}; |
145 const size_t kLength = sizeof(kReceived) / sizeof(uint16_t); | 146 const size_t kLength = sizeof(kReceived) / sizeof(uint16_t); |
146 const size_t kExpectedSizeBytes = | 147 const size_t kExpectedSizeBytes = |
147 kHeaderSize + kStatusChunkSize + (kLength * kSmallDeltaSize); | 148 kHeaderSize + kStatusChunkSize + (kLength * kSmallDeltaSize); |
148 | 149 |
149 FeedbackTester test; | 150 FeedbackTester test; |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 int64_t expected_time = num_samples * kTooSmallDelta; | 350 int64_t expected_time = num_samples * kTooSmallDelta; |
350 ++num_samples; | 351 ++num_samples; |
351 | 352 |
352 EXPECT_NEAR(expected_time, accumulated_delta, | 353 EXPECT_NEAR(expected_time, accumulated_delta, |
353 TransportFeedback::kDeltaScaleFactor / 2); | 354 TransportFeedback::kDeltaScaleFactor / 2); |
354 } | 355 } |
355 } | 356 } |
356 | 357 |
357 TEST(RtcpPacketTest, TransportFeedback_Limits) { | 358 TEST(RtcpPacketTest, TransportFeedback_Limits) { |
358 // Sequence number wrap above 0x8000. | 359 // Sequence number wrap above 0x8000. |
359 rtc::scoped_ptr<TransportFeedback> packet(new TransportFeedback()); | 360 std::unique_ptr<TransportFeedback> packet(new TransportFeedback()); |
360 packet->WithBase(0, 0); | 361 packet->WithBase(0, 0); |
361 EXPECT_TRUE(packet->WithReceivedPacket(0x8000, 1000)); | 362 EXPECT_TRUE(packet->WithReceivedPacket(0x8000, 1000)); |
362 | 363 |
363 packet.reset(new TransportFeedback()); | 364 packet.reset(new TransportFeedback()); |
364 packet->WithBase(0, 0); | 365 packet->WithBase(0, 0); |
365 EXPECT_FALSE(packet->WithReceivedPacket(0x8000 + 1, 1000)); | 366 EXPECT_FALSE(packet->WithReceivedPacket(0x8000 + 1, 1000)); |
366 | 367 |
367 // Packet status count max 0xFFFF. | 368 // Packet status count max 0xFFFF. |
368 packet.reset(new TransportFeedback()); | 369 packet.reset(new TransportFeedback()); |
369 packet->WithBase(0, 0); | 370 packet->WithBase(0, 0); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 uint8_t mod_buffer[kExpectedSizeWithPadding]; | 440 uint8_t mod_buffer[kExpectedSizeWithPadding]; |
440 memcpy(mod_buffer, packet.data(), kExpectedSizeWords * 4); | 441 memcpy(mod_buffer, packet.data(), kExpectedSizeWords * 4); |
441 memset(&mod_buffer[kExpectedSizeWords * 4], 0, kPaddingBytes - 1); | 442 memset(&mod_buffer[kExpectedSizeWords * 4], 0, kPaddingBytes - 1); |
442 mod_buffer[kExpectedSizeWithPadding - 1] = kPaddingBytes; | 443 mod_buffer[kExpectedSizeWithPadding - 1] = kPaddingBytes; |
443 const uint8_t padding_flag = 1 << 5; | 444 const uint8_t padding_flag = 1 << 5; |
444 mod_buffer[0] |= padding_flag; | 445 mod_buffer[0] |= padding_flag; |
445 ByteWriter<uint16_t>::WriteBigEndian( | 446 ByteWriter<uint16_t>::WriteBigEndian( |
446 &mod_buffer[2], ByteReader<uint16_t>::ReadBigEndian(&mod_buffer[2]) + | 447 &mod_buffer[2], ByteReader<uint16_t>::ReadBigEndian(&mod_buffer[2]) + |
447 ((kPaddingBytes + 3) / 4)); | 448 ((kPaddingBytes + 3) / 4)); |
448 | 449 |
449 rtc::scoped_ptr<TransportFeedback> parsed_packet( | 450 std::unique_ptr<TransportFeedback> parsed_packet( |
450 TransportFeedback::ParseFrom(mod_buffer, kExpectedSizeWithPadding)); | 451 TransportFeedback::ParseFrom(mod_buffer, kExpectedSizeWithPadding)); |
451 ASSERT_TRUE(parsed_packet.get() != nullptr); | 452 ASSERT_TRUE(parsed_packet.get() != nullptr); |
452 EXPECT_EQ(kExpectedSizeWords * 4, packet.size()); // Padding not included. | 453 EXPECT_EQ(kExpectedSizeWords * 4, packet.size()); // Padding not included. |
453 } | 454 } |
454 | 455 |
455 TEST(RtcpPacketTest, TransportFeedback_CorrectlySplitsVectorChunks) { | 456 TEST(RtcpPacketTest, TransportFeedback_CorrectlySplitsVectorChunks) { |
456 const int kOneBitVectorCapacity = 14; | 457 const int kOneBitVectorCapacity = 14; |
457 const int64_t kLargeTimeDelta = | 458 const int64_t kLargeTimeDelta = |
458 TransportFeedback::kDeltaScaleFactor * (1 << 8); | 459 TransportFeedback::kDeltaScaleFactor * (1 << 8); |
459 | 460 |
460 // Test that a number of small deltas followed by a large delta results in a | 461 // Test that a number of small deltas followed by a large delta results in a |
461 // correct split into multiple chunks, as needed. | 462 // correct split into multiple chunks, as needed. |
462 | 463 |
463 for (int deltas = 0; deltas <= kOneBitVectorCapacity + 1; ++deltas) { | 464 for (int deltas = 0; deltas <= kOneBitVectorCapacity + 1; ++deltas) { |
464 TransportFeedback feedback; | 465 TransportFeedback feedback; |
465 feedback.WithBase(0, 0); | 466 feedback.WithBase(0, 0); |
466 for (int i = 0; i < deltas; ++i) | 467 for (int i = 0; i < deltas; ++i) |
467 feedback.WithReceivedPacket(i, i * 1000); | 468 feedback.WithReceivedPacket(i, i * 1000); |
468 feedback.WithReceivedPacket(deltas, deltas * 1000 + kLargeTimeDelta); | 469 feedback.WithReceivedPacket(deltas, deltas * 1000 + kLargeTimeDelta); |
469 | 470 |
470 rtc::Buffer serialized_packet = feedback.Build(); | 471 rtc::Buffer serialized_packet = feedback.Build(); |
471 rtc::scoped_ptr<TransportFeedback> deserialized_packet = | 472 std::unique_ptr<TransportFeedback> deserialized_packet = |
472 TransportFeedback::ParseFrom(serialized_packet.data(), | 473 TransportFeedback::ParseFrom(serialized_packet.data(), |
473 serialized_packet.size()); | 474 serialized_packet.size()); |
474 EXPECT_TRUE(deserialized_packet.get() != nullptr); | 475 EXPECT_TRUE(deserialized_packet.get() != nullptr); |
475 } | 476 } |
476 } | 477 } |
477 | 478 |
478 } // namespace | 479 } // namespace |
479 } // namespace webrtc | 480 } // namespace webrtc |
OLD | NEW |