| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/cast/net/rtp/packet_storage.h" | 5 #include "media/cast/net/rtp/packet_storage.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> |
| 9 #include <vector> | 10 #include <vector> |
| 10 | 11 |
| 11 #include "base/test/simple_test_tick_clock.h" | 12 #include "base/test/simple_test_tick_clock.h" |
| 12 #include "base/time/time.h" | 13 #include "base/time/time.h" |
| 14 #include "media/cast/cast_defines.h" |
| 13 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
| 14 | 16 |
| 15 namespace media { | 17 namespace media { |
| 16 namespace cast { | 18 namespace cast { |
| 17 | 19 |
| 18 static size_t kStoredFrames = 10; | 20 static const size_t kStoredFrames = 10; |
| 19 | 21 |
| 20 // Generate |number_of_frames| and store into |*storage|. | 22 // Generate |number_of_frames| and store into |*storage|. |
| 21 // First frame has 1 packet, second frame has 2 packets, etc. | 23 // First frame has 1 packet, second frame has 2 packets, etc. |
| 22 static void StoreFrames(size_t number_of_frames, | 24 static void StoreFrames(size_t number_of_frames, |
| 23 uint32 first_frame_id, | 25 uint32 first_frame_id, |
| 24 PacketStorage* storage) { | 26 PacketStorage* storage) { |
| 25 const base::TimeTicks kTicks; | 27 const base::TimeTicks kTicks; |
| 26 const int kSsrc = 1; | 28 const int kSsrc = 1; |
| 27 for (size_t i = 0; i < number_of_frames; ++i) { | 29 for (size_t i = 0; i < number_of_frames; ++i) { |
| 28 SendPacketVector packets; | 30 SendPacketVector packets; |
| 29 // First frame has 1 packet, second frame has 2 packets, etc. | 31 // First frame has 1 packet, second frame has 2 packets, etc. |
| 30 const size_t kNumberOfPackets = i + 1; | 32 const size_t kNumberOfPackets = i + 1; |
| 31 for (size_t j = 0; j < kNumberOfPackets; ++j) { | 33 for (size_t j = 0; j < kNumberOfPackets; ++j) { |
| 32 Packet test_packet(1, 0); | 34 Packet test_packet(1, 0); |
| 33 packets.push_back( | 35 packets.push_back( |
| 34 std::make_pair( | 36 std::make_pair( |
| 35 PacedPacketSender::MakePacketKey(kTicks, kSsrc, j), | 37 PacedPacketSender::MakePacketKey(kTicks, kSsrc, j), |
| 36 new base::RefCountedData<Packet>(test_packet))); | 38 new base::RefCountedData<Packet>(test_packet))); |
| 37 } | 39 } |
| 38 storage->StoreFrame(first_frame_id, packets); | 40 storage->StoreFrame(first_frame_id, packets); |
| 39 ++first_frame_id; | 41 ++first_frame_id; |
| 40 } | 42 } |
| 41 } | 43 } |
| 42 | 44 |
| 43 TEST(PacketStorageTest, NumberOfStoredFrames) { | 45 TEST(PacketStorageTest, NumberOfStoredFrames) { |
| 44 PacketStorage storage(kStoredFrames); | 46 PacketStorage storage; |
| 45 | 47 |
| 46 uint32 frame_id = 0; | 48 uint32 frame_id = 0; |
| 47 frame_id = ~frame_id; // The maximum value of uint32. | 49 frame_id = ~frame_id; // The maximum value of uint32. |
| 48 StoreFrames(200, frame_id, &storage); | 50 StoreFrames(kMaxUnackedFrames / 2, frame_id, &storage); |
| 49 EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames()); | 51 EXPECT_EQ(static_cast<size_t>(kMaxUnackedFrames / 2), |
| 52 storage.GetNumberOfStoredFrames()); |
| 50 } | 53 } |
| 51 | 54 |
| 52 TEST(PacketStorageTest, GetFrameWrapAround8bits) { | 55 TEST(PacketStorageTest, GetFrameWrapAround8bits) { |
| 53 PacketStorage storage(kStoredFrames); | 56 PacketStorage storage; |
| 54 | 57 |
| 55 const uint32 kFirstFrameId = 250; | 58 const uint32 kFirstFrameId = 250; |
| 56 StoreFrames(kStoredFrames, kFirstFrameId, &storage); | 59 StoreFrames(kStoredFrames, kFirstFrameId, &storage); |
| 57 EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames()); | 60 EXPECT_EQ(std::min<size_t>(kMaxUnackedFrames, kStoredFrames), |
| 61 storage.GetNumberOfStoredFrames()); |
| 58 | 62 |
| 59 // Expect we get the correct frames by looking at the number of | 63 // Expect we get the correct frames by looking at the number of |
| 60 // packets. | 64 // packets. |
| 61 uint32 frame_id = kFirstFrameId; | 65 uint32 frame_id = kFirstFrameId; |
| 62 for (size_t i = 0; i < kStoredFrames; ++i) { | 66 for (size_t i = 0; i < kStoredFrames; ++i) { |
| 63 ASSERT_TRUE(storage.GetFrame8(frame_id)); | 67 ASSERT_TRUE(storage.GetFrame8(frame_id)); |
| 64 EXPECT_EQ(i + 1, storage.GetFrame8(frame_id)->size()); | 68 EXPECT_EQ(i + 1, storage.GetFrame8(frame_id)->size()); |
| 65 ++frame_id; | 69 ++frame_id; |
| 66 } | 70 } |
| 67 } | 71 } |
| 68 | 72 |
| 69 TEST(PacketStorageTest, GetFrameWrapAround32bits) { | 73 TEST(PacketStorageTest, GetFrameWrapAround32bits) { |
| 70 PacketStorage storage(kStoredFrames); | 74 PacketStorage storage; |
| 71 | 75 |
| 72 // First frame ID is close to the maximum value of uint32. | 76 // First frame ID is close to the maximum value of uint32. |
| 73 uint32 first_frame_id = 0xffffffff - 5; | 77 uint32 first_frame_id = 0xffffffff - 5; |
| 74 StoreFrames(kStoredFrames, first_frame_id, &storage); | 78 StoreFrames(kStoredFrames, first_frame_id, &storage); |
| 75 EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames()); | 79 EXPECT_EQ(std::min<size_t>(kMaxUnackedFrames, kStoredFrames), |
| 80 storage.GetNumberOfStoredFrames()); |
| 76 | 81 |
| 77 // Expect we get the correct frames by looking at the number of | 82 // Expect we get the correct frames by looking at the number of |
| 78 // packets. | 83 // packets. |
| 79 uint32 frame_id = first_frame_id; | 84 uint32 frame_id = first_frame_id; |
| 80 for (size_t i = 0; i < kStoredFrames; ++i) { | 85 for (size_t i = 0; i < kStoredFrames; ++i) { |
| 81 ASSERT_TRUE(storage.GetFrame8(frame_id)); | 86 ASSERT_TRUE(storage.GetFrame8(frame_id)); |
| 82 EXPECT_EQ(i + 1, storage.GetFrame8(frame_id)->size()); | 87 EXPECT_EQ(i + 1, storage.GetFrame8(frame_id)->size()); |
| 83 ++frame_id; | 88 ++frame_id; |
| 84 } | 89 } |
| 85 } | 90 } |
| 86 | 91 |
| 87 TEST(PacketStorageTest, GetFrameTooOld) { | 92 TEST(PacketStorageTest, FramesReleased) { |
| 88 PacketStorage storage(kStoredFrames); | 93 PacketStorage storage; |
| 89 | 94 |
| 90 // First frame ID is close to the maximum value of uint32. | 95 const uint32 kFirstFrameId = 0; |
| 91 uint32 first_frame_id = 0xffffffff - 5; | 96 StoreFrames(5, kFirstFrameId, &storage); |
| 97 EXPECT_EQ(std::min<size_t>(kMaxUnackedFrames, 5), |
| 98 storage.GetNumberOfStoredFrames()); |
| 92 | 99 |
| 93 // Store two times the capacity. | 100 for (uint32 frame_id = kFirstFrameId; frame_id < kFirstFrameId + 5; |
| 94 StoreFrames(2 * kStoredFrames, first_frame_id, &storage); | 101 ++frame_id) { |
| 95 EXPECT_EQ(kStoredFrames, storage.GetNumberOfStoredFrames()); | 102 EXPECT_TRUE(storage.GetFrame8(frame_id)); |
| 103 } |
| 96 | 104 |
| 97 uint32 frame_id = first_frame_id; | 105 storage.ReleaseFrame(kFirstFrameId + 2); |
| 98 // Old frames are evicted. | 106 EXPECT_EQ(4u, storage.GetNumberOfStoredFrames()); |
| 99 for (size_t i = 0; i < kStoredFrames; ++i) { | 107 EXPECT_FALSE(storage.GetFrame8(kFirstFrameId + 2)); |
| 100 EXPECT_FALSE(storage.GetFrame8(frame_id)); | 108 |
| 101 ++frame_id; | 109 storage.ReleaseFrame(kFirstFrameId + 0); |
| 102 } | 110 EXPECT_EQ(3u, storage.GetNumberOfStoredFrames()); |
| 103 // Check recent frames are there. | 111 EXPECT_FALSE(storage.GetFrame8(kFirstFrameId + 0)); |
| 104 for (size_t i = 0; i < kStoredFrames; ++i) { | 112 |
| 105 ASSERT_TRUE(storage.GetFrame8(frame_id)); | 113 storage.ReleaseFrame(kFirstFrameId + 3); |
| 106 EXPECT_EQ(kStoredFrames + i + 1, | 114 EXPECT_EQ(2u, storage.GetNumberOfStoredFrames()); |
| 107 storage.GetFrame8(frame_id)->size()); | 115 EXPECT_FALSE(storage.GetFrame8(kFirstFrameId + 3)); |
| 108 ++frame_id; | 116 |
| 109 } | 117 storage.ReleaseFrame(kFirstFrameId + 4); |
| 118 EXPECT_EQ(1u, storage.GetNumberOfStoredFrames()); |
| 119 EXPECT_FALSE(storage.GetFrame8(kFirstFrameId + 4)); |
| 120 |
| 121 storage.ReleaseFrame(kFirstFrameId + 1); |
| 122 EXPECT_EQ(0u, storage.GetNumberOfStoredFrames()); |
| 123 EXPECT_FALSE(storage.GetFrame8(kFirstFrameId + 1)); |
| 110 } | 124 } |
| 111 | 125 |
| 112 } // namespace cast | 126 } // namespace cast |
| 113 } // namespace media | 127 } // namespace media |
| OLD | NEW |