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