blob: 46420ecc21e61f39f3ed5c5a9714941c2df36802 [file] [log] [blame]
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10#include <assert.h>
11
12#include <algorithm>
13#include <map>
14#include <sstream>
15#include <string>
16
17#include "testing/gtest/include/gtest/gtest.h"
18
19#include "webrtc/call.h"
20#include "webrtc/frame_callback.h"
21#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000022#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
23#include "webrtc/system_wrappers/interface/event_wrapper.h"
24#include "webrtc/system_wrappers/interface/scoped_ptr.h"
25#include "webrtc/system_wrappers/interface/sleep.h"
26#include "webrtc/test/call_test.h"
27#include "webrtc/test/direct_transport.h"
28#include "webrtc/test/encoder_settings.h"
29#include "webrtc/test/fake_audio_device.h"
30#include "webrtc/test/fake_decoder.h"
31#include "webrtc/test/fake_encoder.h"
32#include "webrtc/test/frame_generator.h"
33#include "webrtc/test/frame_generator_capturer.h"
34#include "webrtc/test/null_transport.h"
35#include "webrtc/test/rtp_rtcp_observer.h"
36#include "webrtc/test/testsupport/fileutils.h"
andresp@webrtc.orgab071da2014-09-18 08:58:15 +000037#include "webrtc/test/testsupport/gtest_disable.h"
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000038#include "webrtc/test/testsupport/perf_test.h"
39#include "webrtc/video/transport_adapter.h"
pbos@webrtc.orgab990ae2014-09-17 09:02:25 +000040#include "webrtc/video_encoder.h"
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000041
42namespace webrtc {
43
pbos@webrtc.org26c0c412014-09-03 16:17:12 +000044static const unsigned long kSilenceTimeoutMs = 2000;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000045
46class EndToEndTest : public test::CallTest {
47 public:
48 EndToEndTest() {}
49
50 virtual ~EndToEndTest() {
51 EXPECT_EQ(NULL, send_stream_);
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +000052 EXPECT_TRUE(receive_streams_.empty());
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000053 }
54
55 protected:
pbos@webrtc.org26c0c412014-09-03 16:17:12 +000056 class UnusedTransport : public newapi::Transport {
57 private:
58 virtual bool SendRtp(const uint8_t* packet, size_t length) OVERRIDE {
59 ADD_FAILURE() << "Unexpected RTP sent.";
60 return false;
61 }
62
63 virtual bool SendRtcp(const uint8_t* packet, size_t length) OVERRIDE {
64 ADD_FAILURE() << "Unexpected RTCP sent.";
65 return false;
66 }
67 };
68
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000069 void DecodesRetransmittedFrame(bool retransmit_over_rtx);
70 void ReceivesPliAndRecovers(int rtp_history_ms);
71 void RespectsRtcpMode(newapi::RtcpMode rtcp_mode);
72 void TestXrReceiverReferenceTimeReport(bool enable_rrtr);
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +000073 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first);
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +000074 void TestRtpStatePreservation(bool use_rtx);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000075};
76
77TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) {
78 test::NullTransport transport;
79 CreateCalls(Call::Config(&transport), Call::Config(&transport));
80
81 CreateSendConfig(1);
82 CreateMatchingReceiveConfigs();
83
84 CreateStreams();
85
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +000086 receive_streams_[0]->Start();
87 receive_streams_[0]->Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000088
89 DestroyStreams();
90}
91
92TEST_F(EndToEndTest, ReceiverCanBeStoppedTwice) {
93 test::NullTransport transport;
94 CreateCalls(Call::Config(&transport), Call::Config(&transport));
95
96 CreateSendConfig(1);
97 CreateMatchingReceiveConfigs();
98
99 CreateStreams();
100
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000101 receive_streams_[0]->Stop();
102 receive_streams_[0]->Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000103
104 DestroyStreams();
105}
106
107TEST_F(EndToEndTest, RendersSingleDelayedFrame) {
108 static const int kWidth = 320;
109 static const int kHeight = 240;
110 // This constant is chosen to be higher than the timeout in the video_render
111 // module. This makes sure that frames aren't dropped if there are no other
112 // frames in the queue.
113 static const int kDelayRenderCallbackMs = 1000;
114
115 class Renderer : public VideoRenderer {
116 public:
117 Renderer() : event_(EventWrapper::Create()) {}
118
119 virtual void RenderFrame(const I420VideoFrame& video_frame,
120 int /*time_to_render_ms*/) OVERRIDE {
121 event_->Set();
122 }
123
124 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
125
126 scoped_ptr<EventWrapper> event_;
127 } renderer;
128
129 class TestFrameCallback : public I420FrameCallback {
130 public:
131 TestFrameCallback() : event_(EventWrapper::Create()) {}
132
133 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
134
135 private:
136 virtual void FrameCallback(I420VideoFrame* frame) OVERRIDE {
137 SleepMs(kDelayRenderCallbackMs);
138 event_->Set();
139 }
140
141 scoped_ptr<EventWrapper> event_;
142 };
143
144 test::DirectTransport sender_transport, receiver_transport;
145
146 CreateCalls(Call::Config(&sender_transport),
147 Call::Config(&receiver_transport));
148
149 sender_transport.SetReceiver(receiver_call_->Receiver());
150 receiver_transport.SetReceiver(sender_call_->Receiver());
151
152 CreateSendConfig(1);
153 CreateMatchingReceiveConfigs();
154
155 TestFrameCallback pre_render_callback;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000156 receive_configs_[0].pre_render_callback = &pre_render_callback;
157 receive_configs_[0].renderer = &renderer;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000158
159 CreateStreams();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000160 Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000161
162 // Create frames that are smaller than the send width/height, this is done to
163 // check that the callbacks are done after processing video.
164 scoped_ptr<test::FrameGenerator> frame_generator(
165 test::FrameGenerator::Create(kWidth, kHeight));
166 send_stream_->Input()->SwapFrame(frame_generator->NextFrame());
167 EXPECT_EQ(kEventSignaled, pre_render_callback.Wait())
168 << "Timed out while waiting for pre-render callback.";
169 EXPECT_EQ(kEventSignaled, renderer.Wait())
170 << "Timed out while waiting for the frame to render.";
171
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000172 Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000173
174 sender_transport.StopSending();
175 receiver_transport.StopSending();
176
177 DestroyStreams();
178}
179
180TEST_F(EndToEndTest, TransmitsFirstFrame) {
181 class Renderer : public VideoRenderer {
182 public:
183 Renderer() : event_(EventWrapper::Create()) {}
184
185 virtual void RenderFrame(const I420VideoFrame& video_frame,
186 int /*time_to_render_ms*/) OVERRIDE {
187 event_->Set();
188 }
189
190 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
191
192 scoped_ptr<EventWrapper> event_;
193 } renderer;
194
195 test::DirectTransport sender_transport, receiver_transport;
196
197 CreateCalls(Call::Config(&sender_transport),
198 Call::Config(&receiver_transport));
199
200 sender_transport.SetReceiver(receiver_call_->Receiver());
201 receiver_transport.SetReceiver(sender_call_->Receiver());
202
203 CreateSendConfig(1);
204 CreateMatchingReceiveConfigs();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000205 receive_configs_[0].renderer = &renderer;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000206
207 CreateStreams();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000208 Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000209
210 scoped_ptr<test::FrameGenerator> frame_generator(test::FrameGenerator::Create(
211 video_streams_[0].width, video_streams_[0].height));
212 send_stream_->Input()->SwapFrame(frame_generator->NextFrame());
213
214 EXPECT_EQ(kEventSignaled, renderer.Wait())
215 << "Timed out while waiting for the frame to render.";
216
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000217 Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000218
219 sender_transport.StopSending();
220 receiver_transport.StopSending();
221
222 DestroyStreams();
223}
224
stefan@webrtc.org79c33592014-08-06 09:24:53 +0000225TEST_F(EndToEndTest, SendsAndReceivesH264) {
226 class H264Observer : public test::EndToEndTest, public VideoRenderer {
227 public:
228 H264Observer()
229 : EndToEndTest(2 * kDefaultTimeoutMs),
230 fake_encoder_(Clock::GetRealTimeClock()),
231 frame_counter_(0) {}
232
233 virtual void PerformTest() OVERRIDE {
234 EXPECT_EQ(kEventSignaled, Wait())
235 << "Timed out while waiting for enough frames to be decoded.";
236 }
237
238 virtual void ModifyConfigs(
239 VideoSendStream::Config* send_config,
240 std::vector<VideoReceiveStream::Config>* receive_configs,
241 std::vector<VideoStream>* video_streams) {
242 send_config->encoder_settings.encoder = &fake_encoder_;
243 send_config->encoder_settings.payload_name = "H264";
244 send_config->encoder_settings.payload_type = kFakeSendPayloadType;
245 (*video_streams)[0].min_bitrate_bps = 50000;
246 (*video_streams)[0].target_bitrate_bps =
247 (*video_streams)[0].max_bitrate_bps = 2000000;
248
249 (*receive_configs)[0].renderer = this;
250 VideoCodec codec =
251 test::CreateDecoderVideoCodec(send_config->encoder_settings);
252 (*receive_configs)[0].codecs.resize(1);
253 (*receive_configs)[0].codecs[0] = codec;
254 (*receive_configs)[0].external_decoders.resize(1);
255 (*receive_configs)[0].external_decoders[0].payload_type =
256 send_config->encoder_settings.payload_type;
257 (*receive_configs)[0].external_decoders[0].decoder = &fake_decoder_;
258 }
259
260 virtual void RenderFrame(const I420VideoFrame& video_frame,
261 int time_to_render_ms) OVERRIDE {
262 const int kRequiredFrames = 500;
263 if (++frame_counter_ == kRequiredFrames)
264 observation_complete_->Set();
265 }
266
267 private:
268 test::FakeH264Decoder fake_decoder_;
269 test::FakeH264Encoder fake_encoder_;
270 int frame_counter_;
271 } test;
272
273 RunBaseTest(&test);
274}
275
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000276TEST_F(EndToEndTest, ReceiverUsesLocalSsrc) {
277 class SyncRtcpObserver : public test::EndToEndTest {
278 public:
279 SyncRtcpObserver() : EndToEndTest(kDefaultTimeoutMs) {}
280
281 virtual Action OnReceiveRtcp(const uint8_t* packet,
282 size_t length) OVERRIDE {
283 RTCPUtility::RTCPParserV2 parser(packet, length, true);
284 EXPECT_TRUE(parser.IsValid());
285 uint32_t ssrc = 0;
286 ssrc |= static_cast<uint32_t>(packet[4]) << 24;
287 ssrc |= static_cast<uint32_t>(packet[5]) << 16;
288 ssrc |= static_cast<uint32_t>(packet[6]) << 8;
289 ssrc |= static_cast<uint32_t>(packet[7]) << 0;
290 EXPECT_EQ(kReceiverLocalSsrc, ssrc);
291 observation_complete_->Set();
292
293 return SEND_PACKET;
294 }
295
296 virtual void PerformTest() OVERRIDE {
297 EXPECT_EQ(kEventSignaled, Wait())
298 << "Timed out while waiting for a receiver RTCP packet to be sent.";
299 }
300 } test;
301
302 RunBaseTest(&test);
303}
304
305TEST_F(EndToEndTest, ReceivesAndRetransmitsNack) {
306 static const int kNumberOfNacksToObserve = 2;
307 static const int kLossBurstSize = 2;
308 static const int kPacketsBetweenLossBursts = 9;
309 class NackObserver : public test::EndToEndTest {
310 public:
311 NackObserver()
312 : EndToEndTest(kLongTimeoutMs),
313 rtp_parser_(RtpHeaderParser::Create()),
314 sent_rtp_packets_(0),
315 packets_left_to_drop_(0),
316 nacks_left_(kNumberOfNacksToObserve) {}
317
318 private:
319 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
320 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +0000321 EXPECT_TRUE(rtp_parser_->Parse(packet, length, &header));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000322
323 // Never drop retransmitted packets.
324 if (dropped_packets_.find(header.sequenceNumber) !=
325 dropped_packets_.end()) {
326 retransmitted_packets_.insert(header.sequenceNumber);
327 if (nacks_left_ == 0 &&
328 retransmitted_packets_.size() == dropped_packets_.size()) {
329 observation_complete_->Set();
330 }
331 return SEND_PACKET;
332 }
333
334 ++sent_rtp_packets_;
335
336 // Enough NACKs received, stop dropping packets.
337 if (nacks_left_ == 0)
338 return SEND_PACKET;
339
340 // Check if it's time for a new loss burst.
341 if (sent_rtp_packets_ % kPacketsBetweenLossBursts == 0)
342 packets_left_to_drop_ = kLossBurstSize;
343
344 if (packets_left_to_drop_ > 0) {
345 --packets_left_to_drop_;
346 dropped_packets_.insert(header.sequenceNumber);
347 return DROP_PACKET;
348 }
349
350 return SEND_PACKET;
351 }
352
353 virtual Action OnReceiveRtcp(const uint8_t* packet,
354 size_t length) OVERRIDE {
355 RTCPUtility::RTCPParserV2 parser(packet, length, true);
356 EXPECT_TRUE(parser.IsValid());
357
358 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
359 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
360 if (packet_type == RTCPUtility::kRtcpRtpfbNackCode) {
361 --nacks_left_;
362 break;
363 }
364 packet_type = parser.Iterate();
365 }
366 return SEND_PACKET;
367 }
368
369 virtual void ModifyConfigs(
370 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000371 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000372 std::vector<VideoStream>* video_streams) OVERRIDE {
373 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000374 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000375 }
376
377 virtual void PerformTest() OVERRIDE {
378 EXPECT_EQ(kEventSignaled, Wait())
379 << "Timed out waiting for packets to be NACKed, retransmitted and "
380 "rendered.";
381 }
382
383 scoped_ptr<RtpHeaderParser> rtp_parser_;
384 std::set<uint16_t> dropped_packets_;
385 std::set<uint16_t> retransmitted_packets_;
386 uint64_t sent_rtp_packets_;
387 int packets_left_to_drop_;
388 int nacks_left_;
389 } test;
390
391 RunBaseTest(&test);
392}
393
394// TODO(pbos): Flaky, webrtc:3269
395TEST_F(EndToEndTest, DISABLED_CanReceiveFec) {
396 class FecRenderObserver : public test::EndToEndTest, public VideoRenderer {
397 public:
398 FecRenderObserver()
399 : EndToEndTest(kDefaultTimeoutMs),
400 state_(kFirstPacket),
401 protected_sequence_number_(0),
402 protected_frame_timestamp_(0) {}
403
404 private:
405 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE
406 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
407 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +0000408 EXPECT_TRUE(parser_->Parse(packet, length, &header));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000409
410 EXPECT_EQ(kRedPayloadType, header.payloadType);
411 int encapsulated_payload_type =
412 static_cast<int>(packet[header.headerLength]);
413 if (encapsulated_payload_type != kFakeSendPayloadType)
414 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type);
415
416 switch (state_) {
417 case kFirstPacket:
418 state_ = kDropEveryOtherPacketUntilFec;
419 break;
420 case kDropEveryOtherPacketUntilFec:
421 if (encapsulated_payload_type == kUlpfecPayloadType) {
422 state_ = kDropNextMediaPacket;
423 return SEND_PACKET;
424 }
425 if (header.sequenceNumber % 2 == 0)
426 return DROP_PACKET;
427 break;
428 case kDropNextMediaPacket:
429 if (encapsulated_payload_type == kFakeSendPayloadType) {
430 protected_sequence_number_ = header.sequenceNumber;
431 protected_frame_timestamp_ = header.timestamp;
432 state_ = kProtectedPacketDropped;
433 return DROP_PACKET;
434 }
435 break;
436 case kProtectedPacketDropped:
437 EXPECT_NE(header.sequenceNumber, protected_sequence_number_)
438 << "Protected packet retransmitted. Should not happen with FEC.";
439 break;
440 }
441
442 return SEND_PACKET;
443 }
444
445 virtual void RenderFrame(const I420VideoFrame& video_frame,
446 int time_to_render_ms) OVERRIDE {
447 CriticalSectionScoped lock(crit_.get());
448 // Rendering frame with timestamp associated with dropped packet -> FEC
449 // protection worked.
450 if (state_ == kProtectedPacketDropped &&
451 video_frame.timestamp() == protected_frame_timestamp_) {
452 observation_complete_->Set();
453 }
454 }
455
456 enum {
457 kFirstPacket,
458 kDropEveryOtherPacketUntilFec,
459 kDropNextMediaPacket,
460 kProtectedPacketDropped,
461 } state_;
462
463 virtual void ModifyConfigs(
464 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000465 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000466 std::vector<VideoStream>* video_streams) OVERRIDE {
467 // TODO(pbos): Run this test with combined NACK/FEC enabled as well.
468 // int rtp_history_ms = 1000;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000469 // (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000470 // send_config->rtp.nack.rtp_history_ms = rtp_history_ms;
471 send_config->rtp.fec.red_payload_type = kRedPayloadType;
472 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
473
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000474 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType;
475 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
476 (*receive_configs)[0].renderer = this;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000477 }
478
479 virtual void PerformTest() OVERRIDE {
480 EXPECT_EQ(kEventSignaled, Wait())
481 << "Timed out while waiting for retransmitted NACKed frames to be "
482 "rendered again.";
483 }
484
485 uint32_t protected_sequence_number_ GUARDED_BY(crit_);
486 uint32_t protected_frame_timestamp_ GUARDED_BY(crit_);
487 } test;
488
489 RunBaseTest(&test);
490}
491
492// This test drops second RTP packet with a marker bit set, makes sure it's
493// retransmitted and renders. Retransmission SSRCs are also checked.
494void EndToEndTest::DecodesRetransmittedFrame(bool retransmit_over_rtx) {
495 static const int kDroppedFrameNumber = 2;
496 class RetransmissionObserver : public test::EndToEndTest,
497 public I420FrameCallback {
498 public:
499 explicit RetransmissionObserver(bool expect_rtx)
500 : EndToEndTest(kDefaultTimeoutMs),
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +0000501 retransmission_ssrc_(expect_rtx ? kSendRtxSsrcs[0] : kSendSsrcs[0]),
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000502 retransmission_payload_type_(expect_rtx ? kSendRtxPayloadType
503 : kFakeSendPayloadType),
504 marker_bits_observed_(0),
505 retransmitted_timestamp_(0),
506 frame_retransmitted_(false) {}
507
508 private:
509 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
510 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +0000511 EXPECT_TRUE(parser_->Parse(packet, length, &header));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000512
513 if (header.timestamp == retransmitted_timestamp_) {
514 EXPECT_EQ(retransmission_ssrc_, header.ssrc);
515 EXPECT_EQ(retransmission_payload_type_, header.payloadType);
516 frame_retransmitted_ = true;
517 return SEND_PACKET;
518 }
519
520 EXPECT_EQ(kSendSsrcs[0], header.ssrc);
521 EXPECT_EQ(kFakeSendPayloadType, header.payloadType);
522
523 // Found the second frame's final packet, drop this and expect a
524 // retransmission.
525 if (header.markerBit && ++marker_bits_observed_ == kDroppedFrameNumber) {
526 retransmitted_timestamp_ = header.timestamp;
527 return DROP_PACKET;
528 }
529
530 return SEND_PACKET;
531 }
532
533 virtual void FrameCallback(I420VideoFrame* frame) OVERRIDE {
534 CriticalSectionScoped lock(crit_.get());
535 if (frame->timestamp() == retransmitted_timestamp_) {
536 EXPECT_TRUE(frame_retransmitted_);
537 observation_complete_->Set();
538 }
539 }
540
541 virtual void ModifyConfigs(
542 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000543 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000544 std::vector<VideoStream>* video_streams) OVERRIDE {
545 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000546 (*receive_configs)[0].pre_render_callback = this;
547 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +0000548 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) {
549 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000550 send_config->rtp.rtx.payload_type = kSendRtxPayloadType;
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +0000551 (*receive_configs)[0].rtp.rtx[kSendRtxPayloadType].ssrc =
552 kSendRtxSsrcs[0];
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000553 (*receive_configs)[0].rtp.rtx[kSendRtxPayloadType].payload_type =
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000554 kSendRtxPayloadType;
555 }
556 }
557
558 virtual void PerformTest() OVERRIDE {
559 EXPECT_EQ(kEventSignaled, Wait())
560 << "Timed out while waiting for retransmission to render.";
561 }
562
563 const uint32_t retransmission_ssrc_;
564 const int retransmission_payload_type_;
565 int marker_bits_observed_;
566 uint32_t retransmitted_timestamp_;
567 bool frame_retransmitted_;
568 } test(retransmit_over_rtx);
569
570 RunBaseTest(&test);
571}
572
573TEST_F(EndToEndTest, DecodesRetransmittedFrame) {
574 DecodesRetransmittedFrame(false);
575}
576
577TEST_F(EndToEndTest, DecodesRetransmittedFrameOverRtx) {
578 DecodesRetransmittedFrame(true);
579}
580
andresp@webrtc.orgab071da2014-09-18 08:58:15 +0000581// Disabled due to: https://code.google.com/p/webrtc/issues/detail?id=3770
582TEST_F(EndToEndTest, DISABLED_ON_ANDROID(UsesFrameCallbacks)) {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000583 static const int kWidth = 320;
584 static const int kHeight = 240;
585
586 class Renderer : public VideoRenderer {
587 public:
588 Renderer() : event_(EventWrapper::Create()) {}
589
590 virtual void RenderFrame(const I420VideoFrame& video_frame,
591 int /*time_to_render_ms*/) OVERRIDE {
592 EXPECT_EQ(0, *video_frame.buffer(kYPlane))
593 << "Rendered frame should have zero luma which is applied by the "
594 "pre-render callback.";
595 event_->Set();
596 }
597
598 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
599 scoped_ptr<EventWrapper> event_;
600 } renderer;
601
602 class TestFrameCallback : public I420FrameCallback {
603 public:
604 TestFrameCallback(int expected_luma_byte, int next_luma_byte)
605 : event_(EventWrapper::Create()),
606 expected_luma_byte_(expected_luma_byte),
607 next_luma_byte_(next_luma_byte) {}
608
609 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
610
611 private:
612 virtual void FrameCallback(I420VideoFrame* frame) {
613 EXPECT_EQ(kWidth, frame->width())
614 << "Width not as expected, callback done before resize?";
615 EXPECT_EQ(kHeight, frame->height())
616 << "Height not as expected, callback done before resize?";
617
618 // Previous luma specified, observed luma should be fairly close.
619 if (expected_luma_byte_ != -1) {
620 EXPECT_NEAR(expected_luma_byte_, *frame->buffer(kYPlane), 10);
621 }
622
623 memset(frame->buffer(kYPlane),
624 next_luma_byte_,
625 frame->allocated_size(kYPlane));
626
627 event_->Set();
628 }
629
630 scoped_ptr<EventWrapper> event_;
631 int expected_luma_byte_;
632 int next_luma_byte_;
633 };
634
635 TestFrameCallback pre_encode_callback(-1, 255); // Changes luma to 255.
636 TestFrameCallback pre_render_callback(255, 0); // Changes luma from 255 to 0.
637
638 test::DirectTransport sender_transport, receiver_transport;
639
640 CreateCalls(Call::Config(&sender_transport),
641 Call::Config(&receiver_transport));
642
643 sender_transport.SetReceiver(receiver_call_->Receiver());
644 receiver_transport.SetReceiver(sender_call_->Receiver());
645
646 CreateSendConfig(1);
pbos@webrtc.orgab990ae2014-09-17 09:02:25 +0000647 scoped_ptr<VideoEncoder> encoder(
648 VideoEncoder::Create(VideoEncoder::kVp8));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000649 send_config_.encoder_settings.encoder = encoder.get();
650 send_config_.encoder_settings.payload_name = "VP8";
651 ASSERT_EQ(1u, video_streams_.size()) << "Test setup error.";
652 video_streams_[0].width = kWidth;
653 video_streams_[0].height = kHeight;
654 send_config_.pre_encode_callback = &pre_encode_callback;
655
656 CreateMatchingReceiveConfigs();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000657 receive_configs_[0].pre_render_callback = &pre_render_callback;
658 receive_configs_[0].renderer = &renderer;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000659
660 CreateStreams();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000661 Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000662
663 // Create frames that are smaller than the send width/height, this is done to
664 // check that the callbacks are done after processing video.
665 scoped_ptr<test::FrameGenerator> frame_generator(
666 test::FrameGenerator::Create(kWidth / 2, kHeight / 2));
667 send_stream_->Input()->SwapFrame(frame_generator->NextFrame());
668
669 EXPECT_EQ(kEventSignaled, pre_encode_callback.Wait())
670 << "Timed out while waiting for pre-encode callback.";
671 EXPECT_EQ(kEventSignaled, pre_render_callback.Wait())
672 << "Timed out while waiting for pre-render callback.";
673 EXPECT_EQ(kEventSignaled, renderer.Wait())
674 << "Timed out while waiting for the frame to render.";
675
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000676 Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000677
678 sender_transport.StopSending();
679 receiver_transport.StopSending();
680
681 DestroyStreams();
682}
683
684void EndToEndTest::ReceivesPliAndRecovers(int rtp_history_ms) {
685 static const int kPacketsToDrop = 1;
686
687 class PliObserver : public test::EndToEndTest, public VideoRenderer {
688 public:
689 explicit PliObserver(int rtp_history_ms)
690 : EndToEndTest(kLongTimeoutMs),
691 rtp_history_ms_(rtp_history_ms),
692 nack_enabled_(rtp_history_ms > 0),
693 highest_dropped_timestamp_(0),
694 frames_to_drop_(0),
695 received_pli_(false) {}
696
697 private:
698 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
699 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +0000700 EXPECT_TRUE(parser_->Parse(packet, length, &header));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000701
702 // Drop all retransmitted packets to force a PLI.
703 if (header.timestamp <= highest_dropped_timestamp_)
704 return DROP_PACKET;
705
706 if (frames_to_drop_ > 0) {
707 highest_dropped_timestamp_ = header.timestamp;
708 --frames_to_drop_;
709 return DROP_PACKET;
710 }
711
712 return SEND_PACKET;
713 }
714
715 virtual Action OnReceiveRtcp(const uint8_t* packet,
716 size_t length) OVERRIDE {
717 RTCPUtility::RTCPParserV2 parser(packet, length, true);
718 EXPECT_TRUE(parser.IsValid());
719
720 for (RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
721 packet_type != RTCPUtility::kRtcpNotValidCode;
722 packet_type = parser.Iterate()) {
723 if (!nack_enabled_)
724 EXPECT_NE(packet_type, RTCPUtility::kRtcpRtpfbNackCode);
725
726 if (packet_type == RTCPUtility::kRtcpPsfbPliCode) {
727 received_pli_ = true;
728 break;
729 }
730 }
731 return SEND_PACKET;
732 }
733
734 virtual void RenderFrame(const I420VideoFrame& video_frame,
735 int time_to_render_ms) OVERRIDE {
736 CriticalSectionScoped lock(crit_.get());
737 if (received_pli_ &&
738 video_frame.timestamp() > highest_dropped_timestamp_) {
739 observation_complete_->Set();
740 }
741 if (!received_pli_)
742 frames_to_drop_ = kPacketsToDrop;
743 }
744
745 virtual void ModifyConfigs(
746 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000747 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000748 std::vector<VideoStream>* video_streams) OVERRIDE {
749 send_config->rtp.nack.rtp_history_ms = rtp_history_ms_;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000750 (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms_;
751 (*receive_configs)[0].renderer = this;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000752 }
753
754 virtual void PerformTest() OVERRIDE {
755 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out waiting for PLI to be "
756 "received and a frame to be "
757 "rendered afterwards.";
758 }
759
760 int rtp_history_ms_;
761 bool nack_enabled_;
762 uint32_t highest_dropped_timestamp_;
763 int frames_to_drop_;
764 bool received_pli_;
765 } test(rtp_history_ms);
766
767 RunBaseTest(&test);
768}
769
770TEST_F(EndToEndTest, ReceivesPliAndRecoversWithNack) {
771 ReceivesPliAndRecovers(1000);
772}
773
774// TODO(pbos): Enable this when 2250 is resolved.
775TEST_F(EndToEndTest, DISABLED_ReceivesPliAndRecoversWithoutNack) {
776 ReceivesPliAndRecovers(0);
777}
778
779TEST_F(EndToEndTest, UnknownRtpPacketGivesUnknownSsrcReturnCode) {
780 class PacketInputObserver : public PacketReceiver {
781 public:
782 explicit PacketInputObserver(PacketReceiver* receiver)
783 : receiver_(receiver), delivered_packet_(EventWrapper::Create()) {}
784
785 EventTypeWrapper Wait() {
786 return delivered_packet_->Wait(kDefaultTimeoutMs);
787 }
788
789 private:
790 virtual DeliveryStatus DeliverPacket(const uint8_t* packet,
791 size_t length) OVERRIDE {
pbos@webrtc.org62bafae2014-07-08 12:10:51 +0000792 if (RtpHeaderParser::IsRtcp(packet, length)) {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000793 return receiver_->DeliverPacket(packet, length);
794 } else {
795 DeliveryStatus delivery_status =
796 receiver_->DeliverPacket(packet, length);
797 EXPECT_EQ(DELIVERY_UNKNOWN_SSRC, delivery_status);
798 delivered_packet_->Set();
799 return delivery_status;
800 }
801 }
802
803 PacketReceiver* receiver_;
804 scoped_ptr<EventWrapper> delivered_packet_;
805 };
806
807 test::DirectTransport send_transport, receive_transport;
808
809 CreateCalls(Call::Config(&send_transport), Call::Config(&receive_transport));
810 PacketInputObserver input_observer(receiver_call_->Receiver());
811
812 send_transport.SetReceiver(&input_observer);
813 receive_transport.SetReceiver(sender_call_->Receiver());
814
815 CreateSendConfig(1);
816 CreateMatchingReceiveConfigs();
817
818 CreateStreams();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000819 CreateFrameGeneratorCapturer();
820 Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000821
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000822 receiver_call_->DestroyVideoReceiveStream(receive_streams_[0]);
823 receive_streams_.clear();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000824
825 // Wait() waits for a received packet.
826 EXPECT_EQ(kEventSignaled, input_observer.Wait());
827
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000828 Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000829
830 DestroyStreams();
831
832 send_transport.StopSending();
833 receive_transport.StopSending();
834}
835
836void EndToEndTest::RespectsRtcpMode(newapi::RtcpMode rtcp_mode) {
837 static const int kNumCompoundRtcpPacketsToObserve = 10;
838 class RtcpModeObserver : public test::EndToEndTest {
839 public:
840 explicit RtcpModeObserver(newapi::RtcpMode rtcp_mode)
841 : EndToEndTest(kDefaultTimeoutMs),
842 rtcp_mode_(rtcp_mode),
843 sent_rtp_(0),
844 sent_rtcp_(0) {}
845
846 private:
847 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
848 if (++sent_rtp_ % 3 == 0)
849 return DROP_PACKET;
850
851 return SEND_PACKET;
852 }
853
854 virtual Action OnReceiveRtcp(const uint8_t* packet,
855 size_t length) OVERRIDE {
856 ++sent_rtcp_;
857 RTCPUtility::RTCPParserV2 parser(packet, length, true);
858 EXPECT_TRUE(parser.IsValid());
859
860 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
861 bool has_report_block = false;
862 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
863 EXPECT_NE(RTCPUtility::kRtcpSrCode, packet_type);
864 if (packet_type == RTCPUtility::kRtcpRrCode) {
865 has_report_block = true;
866 break;
867 }
868 packet_type = parser.Iterate();
869 }
870
871 switch (rtcp_mode_) {
872 case newapi::kRtcpCompound:
873 if (!has_report_block) {
874 ADD_FAILURE() << "Received RTCP packet without receiver report for "
875 "kRtcpCompound.";
876 observation_complete_->Set();
877 }
878
879 if (sent_rtcp_ >= kNumCompoundRtcpPacketsToObserve)
880 observation_complete_->Set();
881
882 break;
883 case newapi::kRtcpReducedSize:
884 if (!has_report_block)
885 observation_complete_->Set();
886 break;
887 }
888
889 return SEND_PACKET;
890 }
891
892 virtual void ModifyConfigs(
893 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000894 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000895 std::vector<VideoStream>* video_streams) OVERRIDE {
896 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000897 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
898 (*receive_configs)[0].rtp.rtcp_mode = rtcp_mode_;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000899 }
900
901 virtual void PerformTest() OVERRIDE {
902 EXPECT_EQ(kEventSignaled, Wait())
903 << (rtcp_mode_ == newapi::kRtcpCompound
904 ? "Timed out before observing enough compound packets."
905 : "Timed out before receiving a non-compound RTCP packet.");
906 }
907
908 newapi::RtcpMode rtcp_mode_;
909 int sent_rtp_;
910 int sent_rtcp_;
911 } test(rtcp_mode);
912
913 RunBaseTest(&test);
914}
915
916TEST_F(EndToEndTest, UsesRtcpCompoundMode) {
917 RespectsRtcpMode(newapi::kRtcpCompound);
918}
919
920TEST_F(EndToEndTest, UsesRtcpReducedSizeMode) {
921 RespectsRtcpMode(newapi::kRtcpReducedSize);
922}
923
924// Test sets up a Call multiple senders with different resolutions and SSRCs.
925// Another is set up to receive all three of these with different renderers.
926// Each renderer verifies that it receives the expected resolution, and as soon
927// as every renderer has received a frame, the test finishes.
andresp@webrtc.orgab071da2014-09-18 08:58:15 +0000928//
929// Disabled due to: https://code.google.com/p/webrtc/issues/detail?id=3770
930TEST_F(EndToEndTest, DISABLED_ON_ANDROID(SendsAndReceivesMultipleStreams)) {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000931 static const size_t kNumStreams = 3;
932
933 class VideoOutputObserver : public VideoRenderer {
934 public:
935 VideoOutputObserver(test::FrameGeneratorCapturer** capturer,
936 int width,
937 int height)
938 : capturer_(capturer),
939 width_(width),
940 height_(height),
941 done_(EventWrapper::Create()) {}
942
943 virtual void RenderFrame(const I420VideoFrame& video_frame,
944 int time_to_render_ms) OVERRIDE {
945 EXPECT_EQ(width_, video_frame.width());
946 EXPECT_EQ(height_, video_frame.height());
947 (*capturer_)->Stop();
948 done_->Set();
949 }
950
951 EventTypeWrapper Wait() { return done_->Wait(kDefaultTimeoutMs); }
952
953 private:
954 test::FrameGeneratorCapturer** capturer_;
955 int width_;
956 int height_;
957 scoped_ptr<EventWrapper> done_;
958 };
959
960 struct {
961 uint32_t ssrc;
962 int width;
963 int height;
964 } codec_settings[kNumStreams] = {{1, 640, 480}, {2, 320, 240}, {3, 240, 160}};
965
966 test::DirectTransport sender_transport, receiver_transport;
967 scoped_ptr<Call> sender_call(Call::Create(Call::Config(&sender_transport)));
968 scoped_ptr<Call> receiver_call(
969 Call::Create(Call::Config(&receiver_transport)));
970 sender_transport.SetReceiver(receiver_call->Receiver());
971 receiver_transport.SetReceiver(sender_call->Receiver());
972
973 VideoSendStream* send_streams[kNumStreams];
974 VideoReceiveStream* receive_streams[kNumStreams];
975
976 VideoOutputObserver* observers[kNumStreams];
977 test::FrameGeneratorCapturer* frame_generators[kNumStreams];
978
pbos@webrtc.orgab990ae2014-09-17 09:02:25 +0000979 scoped_ptr<VideoEncoder> encoders[kNumStreams];
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000980 for (size_t i = 0; i < kNumStreams; ++i)
pbos@webrtc.orgab990ae2014-09-17 09:02:25 +0000981 encoders[i].reset(VideoEncoder::Create(VideoEncoder::kVp8));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000982
983 for (size_t i = 0; i < kNumStreams; ++i) {
984 uint32_t ssrc = codec_settings[i].ssrc;
985 int width = codec_settings[i].width;
986 int height = codec_settings[i].height;
987 observers[i] = new VideoOutputObserver(&frame_generators[i], width, height);
988
pbos@webrtc.orgbd249bc2014-07-07 04:45:15 +0000989 VideoSendStream::Config send_config;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000990 send_config.rtp.ssrcs.push_back(ssrc);
991 send_config.encoder_settings.encoder = encoders[i].get();
992 send_config.encoder_settings.payload_name = "VP8";
993 send_config.encoder_settings.payload_type = 124;
994 std::vector<VideoStream> video_streams = test::CreateVideoStreams(1);
995 VideoStream* stream = &video_streams[0];
996 stream->width = width;
997 stream->height = height;
998 stream->max_framerate = 5;
999 stream->min_bitrate_bps = stream->target_bitrate_bps =
1000 stream->max_bitrate_bps = 100000;
1001 send_streams[i] =
1002 sender_call->CreateVideoSendStream(send_config, video_streams, NULL);
1003 send_streams[i]->Start();
1004
pbos@webrtc.orgbd249bc2014-07-07 04:45:15 +00001005 VideoReceiveStream::Config receive_config;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001006 receive_config.renderer = observers[i];
1007 receive_config.rtp.remote_ssrc = ssrc;
1008 receive_config.rtp.local_ssrc = kReceiverLocalSsrc;
1009 VideoCodec codec =
1010 test::CreateDecoderVideoCodec(send_config.encoder_settings);
1011 receive_config.codecs.push_back(codec);
1012 receive_streams[i] =
1013 receiver_call->CreateVideoReceiveStream(receive_config);
1014 receive_streams[i]->Start();
1015
1016 frame_generators[i] = test::FrameGeneratorCapturer::Create(
1017 send_streams[i]->Input(), width, height, 30, Clock::GetRealTimeClock());
1018 frame_generators[i]->Start();
1019 }
1020
1021 for (size_t i = 0; i < kNumStreams; ++i) {
1022 EXPECT_EQ(kEventSignaled, observers[i]->Wait())
1023 << "Timed out while waiting for observer " << i << " to render.";
1024 }
1025
1026 for (size_t i = 0; i < kNumStreams; ++i) {
1027 frame_generators[i]->Stop();
1028 sender_call->DestroyVideoSendStream(send_streams[i]);
1029 receiver_call->DestroyVideoReceiveStream(receive_streams[i]);
1030 delete frame_generators[i];
1031 delete observers[i];
1032 }
1033
1034 sender_transport.StopSending();
1035 receiver_transport.StopSending();
1036}
1037
1038TEST_F(EndToEndTest, ObserversEncodedFrames) {
1039 class EncodedFrameTestObserver : public EncodedFrameObserver {
1040 public:
1041 EncodedFrameTestObserver()
1042 : length_(0),
1043 frame_type_(kFrameEmpty),
1044 called_(EventWrapper::Create()) {}
1045 virtual ~EncodedFrameTestObserver() {}
1046
1047 virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) {
1048 frame_type_ = encoded_frame.frame_type_;
1049 length_ = encoded_frame.length_;
1050 buffer_.reset(new uint8_t[length_]);
1051 memcpy(buffer_.get(), encoded_frame.data_, length_);
1052 called_->Set();
1053 }
1054
1055 EventTypeWrapper Wait() { return called_->Wait(kDefaultTimeoutMs); }
1056
1057 void ExpectEqualFrames(const EncodedFrameTestObserver& observer) {
1058 ASSERT_EQ(length_, observer.length_)
1059 << "Observed frames are of different lengths.";
1060 EXPECT_EQ(frame_type_, observer.frame_type_)
1061 << "Observed frames have different frame types.";
1062 EXPECT_EQ(0, memcmp(buffer_.get(), observer.buffer_.get(), length_))
1063 << "Observed encoded frames have different content.";
1064 }
1065
1066 private:
1067 scoped_ptr<uint8_t[]> buffer_;
1068 size_t length_;
1069 FrameType frame_type_;
1070 scoped_ptr<EventWrapper> called_;
1071 };
1072
1073 EncodedFrameTestObserver post_encode_observer;
1074 EncodedFrameTestObserver pre_decode_observer;
1075
1076 test::DirectTransport sender_transport, receiver_transport;
1077
1078 CreateCalls(Call::Config(&sender_transport),
1079 Call::Config(&receiver_transport));
1080
1081 sender_transport.SetReceiver(receiver_call_->Receiver());
1082 receiver_transport.SetReceiver(sender_call_->Receiver());
1083
1084 CreateSendConfig(1);
1085 CreateMatchingReceiveConfigs();
1086 send_config_.post_encode_callback = &post_encode_observer;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001087 receive_configs_[0].pre_decode_callback = &pre_decode_observer;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001088
1089 CreateStreams();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001090 Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001091
1092 scoped_ptr<test::FrameGenerator> frame_generator(test::FrameGenerator::Create(
1093 video_streams_[0].width, video_streams_[0].height));
1094 send_stream_->Input()->SwapFrame(frame_generator->NextFrame());
1095
1096 EXPECT_EQ(kEventSignaled, post_encode_observer.Wait())
1097 << "Timed out while waiting for send-side encoded-frame callback.";
1098
1099 EXPECT_EQ(kEventSignaled, pre_decode_observer.Wait())
1100 << "Timed out while waiting for pre-decode encoded-frame callback.";
1101
1102 post_encode_observer.ExpectEqualFrames(pre_decode_observer);
1103
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001104 Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001105
1106 sender_transport.StopSending();
1107 receiver_transport.StopSending();
1108
1109 DestroyStreams();
1110}
1111
1112TEST_F(EndToEndTest, ReceiveStreamSendsRemb) {
1113 class RembObserver : public test::EndToEndTest {
1114 public:
1115 RembObserver() : EndToEndTest(kDefaultTimeoutMs) {}
1116
1117 virtual Action OnReceiveRtcp(const uint8_t* packet,
1118 size_t length) OVERRIDE {
1119 RTCPUtility::RTCPParserV2 parser(packet, length, true);
1120 EXPECT_TRUE(parser.IsValid());
1121
1122 bool received_psfb = false;
1123 bool received_remb = false;
1124 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
1125 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
1126 if (packet_type == RTCPUtility::kRtcpPsfbRembCode) {
1127 const RTCPUtility::RTCPPacket& packet = parser.Packet();
1128 EXPECT_EQ(packet.PSFBAPP.SenderSSRC, kReceiverLocalSsrc);
1129 received_psfb = true;
1130 } else if (packet_type == RTCPUtility::kRtcpPsfbRembItemCode) {
1131 const RTCPUtility::RTCPPacket& packet = parser.Packet();
1132 EXPECT_GT(packet.REMBItem.BitRate, 0u);
1133 EXPECT_EQ(packet.REMBItem.NumberOfSSRCs, 1u);
1134 EXPECT_EQ(packet.REMBItem.SSRCs[0], kSendSsrcs[0]);
1135 received_remb = true;
1136 }
1137 packet_type = parser.Iterate();
1138 }
1139 if (received_psfb && received_remb)
1140 observation_complete_->Set();
1141 return SEND_PACKET;
1142 }
1143 virtual void PerformTest() OVERRIDE {
1144 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for a "
1145 "receiver RTCP REMB packet to be "
1146 "sent.";
1147 }
1148 } test;
1149
1150 RunBaseTest(&test);
1151}
1152
1153void EndToEndTest::TestXrReceiverReferenceTimeReport(bool enable_rrtr) {
1154 static const int kNumRtcpReportPacketsToObserve = 5;
1155 class RtcpXrObserver : public test::EndToEndTest {
1156 public:
1157 explicit RtcpXrObserver(bool enable_rrtr)
1158 : EndToEndTest(kDefaultTimeoutMs),
1159 enable_rrtr_(enable_rrtr),
1160 sent_rtcp_sr_(0),
1161 sent_rtcp_rr_(0),
1162 sent_rtcp_rrtr_(0),
1163 sent_rtcp_dlrr_(0) {}
1164
1165 private:
1166 // Receive stream should send RR packets (and RRTR packets if enabled).
1167 virtual Action OnReceiveRtcp(const uint8_t* packet,
1168 size_t length) OVERRIDE {
1169 RTCPUtility::RTCPParserV2 parser(packet, length, true);
1170 EXPECT_TRUE(parser.IsValid());
1171
1172 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
1173 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
1174 if (packet_type == RTCPUtility::kRtcpRrCode) {
1175 ++sent_rtcp_rr_;
1176 } else if (packet_type ==
1177 RTCPUtility::kRtcpXrReceiverReferenceTimeCode) {
1178 ++sent_rtcp_rrtr_;
1179 }
1180 EXPECT_NE(packet_type, RTCPUtility::kRtcpSrCode);
1181 EXPECT_NE(packet_type, RTCPUtility::kRtcpXrDlrrReportBlockItemCode);
1182 packet_type = parser.Iterate();
1183 }
1184 return SEND_PACKET;
1185 }
1186 // Send stream should send SR packets (and DLRR packets if enabled).
1187 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
1188 RTCPUtility::RTCPParserV2 parser(packet, length, true);
1189 EXPECT_TRUE(parser.IsValid());
1190
1191 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
1192 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
1193 if (packet_type == RTCPUtility::kRtcpSrCode) {
1194 ++sent_rtcp_sr_;
1195 } else if (packet_type == RTCPUtility::kRtcpXrDlrrReportBlockItemCode) {
1196 ++sent_rtcp_dlrr_;
1197 }
1198 EXPECT_NE(packet_type, RTCPUtility::kRtcpXrReceiverReferenceTimeCode);
1199 packet_type = parser.Iterate();
1200 }
1201 if (sent_rtcp_sr_ > kNumRtcpReportPacketsToObserve &&
1202 sent_rtcp_rr_ > kNumRtcpReportPacketsToObserve) {
1203 if (enable_rrtr_) {
1204 EXPECT_GT(sent_rtcp_rrtr_, 0);
1205 EXPECT_GT(sent_rtcp_dlrr_, 0);
1206 } else {
1207 EXPECT_EQ(0, sent_rtcp_rrtr_);
1208 EXPECT_EQ(0, sent_rtcp_dlrr_);
1209 }
1210 observation_complete_->Set();
1211 }
1212 return SEND_PACKET;
1213 }
1214
1215 virtual void ModifyConfigs(
1216 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001217 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001218 std::vector<VideoStream>* video_streams) OVERRIDE {
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001219 (*receive_configs)[0].rtp.rtcp_mode = newapi::kRtcpReducedSize;
1220 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report =
1221 enable_rrtr_;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001222 }
1223
1224 virtual void PerformTest() OVERRIDE {
1225 EXPECT_EQ(kEventSignaled, Wait())
1226 << "Timed out while waiting for RTCP SR/RR packets to be sent.";
1227 }
1228
1229 bool enable_rrtr_;
1230 int sent_rtcp_sr_;
1231 int sent_rtcp_rr_;
1232 int sent_rtcp_rrtr_;
1233 int sent_rtcp_dlrr_;
1234 } test(enable_rrtr);
1235
1236 RunBaseTest(&test);
1237}
1238
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001239void EndToEndTest::TestSendsSetSsrcs(size_t num_ssrcs,
1240 bool send_single_ssrc_first) {
1241 class SendsSetSsrcs : public test::EndToEndTest {
1242 public:
1243 SendsSetSsrcs(const uint32_t* ssrcs,
1244 size_t num_ssrcs,
1245 bool send_single_ssrc_first)
1246 : EndToEndTest(kDefaultTimeoutMs),
1247 num_ssrcs_(num_ssrcs),
1248 send_single_ssrc_first_(send_single_ssrc_first),
1249 ssrcs_to_observe_(num_ssrcs),
1250 expect_single_ssrc_(send_single_ssrc_first) {
1251 for (size_t i = 0; i < num_ssrcs; ++i)
1252 valid_ssrcs_[ssrcs[i]] = true;
1253 }
1254
1255 private:
1256 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1257 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +00001258 EXPECT_TRUE(parser_->Parse(packet, length, &header));
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001259
1260 EXPECT_TRUE(valid_ssrcs_[header.ssrc])
1261 << "Received unknown SSRC: " << header.ssrc;
1262
1263 if (!valid_ssrcs_[header.ssrc])
1264 observation_complete_->Set();
1265
1266 if (!is_observed_[header.ssrc]) {
1267 is_observed_[header.ssrc] = true;
1268 --ssrcs_to_observe_;
1269 if (expect_single_ssrc_) {
1270 expect_single_ssrc_ = false;
1271 observation_complete_->Set();
1272 }
1273 }
1274
1275 if (ssrcs_to_observe_ == 0)
1276 observation_complete_->Set();
1277
1278 return SEND_PACKET;
1279 }
1280
1281 virtual size_t GetNumStreams() const OVERRIDE { return num_ssrcs_; }
1282
1283 virtual void ModifyConfigs(
1284 VideoSendStream::Config* send_config,
1285 std::vector<VideoReceiveStream::Config>* receive_configs,
1286 std::vector<VideoStream>* video_streams) OVERRIDE {
1287 if (num_ssrcs_ > 1) {
1288 // Set low simulcast bitrates to not have to wait for bandwidth ramp-up.
1289 for (size_t i = 0; i < video_streams->size(); ++i) {
1290 (*video_streams)[i].min_bitrate_bps = 10000;
1291 (*video_streams)[i].target_bitrate_bps = 15000;
1292 (*video_streams)[i].max_bitrate_bps = 20000;
1293 }
1294 }
1295
1296 all_streams_ = *video_streams;
1297 if (send_single_ssrc_first_)
1298 video_streams->resize(1);
1299 }
1300
1301 virtual void OnStreamsCreated(
1302 VideoSendStream* send_stream,
1303 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE {
1304 send_stream_ = send_stream;
1305 }
1306
1307 virtual void PerformTest() OVERRIDE {
1308 EXPECT_EQ(kEventSignaled, Wait())
1309 << "Timed out while waiting for "
1310 << (send_single_ssrc_first_ ? "first SSRC." : "SSRCs.");
1311
1312 if (send_single_ssrc_first_) {
1313 // Set full simulcast and continue with the rest of the SSRCs.
1314 send_stream_->ReconfigureVideoEncoder(all_streams_, NULL);
1315 EXPECT_EQ(kEventSignaled, Wait())
1316 << "Timed out while waiting on additional SSRCs.";
1317 }
1318 }
1319
1320 private:
1321 std::map<uint32_t, bool> valid_ssrcs_;
1322 std::map<uint32_t, bool> is_observed_;
1323
1324 const size_t num_ssrcs_;
1325 const bool send_single_ssrc_first_;
1326
1327 size_t ssrcs_to_observe_;
1328 bool expect_single_ssrc_;
1329
1330 VideoSendStream* send_stream_;
1331 std::vector<VideoStream> all_streams_;
1332 } test(kSendSsrcs, num_ssrcs, send_single_ssrc_first);
1333
1334 RunBaseTest(&test);
1335}
1336
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001337TEST_F(EndToEndTest, GetStats) {
1338 class StatsObserver : public test::EndToEndTest, public I420FrameCallback {
1339 public:
1340 StatsObserver()
1341 : EndToEndTest(kLongTimeoutMs),
1342 receive_stream_(NULL),
1343 send_stream_(NULL),
1344 expected_receive_ssrc_(),
1345 expected_send_ssrcs_(),
1346 check_stats_event_(EventWrapper::Create()) {}
1347
1348 private:
1349 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1350 check_stats_event_->Set();
1351 return SEND_PACKET;
1352 }
1353
1354 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) OVERRIDE {
1355 check_stats_event_->Set();
1356 return SEND_PACKET;
1357 }
1358
1359 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) OVERRIDE {
1360 check_stats_event_->Set();
1361 return SEND_PACKET;
1362 }
1363
1364 virtual Action OnReceiveRtcp(const uint8_t* packet,
1365 size_t length) OVERRIDE {
1366 check_stats_event_->Set();
1367 return SEND_PACKET;
1368 }
1369
1370 virtual void FrameCallback(I420VideoFrame* video_frame) OVERRIDE {
1371 // Ensure that we have at least 5ms send side delay.
1372 int64_t render_time = video_frame->render_time_ms();
1373 if (render_time > 0)
1374 video_frame->set_render_time_ms(render_time - 5);
1375 }
1376
1377 bool CheckReceiveStats() {
1378 assert(receive_stream_ != NULL);
1379 VideoReceiveStream::Stats stats = receive_stream_->GetStats();
1380 EXPECT_EQ(expected_receive_ssrc_, stats.ssrc);
1381
1382 // Make sure all fields have been populated.
1383
1384 receive_stats_filled_["IncomingRate"] |=
1385 stats.network_frame_rate != 0 || stats.bitrate_bps != 0;
1386
1387 receive_stats_filled_["FrameCallback"] |= stats.decode_frame_rate != 0;
1388
1389 receive_stats_filled_["FrameRendered"] |= stats.render_frame_rate != 0;
1390
1391 receive_stats_filled_["StatisticsUpdated"] |=
1392 stats.rtcp_stats.cumulative_lost != 0 ||
1393 stats.rtcp_stats.extended_max_sequence_number != 0 ||
1394 stats.rtcp_stats.fraction_lost != 0 || stats.rtcp_stats.jitter != 0;
1395
1396 receive_stats_filled_["DataCountersUpdated"] |=
1397 stats.rtp_stats.bytes != 0 || stats.rtp_stats.fec_packets != 0 ||
1398 stats.rtp_stats.header_bytes != 0 || stats.rtp_stats.packets != 0 ||
1399 stats.rtp_stats.padding_bytes != 0 ||
1400 stats.rtp_stats.retransmitted_packets != 0;
1401
1402 receive_stats_filled_["CodecStats"] |=
1403 stats.avg_delay_ms != 0 || stats.discarded_packets != 0 ||
1404 stats.key_frames != 0 || stats.delta_frames != 0;
1405
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001406 return AllStatsFilled(receive_stats_filled_);
1407 }
1408
1409 bool CheckSendStats() {
1410 assert(send_stream_ != NULL);
1411 VideoSendStream::Stats stats = send_stream_->GetStats();
1412
1413 send_stats_filled_["NumStreams"] |=
1414 stats.substreams.size() == expected_send_ssrcs_.size();
1415
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001416 for (std::map<uint32_t, StreamStats>::const_iterator it =
1417 stats.substreams.begin();
1418 it != stats.substreams.end();
1419 ++it) {
1420 EXPECT_TRUE(expected_send_ssrcs_.find(it->first) !=
1421 expected_send_ssrcs_.end());
1422
1423 send_stats_filled_[CompoundKey("IncomingRate", it->first)] |=
1424 stats.input_frame_rate != 0;
1425
1426 const StreamStats& stream_stats = it->second;
1427
1428 send_stats_filled_[CompoundKey("StatisticsUpdated", it->first)] |=
1429 stream_stats.rtcp_stats.cumulative_lost != 0 ||
1430 stream_stats.rtcp_stats.extended_max_sequence_number != 0 ||
1431 stream_stats.rtcp_stats.fraction_lost != 0;
1432
1433 send_stats_filled_[CompoundKey("DataCountersUpdated", it->first)] |=
1434 stream_stats.rtp_stats.fec_packets != 0 ||
1435 stream_stats.rtp_stats.padding_bytes != 0 ||
1436 stream_stats.rtp_stats.retransmitted_packets != 0 ||
1437 stream_stats.rtp_stats.packets != 0;
1438
1439 send_stats_filled_[CompoundKey("BitrateStatisticsObserver",
1440 it->first)] |=
1441 stream_stats.bitrate_bps != 0;
1442
1443 send_stats_filled_[CompoundKey("FrameCountObserver", it->first)] |=
1444 stream_stats.delta_frames != 0 || stream_stats.key_frames != 0;
1445
1446 send_stats_filled_[CompoundKey("OutgoingRate", it->first)] |=
1447 stats.encode_frame_rate != 0;
stefan@webrtc.org168f23f2014-07-11 13:44:02 +00001448
1449 send_stats_filled_[CompoundKey("Delay", it->first)] |=
1450 stream_stats.avg_delay_ms != 0 || stream_stats.max_delay_ms != 0;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001451 }
1452
1453 return AllStatsFilled(send_stats_filled_);
1454 }
1455
1456 std::string CompoundKey(const char* name, uint32_t ssrc) {
1457 std::ostringstream oss;
1458 oss << name << "_" << ssrc;
1459 return oss.str();
1460 }
1461
1462 bool AllStatsFilled(const std::map<std::string, bool>& stats_map) {
1463 for (std::map<std::string, bool>::const_iterator it = stats_map.begin();
1464 it != stats_map.end();
1465 ++it) {
1466 if (!it->second)
1467 return false;
1468 }
1469 return true;
1470 }
1471
1472 virtual void ModifyConfigs(
1473 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001474 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001475 std::vector<VideoStream>* video_streams) OVERRIDE {
1476 send_config->pre_encode_callback = this; // Used to inject delay.
1477 send_config->rtp.c_name = "SomeCName";
1478
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001479 expected_receive_ssrc_ = (*receive_configs)[0].rtp.local_ssrc;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001480 const std::vector<uint32_t>& ssrcs = send_config->rtp.ssrcs;
1481 for (size_t i = 0; i < ssrcs.size(); ++i)
1482 expected_send_ssrcs_.insert(ssrcs[i]);
1483
1484 expected_cname_ = send_config->rtp.c_name;
1485 }
1486
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001487 virtual void OnStreamsCreated(
1488 VideoSendStream* send_stream,
1489 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001490 send_stream_ = send_stream;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001491 receive_stream_ = receive_streams[0];
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001492 }
1493
1494 virtual void PerformTest() OVERRIDE {
1495 Clock* clock = Clock::GetRealTimeClock();
1496 int64_t now = clock->TimeInMilliseconds();
1497 int64_t stop_time = now + test::CallTest::kLongTimeoutMs;
1498 bool receive_ok = false;
1499 bool send_ok = false;
1500
1501 while (now < stop_time) {
1502 if (!receive_ok)
1503 receive_ok = CheckReceiveStats();
1504 if (!send_ok)
1505 send_ok = CheckSendStats();
1506
1507 if (receive_ok && send_ok)
1508 return;
1509
1510 int64_t time_until_timout_ = stop_time - now;
1511 if (time_until_timout_ > 0)
1512 check_stats_event_->Wait(time_until_timout_);
1513 now = clock->TimeInMilliseconds();
1514 }
1515
1516 ADD_FAILURE() << "Timed out waiting for filled stats.";
1517 for (std::map<std::string, bool>::const_iterator it =
1518 receive_stats_filled_.begin();
1519 it != receive_stats_filled_.end();
1520 ++it) {
1521 if (!it->second) {
1522 ADD_FAILURE() << "Missing receive stats: " << it->first;
1523 }
1524 }
1525
1526 for (std::map<std::string, bool>::const_iterator it =
1527 send_stats_filled_.begin();
1528 it != send_stats_filled_.end();
1529 ++it) {
1530 if (!it->second) {
1531 ADD_FAILURE() << "Missing send stats: " << it->first;
1532 }
1533 }
1534 }
1535
1536 VideoReceiveStream* receive_stream_;
1537 std::map<std::string, bool> receive_stats_filled_;
1538
1539 VideoSendStream* send_stream_;
1540 std::map<std::string, bool> send_stats_filled_;
1541
1542 uint32_t expected_receive_ssrc_;
1543 std::set<uint32_t> expected_send_ssrcs_;
1544 std::string expected_cname_;
1545
1546 scoped_ptr<EventWrapper> check_stats_event_;
1547 } test;
1548
1549 RunBaseTest(&test);
1550}
1551
1552TEST_F(EndToEndTest, ReceiverReferenceTimeReportEnabled) {
1553 TestXrReceiverReferenceTimeReport(true);
1554}
1555
1556TEST_F(EndToEndTest, ReceiverReferenceTimeReportDisabled) {
1557 TestXrReceiverReferenceTimeReport(false);
1558}
1559
1560TEST_F(EndToEndTest, TestReceivedRtpPacketStats) {
1561 static const size_t kNumRtpPacketsToSend = 5;
1562 class ReceivedRtpStatsObserver : public test::EndToEndTest {
1563 public:
1564 ReceivedRtpStatsObserver()
1565 : EndToEndTest(kDefaultTimeoutMs),
1566 receive_stream_(NULL),
1567 sent_rtp_(0) {}
1568
1569 private:
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001570 virtual void OnStreamsCreated(
1571 VideoSendStream* send_stream,
1572 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE {
1573 receive_stream_ = receive_streams[0];
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001574 }
1575
1576 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1577 if (sent_rtp_ >= kNumRtpPacketsToSend) {
1578 VideoReceiveStream::Stats stats = receive_stream_->GetStats();
1579 if (kNumRtpPacketsToSend == stats.rtp_stats.packets) {
1580 observation_complete_->Set();
1581 }
1582 return DROP_PACKET;
1583 }
1584 ++sent_rtp_;
1585 return SEND_PACKET;
1586 }
1587
1588 virtual void PerformTest() OVERRIDE {
1589 EXPECT_EQ(kEventSignaled, Wait())
1590 << "Timed out while verifying number of received RTP packets.";
1591 }
1592
1593 VideoReceiveStream* receive_stream_;
1594 uint32_t sent_rtp_;
1595 } test;
1596
1597 RunBaseTest(&test);
1598}
1599
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001600TEST_F(EndToEndTest, SendsSetSsrc) { TestSendsSetSsrcs(1, false); }
1601
1602TEST_F(EndToEndTest, SendsSetSimulcastSsrcs) {
1603 TestSendsSetSsrcs(kNumSsrcs, false);
1604}
1605
1606TEST_F(EndToEndTest, CanSwitchToUseAllSsrcs) {
1607 TestSendsSetSsrcs(kNumSsrcs, true);
1608}
1609
mflodman@webrtc.orgf9460682014-07-24 16:41:25 +00001610TEST_F(EndToEndTest, DISABLED_RedundantPayloadsTransmittedOnAllSsrcs) {
pbos@webrtc.org20c1f562014-07-04 10:58:12 +00001611 class ObserveRedundantPayloads: public test::EndToEndTest {
1612 public:
1613 ObserveRedundantPayloads()
1614 : EndToEndTest(kDefaultTimeoutMs), ssrcs_to_observe_(kNumSsrcs) {
pbos@webrtc.orgdde16f12014-08-05 23:35:43 +00001615 for (size_t i = 0; i < kNumSsrcs; ++i) {
pbos@webrtc.org20c1f562014-07-04 10:58:12 +00001616 registered_rtx_ssrc_[kSendRtxSsrcs[i]] = true;
1617 }
1618 }
1619
1620 private:
1621 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1622 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +00001623 EXPECT_TRUE(parser_->Parse(packet, length, &header));
pbos@webrtc.org20c1f562014-07-04 10:58:12 +00001624
1625 if (!registered_rtx_ssrc_[header.ssrc])
1626 return SEND_PACKET;
1627
1628 EXPECT_LE(static_cast<size_t>(header.headerLength + header.paddingLength),
1629 length);
1630 const bool packet_is_redundant_payload =
1631 static_cast<size_t>(header.headerLength + header.paddingLength) <
1632 length;
1633
1634 if (!packet_is_redundant_payload)
1635 return SEND_PACKET;
1636
1637 if (!observed_redundant_retransmission_[header.ssrc]) {
1638 observed_redundant_retransmission_[header.ssrc] = true;
1639 if (--ssrcs_to_observe_ == 0)
1640 observation_complete_->Set();
1641 }
1642
1643 return SEND_PACKET;
1644 }
1645
1646 virtual size_t GetNumStreams() const OVERRIDE { return kNumSsrcs; }
1647
1648 virtual void ModifyConfigs(
1649 VideoSendStream::Config* send_config,
1650 std::vector<VideoReceiveStream::Config>* receive_configs,
1651 std::vector<VideoStream>* video_streams) OVERRIDE {
1652 // Set low simulcast bitrates to not have to wait for bandwidth ramp-up.
1653 for (size_t i = 0; i < video_streams->size(); ++i) {
1654 (*video_streams)[i].min_bitrate_bps = 10000;
1655 (*video_streams)[i].target_bitrate_bps = 15000;
1656 (*video_streams)[i].max_bitrate_bps = 20000;
1657 }
1658 // Significantly higher than max bitrates for all video streams -> forcing
1659 // padding to trigger redundant padding on all RTX SSRCs.
1660 send_config->rtp.min_transmit_bitrate_bps = 100000;
1661
1662 send_config->rtp.rtx.payload_type = kSendRtxPayloadType;
1663 send_config->rtp.rtx.pad_with_redundant_payloads = true;
1664
1665 for (size_t i = 0; i < kNumSsrcs; ++i)
1666 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]);
1667 }
1668
1669 virtual void PerformTest() OVERRIDE {
1670 EXPECT_EQ(kEventSignaled, Wait())
1671 << "Timed out while waiting for redundant payloads on all SSRCs.";
1672 }
1673
1674 private:
1675 size_t ssrcs_to_observe_;
1676 std::map<uint32_t, bool> observed_redundant_retransmission_;
1677 std::map<uint32_t, bool> registered_rtx_ssrc_;
1678 } test;
1679
1680 RunBaseTest(&test);
1681}
1682
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001683void EndToEndTest::TestRtpStatePreservation(bool use_rtx) {
1684 static const uint32_t kMaxSequenceNumberGap = 100;
1685 static const uint64_t kMaxTimestampGap = kDefaultTimeoutMs * 90;
1686 class RtpSequenceObserver : public test::RtpRtcpObserver {
1687 public:
pbos@webrtc.orgdde16f12014-08-05 23:35:43 +00001688 explicit RtpSequenceObserver(bool use_rtx)
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001689 : test::RtpRtcpObserver(kDefaultTimeoutMs),
1690 crit_(CriticalSectionWrapper::CreateCriticalSection()),
1691 ssrcs_to_observe_(kNumSsrcs) {
1692 for (size_t i = 0; i < kNumSsrcs; ++i) {
1693 configured_ssrcs_[kSendSsrcs[i]] = true;
1694 if (use_rtx)
1695 configured_ssrcs_[kSendRtxSsrcs[i]] = true;
1696 }
1697 }
1698
1699 void ResetExpectedSsrcs(size_t num_expected_ssrcs) {
1700 CriticalSectionScoped lock(crit_.get());
1701 ssrc_observed_.clear();
1702 ssrcs_to_observe_ = num_expected_ssrcs;
1703 }
1704
1705 private:
1706 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1707 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +00001708 EXPECT_TRUE(parser_->Parse(packet, length, &header));
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001709 const uint32_t ssrc = header.ssrc;
1710 const uint16_t sequence_number = header.sequenceNumber;
1711 const uint32_t timestamp = header.timestamp;
1712 const bool only_padding =
1713 static_cast<size_t>(header.headerLength + header.paddingLength) ==
1714 length;
1715
1716 EXPECT_TRUE(configured_ssrcs_[ssrc])
1717 << "Received SSRC that wasn't configured: " << ssrc;
1718
1719 std::map<uint32_t, uint16_t>::iterator it =
1720 last_observed_sequence_number_.find(header.ssrc);
1721 if (it == last_observed_sequence_number_.end()) {
1722 last_observed_sequence_number_[ssrc] = sequence_number;
1723 last_observed_timestamp_[ssrc] = timestamp;
1724 } else {
1725 // Verify sequence numbers are reasonably close.
1726 uint32_t extended_sequence_number = sequence_number;
1727 // Check for roll-over.
1728 if (sequence_number < last_observed_sequence_number_[ssrc])
1729 extended_sequence_number += 0xFFFFu + 1;
1730 EXPECT_LE(
1731 extended_sequence_number - last_observed_sequence_number_[ssrc],
1732 kMaxSequenceNumberGap)
1733 << "Gap in sequence numbers ("
1734 << last_observed_sequence_number_[ssrc] << " -> " << sequence_number
1735 << ") too large for SSRC: " << ssrc << ".";
1736 last_observed_sequence_number_[ssrc] = sequence_number;
1737
1738 // TODO(pbos): Remove this check if we ever have monotonically
1739 // increasing timestamps. Right now padding packets add a delta which
1740 // can cause reordering between padding packets and regular packets,
1741 // hence we drop padding-only packets to not flake.
1742 if (only_padding) {
1743 // Verify that timestamps are reasonably close.
1744 uint64_t extended_timestamp = timestamp;
1745 // Check for roll-over.
1746 if (timestamp < last_observed_timestamp_[ssrc])
1747 extended_timestamp += static_cast<uint64_t>(0xFFFFFFFFu) + 1;
1748 EXPECT_LE(extended_timestamp - last_observed_timestamp_[ssrc],
1749 kMaxTimestampGap)
1750 << "Gap in timestamps (" << last_observed_timestamp_[ssrc]
1751 << " -> " << timestamp << ") too large for SSRC: " << ssrc << ".";
1752 }
1753 last_observed_timestamp_[ssrc] = timestamp;
1754 }
1755
1756 CriticalSectionScoped lock(crit_.get());
1757 // Wait for media packets on all ssrcs.
1758 if (!ssrc_observed_[ssrc] && !only_padding) {
1759 ssrc_observed_[ssrc] = true;
1760 if (--ssrcs_to_observe_ == 0)
1761 observation_complete_->Set();
1762 }
1763
1764 return SEND_PACKET;
1765 }
1766
1767 std::map<uint32_t, uint16_t> last_observed_sequence_number_;
1768 std::map<uint32_t, uint32_t> last_observed_timestamp_;
1769 std::map<uint32_t, bool> configured_ssrcs_;
1770
1771 scoped_ptr<CriticalSectionWrapper> crit_;
1772 size_t ssrcs_to_observe_ GUARDED_BY(crit_);
1773 std::map<uint32_t, bool> ssrc_observed_ GUARDED_BY(crit_);
1774 } observer(use_rtx);
1775
1776 CreateCalls(Call::Config(observer.SendTransport()),
1777 Call::Config(observer.ReceiveTransport()));
1778 observer.SetReceivers(sender_call_->Receiver(), NULL);
1779
1780 CreateSendConfig(kNumSsrcs);
1781
1782 if (use_rtx) {
1783 for (size_t i = 0; i < kNumSsrcs; ++i) {
1784 send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]);
1785 }
1786 send_config_.rtp.rtx.payload_type = kSendRtxPayloadType;
1787 }
1788
1789 // Lower bitrates so that all streams send initially.
1790 for (size_t i = 0; i < video_streams_.size(); ++i) {
1791 video_streams_[i].min_bitrate_bps = 10000;
1792 video_streams_[i].target_bitrate_bps = 15000;
1793 video_streams_[i].max_bitrate_bps = 20000;
1794 }
1795
1796 CreateMatchingReceiveConfigs();
1797
1798 CreateStreams();
1799 CreateFrameGeneratorCapturer();
1800
1801 Start();
1802 EXPECT_EQ(kEventSignaled, observer.Wait())
1803 << "Timed out waiting for all SSRCs to send packets.";
1804
1805 // Test stream resetting more than once to make sure that the state doesn't
1806 // get set once (this could be due to using std::map::insert for instance).
1807 for (size_t i = 0; i < 3; ++i) {
1808 frame_generator_capturer_->Stop();
1809 sender_call_->DestroyVideoSendStream(send_stream_);
1810
1811 // Re-create VideoSendStream with only one stream.
1812 std::vector<VideoStream> one_stream = video_streams_;
1813 one_stream.resize(1);
1814 send_stream_ =
1815 sender_call_->CreateVideoSendStream(send_config_, one_stream, NULL);
1816 send_stream_->Start();
1817 CreateFrameGeneratorCapturer();
1818 frame_generator_capturer_->Start();
1819
1820 observer.ResetExpectedSsrcs(1);
1821 EXPECT_EQ(kEventSignaled, observer.Wait())
1822 << "Timed out waiting for single RTP packet.";
1823
1824 // Reconfigure back to use all streams.
1825 send_stream_->ReconfigureVideoEncoder(video_streams_, NULL);
1826 observer.ResetExpectedSsrcs(kNumSsrcs);
1827 EXPECT_EQ(kEventSignaled, observer.Wait())
1828 << "Timed out waiting for all SSRCs to send packets.";
1829
1830 // Reconfigure down to one stream.
1831 send_stream_->ReconfigureVideoEncoder(one_stream, NULL);
1832 observer.ResetExpectedSsrcs(1);
1833 EXPECT_EQ(kEventSignaled, observer.Wait())
1834 << "Timed out waiting for single RTP packet.";
1835
1836 // Reconfigure back to use all streams.
1837 send_stream_->ReconfigureVideoEncoder(video_streams_, NULL);
1838 observer.ResetExpectedSsrcs(kNumSsrcs);
1839 EXPECT_EQ(kEventSignaled, observer.Wait())
1840 << "Timed out waiting for all SSRCs to send packets.";
1841 }
1842
1843 observer.StopSending();
1844
1845 Stop();
1846 DestroyStreams();
1847}
1848
aluebs@webrtc.orgb623c5c2014-08-26 14:22:51 +00001849TEST_F(EndToEndTest, DISABLED_RestartingSendStreamPreservesRtpState) {
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001850 TestRtpStatePreservation(false);
1851}
1852
1853TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpStatesWithRtx) {
1854 TestRtpStatePreservation(true);
1855}
1856
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00001857TEST_F(EndToEndTest, RespectsNetworkState) {
1858 // TODO(pbos): Remove accepted downtime packets etc. when signaling network
1859 // down blocks until no more packets will be sent.
1860
1861 // Pacer will send from its packet list and then send required padding before
1862 // checking paused_ again. This should be enough for one round of pacing,
1863 // otherwise increase.
1864 static const int kNumAcceptedDowntimeRtp = 5;
1865 // A single RTCP may be in the pipeline.
1866 static const int kNumAcceptedDowntimeRtcp = 1;
1867 class NetworkStateTest : public test::EndToEndTest, public test::FakeEncoder {
1868 public:
1869 NetworkStateTest()
1870 : EndToEndTest(kDefaultTimeoutMs),
1871 FakeEncoder(Clock::GetRealTimeClock()),
1872 test_crit_(CriticalSectionWrapper::CreateCriticalSection()),
1873 encoded_frames_(EventWrapper::Create()),
1874 sender_packets_(EventWrapper::Create()),
1875 receiver_packets_(EventWrapper::Create()),
1876 sender_state_(Call::kNetworkUp),
1877 down_sender_rtp_(0),
1878 down_sender_rtcp_(0),
1879 receiver_state_(Call::kNetworkUp),
1880 down_receiver_rtcp_(0),
1881 down_frames_(0) {}
1882
1883 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1884 CriticalSectionScoped lock(test_crit_.get());
1885 if (sender_state_ == Call::kNetworkDown) {
1886 ++down_sender_rtp_;
1887 EXPECT_LE(down_sender_rtp_, kNumAcceptedDowntimeRtp)
1888 << "RTP sent during sender-side downtime.";
1889 if (down_sender_rtp_> kNumAcceptedDowntimeRtp)
1890 sender_packets_->Set();
1891 } else {
1892 sender_packets_->Set();
1893 }
1894 return SEND_PACKET;
1895 }
1896
1897 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) OVERRIDE {
1898 CriticalSectionScoped lock(test_crit_.get());
1899 if (sender_state_ == Call::kNetworkDown) {
1900 ++down_sender_rtcp_;
1901 EXPECT_LE(down_sender_rtcp_, kNumAcceptedDowntimeRtcp)
1902 << "RTCP sent during sender-side downtime.";
1903 if (down_sender_rtcp_ > kNumAcceptedDowntimeRtcp)
1904 sender_packets_->Set();
1905 } else {
1906 sender_packets_->Set();
1907 }
1908 return SEND_PACKET;
1909 }
1910
1911 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) OVERRIDE {
1912 ADD_FAILURE() << "Unexpected receiver RTP, should not be sending.";
1913 return SEND_PACKET;
1914 }
1915
1916 virtual Action OnReceiveRtcp(const uint8_t* packet,
1917 size_t length) OVERRIDE {
1918 CriticalSectionScoped lock(test_crit_.get());
1919 if (receiver_state_ == Call::kNetworkDown) {
1920 ++down_receiver_rtcp_;
1921 EXPECT_LE(down_receiver_rtcp_, kNumAcceptedDowntimeRtcp)
1922 << "RTCP sent during receiver-side downtime.";
1923 if (down_receiver_rtcp_ > kNumAcceptedDowntimeRtcp)
1924 receiver_packets_->Set();
1925 } else {
1926 receiver_packets_->Set();
1927 }
1928 return SEND_PACKET;
1929 }
1930
1931 virtual void OnCallsCreated(Call* sender_call,
1932 Call* receiver_call) OVERRIDE {
1933 sender_call_ = sender_call;
1934 receiver_call_ = receiver_call;
1935 }
1936
1937 virtual void ModifyConfigs(
1938 VideoSendStream::Config* send_config,
1939 std::vector<VideoReceiveStream::Config>* receive_configs,
1940 std::vector<VideoStream>* video_streams) OVERRIDE {
1941 send_config->encoder_settings.encoder = this;
1942 }
1943
1944 virtual void PerformTest() OVERRIDE {
1945 EXPECT_EQ(kEventSignaled, encoded_frames_->Wait(kDefaultTimeoutMs))
1946 << "No frames received by the encoder.";
1947 EXPECT_EQ(kEventSignaled, sender_packets_->Wait(kDefaultTimeoutMs))
1948 << "Timed out waiting for send-side packets.";
1949 EXPECT_EQ(kEventSignaled, receiver_packets_->Wait(kDefaultTimeoutMs))
1950 << "Timed out waiting for receiver-side packets.";
1951
1952 // Sender-side network down.
1953 sender_call_->SignalNetworkState(Call::kNetworkDown);
1954 {
1955 CriticalSectionScoped lock(test_crit_.get());
1956 sender_packets_->Reset(); // Earlier packets should not count.
1957 sender_state_ = Call::kNetworkDown;
1958 }
1959 EXPECT_EQ(kEventTimeout, sender_packets_->Wait(kSilenceTimeoutMs))
1960 << "Packets sent during sender-network downtime.";
1961 EXPECT_EQ(kEventSignaled, receiver_packets_->Wait(kDefaultTimeoutMs))
1962 << "Timed out waiting for receiver-side packets.";
1963 // Receiver-side network down.
1964 receiver_call_->SignalNetworkState(Call::kNetworkDown);
1965 {
1966 CriticalSectionScoped lock(test_crit_.get());
1967 receiver_packets_->Reset(); // Earlier packets should not count.
1968 receiver_state_ = Call::kNetworkDown;
1969 }
1970 EXPECT_EQ(kEventTimeout, receiver_packets_->Wait(kSilenceTimeoutMs))
1971 << "Packets sent during receiver-network downtime.";
1972
1973 // Network back up again for both.
1974 {
1975 CriticalSectionScoped lock(test_crit_.get());
1976 sender_packets_->Reset(); // Earlier packets should not count.
1977 receiver_packets_->Reset(); // Earlier packets should not count.
1978 sender_state_ = receiver_state_ = Call::kNetworkUp;
1979 }
1980 sender_call_->SignalNetworkState(Call::kNetworkUp);
1981 receiver_call_->SignalNetworkState(Call::kNetworkUp);
1982 EXPECT_EQ(kEventSignaled, sender_packets_->Wait(kDefaultTimeoutMs))
1983 << "Timed out waiting for send-side packets.";
1984 EXPECT_EQ(kEventSignaled, receiver_packets_->Wait(kDefaultTimeoutMs))
1985 << "Timed out waiting for receiver-side packets.";
1986 }
1987
1988 virtual int32_t Encode(const I420VideoFrame& input_image,
1989 const CodecSpecificInfo* codec_specific_info,
1990 const std::vector<VideoFrameType>* frame_types)
1991 OVERRIDE {
1992 {
1993 CriticalSectionScoped lock(test_crit_.get());
1994 if (sender_state_ == Call::kNetworkDown) {
1995 ++down_frames_;
1996 EXPECT_LE(down_frames_, 1)
1997 << "Encoding more than one frame while network is down.";
1998 if (down_frames_ > 1)
1999 encoded_frames_->Set();
2000 } else {
2001 encoded_frames_->Set();
2002 }
2003 }
2004 return test::FakeEncoder::Encode(
2005 input_image, codec_specific_info, frame_types);
2006 }
2007
2008 private:
2009 const scoped_ptr<CriticalSectionWrapper> test_crit_;
2010 scoped_ptr<EventWrapper> encoded_frames_;
2011 scoped_ptr<EventWrapper> sender_packets_;
2012 scoped_ptr<EventWrapper> receiver_packets_;
2013 Call* sender_call_;
2014 Call* receiver_call_;
2015 Call::NetworkState sender_state_ GUARDED_BY(test_crit_);
2016 int down_sender_rtp_ GUARDED_BY(test_crit_);
2017 int down_sender_rtcp_ GUARDED_BY(test_crit_);
2018 Call::NetworkState receiver_state_ GUARDED_BY(test_crit_);
2019 int down_receiver_rtcp_ GUARDED_BY(test_crit_);
2020 int down_frames_ GUARDED_BY(test_crit_);
2021 } test;
2022
2023 RunBaseTest(&test);
2024}
2025
2026TEST_F(EndToEndTest, NewSendStreamsRespectNetworkDown) {
2027 class UnusedEncoder : public test::FakeEncoder {
2028 public:
2029 UnusedEncoder() : FakeEncoder(Clock::GetRealTimeClock()) {}
2030 virtual int32_t Encode(const I420VideoFrame& input_image,
2031 const CodecSpecificInfo* codec_specific_info,
2032 const std::vector<VideoFrameType>* frame_types)
2033 OVERRIDE {
2034 ADD_FAILURE() << "Unexpected frame encode.";
2035 return test::FakeEncoder::Encode(
2036 input_image, codec_specific_info, frame_types);
2037 }
2038 };
2039
2040 UnusedTransport transport;
2041 CreateSenderCall(Call::Config(&transport));
2042 sender_call_->SignalNetworkState(Call::kNetworkDown);
2043
2044 CreateSendConfig(1);
2045 UnusedEncoder unused_encoder;
2046 send_config_.encoder_settings.encoder = &unused_encoder;
2047 CreateStreams();
2048 CreateFrameGeneratorCapturer();
2049
2050 Start();
2051 SleepMs(kSilenceTimeoutMs);
2052 Stop();
2053
2054 DestroyStreams();
2055}
2056
2057TEST_F(EndToEndTest, NewReceiveStreamsRespectNetworkDown) {
2058 test::DirectTransport sender_transport;
2059 CreateSenderCall(Call::Config(&sender_transport));
2060 UnusedTransport transport;
2061 CreateReceiverCall(Call::Config(&transport));
2062 sender_transport.SetReceiver(receiver_call_->Receiver());
2063
2064 receiver_call_->SignalNetworkState(Call::kNetworkDown);
2065
2066 CreateSendConfig(1);
2067 CreateMatchingReceiveConfigs();
2068 CreateStreams();
2069 CreateFrameGeneratorCapturer();
2070
2071 Start();
2072 SleepMs(kSilenceTimeoutMs);
2073 Stop();
2074
2075 sender_transport.StopSending();
2076
2077 DestroyStreams();
2078}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00002079} // namespace webrtc