Chromium Code Reviews| 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 "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
| 6 #include "base/test/simple_test_tick_clock.h" | 6 #include "base/test/simple_test_tick_clock.h" |
| 7 #include "media/cast/cast_defines.h" | 7 #include "media/cast/cast_defines.h" |
| 8 #include "media/cast/cast_environment.h" | 8 #include "media/cast/cast_environment.h" |
| 9 #include "media/cast/net/cast_transport_defines.h" | 9 #include "media/cast/net/cast_transport_defines.h" |
| 10 #include "media/cast/net/pacing/paced_sender.h" | 10 #include "media/cast/net/pacing/paced_sender.h" |
| 11 #include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" | 11 #include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" |
| 12 #include "media/cast/net/rtcp/rtcp_sender.h" | 12 #include "media/cast/net/rtcp/rtcp_builder.h" |
| 13 #include "media/cast/net/rtcp/rtcp_utility.h" | 13 #include "media/cast/net/rtcp/rtcp_utility.h" |
| 14 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" | 14 #include "media/cast/net/rtcp/test_rtcp_packet_builder.h" |
| 15 #include "media/cast/test/fake_single_thread_task_runner.h" | 15 #include "media/cast/test/fake_single_thread_task_runner.h" |
| 16 #include "testing/gmock/include/gmock/gmock.h" | 16 #include "testing/gmock/include/gmock/gmock.h" |
| 17 | 17 |
| 18 namespace media { | 18 namespace media { |
| 19 namespace cast { | 19 namespace cast { |
| 20 | 20 |
| 21 namespace { | 21 namespace { |
| 22 static const uint32 kSendingSsrc = 0x12345678; | 22 static const uint32 kSendingSsrc = 0x12345678; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 33 report_block.cumulative_lost = kLoss; // 24 bits valid. | 33 report_block.cumulative_lost = kLoss; // 24 bits valid. |
| 34 report_block.extended_high_sequence_number = kExtendedMax; | 34 report_block.extended_high_sequence_number = kExtendedMax; |
| 35 report_block.jitter = kTestJitter; | 35 report_block.jitter = kTestJitter; |
| 36 report_block.last_sr = kLastSr; | 36 report_block.last_sr = kLastSr; |
| 37 report_block.delay_since_last_sr = kDelayLastSr; | 37 report_block.delay_since_last_sr = kDelayLastSr; |
| 38 return report_block; | 38 return report_block; |
| 39 } | 39 } |
| 40 | 40 |
| 41 } // namespace | 41 } // namespace |
| 42 | 42 |
| 43 class TestRtcpTransport : public PacedPacketSender { | |
| 44 public: | |
| 45 TestRtcpTransport() : packet_count_(0) {} | |
| 46 | 43 |
| 47 virtual bool SendRtcpPacket(uint32 ssrc, | 44 class RtcpBuilderTest : public ::testing::Test { |
| 48 PacketRef packet) OVERRIDE { | 45 protected: |
| 49 EXPECT_EQ(expected_packet_.size(), packet->data.size()); | 46 RtcpBuilderTest() |
| 50 if (expected_packet_.size() != packet->data.size()) | 47 : testing_clock_(new base::SimpleTestTickClock()), |
| 51 return false; | 48 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), |
| 52 EXPECT_EQ(0, memcmp(&expected_packet_[0], | 49 rtcp_builder_(new RtcpBuilder(kSendingSsrc)) {} |
| 53 &packet->data[0], | 50 |
| 54 packet->data.size())); | 51 void ExpectPacketEQ(scoped_ptr<Packet> golden_packet, |
| 55 packet_count_++; | 52 PacketRef packet) { |
| 56 return true; | 53 EXPECT_EQ(golden_packet->size(), packet->data.size()); |
| 54 if (golden_packet->size() == packet->data.size()) { | |
| 55 for (size_t x = 0; x < golden_packet->size(); x++) { | |
| 56 EXPECT_EQ((*golden_packet)[x], packet->data[x]); | |
| 57 if ((*golden_packet)[x] != packet->data[x]) | |
| 58 break; | |
| 59 } | |
| 60 } | |
| 57 } | 61 } |
| 58 | 62 |
| 59 virtual bool SendPackets( | 63 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. |
| 60 const SendPacketVector& packets) OVERRIDE { | 64 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; |
|
miu
2014/09/03 22:28:07
Seems like you can get rid of task_runner_ (and it
hubbe
2014/09/04 22:21:19
Done.
| |
| 61 return false; | 65 scoped_ptr<RtcpBuilder> rtcp_builder_; |
| 62 } | |
| 63 virtual bool ResendPackets( | |
| 64 const SendPacketVector& packets, | |
| 65 const DedupInfo& dedup_info) OVERRIDE { | |
| 66 return false; | |
| 67 } | |
| 68 | 66 |
| 69 virtual void CancelSendingPacket( | 67 DISALLOW_COPY_AND_ASSIGN(RtcpBuilderTest); |
| 70 const PacketKey& packet_key) OVERRIDE { | |
| 71 } | |
| 72 | |
| 73 void SetExpectedRtcpPacket(scoped_ptr<Packet> packet) { | |
| 74 expected_packet_.swap(*packet); | |
| 75 } | |
| 76 | |
| 77 int packet_count() const { return packet_count_; } | |
| 78 | |
| 79 private: | |
| 80 Packet expected_packet_; | |
| 81 int packet_count_; | |
| 82 | |
| 83 DISALLOW_COPY_AND_ASSIGN(TestRtcpTransport); | |
| 84 }; | 68 }; |
| 85 | 69 |
| 86 class RtcpSenderTest : public ::testing::Test { | 70 TEST_F(RtcpBuilderTest, RtcpReceiverReport) { |
| 87 protected: | |
| 88 RtcpSenderTest() | |
| 89 : testing_clock_(new base::SimpleTestTickClock()), | |
| 90 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), | |
| 91 cast_environment_(new CastEnvironment( | |
| 92 scoped_ptr<base::TickClock>(testing_clock_).Pass(), | |
| 93 task_runner_, | |
| 94 task_runner_, | |
| 95 task_runner_)), | |
| 96 rtcp_sender_(new RtcpSender(&test_transport_, kSendingSsrc)) {} | |
| 97 | |
| 98 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. | |
| 99 TestRtcpTransport test_transport_; | |
| 100 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; | |
| 101 scoped_refptr<CastEnvironment> cast_environment_; | |
| 102 scoped_ptr<RtcpSender> rtcp_sender_; | |
| 103 | |
| 104 DISALLOW_COPY_AND_ASSIGN(RtcpSenderTest); | |
| 105 }; | |
| 106 | |
| 107 TEST_F(RtcpSenderTest, RtcpReceiverReport) { | |
| 108 // Receiver report with report block. | 71 // Receiver report with report block. |
| 109 TestRtcpPacketBuilder p2; | 72 TestRtcpPacketBuilder p2; |
| 110 p2.AddRr(kSendingSsrc, 1); | 73 p2.AddRr(kSendingSsrc, 1); |
| 111 p2.AddRb(kMediaSsrc); | 74 p2.AddRb(kMediaSsrc); |
| 112 test_transport_.SetExpectedRtcpPacket(p2.GetPacket().Pass()); | |
| 113 | 75 |
| 114 RtcpReportBlock report_block = GetReportBlock(); | 76 RtcpReportBlock report_block = GetReportBlock(); |
| 115 | 77 |
| 116 rtcp_sender_->SendRtcpFromRtpReceiver( | 78 ExpectPacketEQ( |
| 117 &report_block, NULL, NULL, NULL, kDefaultDelay); | 79 p2.GetPacket().Pass(), |
| 118 | 80 rtcp_builder_->BuildRtcpFromReceiver( |
| 119 EXPECT_EQ(1, test_transport_.packet_count()); | 81 &report_block, NULL, NULL, NULL, kDefaultDelay)); |
| 120 } | 82 } |
| 121 | 83 |
| 122 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtr) { | 84 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithRrtr) { |
| 123 // Receiver report with report block. | 85 // Receiver report with report block. |
| 124 TestRtcpPacketBuilder p; | 86 TestRtcpPacketBuilder p; |
| 125 p.AddRr(kSendingSsrc, 1); | 87 p.AddRr(kSendingSsrc, 1); |
| 126 p.AddRb(kMediaSsrc); | 88 p.AddRb(kMediaSsrc); |
| 127 p.AddXrHeader(kSendingSsrc); | 89 p.AddXrHeader(kSendingSsrc); |
| 128 p.AddXrRrtrBlock(); | 90 p.AddXrRrtrBlock(); |
| 129 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
| 130 | 91 |
| 131 RtcpReportBlock report_block = GetReportBlock(); | 92 RtcpReportBlock report_block = GetReportBlock(); |
| 132 | 93 |
| 133 RtcpReceiverReferenceTimeReport rrtr; | 94 RtcpReceiverReferenceTimeReport rrtr; |
| 134 rrtr.ntp_seconds = kNtpHigh; | 95 rrtr.ntp_seconds = kNtpHigh; |
| 135 rrtr.ntp_fraction = kNtpLow; | 96 rrtr.ntp_fraction = kNtpLow; |
| 136 | 97 |
| 137 rtcp_sender_->SendRtcpFromRtpReceiver( | 98 ExpectPacketEQ(p.GetPacket().Pass(), |
| 138 &report_block, | 99 rtcp_builder_->BuildRtcpFromReceiver( |
| 139 &rrtr, | 100 &report_block, |
| 140 NULL, | 101 &rrtr, |
| 141 NULL, | 102 NULL, |
| 142 kDefaultDelay); | 103 NULL, |
| 143 | 104 kDefaultDelay)); |
| 144 EXPECT_EQ(1, test_transport_.packet_count()); | |
| 145 } | 105 } |
| 146 | 106 |
| 147 TEST_F(RtcpSenderTest, RtcpReceiverReportWithCast) { | 107 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithCast) { |
| 148 // Receiver report with report block. | 108 // Receiver report with report block. |
| 149 TestRtcpPacketBuilder p; | 109 TestRtcpPacketBuilder p; |
| 150 p.AddRr(kSendingSsrc, 1); | 110 p.AddRr(kSendingSsrc, 1); |
| 151 p.AddRb(kMediaSsrc); | 111 p.AddRb(kMediaSsrc); |
| 152 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); | 112 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); |
| 153 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
| 154 | 113 |
| 155 RtcpReportBlock report_block = GetReportBlock(); | 114 RtcpReportBlock report_block = GetReportBlock(); |
| 156 | 115 |
| 157 RtcpCastMessage cast_message(kMediaSsrc); | 116 RtcpCastMessage cast_message(kMediaSsrc); |
| 158 cast_message.ack_frame_id = kAckFrameId; | 117 cast_message.ack_frame_id = kAckFrameId; |
| 159 PacketIdSet missing_packets; | 118 PacketIdSet missing_packets; |
| 160 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets; | 119 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets; |
| 161 | 120 |
| 162 missing_packets.insert(kLostPacketId1); | 121 missing_packets.insert(kLostPacketId1); |
| 163 missing_packets.insert(kLostPacketId2); | 122 missing_packets.insert(kLostPacketId2); |
| 164 missing_packets.insert(kLostPacketId3); | 123 missing_packets.insert(kLostPacketId3); |
| 165 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = | 124 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = |
| 166 missing_packets; | 125 missing_packets; |
| 167 | 126 |
| 168 rtcp_sender_->SendRtcpFromRtpReceiver( | 127 ExpectPacketEQ(p.GetPacket().Pass(), |
| 169 &report_block, | 128 rtcp_builder_->BuildRtcpFromReceiver( |
| 170 NULL, | 129 &report_block, |
| 171 &cast_message, | 130 NULL, |
| 172 NULL, | 131 &cast_message, |
| 173 kDefaultDelay); | 132 NULL, |
| 174 | 133 kDefaultDelay)); |
| 175 EXPECT_EQ(1, test_transport_.packet_count()); | |
| 176 } | 134 } |
| 177 | 135 |
| 178 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtraAndCastMessage) { | 136 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithRrtraAndCastMessage) { |
| 179 TestRtcpPacketBuilder p; | 137 TestRtcpPacketBuilder p; |
| 180 p.AddRr(kSendingSsrc, 1); | 138 p.AddRr(kSendingSsrc, 1); |
| 181 p.AddRb(kMediaSsrc); | 139 p.AddRb(kMediaSsrc); |
| 182 p.AddXrHeader(kSendingSsrc); | 140 p.AddXrHeader(kSendingSsrc); |
| 183 p.AddXrRrtrBlock(); | 141 p.AddXrRrtrBlock(); |
| 184 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); | 142 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); |
| 185 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
| 186 | 143 |
| 187 RtcpReportBlock report_block = GetReportBlock(); | 144 RtcpReportBlock report_block = GetReportBlock(); |
| 188 | 145 |
| 189 RtcpReceiverReferenceTimeReport rrtr; | 146 RtcpReceiverReferenceTimeReport rrtr; |
| 190 rrtr.ntp_seconds = kNtpHigh; | 147 rrtr.ntp_seconds = kNtpHigh; |
| 191 rrtr.ntp_fraction = kNtpLow; | 148 rrtr.ntp_fraction = kNtpLow; |
| 192 | 149 |
| 193 RtcpCastMessage cast_message(kMediaSsrc); | 150 RtcpCastMessage cast_message(kMediaSsrc); |
| 194 cast_message.ack_frame_id = kAckFrameId; | 151 cast_message.ack_frame_id = kAckFrameId; |
| 195 PacketIdSet missing_packets; | 152 PacketIdSet missing_packets; |
| 196 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets; | 153 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets; |
| 197 | 154 |
| 198 missing_packets.insert(kLostPacketId1); | 155 missing_packets.insert(kLostPacketId1); |
| 199 missing_packets.insert(kLostPacketId2); | 156 missing_packets.insert(kLostPacketId2); |
| 200 missing_packets.insert(kLostPacketId3); | 157 missing_packets.insert(kLostPacketId3); |
| 201 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = | 158 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = |
| 202 missing_packets; | 159 missing_packets; |
| 203 | 160 |
| 204 rtcp_sender_->SendRtcpFromRtpReceiver( | 161 ExpectPacketEQ(p.GetPacket().Pass(), |
| 205 &report_block, | 162 rtcp_builder_->BuildRtcpFromReceiver( |
| 206 &rrtr, | 163 &report_block, |
| 207 &cast_message, | 164 &rrtr, |
| 208 NULL, | 165 &cast_message, |
| 209 kDefaultDelay); | 166 NULL, |
| 210 | 167 kDefaultDelay)); |
| 211 EXPECT_EQ(1, test_transport_.packet_count()); | |
| 212 } | 168 } |
| 213 | 169 |
| 214 TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { | 170 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { |
| 215 static const uint32 kTimeBaseMs = 12345678; | 171 static const uint32 kTimeBaseMs = 12345678; |
| 216 static const uint32 kTimeDelayMs = 10; | 172 static const uint32 kTimeDelayMs = 10; |
| 217 | 173 |
| 218 TestRtcpPacketBuilder p; | 174 TestRtcpPacketBuilder p; |
| 219 p.AddRr(kSendingSsrc, 1); | 175 p.AddRr(kSendingSsrc, 1); |
| 220 p.AddRb(kMediaSsrc); | 176 p.AddRb(kMediaSsrc); |
| 221 p.AddXrHeader(kSendingSsrc); | 177 p.AddXrHeader(kSendingSsrc); |
| 222 p.AddXrRrtrBlock(); | 178 p.AddXrRrtrBlock(); |
| 223 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); | 179 p.AddCast(kSendingSsrc, kMediaSsrc, kDefaultDelay); |
| 224 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
| 225 | 180 |
| 226 RtcpReportBlock report_block = GetReportBlock(); | 181 RtcpReportBlock report_block = GetReportBlock(); |
| 227 | 182 |
| 228 RtcpReceiverReferenceTimeReport rrtr; | 183 RtcpReceiverReferenceTimeReport rrtr; |
| 229 rrtr.ntp_seconds = kNtpHigh; | 184 rrtr.ntp_seconds = kNtpHigh; |
| 230 rrtr.ntp_fraction = kNtpLow; | 185 rrtr.ntp_fraction = kNtpLow; |
| 231 | 186 |
| 232 RtcpCastMessage cast_message(kMediaSsrc); | 187 RtcpCastMessage cast_message(kMediaSsrc); |
| 233 cast_message.ack_frame_id = kAckFrameId; | 188 cast_message.ack_frame_id = kAckFrameId; |
| 234 PacketIdSet missing_packets; | 189 PacketIdSet missing_packets; |
| 235 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets; | 190 cast_message.missing_frames_and_packets[kLostFrameId] = missing_packets; |
| 236 | 191 |
| 237 missing_packets.insert(kLostPacketId1); | 192 missing_packets.insert(kLostPacketId1); |
| 238 missing_packets.insert(kLostPacketId2); | 193 missing_packets.insert(kLostPacketId2); |
| 239 missing_packets.insert(kLostPacketId3); | 194 missing_packets.insert(kLostPacketId3); |
| 240 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = | 195 cast_message.missing_frames_and_packets[kFrameIdWithLostPackets] = |
| 241 missing_packets; | 196 missing_packets; |
| 242 | 197 |
| 243 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); | 198 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); |
| 244 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; | 199 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; |
| 245 | 200 |
| 246 rtcp_sender_->SendRtcpFromRtpReceiver( | 201 ExpectPacketEQ(p.GetPacket().Pass(), |
| 247 &report_block, | 202 rtcp_builder_->BuildRtcpFromReceiver( |
| 248 &rrtr, | 203 &report_block, |
| 249 &cast_message, | 204 &rrtr, |
| 250 &rtcp_events, | 205 &cast_message, |
| 251 kDefaultDelay); | 206 &rtcp_events, |
| 207 kDefaultDelay)); | |
| 252 | 208 |
| 253 base::SimpleTestTickClock testing_clock; | 209 base::SimpleTestTickClock testing_clock; |
| 254 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 210 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
| 255 | 211 |
| 256 p.AddReceiverLog(kSendingSsrc); | 212 p.AddReceiverLog(kSendingSsrc); |
| 257 p.AddReceiverFrameLog(kRtpTimestamp, 2, kTimeBaseMs); | 213 p.AddReceiverFrameLog(kRtpTimestamp, 2, kTimeBaseMs); |
| 258 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); | 214 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); |
| 259 p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs); | 215 p.AddReceiverEventLog(kLostPacketId1, PACKET_RECEIVED, kTimeDelayMs); |
| 260 | 216 |
| 261 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
| 262 | |
| 263 FrameEvent frame_event; | 217 FrameEvent frame_event; |
| 264 frame_event.rtp_timestamp = kRtpTimestamp; | 218 frame_event.rtp_timestamp = kRtpTimestamp; |
| 265 frame_event.type = FRAME_ACK_SENT; | 219 frame_event.type = FRAME_ACK_SENT; |
| 266 frame_event.media_type = VIDEO_EVENT; | 220 frame_event.media_type = VIDEO_EVENT; |
| 267 frame_event.timestamp = testing_clock.NowTicks(); | 221 frame_event.timestamp = testing_clock.NowTicks(); |
| 268 event_subscriber.OnReceiveFrameEvent(frame_event); | 222 event_subscriber.OnReceiveFrameEvent(frame_event); |
| 269 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); | 223 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
| 270 | 224 |
| 271 PacketEvent packet_event; | 225 PacketEvent packet_event; |
| 272 packet_event.rtp_timestamp = kRtpTimestamp; | 226 packet_event.rtp_timestamp = kRtpTimestamp; |
| 273 packet_event.type = PACKET_RECEIVED; | 227 packet_event.type = PACKET_RECEIVED; |
| 274 packet_event.media_type = VIDEO_EVENT; | 228 packet_event.media_type = VIDEO_EVENT; |
| 275 packet_event.timestamp = testing_clock.NowTicks(); | 229 packet_event.timestamp = testing_clock.NowTicks(); |
| 276 packet_event.packet_id = kLostPacketId1; | 230 packet_event.packet_id = kLostPacketId1; |
| 277 event_subscriber.OnReceivePacketEvent(packet_event); | 231 event_subscriber.OnReceivePacketEvent(packet_event); |
| 278 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); | 232 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); |
| 279 EXPECT_EQ(2u, rtcp_events.size()); | 233 EXPECT_EQ(2u, rtcp_events.size()); |
| 280 | 234 |
| 281 rtcp_sender_->SendRtcpFromRtpReceiver( | 235 ExpectPacketEQ( |
| 282 &report_block, | 236 p.GetPacket().Pass(), |
| 283 &rrtr, | 237 rtcp_builder_->BuildRtcpFromReceiver( |
| 284 &cast_message, | 238 &report_block, |
| 285 &rtcp_events, | 239 &rrtr, |
| 286 kDefaultDelay); | 240 &cast_message, |
| 287 | 241 &rtcp_events, |
| 288 EXPECT_EQ(2, test_transport_.packet_count()); | 242 kDefaultDelay)); |
| 289 } | 243 } |
| 290 | 244 |
| 291 TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) { | 245 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithOversizedFrameLog) { |
| 292 static const uint32 kTimeBaseMs = 12345678; | 246 static const uint32 kTimeBaseMs = 12345678; |
| 293 static const uint32 kTimeDelayMs = 10; | 247 static const uint32 kTimeDelayMs = 10; |
| 294 | 248 |
| 295 TestRtcpPacketBuilder p; | 249 TestRtcpPacketBuilder p; |
| 296 p.AddRr(kSendingSsrc, 1); | 250 p.AddRr(kSendingSsrc, 1); |
| 297 p.AddRb(kMediaSsrc); | 251 p.AddRb(kMediaSsrc); |
| 298 | 252 |
| 299 RtcpReportBlock report_block = GetReportBlock(); | 253 RtcpReportBlock report_block = GetReportBlock(); |
| 300 | 254 |
| 301 base::SimpleTestTickClock testing_clock; | 255 base::SimpleTestTickClock testing_clock; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 313 p.AddReceiverFrameLog( | 267 p.AddReceiverFrameLog( |
| 314 kRtpTimestamp + 2345, | 268 kRtpTimestamp + 2345, |
| 315 num_events, | 269 num_events, |
| 316 kTimeBaseMs + (kRtcpMaxReceiverLogMessages - num_events) * kTimeDelayMs); | 270 kTimeBaseMs + (kRtcpMaxReceiverLogMessages - num_events) * kTimeDelayMs); |
| 317 for (int i = 0; i < num_events; i++) { | 271 for (int i = 0; i < num_events; i++) { |
| 318 p.AddReceiverEventLog( | 272 p.AddReceiverEventLog( |
| 319 kLostPacketId1, PACKET_RECEIVED, | 273 kLostPacketId1, PACKET_RECEIVED, |
| 320 static_cast<uint16>(kTimeDelayMs * i)); | 274 static_cast<uint16>(kTimeDelayMs * i)); |
| 321 } | 275 } |
| 322 | 276 |
| 323 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
| 324 | 277 |
| 325 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); | 278 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); |
| 326 FrameEvent frame_event; | 279 FrameEvent frame_event; |
| 327 frame_event.rtp_timestamp = kRtpTimestamp; | 280 frame_event.rtp_timestamp = kRtpTimestamp; |
| 328 frame_event.type = FRAME_ACK_SENT; | 281 frame_event.type = FRAME_ACK_SENT; |
| 329 frame_event.media_type = VIDEO_EVENT; | 282 frame_event.media_type = VIDEO_EVENT; |
| 330 frame_event.timestamp = testing_clock.NowTicks(); | 283 frame_event.timestamp = testing_clock.NowTicks(); |
| 331 event_subscriber.OnReceiveFrameEvent(frame_event); | 284 event_subscriber.OnReceiveFrameEvent(frame_event); |
| 332 | 285 |
| 333 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { | 286 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { |
| 334 PacketEvent packet_event; | 287 PacketEvent packet_event; |
| 335 packet_event.rtp_timestamp = kRtpTimestamp + 2345; | 288 packet_event.rtp_timestamp = kRtpTimestamp + 2345; |
| 336 packet_event.type = PACKET_RECEIVED; | 289 packet_event.type = PACKET_RECEIVED; |
| 337 packet_event.media_type = VIDEO_EVENT; | 290 packet_event.media_type = VIDEO_EVENT; |
| 338 packet_event.timestamp = testing_clock.NowTicks(); | 291 packet_event.timestamp = testing_clock.NowTicks(); |
| 339 packet_event.packet_id = kLostPacketId1; | 292 packet_event.packet_id = kLostPacketId1; |
| 340 event_subscriber.OnReceivePacketEvent(packet_event); | 293 event_subscriber.OnReceivePacketEvent(packet_event); |
| 341 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); | 294 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
| 342 } | 295 } |
| 343 | 296 |
| 344 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; | 297 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; |
| 345 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); | 298 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); |
| 346 | 299 |
| 347 rtcp_sender_->SendRtcpFromRtpReceiver( | 300 ExpectPacketEQ(p.GetPacket().Pass(), |
| 348 &report_block, | 301 rtcp_builder_->BuildRtcpFromReceiver( |
| 349 NULL, | 302 &report_block, |
| 350 NULL, | 303 NULL, |
| 351 &rtcp_events, | 304 NULL, |
| 352 kDefaultDelay); | 305 &rtcp_events, |
| 353 | 306 kDefaultDelay)); |
| 354 EXPECT_EQ(1, test_transport_.packet_count()); | |
| 355 } | 307 } |
| 356 | 308 |
| 357 TEST_F(RtcpSenderTest, RtcpReceiverReportWithTooManyLogFrames) { | 309 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithTooManyLogFrames) { |
| 358 static const uint32 kTimeBaseMs = 12345678; | 310 static const uint32 kTimeBaseMs = 12345678; |
| 359 static const uint32 kTimeDelayMs = 10; | 311 static const uint32 kTimeDelayMs = 10; |
| 360 | 312 |
| 361 TestRtcpPacketBuilder p; | 313 TestRtcpPacketBuilder p; |
| 362 p.AddRr(kSendingSsrc, 1); | 314 p.AddRr(kSendingSsrc, 1); |
| 363 p.AddRb(kMediaSsrc); | 315 p.AddRb(kMediaSsrc); |
| 364 | 316 |
| 365 RtcpReportBlock report_block = GetReportBlock(); | 317 RtcpReportBlock report_block = GetReportBlock(); |
| 366 | 318 |
| 367 base::SimpleTestTickClock testing_clock; | 319 base::SimpleTestTickClock testing_clock; |
| 368 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 320 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
| 369 | 321 |
| 370 p.AddReceiverLog(kSendingSsrc); | 322 p.AddReceiverLog(kSendingSsrc); |
| 371 | 323 |
| 372 int remaining_bytes = kMaxReceiverLogBytes; | 324 int remaining_bytes = kMaxReceiverLogBytes; |
| 373 remaining_bytes -= kRtcpCastLogHeaderSize; | 325 remaining_bytes -= kRtcpCastLogHeaderSize; |
| 374 | 326 |
| 375 int num_events = | 327 int num_events = |
| 376 remaining_bytes / (kRtcpReceiverFrameLogSize + kRtcpReceiverEventLogSize); | 328 remaining_bytes / (kRtcpReceiverFrameLogSize + kRtcpReceiverEventLogSize); |
| 377 | 329 |
| 378 // The last |num_events| events are sent due to receiver log size cap. | 330 // The last |num_events| events are sent due to receiver log size cap. |
| 379 for (size_t i = kRtcpMaxReceiverLogMessages - num_events; | 331 for (size_t i = kRtcpMaxReceiverLogMessages - num_events; |
| 380 i < kRtcpMaxReceiverLogMessages; | 332 i < kRtcpMaxReceiverLogMessages; |
| 381 ++i) { | 333 ++i) { |
| 382 p.AddReceiverFrameLog(kRtpTimestamp + i, 1, kTimeBaseMs + i * kTimeDelayMs); | 334 p.AddReceiverFrameLog(kRtpTimestamp + i, 1, kTimeBaseMs + i * kTimeDelayMs); |
| 383 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); | 335 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); |
| 384 } | 336 } |
| 385 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
| 386 | 337 |
| 387 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); | 338 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); |
| 388 | 339 |
| 389 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { | 340 for (size_t i = 0; i < kRtcpMaxReceiverLogMessages; ++i) { |
| 390 FrameEvent frame_event; | 341 FrameEvent frame_event; |
| 391 frame_event.rtp_timestamp = kRtpTimestamp + static_cast<int>(i); | 342 frame_event.rtp_timestamp = kRtpTimestamp + static_cast<int>(i); |
| 392 frame_event.type = FRAME_ACK_SENT; | 343 frame_event.type = FRAME_ACK_SENT; |
| 393 frame_event.media_type = VIDEO_EVENT; | 344 frame_event.media_type = VIDEO_EVENT; |
| 394 frame_event.timestamp = testing_clock.NowTicks(); | 345 frame_event.timestamp = testing_clock.NowTicks(); |
| 395 event_subscriber.OnReceiveFrameEvent(frame_event); | 346 event_subscriber.OnReceiveFrameEvent(frame_event); |
| 396 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); | 347 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); |
| 397 } | 348 } |
| 398 | 349 |
| 399 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; | 350 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; |
| 400 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); | 351 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); |
| 401 | 352 |
| 402 rtcp_sender_->SendRtcpFromRtpReceiver( | 353 ExpectPacketEQ(p.GetPacket().Pass(), |
| 403 &report_block, | 354 rtcp_builder_->BuildRtcpFromReceiver( |
| 404 NULL, | 355 &report_block, |
| 405 NULL, | 356 NULL, |
| 406 &rtcp_events, | 357 NULL, |
| 407 kDefaultDelay); | 358 &rtcp_events, |
| 408 | 359 kDefaultDelay)); |
| 409 EXPECT_EQ(1, test_transport_.packet_count()); | |
| 410 } | 360 } |
| 411 | 361 |
| 412 TEST_F(RtcpSenderTest, RtcpReceiverReportWithOldLogFrames) { | 362 TEST_F(RtcpBuilderTest, RtcpReceiverReportWithOldLogFrames) { |
| 413 static const uint32 kTimeBaseMs = 12345678; | 363 static const uint32 kTimeBaseMs = 12345678; |
| 414 | 364 |
| 415 TestRtcpPacketBuilder p; | 365 TestRtcpPacketBuilder p; |
| 416 p.AddRr(kSendingSsrc, 1); | 366 p.AddRr(kSendingSsrc, 1); |
| 417 p.AddRb(kMediaSsrc); | 367 p.AddRb(kMediaSsrc); |
| 418 | 368 |
| 419 RtcpReportBlock report_block = GetReportBlock(); | 369 RtcpReportBlock report_block = GetReportBlock(); |
| 420 | 370 |
| 421 base::SimpleTestTickClock testing_clock; | 371 base::SimpleTestTickClock testing_clock; |
| 422 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); | 372 testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeBaseMs)); |
| 423 | 373 |
| 424 p.AddReceiverLog(kSendingSsrc); | 374 p.AddReceiverLog(kSendingSsrc); |
| 425 | 375 |
| 426 // Log 11 events for a single frame, each |kTimeBetweenEventsMs| apart. | 376 // Log 11 events for a single frame, each |kTimeBetweenEventsMs| apart. |
| 427 // Only last 10 events will be sent because the first event is more than | 377 // Only last 10 events will be sent because the first event is more than |
| 428 // 4095 milliseconds away from latest event. | 378 // 4095 milliseconds away from latest event. |
| 429 const int kTimeBetweenEventsMs = 410; | 379 const int kTimeBetweenEventsMs = 410; |
| 430 p.AddReceiverFrameLog(kRtpTimestamp, 10, kTimeBaseMs + kTimeBetweenEventsMs); | 380 p.AddReceiverFrameLog(kRtpTimestamp, 10, kTimeBaseMs + kTimeBetweenEventsMs); |
| 431 for (int i = 0; i < 10; ++i) { | 381 for (int i = 0; i < 10; ++i) { |
| 432 p.AddReceiverEventLog(0, FRAME_ACK_SENT, i * kTimeBetweenEventsMs); | 382 p.AddReceiverEventLog(0, FRAME_ACK_SENT, i * kTimeBetweenEventsMs); |
| 433 } | 383 } |
| 434 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
| 435 | 384 |
| 436 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); | 385 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); |
| 437 for (int i = 0; i < 11; ++i) { | 386 for (int i = 0; i < 11; ++i) { |
| 438 FrameEvent frame_event; | 387 FrameEvent frame_event; |
| 439 frame_event.rtp_timestamp = kRtpTimestamp; | 388 frame_event.rtp_timestamp = kRtpTimestamp; |
| 440 frame_event.type = FRAME_ACK_SENT; | 389 frame_event.type = FRAME_ACK_SENT; |
| 441 frame_event.media_type = VIDEO_EVENT; | 390 frame_event.media_type = VIDEO_EVENT; |
| 442 frame_event.timestamp = testing_clock.NowTicks(); | 391 frame_event.timestamp = testing_clock.NowTicks(); |
| 443 event_subscriber.OnReceiveFrameEvent(frame_event); | 392 event_subscriber.OnReceiveFrameEvent(frame_event); |
| 444 testing_clock.Advance( | 393 testing_clock.Advance( |
| 445 base::TimeDelta::FromMilliseconds(kTimeBetweenEventsMs)); | 394 base::TimeDelta::FromMilliseconds(kTimeBetweenEventsMs)); |
| 446 } | 395 } |
| 447 | 396 |
| 448 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; | 397 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; |
| 449 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); | 398 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); |
| 450 | 399 |
| 451 rtcp_sender_->SendRtcpFromRtpReceiver( | 400 ExpectPacketEQ(p.GetPacket().Pass(), |
| 452 &report_block, | 401 rtcp_builder_->BuildRtcpFromReceiver( |
| 453 NULL, | 402 &report_block, |
| 454 NULL, | 403 NULL, |
| 455 &rtcp_events, | 404 NULL, |
| 456 kDefaultDelay); | 405 &rtcp_events, |
| 457 | 406 kDefaultDelay)); |
| 458 EXPECT_EQ(1, test_transport_.packet_count()); | |
| 459 } | 407 } |
| 460 | 408 |
| 461 TEST_F(RtcpSenderTest, RtcpReceiverReportRedundancy) { | 409 TEST_F(RtcpBuilderTest, RtcpReceiverReportRedundancy) { |
| 462 uint32 time_base_ms = 12345678; | 410 uint32 time_base_ms = 12345678; |
| 463 int kTimeBetweenEventsMs = 10; | 411 int kTimeBetweenEventsMs = 10; |
| 464 | 412 |
| 465 RtcpReportBlock report_block = GetReportBlock(); | 413 RtcpReportBlock report_block = GetReportBlock(); |
| 466 | 414 |
| 467 base::SimpleTestTickClock testing_clock; | 415 base::SimpleTestTickClock testing_clock; |
| 468 testing_clock.Advance(base::TimeDelta::FromMilliseconds(time_base_ms)); | 416 testing_clock.Advance(base::TimeDelta::FromMilliseconds(time_base_ms)); |
| 469 | 417 |
| 470 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); | 418 ReceiverRtcpEventSubscriber event_subscriber(500, VIDEO_EVENT); |
| 471 size_t packet_count = kReceiveLogMessageHistorySize + 10; | 419 size_t packet_count = kReceiveLogMessageHistorySize + 10; |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 486 if (i >= kFirstRedundancyOffset) { | 434 if (i >= kFirstRedundancyOffset) { |
| 487 p.AddReceiverFrameLog( | 435 p.AddReceiverFrameLog( |
| 488 kRtpTimestamp, | 436 kRtpTimestamp, |
| 489 1, | 437 1, |
| 490 time_base_ms - kFirstRedundancyOffset * kTimeBetweenEventsMs); | 438 time_base_ms - kFirstRedundancyOffset * kTimeBetweenEventsMs); |
| 491 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); | 439 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); |
| 492 } | 440 } |
| 493 p.AddReceiverFrameLog(kRtpTimestamp, 1, time_base_ms); | 441 p.AddReceiverFrameLog(kRtpTimestamp, 1, time_base_ms); |
| 494 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); | 442 p.AddReceiverEventLog(0, FRAME_ACK_SENT, 0); |
| 495 | 443 |
| 496 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
| 497 | |
| 498 FrameEvent frame_event; | 444 FrameEvent frame_event; |
| 499 frame_event.rtp_timestamp = kRtpTimestamp; | 445 frame_event.rtp_timestamp = kRtpTimestamp; |
| 500 frame_event.type = FRAME_ACK_SENT; | 446 frame_event.type = FRAME_ACK_SENT; |
| 501 frame_event.media_type = VIDEO_EVENT; | 447 frame_event.media_type = VIDEO_EVENT; |
| 502 frame_event.timestamp = testing_clock.NowTicks(); | 448 frame_event.timestamp = testing_clock.NowTicks(); |
| 503 event_subscriber.OnReceiveFrameEvent(frame_event); | 449 event_subscriber.OnReceiveFrameEvent(frame_event); |
| 504 | 450 |
| 505 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; | 451 ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; |
| 506 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); | 452 event_subscriber.GetRtcpEventsAndReset(&rtcp_events); |
| 507 | 453 |
| 508 rtcp_sender_->SendRtcpFromRtpReceiver( | 454 ExpectPacketEQ(p.GetPacket().Pass(), |
| 509 &report_block, | 455 rtcp_builder_->BuildRtcpFromReceiver( |
| 510 NULL, | 456 &report_block, |
| 511 NULL, | 457 NULL, |
| 512 &rtcp_events, | 458 NULL, |
| 513 kDefaultDelay); | 459 &rtcp_events, |
| 460 kDefaultDelay)); | |
| 514 | 461 |
| 515 testing_clock.Advance( | 462 testing_clock.Advance( |
| 516 base::TimeDelta::FromMilliseconds(kTimeBetweenEventsMs)); | 463 base::TimeDelta::FromMilliseconds(kTimeBetweenEventsMs)); |
| 517 time_base_ms += kTimeBetweenEventsMs; | 464 time_base_ms += kTimeBetweenEventsMs; |
| 518 } | 465 } |
| 519 | |
| 520 EXPECT_EQ(static_cast<int>(packet_count), test_transport_.packet_count()); | |
| 521 } | 466 } |
| 522 | 467 |
| 523 TEST_F(RtcpSenderTest, RtcpSenderReport) { | 468 TEST_F(RtcpBuilderTest, RtcpSenderReport) { |
| 524 RtcpSenderInfo sender_info; | 469 RtcpSenderInfo sender_info; |
| 525 sender_info.ntp_seconds = kNtpHigh; | 470 sender_info.ntp_seconds = kNtpHigh; |
| 526 sender_info.ntp_fraction = kNtpLow; | 471 sender_info.ntp_fraction = kNtpLow; |
| 527 sender_info.rtp_timestamp = kRtpTimestamp; | 472 sender_info.rtp_timestamp = kRtpTimestamp; |
| 528 sender_info.send_packet_count = kSendPacketCount; | 473 sender_info.send_packet_count = kSendPacketCount; |
| 529 sender_info.send_octet_count = kSendOctetCount; | 474 sender_info.send_octet_count = kSendOctetCount; |
| 530 | 475 |
| 531 // Sender report. | 476 // Sender report. |
| 532 TestRtcpPacketBuilder p; | 477 TestRtcpPacketBuilder p; |
| 533 p.AddSr(kSendingSsrc, 0); | 478 p.AddSr(kSendingSsrc, 0); |
| 534 test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); | |
| 535 | 479 |
| 536 rtcp_sender_->SendRtcpFromRtpSender(sender_info); | 480 ExpectPacketEQ(p.GetPacket().Pass(), |
| 537 | 481 rtcp_builder_->BuildRtcpFromSender(sender_info)); |
| 538 EXPECT_EQ(1, test_transport_.packet_count()); | |
| 539 } | 482 } |
| 540 | 483 |
| 541 } // namespace cast | 484 } // namespace cast |
| 542 } // namespace media | 485 } // namespace media |
| OLD | NEW |