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