blob: 86b8009c4919b23149e247c199ef9e6c466aa4c3 [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"
marpan@webrtc.org5b883172014-11-01 06:10:48 +000022#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
23#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
24#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000025#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
26#include "webrtc/system_wrappers/interface/event_wrapper.h"
27#include "webrtc/system_wrappers/interface/scoped_ptr.h"
28#include "webrtc/system_wrappers/interface/sleep.h"
29#include "webrtc/test/call_test.h"
30#include "webrtc/test/direct_transport.h"
31#include "webrtc/test/encoder_settings.h"
32#include "webrtc/test/fake_audio_device.h"
33#include "webrtc/test/fake_decoder.h"
34#include "webrtc/test/fake_encoder.h"
35#include "webrtc/test/frame_generator.h"
36#include "webrtc/test/frame_generator_capturer.h"
37#include "webrtc/test/null_transport.h"
38#include "webrtc/test/rtp_rtcp_observer.h"
39#include "webrtc/test/testsupport/fileutils.h"
andresp@webrtc.orgab071da2014-09-18 08:58:15 +000040#include "webrtc/test/testsupport/gtest_disable.h"
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000041#include "webrtc/test/testsupport/perf_test.h"
42#include "webrtc/video/transport_adapter.h"
pbos@webrtc.orgab990ae2014-09-17 09:02:25 +000043#include "webrtc/video_encoder.h"
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000044
45namespace webrtc {
46
pbos@webrtc.org26c0c412014-09-03 16:17:12 +000047static const unsigned long kSilenceTimeoutMs = 2000;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000048
49class EndToEndTest : public test::CallTest {
50 public:
51 EndToEndTest() {}
52
53 virtual ~EndToEndTest() {
54 EXPECT_EQ(NULL, send_stream_);
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +000055 EXPECT_TRUE(receive_streams_.empty());
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000056 }
57
58 protected:
pbos@webrtc.org26c0c412014-09-03 16:17:12 +000059 class UnusedTransport : public newapi::Transport {
60 private:
61 virtual bool SendRtp(const uint8_t* packet, size_t length) OVERRIDE {
62 ADD_FAILURE() << "Unexpected RTP sent.";
63 return false;
64 }
65
66 virtual bool SendRtcp(const uint8_t* packet, size_t length) OVERRIDE {
67 ADD_FAILURE() << "Unexpected RTCP sent.";
68 return false;
69 }
70 };
71
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000072 void DecodesRetransmittedFrame(bool retransmit_over_rtx);
73 void ReceivesPliAndRecovers(int rtp_history_ms);
74 void RespectsRtcpMode(newapi::RtcpMode rtcp_mode);
75 void TestXrReceiverReferenceTimeReport(bool enable_rrtr);
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +000076 void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first);
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +000077 void TestRtpStatePreservation(bool use_rtx);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000078};
79
80TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) {
81 test::NullTransport transport;
82 CreateCalls(Call::Config(&transport), Call::Config(&transport));
83
84 CreateSendConfig(1);
85 CreateMatchingReceiveConfigs();
86
87 CreateStreams();
88
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +000089 receive_streams_[0]->Start();
90 receive_streams_[0]->Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000091
92 DestroyStreams();
93}
94
95TEST_F(EndToEndTest, ReceiverCanBeStoppedTwice) {
96 test::NullTransport transport;
97 CreateCalls(Call::Config(&transport), Call::Config(&transport));
98
99 CreateSendConfig(1);
100 CreateMatchingReceiveConfigs();
101
102 CreateStreams();
103
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000104 receive_streams_[0]->Stop();
105 receive_streams_[0]->Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000106
107 DestroyStreams();
108}
109
110TEST_F(EndToEndTest, RendersSingleDelayedFrame) {
111 static const int kWidth = 320;
112 static const int kHeight = 240;
113 // This constant is chosen to be higher than the timeout in the video_render
114 // module. This makes sure that frames aren't dropped if there are no other
115 // frames in the queue.
116 static const int kDelayRenderCallbackMs = 1000;
117
118 class Renderer : public VideoRenderer {
119 public:
120 Renderer() : event_(EventWrapper::Create()) {}
121
122 virtual void RenderFrame(const I420VideoFrame& video_frame,
123 int /*time_to_render_ms*/) OVERRIDE {
124 event_->Set();
125 }
126
127 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
128
129 scoped_ptr<EventWrapper> event_;
130 } renderer;
131
132 class TestFrameCallback : public I420FrameCallback {
133 public:
134 TestFrameCallback() : event_(EventWrapper::Create()) {}
135
136 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
137
138 private:
139 virtual void FrameCallback(I420VideoFrame* frame) OVERRIDE {
140 SleepMs(kDelayRenderCallbackMs);
141 event_->Set();
142 }
143
144 scoped_ptr<EventWrapper> event_;
145 };
146
147 test::DirectTransport sender_transport, receiver_transport;
148
149 CreateCalls(Call::Config(&sender_transport),
150 Call::Config(&receiver_transport));
151
152 sender_transport.SetReceiver(receiver_call_->Receiver());
153 receiver_transport.SetReceiver(sender_call_->Receiver());
154
155 CreateSendConfig(1);
156 CreateMatchingReceiveConfigs();
157
158 TestFrameCallback pre_render_callback;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000159 receive_configs_[0].pre_render_callback = &pre_render_callback;
160 receive_configs_[0].renderer = &renderer;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000161
162 CreateStreams();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000163 Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000164
165 // Create frames that are smaller than the send width/height, this is done to
166 // check that the callbacks are done after processing video.
167 scoped_ptr<test::FrameGenerator> frame_generator(
168 test::FrameGenerator::Create(kWidth, kHeight));
169 send_stream_->Input()->SwapFrame(frame_generator->NextFrame());
170 EXPECT_EQ(kEventSignaled, pre_render_callback.Wait())
171 << "Timed out while waiting for pre-render callback.";
172 EXPECT_EQ(kEventSignaled, renderer.Wait())
173 << "Timed out while waiting for the frame to render.";
174
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000175 Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000176
177 sender_transport.StopSending();
178 receiver_transport.StopSending();
179
180 DestroyStreams();
181}
182
183TEST_F(EndToEndTest, TransmitsFirstFrame) {
184 class Renderer : public VideoRenderer {
185 public:
186 Renderer() : event_(EventWrapper::Create()) {}
187
188 virtual void RenderFrame(const I420VideoFrame& video_frame,
189 int /*time_to_render_ms*/) OVERRIDE {
190 event_->Set();
191 }
192
193 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
194
195 scoped_ptr<EventWrapper> event_;
196 } renderer;
197
198 test::DirectTransport sender_transport, receiver_transport;
199
200 CreateCalls(Call::Config(&sender_transport),
201 Call::Config(&receiver_transport));
202
203 sender_transport.SetReceiver(receiver_call_->Receiver());
204 receiver_transport.SetReceiver(sender_call_->Receiver());
205
206 CreateSendConfig(1);
207 CreateMatchingReceiveConfigs();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000208 receive_configs_[0].renderer = &renderer;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000209
210 CreateStreams();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000211 Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000212
213 scoped_ptr<test::FrameGenerator> frame_generator(test::FrameGenerator::Create(
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000214 encoder_config_.streams[0].width, encoder_config_.streams[0].height));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000215 send_stream_->Input()->SwapFrame(frame_generator->NextFrame());
216
217 EXPECT_EQ(kEventSignaled, renderer.Wait())
218 << "Timed out while waiting for the frame to render.";
219
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000220 Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000221
222 sender_transport.StopSending();
223 receiver_transport.StopSending();
224
225 DestroyStreams();
226}
227
marpan@webrtc.org5f1e2e42014-11-06 02:02:28 +0000228TEST_F(EndToEndTest, SendsAndReceivesVP9) {
marpan@webrtc.org5b883172014-11-01 06:10:48 +0000229 class VP9Observer : public test::EndToEndTest, public VideoRenderer {
230 public:
231 VP9Observer()
232 : EndToEndTest(2 * kDefaultTimeoutMs),
233 encoder_(VideoEncoder::Create(VideoEncoder::kVp9)),
234 decoder_(VP9Decoder::Create()),
235 frame_counter_(0) {}
236
237 virtual void PerformTest() OVERRIDE {
238 EXPECT_EQ(kEventSignaled, Wait())
239 << "Timed out while waiting for enough frames to be decoded.";
240 }
241
242 virtual void ModifyConfigs(
243 VideoSendStream::Config* send_config,
244 std::vector<VideoReceiveStream::Config>* receive_configs,
245 VideoEncoderConfig* encoder_config) OVERRIDE {
246 send_config->encoder_settings.encoder = encoder_.get();
247 send_config->encoder_settings.payload_name = "VP9";
248 send_config->encoder_settings.payload_type = VCM_VP9_PAYLOAD_TYPE;
249 encoder_config->streams[0].min_bitrate_bps = 50000;
250 encoder_config->streams[0].target_bitrate_bps =
251 encoder_config->streams[0].max_bitrate_bps = 2000000;
252
253 (*receive_configs)[0].renderer = this;
254 (*receive_configs)[0].decoders.resize(1);
255 (*receive_configs)[0].decoders[0].payload_type =
256 send_config->encoder_settings.payload_type;
257 (*receive_configs)[0].decoders[0].payload_name =
258 send_config->encoder_settings.payload_name;
259 (*receive_configs)[0].decoders[0].decoder = decoder_.get();
260 }
261
262 virtual void RenderFrame(const I420VideoFrame& video_frame,
263 int time_to_render_ms) OVERRIDE {
264 const int kRequiredFrames = 500;
265 if (++frame_counter_ == kRequiredFrames)
266 observation_complete_->Set();
267 }
268
269 private:
270 scoped_ptr<webrtc::VideoEncoder> encoder_;
271 scoped_ptr<webrtc::VideoDecoder> decoder_;
272 int frame_counter_;
273 } test;
274
275 RunBaseTest(&test);
276}
277
stefan@webrtc.org79c33592014-08-06 09:24:53 +0000278TEST_F(EndToEndTest, SendsAndReceivesH264) {
279 class H264Observer : public test::EndToEndTest, public VideoRenderer {
280 public:
281 H264Observer()
282 : EndToEndTest(2 * kDefaultTimeoutMs),
283 fake_encoder_(Clock::GetRealTimeClock()),
284 frame_counter_(0) {}
285
286 virtual void PerformTest() OVERRIDE {
287 EXPECT_EQ(kEventSignaled, Wait())
288 << "Timed out while waiting for enough frames to be decoded.";
289 }
290
291 virtual void ModifyConfigs(
292 VideoSendStream::Config* send_config,
293 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000294 VideoEncoderConfig* encoder_config) OVERRIDE {
stefan@webrtc.org79c33592014-08-06 09:24:53 +0000295 send_config->encoder_settings.encoder = &fake_encoder_;
296 send_config->encoder_settings.payload_name = "H264";
297 send_config->encoder_settings.payload_type = kFakeSendPayloadType;
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000298 encoder_config->streams[0].min_bitrate_bps = 50000;
299 encoder_config->streams[0].target_bitrate_bps =
300 encoder_config->streams[0].max_bitrate_bps = 2000000;
stefan@webrtc.org79c33592014-08-06 09:24:53 +0000301
302 (*receive_configs)[0].renderer = this;
pbos@webrtc.org776e6f22014-10-29 15:28:39 +0000303 (*receive_configs)[0].decoders.resize(1);
304 (*receive_configs)[0].decoders[0].payload_type =
stefan@webrtc.org79c33592014-08-06 09:24:53 +0000305 send_config->encoder_settings.payload_type;
pbos@webrtc.org776e6f22014-10-29 15:28:39 +0000306 (*receive_configs)[0].decoders[0].payload_name =
307 send_config->encoder_settings.payload_name;
308 (*receive_configs)[0].decoders[0].decoder = &fake_decoder_;
stefan@webrtc.org79c33592014-08-06 09:24:53 +0000309 }
310
311 virtual void RenderFrame(const I420VideoFrame& video_frame,
312 int time_to_render_ms) OVERRIDE {
313 const int kRequiredFrames = 500;
314 if (++frame_counter_ == kRequiredFrames)
315 observation_complete_->Set();
316 }
317
318 private:
319 test::FakeH264Decoder fake_decoder_;
320 test::FakeH264Encoder fake_encoder_;
321 int frame_counter_;
322 } test;
323
324 RunBaseTest(&test);
325}
326
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000327TEST_F(EndToEndTest, ReceiverUsesLocalSsrc) {
328 class SyncRtcpObserver : public test::EndToEndTest {
329 public:
330 SyncRtcpObserver() : EndToEndTest(kDefaultTimeoutMs) {}
331
332 virtual Action OnReceiveRtcp(const uint8_t* packet,
333 size_t length) OVERRIDE {
334 RTCPUtility::RTCPParserV2 parser(packet, length, true);
335 EXPECT_TRUE(parser.IsValid());
336 uint32_t ssrc = 0;
337 ssrc |= static_cast<uint32_t>(packet[4]) << 24;
338 ssrc |= static_cast<uint32_t>(packet[5]) << 16;
339 ssrc |= static_cast<uint32_t>(packet[6]) << 8;
340 ssrc |= static_cast<uint32_t>(packet[7]) << 0;
341 EXPECT_EQ(kReceiverLocalSsrc, ssrc);
342 observation_complete_->Set();
343
344 return SEND_PACKET;
345 }
346
347 virtual void PerformTest() OVERRIDE {
348 EXPECT_EQ(kEventSignaled, Wait())
349 << "Timed out while waiting for a receiver RTCP packet to be sent.";
350 }
351 } test;
352
353 RunBaseTest(&test);
354}
355
356TEST_F(EndToEndTest, ReceivesAndRetransmitsNack) {
357 static const int kNumberOfNacksToObserve = 2;
358 static const int kLossBurstSize = 2;
359 static const int kPacketsBetweenLossBursts = 9;
360 class NackObserver : public test::EndToEndTest {
361 public:
362 NackObserver()
363 : EndToEndTest(kLongTimeoutMs),
364 rtp_parser_(RtpHeaderParser::Create()),
365 sent_rtp_packets_(0),
366 packets_left_to_drop_(0),
367 nacks_left_(kNumberOfNacksToObserve) {}
368
369 private:
370 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
371 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +0000372 EXPECT_TRUE(rtp_parser_->Parse(packet, length, &header));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000373
374 // Never drop retransmitted packets.
375 if (dropped_packets_.find(header.sequenceNumber) !=
376 dropped_packets_.end()) {
377 retransmitted_packets_.insert(header.sequenceNumber);
378 if (nacks_left_ == 0 &&
379 retransmitted_packets_.size() == dropped_packets_.size()) {
380 observation_complete_->Set();
381 }
382 return SEND_PACKET;
383 }
384
385 ++sent_rtp_packets_;
386
387 // Enough NACKs received, stop dropping packets.
388 if (nacks_left_ == 0)
389 return SEND_PACKET;
390
391 // Check if it's time for a new loss burst.
392 if (sent_rtp_packets_ % kPacketsBetweenLossBursts == 0)
393 packets_left_to_drop_ = kLossBurstSize;
394
395 if (packets_left_to_drop_ > 0) {
396 --packets_left_to_drop_;
397 dropped_packets_.insert(header.sequenceNumber);
398 return DROP_PACKET;
399 }
400
401 return SEND_PACKET;
402 }
403
404 virtual Action OnReceiveRtcp(const uint8_t* packet,
405 size_t length) OVERRIDE {
406 RTCPUtility::RTCPParserV2 parser(packet, length, true);
407 EXPECT_TRUE(parser.IsValid());
408
409 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
410 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
411 if (packet_type == RTCPUtility::kRtcpRtpfbNackCode) {
412 --nacks_left_;
413 break;
414 }
415 packet_type = parser.Iterate();
416 }
417 return SEND_PACKET;
418 }
419
420 virtual void ModifyConfigs(
421 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000422 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000423 VideoEncoderConfig* encoder_config) OVERRIDE {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000424 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000425 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000426 }
427
428 virtual void PerformTest() OVERRIDE {
429 EXPECT_EQ(kEventSignaled, Wait())
430 << "Timed out waiting for packets to be NACKed, retransmitted and "
431 "rendered.";
432 }
433
434 scoped_ptr<RtpHeaderParser> rtp_parser_;
435 std::set<uint16_t> dropped_packets_;
436 std::set<uint16_t> retransmitted_packets_;
437 uint64_t sent_rtp_packets_;
438 int packets_left_to_drop_;
439 int nacks_left_;
440 } test;
441
442 RunBaseTest(&test);
443}
444
pbos@webrtc.orga9c2d452014-11-13 14:40:15 +0000445TEST_F(EndToEndTest, CanReceiveFec) {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000446 class FecRenderObserver : public test::EndToEndTest, public VideoRenderer {
447 public:
448 FecRenderObserver()
pbos@webrtc.orga9c2d452014-11-13 14:40:15 +0000449 : EndToEndTest(kDefaultTimeoutMs), state_(kFirstPacket) {}
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000450
451 private:
452 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE
453 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
454 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +0000455 EXPECT_TRUE(parser_->Parse(packet, length, &header));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000456
457 EXPECT_EQ(kRedPayloadType, header.payloadType);
458 int encapsulated_payload_type =
459 static_cast<int>(packet[header.headerLength]);
460 if (encapsulated_payload_type != kFakeSendPayloadType)
461 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type);
462
pbos@webrtc.orga9c2d452014-11-13 14:40:15 +0000463 if (protected_sequence_numbers_.count(header.sequenceNumber) != 0) {
464 // Retransmitted packet, should not count.
465 protected_sequence_numbers_.erase(header.sequenceNumber);
466 EXPECT_GT(protected_timestamps_.count(header.timestamp), 0u);
467 protected_timestamps_.erase(header.timestamp);
468 return SEND_PACKET;
469 }
470
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000471 switch (state_) {
472 case kFirstPacket:
473 state_ = kDropEveryOtherPacketUntilFec;
474 break;
475 case kDropEveryOtherPacketUntilFec:
476 if (encapsulated_payload_type == kUlpfecPayloadType) {
477 state_ = kDropNextMediaPacket;
478 return SEND_PACKET;
479 }
480 if (header.sequenceNumber % 2 == 0)
481 return DROP_PACKET;
482 break;
483 case kDropNextMediaPacket:
484 if (encapsulated_payload_type == kFakeSendPayloadType) {
pbos@webrtc.orga9c2d452014-11-13 14:40:15 +0000485 protected_sequence_numbers_.insert(header.sequenceNumber);
486 protected_timestamps_.insert(header.timestamp);
487 state_ = kDropEveryOtherPacketUntilFec;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000488 return DROP_PACKET;
489 }
490 break;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000491 }
492
493 return SEND_PACKET;
494 }
495
496 virtual void RenderFrame(const I420VideoFrame& video_frame,
497 int time_to_render_ms) OVERRIDE {
498 CriticalSectionScoped lock(crit_.get());
pbos@webrtc.orga9c2d452014-11-13 14:40:15 +0000499 // Rendering frame with timestamp of packet that was dropped -> FEC
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000500 // protection worked.
pbos@webrtc.orga9c2d452014-11-13 14:40:15 +0000501 if (protected_timestamps_.count(video_frame.timestamp()) != 0)
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000502 observation_complete_->Set();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000503 }
504
505 enum {
506 kFirstPacket,
507 kDropEveryOtherPacketUntilFec,
508 kDropNextMediaPacket,
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000509 } state_;
510
511 virtual void ModifyConfigs(
512 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000513 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000514 VideoEncoderConfig* encoder_config) OVERRIDE {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000515 // TODO(pbos): Run this test with combined NACK/FEC enabled as well.
516 // int rtp_history_ms = 1000;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000517 // (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000518 // send_config->rtp.nack.rtp_history_ms = rtp_history_ms;
519 send_config->rtp.fec.red_payload_type = kRedPayloadType;
520 send_config->rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
521
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000522 (*receive_configs)[0].rtp.fec.red_payload_type = kRedPayloadType;
523 (*receive_configs)[0].rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
524 (*receive_configs)[0].renderer = this;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000525 }
526
527 virtual void PerformTest() OVERRIDE {
528 EXPECT_EQ(kEventSignaled, Wait())
pbos@webrtc.orga9c2d452014-11-13 14:40:15 +0000529 << "Timed out waiting for dropped frames frames to be rendered.";
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000530 }
531
pbos@webrtc.orga9c2d452014-11-13 14:40:15 +0000532 std::set<uint32_t> protected_sequence_numbers_ GUARDED_BY(crit_);
533 std::set<uint32_t> protected_timestamps_ GUARDED_BY(crit_);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000534 } test;
535
536 RunBaseTest(&test);
537}
538
539// This test drops second RTP packet with a marker bit set, makes sure it's
540// retransmitted and renders. Retransmission SSRCs are also checked.
541void EndToEndTest::DecodesRetransmittedFrame(bool retransmit_over_rtx) {
542 static const int kDroppedFrameNumber = 2;
543 class RetransmissionObserver : public test::EndToEndTest,
544 public I420FrameCallback {
545 public:
546 explicit RetransmissionObserver(bool expect_rtx)
547 : EndToEndTest(kDefaultTimeoutMs),
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +0000548 retransmission_ssrc_(expect_rtx ? kSendRtxSsrcs[0] : kSendSsrcs[0]),
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000549 retransmission_payload_type_(expect_rtx ? kSendRtxPayloadType
550 : kFakeSendPayloadType),
551 marker_bits_observed_(0),
552 retransmitted_timestamp_(0),
553 frame_retransmitted_(false) {}
554
555 private:
556 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
557 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +0000558 EXPECT_TRUE(parser_->Parse(packet, length, &header));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000559
560 if (header.timestamp == retransmitted_timestamp_) {
561 EXPECT_EQ(retransmission_ssrc_, header.ssrc);
562 EXPECT_EQ(retransmission_payload_type_, header.payloadType);
563 frame_retransmitted_ = true;
564 return SEND_PACKET;
565 }
566
567 EXPECT_EQ(kSendSsrcs[0], header.ssrc);
568 EXPECT_EQ(kFakeSendPayloadType, header.payloadType);
569
570 // Found the second frame's final packet, drop this and expect a
571 // retransmission.
572 if (header.markerBit && ++marker_bits_observed_ == kDroppedFrameNumber) {
573 retransmitted_timestamp_ = header.timestamp;
574 return DROP_PACKET;
575 }
576
577 return SEND_PACKET;
578 }
579
580 virtual void FrameCallback(I420VideoFrame* frame) OVERRIDE {
581 CriticalSectionScoped lock(crit_.get());
582 if (frame->timestamp() == retransmitted_timestamp_) {
583 EXPECT_TRUE(frame_retransmitted_);
584 observation_complete_->Set();
585 }
586 }
587
588 virtual void ModifyConfigs(
589 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000590 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000591 VideoEncoderConfig* encoder_config) OVERRIDE {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000592 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000593 (*receive_configs)[0].pre_render_callback = this;
594 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +0000595 if (retransmission_ssrc_ == kSendRtxSsrcs[0]) {
596 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000597 send_config->rtp.rtx.payload_type = kSendRtxPayloadType;
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +0000598 (*receive_configs)[0].rtp.rtx[kSendRtxPayloadType].ssrc =
599 kSendRtxSsrcs[0];
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000600 (*receive_configs)[0].rtp.rtx[kSendRtxPayloadType].payload_type =
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000601 kSendRtxPayloadType;
602 }
603 }
604
605 virtual void PerformTest() OVERRIDE {
606 EXPECT_EQ(kEventSignaled, Wait())
607 << "Timed out while waiting for retransmission to render.";
608 }
609
610 const uint32_t retransmission_ssrc_;
611 const int retransmission_payload_type_;
612 int marker_bits_observed_;
613 uint32_t retransmitted_timestamp_;
614 bool frame_retransmitted_;
615 } test(retransmit_over_rtx);
616
617 RunBaseTest(&test);
618}
619
620TEST_F(EndToEndTest, DecodesRetransmittedFrame) {
621 DecodesRetransmittedFrame(false);
622}
623
624TEST_F(EndToEndTest, DecodesRetransmittedFrameOverRtx) {
625 DecodesRetransmittedFrame(true);
626}
627
andresp@webrtc.org02686112014-09-19 08:24:19 +0000628TEST_F(EndToEndTest, UsesFrameCallbacks) {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000629 static const int kWidth = 320;
630 static const int kHeight = 240;
631
632 class Renderer : public VideoRenderer {
633 public:
634 Renderer() : event_(EventWrapper::Create()) {}
635
636 virtual void RenderFrame(const I420VideoFrame& video_frame,
637 int /*time_to_render_ms*/) OVERRIDE {
638 EXPECT_EQ(0, *video_frame.buffer(kYPlane))
639 << "Rendered frame should have zero luma which is applied by the "
640 "pre-render callback.";
641 event_->Set();
642 }
643
644 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
645 scoped_ptr<EventWrapper> event_;
646 } renderer;
647
648 class TestFrameCallback : public I420FrameCallback {
649 public:
650 TestFrameCallback(int expected_luma_byte, int next_luma_byte)
651 : event_(EventWrapper::Create()),
652 expected_luma_byte_(expected_luma_byte),
653 next_luma_byte_(next_luma_byte) {}
654
655 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
656
657 private:
658 virtual void FrameCallback(I420VideoFrame* frame) {
659 EXPECT_EQ(kWidth, frame->width())
660 << "Width not as expected, callback done before resize?";
661 EXPECT_EQ(kHeight, frame->height())
662 << "Height not as expected, callback done before resize?";
663
664 // Previous luma specified, observed luma should be fairly close.
665 if (expected_luma_byte_ != -1) {
666 EXPECT_NEAR(expected_luma_byte_, *frame->buffer(kYPlane), 10);
667 }
668
669 memset(frame->buffer(kYPlane),
670 next_luma_byte_,
671 frame->allocated_size(kYPlane));
672
673 event_->Set();
674 }
675
676 scoped_ptr<EventWrapper> event_;
677 int expected_luma_byte_;
678 int next_luma_byte_;
679 };
680
681 TestFrameCallback pre_encode_callback(-1, 255); // Changes luma to 255.
682 TestFrameCallback pre_render_callback(255, 0); // Changes luma from 255 to 0.
683
684 test::DirectTransport sender_transport, receiver_transport;
685
686 CreateCalls(Call::Config(&sender_transport),
687 Call::Config(&receiver_transport));
688
689 sender_transport.SetReceiver(receiver_call_->Receiver());
690 receiver_transport.SetReceiver(sender_call_->Receiver());
691
692 CreateSendConfig(1);
pbos@webrtc.orgab990ae2014-09-17 09:02:25 +0000693 scoped_ptr<VideoEncoder> encoder(
694 VideoEncoder::Create(VideoEncoder::kVp8));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000695 send_config_.encoder_settings.encoder = encoder.get();
696 send_config_.encoder_settings.payload_name = "VP8";
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000697 ASSERT_EQ(1u, encoder_config_.streams.size()) << "Test setup error.";
698 encoder_config_.streams[0].width = kWidth;
699 encoder_config_.streams[0].height = kHeight;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000700 send_config_.pre_encode_callback = &pre_encode_callback;
701
702 CreateMatchingReceiveConfigs();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000703 receive_configs_[0].pre_render_callback = &pre_render_callback;
704 receive_configs_[0].renderer = &renderer;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000705
706 CreateStreams();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000707 Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000708
709 // Create frames that are smaller than the send width/height, this is done to
710 // check that the callbacks are done after processing video.
711 scoped_ptr<test::FrameGenerator> frame_generator(
712 test::FrameGenerator::Create(kWidth / 2, kHeight / 2));
713 send_stream_->Input()->SwapFrame(frame_generator->NextFrame());
714
715 EXPECT_EQ(kEventSignaled, pre_encode_callback.Wait())
716 << "Timed out while waiting for pre-encode callback.";
717 EXPECT_EQ(kEventSignaled, pre_render_callback.Wait())
718 << "Timed out while waiting for pre-render callback.";
719 EXPECT_EQ(kEventSignaled, renderer.Wait())
720 << "Timed out while waiting for the frame to render.";
721
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000722 Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000723
724 sender_transport.StopSending();
725 receiver_transport.StopSending();
726
727 DestroyStreams();
728}
729
730void EndToEndTest::ReceivesPliAndRecovers(int rtp_history_ms) {
731 static const int kPacketsToDrop = 1;
732
733 class PliObserver : public test::EndToEndTest, public VideoRenderer {
734 public:
735 explicit PliObserver(int rtp_history_ms)
736 : EndToEndTest(kLongTimeoutMs),
737 rtp_history_ms_(rtp_history_ms),
738 nack_enabled_(rtp_history_ms > 0),
739 highest_dropped_timestamp_(0),
740 frames_to_drop_(0),
741 received_pli_(false) {}
742
743 private:
744 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
745 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +0000746 EXPECT_TRUE(parser_->Parse(packet, length, &header));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000747
748 // Drop all retransmitted packets to force a PLI.
749 if (header.timestamp <= highest_dropped_timestamp_)
750 return DROP_PACKET;
751
752 if (frames_to_drop_ > 0) {
753 highest_dropped_timestamp_ = header.timestamp;
754 --frames_to_drop_;
755 return DROP_PACKET;
756 }
757
758 return SEND_PACKET;
759 }
760
761 virtual Action OnReceiveRtcp(const uint8_t* packet,
762 size_t length) OVERRIDE {
763 RTCPUtility::RTCPParserV2 parser(packet, length, true);
764 EXPECT_TRUE(parser.IsValid());
765
766 for (RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
767 packet_type != RTCPUtility::kRtcpNotValidCode;
768 packet_type = parser.Iterate()) {
769 if (!nack_enabled_)
770 EXPECT_NE(packet_type, RTCPUtility::kRtcpRtpfbNackCode);
771
772 if (packet_type == RTCPUtility::kRtcpPsfbPliCode) {
773 received_pli_ = true;
774 break;
775 }
776 }
777 return SEND_PACKET;
778 }
779
780 virtual void RenderFrame(const I420VideoFrame& video_frame,
781 int time_to_render_ms) OVERRIDE {
782 CriticalSectionScoped lock(crit_.get());
783 if (received_pli_ &&
784 video_frame.timestamp() > highest_dropped_timestamp_) {
785 observation_complete_->Set();
786 }
787 if (!received_pli_)
788 frames_to_drop_ = kPacketsToDrop;
789 }
790
791 virtual void ModifyConfigs(
792 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000793 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000794 VideoEncoderConfig* encoder_config) OVERRIDE {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000795 send_config->rtp.nack.rtp_history_ms = rtp_history_ms_;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000796 (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms_;
797 (*receive_configs)[0].renderer = this;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000798 }
799
800 virtual void PerformTest() OVERRIDE {
801 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out waiting for PLI to be "
802 "received and a frame to be "
803 "rendered afterwards.";
804 }
805
806 int rtp_history_ms_;
807 bool nack_enabled_;
808 uint32_t highest_dropped_timestamp_;
809 int frames_to_drop_;
810 bool received_pli_;
811 } test(rtp_history_ms);
812
813 RunBaseTest(&test);
814}
815
816TEST_F(EndToEndTest, ReceivesPliAndRecoversWithNack) {
817 ReceivesPliAndRecovers(1000);
818}
819
820// TODO(pbos): Enable this when 2250 is resolved.
821TEST_F(EndToEndTest, DISABLED_ReceivesPliAndRecoversWithoutNack) {
822 ReceivesPliAndRecovers(0);
823}
824
825TEST_F(EndToEndTest, UnknownRtpPacketGivesUnknownSsrcReturnCode) {
826 class PacketInputObserver : public PacketReceiver {
827 public:
828 explicit PacketInputObserver(PacketReceiver* receiver)
829 : receiver_(receiver), delivered_packet_(EventWrapper::Create()) {}
830
831 EventTypeWrapper Wait() {
832 return delivered_packet_->Wait(kDefaultTimeoutMs);
833 }
834
835 private:
836 virtual DeliveryStatus DeliverPacket(const uint8_t* packet,
837 size_t length) OVERRIDE {
pbos@webrtc.org62bafae2014-07-08 12:10:51 +0000838 if (RtpHeaderParser::IsRtcp(packet, length)) {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000839 return receiver_->DeliverPacket(packet, length);
840 } else {
841 DeliveryStatus delivery_status =
842 receiver_->DeliverPacket(packet, length);
843 EXPECT_EQ(DELIVERY_UNKNOWN_SSRC, delivery_status);
844 delivered_packet_->Set();
845 return delivery_status;
846 }
847 }
848
849 PacketReceiver* receiver_;
850 scoped_ptr<EventWrapper> delivered_packet_;
851 };
852
853 test::DirectTransport send_transport, receive_transport;
854
855 CreateCalls(Call::Config(&send_transport), Call::Config(&receive_transport));
856 PacketInputObserver input_observer(receiver_call_->Receiver());
857
858 send_transport.SetReceiver(&input_observer);
859 receive_transport.SetReceiver(sender_call_->Receiver());
860
861 CreateSendConfig(1);
862 CreateMatchingReceiveConfigs();
863
864 CreateStreams();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000865 CreateFrameGeneratorCapturer();
866 Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000867
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000868 receiver_call_->DestroyVideoReceiveStream(receive_streams_[0]);
869 receive_streams_.clear();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000870
871 // Wait() waits for a received packet.
872 EXPECT_EQ(kEventSignaled, input_observer.Wait());
873
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000874 Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000875
876 DestroyStreams();
877
878 send_transport.StopSending();
879 receive_transport.StopSending();
880}
881
882void EndToEndTest::RespectsRtcpMode(newapi::RtcpMode rtcp_mode) {
883 static const int kNumCompoundRtcpPacketsToObserve = 10;
884 class RtcpModeObserver : public test::EndToEndTest {
885 public:
886 explicit RtcpModeObserver(newapi::RtcpMode rtcp_mode)
887 : EndToEndTest(kDefaultTimeoutMs),
888 rtcp_mode_(rtcp_mode),
889 sent_rtp_(0),
890 sent_rtcp_(0) {}
891
892 private:
893 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
894 if (++sent_rtp_ % 3 == 0)
895 return DROP_PACKET;
896
897 return SEND_PACKET;
898 }
899
900 virtual Action OnReceiveRtcp(const uint8_t* packet,
901 size_t length) OVERRIDE {
902 ++sent_rtcp_;
903 RTCPUtility::RTCPParserV2 parser(packet, length, true);
904 EXPECT_TRUE(parser.IsValid());
905
906 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
907 bool has_report_block = false;
908 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
909 EXPECT_NE(RTCPUtility::kRtcpSrCode, packet_type);
910 if (packet_type == RTCPUtility::kRtcpRrCode) {
911 has_report_block = true;
912 break;
913 }
914 packet_type = parser.Iterate();
915 }
916
917 switch (rtcp_mode_) {
918 case newapi::kRtcpCompound:
919 if (!has_report_block) {
920 ADD_FAILURE() << "Received RTCP packet without receiver report for "
921 "kRtcpCompound.";
922 observation_complete_->Set();
923 }
924
925 if (sent_rtcp_ >= kNumCompoundRtcpPacketsToObserve)
926 observation_complete_->Set();
927
928 break;
929 case newapi::kRtcpReducedSize:
930 if (!has_report_block)
931 observation_complete_->Set();
932 break;
933 }
934
935 return SEND_PACKET;
936 }
937
938 virtual void ModifyConfigs(
939 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000940 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000941 VideoEncoderConfig* encoder_config) OVERRIDE {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000942 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +0000943 (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
944 (*receive_configs)[0].rtp.rtcp_mode = rtcp_mode_;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000945 }
946
947 virtual void PerformTest() OVERRIDE {
948 EXPECT_EQ(kEventSignaled, Wait())
949 << (rtcp_mode_ == newapi::kRtcpCompound
950 ? "Timed out before observing enough compound packets."
951 : "Timed out before receiving a non-compound RTCP packet.");
952 }
953
954 newapi::RtcpMode rtcp_mode_;
955 int sent_rtp_;
956 int sent_rtcp_;
957 } test(rtcp_mode);
958
959 RunBaseTest(&test);
960}
961
962TEST_F(EndToEndTest, UsesRtcpCompoundMode) {
963 RespectsRtcpMode(newapi::kRtcpCompound);
964}
965
966TEST_F(EndToEndTest, UsesRtcpReducedSizeMode) {
967 RespectsRtcpMode(newapi::kRtcpReducedSize);
968}
969
970// Test sets up a Call multiple senders with different resolutions and SSRCs.
971// Another is set up to receive all three of these with different renderers.
972// Each renderer verifies that it receives the expected resolution, and as soon
973// as every renderer has received a frame, the test finishes.
andresp@webrtc.org02686112014-09-19 08:24:19 +0000974TEST_F(EndToEndTest, SendsAndReceivesMultipleStreams) {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +0000975 static const size_t kNumStreams = 3;
976
977 class VideoOutputObserver : public VideoRenderer {
978 public:
979 VideoOutputObserver(test::FrameGeneratorCapturer** capturer,
980 int width,
981 int height)
982 : capturer_(capturer),
983 width_(width),
984 height_(height),
985 done_(EventWrapper::Create()) {}
986
987 virtual void RenderFrame(const I420VideoFrame& video_frame,
988 int time_to_render_ms) OVERRIDE {
989 EXPECT_EQ(width_, video_frame.width());
990 EXPECT_EQ(height_, video_frame.height());
991 (*capturer_)->Stop();
992 done_->Set();
993 }
994
995 EventTypeWrapper Wait() { return done_->Wait(kDefaultTimeoutMs); }
996
997 private:
998 test::FrameGeneratorCapturer** capturer_;
999 int width_;
1000 int height_;
1001 scoped_ptr<EventWrapper> done_;
1002 };
1003
1004 struct {
1005 uint32_t ssrc;
1006 int width;
1007 int height;
1008 } codec_settings[kNumStreams] = {{1, 640, 480}, {2, 320, 240}, {3, 240, 160}};
1009
1010 test::DirectTransport sender_transport, receiver_transport;
1011 scoped_ptr<Call> sender_call(Call::Create(Call::Config(&sender_transport)));
1012 scoped_ptr<Call> receiver_call(
1013 Call::Create(Call::Config(&receiver_transport)));
1014 sender_transport.SetReceiver(receiver_call->Receiver());
1015 receiver_transport.SetReceiver(sender_call->Receiver());
1016
1017 VideoSendStream* send_streams[kNumStreams];
1018 VideoReceiveStream* receive_streams[kNumStreams];
1019
1020 VideoOutputObserver* observers[kNumStreams];
1021 test::FrameGeneratorCapturer* frame_generators[kNumStreams];
1022
pbos@webrtc.orgab990ae2014-09-17 09:02:25 +00001023 scoped_ptr<VideoEncoder> encoders[kNumStreams];
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001024 for (size_t i = 0; i < kNumStreams; ++i)
pbos@webrtc.orgab990ae2014-09-17 09:02:25 +00001025 encoders[i].reset(VideoEncoder::Create(VideoEncoder::kVp8));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001026
pbos@webrtc.org776e6f22014-10-29 15:28:39 +00001027 ScopedVector<VideoDecoder> allocated_decoders;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001028 for (size_t i = 0; i < kNumStreams; ++i) {
1029 uint32_t ssrc = codec_settings[i].ssrc;
1030 int width = codec_settings[i].width;
1031 int height = codec_settings[i].height;
1032 observers[i] = new VideoOutputObserver(&frame_generators[i], width, height);
1033
pbos@webrtc.orgbd249bc2014-07-07 04:45:15 +00001034 VideoSendStream::Config send_config;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001035 send_config.rtp.ssrcs.push_back(ssrc);
1036 send_config.encoder_settings.encoder = encoders[i].get();
1037 send_config.encoder_settings.payload_name = "VP8";
1038 send_config.encoder_settings.payload_type = 124;
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001039 VideoEncoderConfig encoder_config;
1040 encoder_config.streams = test::CreateVideoStreams(1);
1041 VideoStream* stream = &encoder_config.streams[0];
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001042 stream->width = width;
1043 stream->height = height;
1044 stream->max_framerate = 5;
1045 stream->min_bitrate_bps = stream->target_bitrate_bps =
1046 stream->max_bitrate_bps = 100000;
1047 send_streams[i] =
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001048 sender_call->CreateVideoSendStream(send_config, encoder_config);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001049 send_streams[i]->Start();
1050
pbos@webrtc.orgbd249bc2014-07-07 04:45:15 +00001051 VideoReceiveStream::Config receive_config;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001052 receive_config.renderer = observers[i];
1053 receive_config.rtp.remote_ssrc = ssrc;
1054 receive_config.rtp.local_ssrc = kReceiverLocalSsrc;
pbos@webrtc.org776e6f22014-10-29 15:28:39 +00001055 VideoReceiveStream::Decoder decoder =
1056 test::CreateMatchingDecoder(send_config.encoder_settings);
1057 allocated_decoders.push_back(decoder.decoder);
1058 receive_config.decoders.push_back(decoder);
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001059 receive_streams[i] =
1060 receiver_call->CreateVideoReceiveStream(receive_config);
1061 receive_streams[i]->Start();
1062
1063 frame_generators[i] = test::FrameGeneratorCapturer::Create(
1064 send_streams[i]->Input(), width, height, 30, Clock::GetRealTimeClock());
1065 frame_generators[i]->Start();
1066 }
1067
1068 for (size_t i = 0; i < kNumStreams; ++i) {
1069 EXPECT_EQ(kEventSignaled, observers[i]->Wait())
1070 << "Timed out while waiting for observer " << i << " to render.";
1071 }
1072
1073 for (size_t i = 0; i < kNumStreams; ++i) {
1074 frame_generators[i]->Stop();
1075 sender_call->DestroyVideoSendStream(send_streams[i]);
1076 receiver_call->DestroyVideoReceiveStream(receive_streams[i]);
1077 delete frame_generators[i];
1078 delete observers[i];
1079 }
1080
1081 sender_transport.StopSending();
1082 receiver_transport.StopSending();
1083}
1084
1085TEST_F(EndToEndTest, ObserversEncodedFrames) {
1086 class EncodedFrameTestObserver : public EncodedFrameObserver {
1087 public:
1088 EncodedFrameTestObserver()
1089 : length_(0),
1090 frame_type_(kFrameEmpty),
1091 called_(EventWrapper::Create()) {}
1092 virtual ~EncodedFrameTestObserver() {}
1093
1094 virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) {
1095 frame_type_ = encoded_frame.frame_type_;
1096 length_ = encoded_frame.length_;
1097 buffer_.reset(new uint8_t[length_]);
1098 memcpy(buffer_.get(), encoded_frame.data_, length_);
1099 called_->Set();
1100 }
1101
1102 EventTypeWrapper Wait() { return called_->Wait(kDefaultTimeoutMs); }
1103
1104 void ExpectEqualFrames(const EncodedFrameTestObserver& observer) {
1105 ASSERT_EQ(length_, observer.length_)
1106 << "Observed frames are of different lengths.";
1107 EXPECT_EQ(frame_type_, observer.frame_type_)
1108 << "Observed frames have different frame types.";
1109 EXPECT_EQ(0, memcmp(buffer_.get(), observer.buffer_.get(), length_))
1110 << "Observed encoded frames have different content.";
1111 }
1112
1113 private:
1114 scoped_ptr<uint8_t[]> buffer_;
1115 size_t length_;
1116 FrameType frame_type_;
1117 scoped_ptr<EventWrapper> called_;
1118 };
1119
1120 EncodedFrameTestObserver post_encode_observer;
1121 EncodedFrameTestObserver pre_decode_observer;
1122
1123 test::DirectTransport sender_transport, receiver_transport;
1124
1125 CreateCalls(Call::Config(&sender_transport),
1126 Call::Config(&receiver_transport));
1127
1128 sender_transport.SetReceiver(receiver_call_->Receiver());
1129 receiver_transport.SetReceiver(sender_call_->Receiver());
1130
1131 CreateSendConfig(1);
1132 CreateMatchingReceiveConfigs();
1133 send_config_.post_encode_callback = &post_encode_observer;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001134 receive_configs_[0].pre_decode_callback = &pre_decode_observer;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001135
1136 CreateStreams();
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001137 Start();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001138
1139 scoped_ptr<test::FrameGenerator> frame_generator(test::FrameGenerator::Create(
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001140 encoder_config_.streams[0].width, encoder_config_.streams[0].height));
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001141 send_stream_->Input()->SwapFrame(frame_generator->NextFrame());
1142
1143 EXPECT_EQ(kEventSignaled, post_encode_observer.Wait())
1144 << "Timed out while waiting for send-side encoded-frame callback.";
1145
1146 EXPECT_EQ(kEventSignaled, pre_decode_observer.Wait())
1147 << "Timed out while waiting for pre-decode encoded-frame callback.";
1148
1149 post_encode_observer.ExpectEqualFrames(pre_decode_observer);
1150
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001151 Stop();
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001152
1153 sender_transport.StopSending();
1154 receiver_transport.StopSending();
1155
1156 DestroyStreams();
1157}
1158
1159TEST_F(EndToEndTest, ReceiveStreamSendsRemb) {
1160 class RembObserver : public test::EndToEndTest {
1161 public:
1162 RembObserver() : EndToEndTest(kDefaultTimeoutMs) {}
1163
1164 virtual Action OnReceiveRtcp(const uint8_t* packet,
1165 size_t length) OVERRIDE {
1166 RTCPUtility::RTCPParserV2 parser(packet, length, true);
1167 EXPECT_TRUE(parser.IsValid());
1168
1169 bool received_psfb = false;
1170 bool received_remb = false;
1171 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
1172 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
1173 if (packet_type == RTCPUtility::kRtcpPsfbRembCode) {
1174 const RTCPUtility::RTCPPacket& packet = parser.Packet();
1175 EXPECT_EQ(packet.PSFBAPP.SenderSSRC, kReceiverLocalSsrc);
1176 received_psfb = true;
1177 } else if (packet_type == RTCPUtility::kRtcpPsfbRembItemCode) {
1178 const RTCPUtility::RTCPPacket& packet = parser.Packet();
1179 EXPECT_GT(packet.REMBItem.BitRate, 0u);
1180 EXPECT_EQ(packet.REMBItem.NumberOfSSRCs, 1u);
1181 EXPECT_EQ(packet.REMBItem.SSRCs[0], kSendSsrcs[0]);
1182 received_remb = true;
1183 }
1184 packet_type = parser.Iterate();
1185 }
1186 if (received_psfb && received_remb)
1187 observation_complete_->Set();
1188 return SEND_PACKET;
1189 }
1190 virtual void PerformTest() OVERRIDE {
1191 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for a "
1192 "receiver RTCP REMB packet to be "
1193 "sent.";
1194 }
1195 } test;
1196
1197 RunBaseTest(&test);
1198}
1199
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +00001200TEST_F(EndToEndTest, VerifyBandwidthStats) {
1201 class RtcpObserver : public test::EndToEndTest, public PacketReceiver {
1202 public:
1203 RtcpObserver()
1204 : EndToEndTest(kDefaultTimeoutMs),
1205 sender_call_(NULL),
1206 receiver_call_(NULL),
1207 has_seen_pacer_delay_(false) {}
1208
1209 virtual DeliveryStatus DeliverPacket(const uint8_t* packet,
1210 size_t length) OVERRIDE {
1211 Call::Stats sender_stats = sender_call_->GetStats();
1212 Call::Stats receiver_stats = receiver_call_->GetStats();
1213 if (!has_seen_pacer_delay_)
1214 has_seen_pacer_delay_ = sender_stats.pacer_delay_ms > 0;
1215 if (sender_stats.send_bandwidth_bps > 0 &&
1216 receiver_stats.recv_bandwidth_bps > 0 && has_seen_pacer_delay_)
1217 observation_complete_->Set();
1218 return receiver_call_->Receiver()->DeliverPacket(packet, length);
1219 }
1220
1221 virtual void OnCallsCreated(Call* sender_call,
1222 Call* receiver_call) OVERRIDE {
1223 sender_call_ = sender_call;
1224 receiver_call_ = receiver_call;
1225 }
1226
1227 virtual void PerformTest() OVERRIDE {
1228 EXPECT_EQ(kEventSignaled, Wait()) << "Timed out while waiting for "
1229 "non-zero bandwidth stats.";
1230 }
1231
1232 virtual void SetReceivers(
1233 PacketReceiver* send_transport_receiver,
1234 PacketReceiver* receive_transport_receiver) OVERRIDE {
1235 test::RtpRtcpObserver::SetReceivers(this, receive_transport_receiver);
1236 }
1237
1238 private:
1239 Call* sender_call_;
1240 Call* receiver_call_;
1241 bool has_seen_pacer_delay_;
1242 } test;
1243
1244 RunBaseTest(&test);
1245}
1246
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001247void EndToEndTest::TestXrReceiverReferenceTimeReport(bool enable_rrtr) {
1248 static const int kNumRtcpReportPacketsToObserve = 5;
1249 class RtcpXrObserver : public test::EndToEndTest {
1250 public:
1251 explicit RtcpXrObserver(bool enable_rrtr)
1252 : EndToEndTest(kDefaultTimeoutMs),
1253 enable_rrtr_(enable_rrtr),
1254 sent_rtcp_sr_(0),
1255 sent_rtcp_rr_(0),
1256 sent_rtcp_rrtr_(0),
1257 sent_rtcp_dlrr_(0) {}
1258
1259 private:
1260 // Receive stream should send RR packets (and RRTR packets if enabled).
1261 virtual Action OnReceiveRtcp(const uint8_t* packet,
1262 size_t length) OVERRIDE {
1263 RTCPUtility::RTCPParserV2 parser(packet, length, true);
1264 EXPECT_TRUE(parser.IsValid());
1265
1266 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
1267 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
1268 if (packet_type == RTCPUtility::kRtcpRrCode) {
1269 ++sent_rtcp_rr_;
1270 } else if (packet_type ==
1271 RTCPUtility::kRtcpXrReceiverReferenceTimeCode) {
1272 ++sent_rtcp_rrtr_;
1273 }
1274 EXPECT_NE(packet_type, RTCPUtility::kRtcpSrCode);
1275 EXPECT_NE(packet_type, RTCPUtility::kRtcpXrDlrrReportBlockItemCode);
1276 packet_type = parser.Iterate();
1277 }
1278 return SEND_PACKET;
1279 }
1280 // Send stream should send SR packets (and DLRR packets if enabled).
1281 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
1282 RTCPUtility::RTCPParserV2 parser(packet, length, true);
1283 EXPECT_TRUE(parser.IsValid());
1284
1285 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
1286 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
1287 if (packet_type == RTCPUtility::kRtcpSrCode) {
1288 ++sent_rtcp_sr_;
1289 } else if (packet_type == RTCPUtility::kRtcpXrDlrrReportBlockItemCode) {
1290 ++sent_rtcp_dlrr_;
1291 }
1292 EXPECT_NE(packet_type, RTCPUtility::kRtcpXrReceiverReferenceTimeCode);
1293 packet_type = parser.Iterate();
1294 }
1295 if (sent_rtcp_sr_ > kNumRtcpReportPacketsToObserve &&
1296 sent_rtcp_rr_ > kNumRtcpReportPacketsToObserve) {
1297 if (enable_rrtr_) {
1298 EXPECT_GT(sent_rtcp_rrtr_, 0);
1299 EXPECT_GT(sent_rtcp_dlrr_, 0);
1300 } else {
1301 EXPECT_EQ(0, sent_rtcp_rrtr_);
1302 EXPECT_EQ(0, sent_rtcp_dlrr_);
1303 }
1304 observation_complete_->Set();
1305 }
1306 return SEND_PACKET;
1307 }
1308
1309 virtual void ModifyConfigs(
1310 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001311 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001312 VideoEncoderConfig* encoder_config) OVERRIDE {
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001313 (*receive_configs)[0].rtp.rtcp_mode = newapi::kRtcpReducedSize;
1314 (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report =
1315 enable_rrtr_;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001316 }
1317
1318 virtual void PerformTest() OVERRIDE {
1319 EXPECT_EQ(kEventSignaled, Wait())
1320 << "Timed out while waiting for RTCP SR/RR packets to be sent.";
1321 }
1322
1323 bool enable_rrtr_;
1324 int sent_rtcp_sr_;
1325 int sent_rtcp_rr_;
1326 int sent_rtcp_rrtr_;
1327 int sent_rtcp_dlrr_;
1328 } test(enable_rrtr);
1329
1330 RunBaseTest(&test);
1331}
1332
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001333void EndToEndTest::TestSendsSetSsrcs(size_t num_ssrcs,
1334 bool send_single_ssrc_first) {
1335 class SendsSetSsrcs : public test::EndToEndTest {
1336 public:
1337 SendsSetSsrcs(const uint32_t* ssrcs,
1338 size_t num_ssrcs,
1339 bool send_single_ssrc_first)
1340 : EndToEndTest(kDefaultTimeoutMs),
1341 num_ssrcs_(num_ssrcs),
1342 send_single_ssrc_first_(send_single_ssrc_first),
1343 ssrcs_to_observe_(num_ssrcs),
1344 expect_single_ssrc_(send_single_ssrc_first) {
1345 for (size_t i = 0; i < num_ssrcs; ++i)
1346 valid_ssrcs_[ssrcs[i]] = true;
1347 }
1348
1349 private:
1350 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1351 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +00001352 EXPECT_TRUE(parser_->Parse(packet, length, &header));
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001353
1354 EXPECT_TRUE(valid_ssrcs_[header.ssrc])
1355 << "Received unknown SSRC: " << header.ssrc;
1356
1357 if (!valid_ssrcs_[header.ssrc])
1358 observation_complete_->Set();
1359
1360 if (!is_observed_[header.ssrc]) {
1361 is_observed_[header.ssrc] = true;
1362 --ssrcs_to_observe_;
1363 if (expect_single_ssrc_) {
1364 expect_single_ssrc_ = false;
1365 observation_complete_->Set();
1366 }
1367 }
1368
1369 if (ssrcs_to_observe_ == 0)
1370 observation_complete_->Set();
1371
1372 return SEND_PACKET;
1373 }
1374
1375 virtual size_t GetNumStreams() const OVERRIDE { return num_ssrcs_; }
1376
1377 virtual void ModifyConfigs(
1378 VideoSendStream::Config* send_config,
1379 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001380 VideoEncoderConfig* encoder_config) OVERRIDE {
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001381 if (num_ssrcs_ > 1) {
1382 // Set low simulcast bitrates to not have to wait for bandwidth ramp-up.
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001383 for (size_t i = 0; i < encoder_config->streams.size(); ++i) {
1384 encoder_config->streams[i].min_bitrate_bps = 10000;
1385 encoder_config->streams[i].target_bitrate_bps = 15000;
1386 encoder_config->streams[i].max_bitrate_bps = 20000;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001387 }
1388 }
1389
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001390 encoder_config_all_streams_ = *encoder_config;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001391 if (send_single_ssrc_first_)
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001392 encoder_config->streams.resize(1);
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001393 }
1394
1395 virtual void OnStreamsCreated(
1396 VideoSendStream* send_stream,
1397 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE {
1398 send_stream_ = send_stream;
1399 }
1400
1401 virtual void PerformTest() OVERRIDE {
1402 EXPECT_EQ(kEventSignaled, Wait())
1403 << "Timed out while waiting for "
1404 << (send_single_ssrc_first_ ? "first SSRC." : "SSRCs.");
1405
1406 if (send_single_ssrc_first_) {
1407 // Set full simulcast and continue with the rest of the SSRCs.
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001408 send_stream_->ReconfigureVideoEncoder(encoder_config_all_streams_);
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001409 EXPECT_EQ(kEventSignaled, Wait())
1410 << "Timed out while waiting on additional SSRCs.";
1411 }
1412 }
1413
1414 private:
1415 std::map<uint32_t, bool> valid_ssrcs_;
1416 std::map<uint32_t, bool> is_observed_;
1417
1418 const size_t num_ssrcs_;
1419 const bool send_single_ssrc_first_;
1420
1421 size_t ssrcs_to_observe_;
1422 bool expect_single_ssrc_;
1423
1424 VideoSendStream* send_stream_;
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001425 VideoEncoderConfig encoder_config_all_streams_;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001426 } test(kSendSsrcs, num_ssrcs, send_single_ssrc_first);
1427
1428 RunBaseTest(&test);
1429}
1430
pbos@webrtc.org67c22472014-11-14 17:42:51 +00001431// TODO(pbos): Reenable test, it exposes an assert in the jitter buffer.
1432// https://code.google.com/p/webrtc/issues/detail?id=4014
1433TEST_F(EndToEndTest, DISABLED_GetStats) {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001434 class StatsObserver : public test::EndToEndTest, public I420FrameCallback {
1435 public:
1436 StatsObserver()
1437 : EndToEndTest(kLongTimeoutMs),
1438 receive_stream_(NULL),
1439 send_stream_(NULL),
1440 expected_receive_ssrc_(),
1441 expected_send_ssrcs_(),
1442 check_stats_event_(EventWrapper::Create()) {}
1443
1444 private:
1445 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1446 check_stats_event_->Set();
1447 return SEND_PACKET;
1448 }
1449
1450 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) OVERRIDE {
1451 check_stats_event_->Set();
1452 return SEND_PACKET;
1453 }
1454
1455 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) OVERRIDE {
1456 check_stats_event_->Set();
1457 return SEND_PACKET;
1458 }
1459
1460 virtual Action OnReceiveRtcp(const uint8_t* packet,
1461 size_t length) OVERRIDE {
1462 check_stats_event_->Set();
1463 return SEND_PACKET;
1464 }
1465
1466 virtual void FrameCallback(I420VideoFrame* video_frame) OVERRIDE {
1467 // Ensure that we have at least 5ms send side delay.
1468 int64_t render_time = video_frame->render_time_ms();
1469 if (render_time > 0)
1470 video_frame->set_render_time_ms(render_time - 5);
1471 }
1472
1473 bool CheckReceiveStats() {
1474 assert(receive_stream_ != NULL);
1475 VideoReceiveStream::Stats stats = receive_stream_->GetStats();
1476 EXPECT_EQ(expected_receive_ssrc_, stats.ssrc);
1477
1478 // Make sure all fields have been populated.
1479
1480 receive_stats_filled_["IncomingRate"] |=
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +00001481 stats.network_frame_rate != 0 || stats.total_bitrate_bps != 0;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001482
1483 receive_stats_filled_["FrameCallback"] |= stats.decode_frame_rate != 0;
1484
1485 receive_stats_filled_["FrameRendered"] |= stats.render_frame_rate != 0;
1486
1487 receive_stats_filled_["StatisticsUpdated"] |=
1488 stats.rtcp_stats.cumulative_lost != 0 ||
1489 stats.rtcp_stats.extended_max_sequence_number != 0 ||
1490 stats.rtcp_stats.fraction_lost != 0 || stats.rtcp_stats.jitter != 0;
1491
1492 receive_stats_filled_["DataCountersUpdated"] |=
1493 stats.rtp_stats.bytes != 0 || stats.rtp_stats.fec_packets != 0 ||
1494 stats.rtp_stats.header_bytes != 0 || stats.rtp_stats.packets != 0 ||
1495 stats.rtp_stats.padding_bytes != 0 ||
1496 stats.rtp_stats.retransmitted_packets != 0;
1497
1498 receive_stats_filled_["CodecStats"] |=
1499 stats.avg_delay_ms != 0 || stats.discarded_packets != 0 ||
1500 stats.key_frames != 0 || stats.delta_frames != 0;
1501
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001502 return AllStatsFilled(receive_stats_filled_);
1503 }
1504
1505 bool CheckSendStats() {
1506 assert(send_stream_ != NULL);
1507 VideoSendStream::Stats stats = send_stream_->GetStats();
1508
1509 send_stats_filled_["NumStreams"] |=
1510 stats.substreams.size() == expected_send_ssrcs_.size();
1511
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +00001512 for (std::map<uint32_t, SsrcStats>::const_iterator it =
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001513 stats.substreams.begin();
1514 it != stats.substreams.end();
1515 ++it) {
1516 EXPECT_TRUE(expected_send_ssrcs_.find(it->first) !=
1517 expected_send_ssrcs_.end());
1518
1519 send_stats_filled_[CompoundKey("IncomingRate", it->first)] |=
1520 stats.input_frame_rate != 0;
1521
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +00001522 const SsrcStats& stream_stats = it->second;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001523
1524 send_stats_filled_[CompoundKey("StatisticsUpdated", it->first)] |=
1525 stream_stats.rtcp_stats.cumulative_lost != 0 ||
1526 stream_stats.rtcp_stats.extended_max_sequence_number != 0 ||
1527 stream_stats.rtcp_stats.fraction_lost != 0;
1528
1529 send_stats_filled_[CompoundKey("DataCountersUpdated", it->first)] |=
1530 stream_stats.rtp_stats.fec_packets != 0 ||
1531 stream_stats.rtp_stats.padding_bytes != 0 ||
1532 stream_stats.rtp_stats.retransmitted_packets != 0 ||
1533 stream_stats.rtp_stats.packets != 0;
1534
1535 send_stats_filled_[CompoundKey("BitrateStatisticsObserver",
1536 it->first)] |=
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +00001537 stream_stats.total_bitrate_bps != 0;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001538
1539 send_stats_filled_[CompoundKey("FrameCountObserver", it->first)] |=
1540 stream_stats.delta_frames != 0 || stream_stats.key_frames != 0;
1541
1542 send_stats_filled_[CompoundKey("OutgoingRate", it->first)] |=
1543 stats.encode_frame_rate != 0;
stefan@webrtc.org168f23f2014-07-11 13:44:02 +00001544
1545 send_stats_filled_[CompoundKey("Delay", it->first)] |=
1546 stream_stats.avg_delay_ms != 0 || stream_stats.max_delay_ms != 0;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001547 }
1548
1549 return AllStatsFilled(send_stats_filled_);
1550 }
1551
1552 std::string CompoundKey(const char* name, uint32_t ssrc) {
1553 std::ostringstream oss;
1554 oss << name << "_" << ssrc;
1555 return oss.str();
1556 }
1557
1558 bool AllStatsFilled(const std::map<std::string, bool>& stats_map) {
1559 for (std::map<std::string, bool>::const_iterator it = stats_map.begin();
1560 it != stats_map.end();
1561 ++it) {
1562 if (!it->second)
1563 return false;
1564 }
1565 return true;
1566 }
1567
1568 virtual void ModifyConfigs(
1569 VideoSendStream::Config* send_config,
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001570 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001571 VideoEncoderConfig* encoder_config) OVERRIDE {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001572 send_config->pre_encode_callback = this; // Used to inject delay.
1573 send_config->rtp.c_name = "SomeCName";
1574
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001575 expected_receive_ssrc_ = (*receive_configs)[0].rtp.local_ssrc;
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001576 const std::vector<uint32_t>& ssrcs = send_config->rtp.ssrcs;
1577 for (size_t i = 0; i < ssrcs.size(); ++i)
1578 expected_send_ssrcs_.insert(ssrcs[i]);
1579
1580 expected_cname_ = send_config->rtp.c_name;
1581 }
1582
pbos@webrtc.orgece38902014-11-14 11:52:04 +00001583 virtual size_t GetNumStreams() const OVERRIDE { return kNumSsrcs; }
1584
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001585 virtual void OnStreamsCreated(
1586 VideoSendStream* send_stream,
1587 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE {
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001588 send_stream_ = send_stream;
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001589 receive_stream_ = receive_streams[0];
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001590 }
1591
1592 virtual void PerformTest() OVERRIDE {
1593 Clock* clock = Clock::GetRealTimeClock();
1594 int64_t now = clock->TimeInMilliseconds();
1595 int64_t stop_time = now + test::CallTest::kLongTimeoutMs;
1596 bool receive_ok = false;
1597 bool send_ok = false;
1598
1599 while (now < stop_time) {
1600 if (!receive_ok)
1601 receive_ok = CheckReceiveStats();
1602 if (!send_ok)
1603 send_ok = CheckSendStats();
1604
1605 if (receive_ok && send_ok)
1606 return;
1607
1608 int64_t time_until_timout_ = stop_time - now;
1609 if (time_until_timout_ > 0)
1610 check_stats_event_->Wait(time_until_timout_);
1611 now = clock->TimeInMilliseconds();
1612 }
1613
1614 ADD_FAILURE() << "Timed out waiting for filled stats.";
1615 for (std::map<std::string, bool>::const_iterator it =
1616 receive_stats_filled_.begin();
1617 it != receive_stats_filled_.end();
1618 ++it) {
1619 if (!it->second) {
1620 ADD_FAILURE() << "Missing receive stats: " << it->first;
1621 }
1622 }
1623
1624 for (std::map<std::string, bool>::const_iterator it =
1625 send_stats_filled_.begin();
1626 it != send_stats_filled_.end();
1627 ++it) {
1628 if (!it->second) {
1629 ADD_FAILURE() << "Missing send stats: " << it->first;
1630 }
1631 }
1632 }
1633
1634 VideoReceiveStream* receive_stream_;
1635 std::map<std::string, bool> receive_stats_filled_;
1636
1637 VideoSendStream* send_stream_;
1638 std::map<std::string, bool> send_stats_filled_;
1639
1640 uint32_t expected_receive_ssrc_;
1641 std::set<uint32_t> expected_send_ssrcs_;
1642 std::string expected_cname_;
1643
1644 scoped_ptr<EventWrapper> check_stats_event_;
1645 } test;
1646
1647 RunBaseTest(&test);
1648}
1649
1650TEST_F(EndToEndTest, ReceiverReferenceTimeReportEnabled) {
1651 TestXrReceiverReferenceTimeReport(true);
1652}
1653
1654TEST_F(EndToEndTest, ReceiverReferenceTimeReportDisabled) {
1655 TestXrReceiverReferenceTimeReport(false);
1656}
1657
1658TEST_F(EndToEndTest, TestReceivedRtpPacketStats) {
1659 static const size_t kNumRtpPacketsToSend = 5;
1660 class ReceivedRtpStatsObserver : public test::EndToEndTest {
1661 public:
1662 ReceivedRtpStatsObserver()
1663 : EndToEndTest(kDefaultTimeoutMs),
1664 receive_stream_(NULL),
1665 sent_rtp_(0) {}
1666
1667 private:
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001668 virtual void OnStreamsCreated(
1669 VideoSendStream* send_stream,
1670 const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE {
1671 receive_stream_ = receive_streams[0];
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00001672 }
1673
1674 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1675 if (sent_rtp_ >= kNumRtpPacketsToSend) {
1676 VideoReceiveStream::Stats stats = receive_stream_->GetStats();
1677 if (kNumRtpPacketsToSend == stats.rtp_stats.packets) {
1678 observation_complete_->Set();
1679 }
1680 return DROP_PACKET;
1681 }
1682 ++sent_rtp_;
1683 return SEND_PACKET;
1684 }
1685
1686 virtual void PerformTest() OVERRIDE {
1687 EXPECT_EQ(kEventSignaled, Wait())
1688 << "Timed out while verifying number of received RTP packets.";
1689 }
1690
1691 VideoReceiveStream* receive_stream_;
1692 uint32_t sent_rtp_;
1693 } test;
1694
1695 RunBaseTest(&test);
1696}
1697
pbos@webrtc.orgbe9d2a42014-06-30 13:19:09 +00001698TEST_F(EndToEndTest, SendsSetSsrc) { TestSendsSetSsrcs(1, false); }
1699
1700TEST_F(EndToEndTest, SendsSetSimulcastSsrcs) {
1701 TestSendsSetSsrcs(kNumSsrcs, false);
1702}
1703
1704TEST_F(EndToEndTest, CanSwitchToUseAllSsrcs) {
1705 TestSendsSetSsrcs(kNumSsrcs, true);
1706}
1707
mflodman@webrtc.orgf9460682014-07-24 16:41:25 +00001708TEST_F(EndToEndTest, DISABLED_RedundantPayloadsTransmittedOnAllSsrcs) {
pbos@webrtc.org20c1f562014-07-04 10:58:12 +00001709 class ObserveRedundantPayloads: public test::EndToEndTest {
1710 public:
1711 ObserveRedundantPayloads()
1712 : EndToEndTest(kDefaultTimeoutMs), ssrcs_to_observe_(kNumSsrcs) {
pbos@webrtc.orgdde16f12014-08-05 23:35:43 +00001713 for (size_t i = 0; i < kNumSsrcs; ++i) {
pbos@webrtc.org20c1f562014-07-04 10:58:12 +00001714 registered_rtx_ssrc_[kSendRtxSsrcs[i]] = true;
1715 }
1716 }
1717
1718 private:
1719 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1720 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +00001721 EXPECT_TRUE(parser_->Parse(packet, length, &header));
pbos@webrtc.org20c1f562014-07-04 10:58:12 +00001722
1723 if (!registered_rtx_ssrc_[header.ssrc])
1724 return SEND_PACKET;
1725
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001726 EXPECT_LE(header.headerLength + header.paddingLength, length);
pbos@webrtc.org20c1f562014-07-04 10:58:12 +00001727 const bool packet_is_redundant_payload =
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001728 header.headerLength + header.paddingLength < length;
pbos@webrtc.org20c1f562014-07-04 10:58:12 +00001729
1730 if (!packet_is_redundant_payload)
1731 return SEND_PACKET;
1732
1733 if (!observed_redundant_retransmission_[header.ssrc]) {
1734 observed_redundant_retransmission_[header.ssrc] = true;
1735 if (--ssrcs_to_observe_ == 0)
1736 observation_complete_->Set();
1737 }
1738
1739 return SEND_PACKET;
1740 }
1741
1742 virtual size_t GetNumStreams() const OVERRIDE { return kNumSsrcs; }
1743
1744 virtual void ModifyConfigs(
1745 VideoSendStream::Config* send_config,
1746 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001747 VideoEncoderConfig* encoder_config) OVERRIDE {
pbos@webrtc.org20c1f562014-07-04 10:58:12 +00001748 // Set low simulcast bitrates to not have to wait for bandwidth ramp-up.
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001749 for (size_t i = 0; i < encoder_config->streams.size(); ++i) {
1750 encoder_config->streams[i].min_bitrate_bps = 10000;
1751 encoder_config->streams[i].target_bitrate_bps = 15000;
1752 encoder_config->streams[i].max_bitrate_bps = 20000;
pbos@webrtc.org20c1f562014-07-04 10:58:12 +00001753 }
pbos@webrtc.org20c1f562014-07-04 10:58:12 +00001754
1755 send_config->rtp.rtx.payload_type = kSendRtxPayloadType;
1756 send_config->rtp.rtx.pad_with_redundant_payloads = true;
1757
1758 for (size_t i = 0; i < kNumSsrcs; ++i)
1759 send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]);
pbos@webrtc.orgad3b5a52014-10-24 09:23:21 +00001760
1761 // Significantly higher than max bitrates for all video streams -> forcing
1762 // padding to trigger redundant padding on all RTX SSRCs.
1763 encoder_config->min_transmit_bitrate_bps = 100000;
pbos@webrtc.org20c1f562014-07-04 10:58:12 +00001764 }
1765
1766 virtual void PerformTest() OVERRIDE {
1767 EXPECT_EQ(kEventSignaled, Wait())
1768 << "Timed out while waiting for redundant payloads on all SSRCs.";
1769 }
1770
1771 private:
1772 size_t ssrcs_to_observe_;
1773 std::map<uint32_t, bool> observed_redundant_retransmission_;
1774 std::map<uint32_t, bool> registered_rtx_ssrc_;
1775 } test;
1776
1777 RunBaseTest(&test);
1778}
1779
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001780void EndToEndTest::TestRtpStatePreservation(bool use_rtx) {
1781 static const uint32_t kMaxSequenceNumberGap = 100;
1782 static const uint64_t kMaxTimestampGap = kDefaultTimeoutMs * 90;
1783 class RtpSequenceObserver : public test::RtpRtcpObserver {
1784 public:
pbos@webrtc.orgdde16f12014-08-05 23:35:43 +00001785 explicit RtpSequenceObserver(bool use_rtx)
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001786 : test::RtpRtcpObserver(kDefaultTimeoutMs),
1787 crit_(CriticalSectionWrapper::CreateCriticalSection()),
1788 ssrcs_to_observe_(kNumSsrcs) {
1789 for (size_t i = 0; i < kNumSsrcs; ++i) {
1790 configured_ssrcs_[kSendSsrcs[i]] = true;
1791 if (use_rtx)
1792 configured_ssrcs_[kSendRtxSsrcs[i]] = true;
1793 }
1794 }
1795
1796 void ResetExpectedSsrcs(size_t num_expected_ssrcs) {
1797 CriticalSectionScoped lock(crit_.get());
1798 ssrc_observed_.clear();
1799 ssrcs_to_observe_ = num_expected_ssrcs;
1800 }
1801
1802 private:
1803 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1804 RTPHeader header;
pbos@webrtc.org62bafae2014-07-08 12:10:51 +00001805 EXPECT_TRUE(parser_->Parse(packet, length, &header));
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001806 const uint32_t ssrc = header.ssrc;
1807 const uint16_t sequence_number = header.sequenceNumber;
1808 const uint32_t timestamp = header.timestamp;
1809 const bool only_padding =
pkasting@chromium.org4591fbd2014-11-20 22:28:14 +00001810 header.headerLength + header.paddingLength == length;
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001811
1812 EXPECT_TRUE(configured_ssrcs_[ssrc])
1813 << "Received SSRC that wasn't configured: " << ssrc;
1814
1815 std::map<uint32_t, uint16_t>::iterator it =
1816 last_observed_sequence_number_.find(header.ssrc);
1817 if (it == last_observed_sequence_number_.end()) {
1818 last_observed_sequence_number_[ssrc] = sequence_number;
1819 last_observed_timestamp_[ssrc] = timestamp;
1820 } else {
1821 // Verify sequence numbers are reasonably close.
1822 uint32_t extended_sequence_number = sequence_number;
1823 // Check for roll-over.
1824 if (sequence_number < last_observed_sequence_number_[ssrc])
1825 extended_sequence_number += 0xFFFFu + 1;
1826 EXPECT_LE(
1827 extended_sequence_number - last_observed_sequence_number_[ssrc],
1828 kMaxSequenceNumberGap)
1829 << "Gap in sequence numbers ("
1830 << last_observed_sequence_number_[ssrc] << " -> " << sequence_number
1831 << ") too large for SSRC: " << ssrc << ".";
1832 last_observed_sequence_number_[ssrc] = sequence_number;
1833
1834 // TODO(pbos): Remove this check if we ever have monotonically
1835 // increasing timestamps. Right now padding packets add a delta which
1836 // can cause reordering between padding packets and regular packets,
1837 // hence we drop padding-only packets to not flake.
1838 if (only_padding) {
1839 // Verify that timestamps are reasonably close.
1840 uint64_t extended_timestamp = timestamp;
1841 // Check for roll-over.
1842 if (timestamp < last_observed_timestamp_[ssrc])
1843 extended_timestamp += static_cast<uint64_t>(0xFFFFFFFFu) + 1;
1844 EXPECT_LE(extended_timestamp - last_observed_timestamp_[ssrc],
1845 kMaxTimestampGap)
1846 << "Gap in timestamps (" << last_observed_timestamp_[ssrc]
1847 << " -> " << timestamp << ") too large for SSRC: " << ssrc << ".";
1848 }
1849 last_observed_timestamp_[ssrc] = timestamp;
1850 }
1851
1852 CriticalSectionScoped lock(crit_.get());
1853 // Wait for media packets on all ssrcs.
1854 if (!ssrc_observed_[ssrc] && !only_padding) {
1855 ssrc_observed_[ssrc] = true;
1856 if (--ssrcs_to_observe_ == 0)
1857 observation_complete_->Set();
1858 }
1859
1860 return SEND_PACKET;
1861 }
1862
1863 std::map<uint32_t, uint16_t> last_observed_sequence_number_;
1864 std::map<uint32_t, uint32_t> last_observed_timestamp_;
1865 std::map<uint32_t, bool> configured_ssrcs_;
1866
1867 scoped_ptr<CriticalSectionWrapper> crit_;
1868 size_t ssrcs_to_observe_ GUARDED_BY(crit_);
1869 std::map<uint32_t, bool> ssrc_observed_ GUARDED_BY(crit_);
1870 } observer(use_rtx);
1871
1872 CreateCalls(Call::Config(observer.SendTransport()),
1873 Call::Config(observer.ReceiveTransport()));
1874 observer.SetReceivers(sender_call_->Receiver(), NULL);
1875
1876 CreateSendConfig(kNumSsrcs);
1877
1878 if (use_rtx) {
1879 for (size_t i = 0; i < kNumSsrcs; ++i) {
1880 send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]);
1881 }
1882 send_config_.rtp.rtx.payload_type = kSendRtxPayloadType;
1883 }
1884
1885 // Lower bitrates so that all streams send initially.
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001886 for (size_t i = 0; i < encoder_config_.streams.size(); ++i) {
1887 encoder_config_.streams[i].min_bitrate_bps = 10000;
1888 encoder_config_.streams[i].target_bitrate_bps = 15000;
1889 encoder_config_.streams[i].max_bitrate_bps = 20000;
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001890 }
1891
pbos@webrtc.org32452b22014-10-22 12:15:24 +00001892 // Use the same total bitrates when sending a single stream to avoid lowering
1893 // the bitrate estimate and requiring a subsequent rampup.
1894 VideoEncoderConfig one_stream = encoder_config_;
1895 one_stream.streams.resize(1);
1896 for (size_t i = 1; i < encoder_config_.streams.size(); ++i) {
1897 one_stream.streams.front().min_bitrate_bps +=
1898 encoder_config_.streams[i].min_bitrate_bps;
1899 one_stream.streams.front().target_bitrate_bps +=
1900 encoder_config_.streams[i].target_bitrate_bps;
1901 one_stream.streams.front().max_bitrate_bps +=
1902 encoder_config_.streams[i].max_bitrate_bps;
1903 }
1904
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001905 CreateMatchingReceiveConfigs();
1906
1907 CreateStreams();
1908 CreateFrameGeneratorCapturer();
1909
1910 Start();
1911 EXPECT_EQ(kEventSignaled, observer.Wait())
1912 << "Timed out waiting for all SSRCs to send packets.";
1913
1914 // Test stream resetting more than once to make sure that the state doesn't
1915 // get set once (this could be due to using std::map::insert for instance).
1916 for (size_t i = 0; i < 3; ++i) {
1917 frame_generator_capturer_->Stop();
1918 sender_call_->DestroyVideoSendStream(send_stream_);
1919
1920 // Re-create VideoSendStream with only one stream.
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001921 send_stream_ =
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001922 sender_call_->CreateVideoSendStream(send_config_, one_stream);
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001923 send_stream_->Start();
1924 CreateFrameGeneratorCapturer();
1925 frame_generator_capturer_->Start();
1926
1927 observer.ResetExpectedSsrcs(1);
1928 EXPECT_EQ(kEventSignaled, observer.Wait())
1929 << "Timed out waiting for single RTP packet.";
1930
1931 // Reconfigure back to use all streams.
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001932 send_stream_->ReconfigureVideoEncoder(encoder_config_);
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001933 observer.ResetExpectedSsrcs(kNumSsrcs);
1934 EXPECT_EQ(kEventSignaled, observer.Wait())
1935 << "Timed out waiting for all SSRCs to send packets.";
1936
1937 // Reconfigure down to one stream.
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001938 send_stream_->ReconfigureVideoEncoder(one_stream);
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001939 observer.ResetExpectedSsrcs(1);
1940 EXPECT_EQ(kEventSignaled, observer.Wait())
1941 << "Timed out waiting for single RTP packet.";
1942
1943 // Reconfigure back to use all streams.
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00001944 send_stream_->ReconfigureVideoEncoder(encoder_config_);
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001945 observer.ResetExpectedSsrcs(kNumSsrcs);
1946 EXPECT_EQ(kEventSignaled, observer.Wait())
1947 << "Timed out waiting for all SSRCs to send packets.";
1948 }
1949
1950 observer.StopSending();
1951
1952 Stop();
1953 DestroyStreams();
1954}
1955
aluebs@webrtc.orgb623c5c2014-08-26 14:22:51 +00001956TEST_F(EndToEndTest, DISABLED_RestartingSendStreamPreservesRtpState) {
pbos@webrtc.org2bb1bda2014-07-07 13:06:48 +00001957 TestRtpStatePreservation(false);
1958}
1959
1960TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpStatesWithRtx) {
1961 TestRtpStatePreservation(true);
1962}
1963
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00001964TEST_F(EndToEndTest, RespectsNetworkState) {
1965 // TODO(pbos): Remove accepted downtime packets etc. when signaling network
1966 // down blocks until no more packets will be sent.
1967
1968 // Pacer will send from its packet list and then send required padding before
1969 // checking paused_ again. This should be enough for one round of pacing,
1970 // otherwise increase.
1971 static const int kNumAcceptedDowntimeRtp = 5;
1972 // A single RTCP may be in the pipeline.
1973 static const int kNumAcceptedDowntimeRtcp = 1;
1974 class NetworkStateTest : public test::EndToEndTest, public test::FakeEncoder {
1975 public:
1976 NetworkStateTest()
1977 : EndToEndTest(kDefaultTimeoutMs),
1978 FakeEncoder(Clock::GetRealTimeClock()),
1979 test_crit_(CriticalSectionWrapper::CreateCriticalSection()),
1980 encoded_frames_(EventWrapper::Create()),
1981 sender_packets_(EventWrapper::Create()),
1982 receiver_packets_(EventWrapper::Create()),
1983 sender_state_(Call::kNetworkUp),
1984 down_sender_rtp_(0),
1985 down_sender_rtcp_(0),
1986 receiver_state_(Call::kNetworkUp),
1987 down_receiver_rtcp_(0),
1988 down_frames_(0) {}
1989
1990 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1991 CriticalSectionScoped lock(test_crit_.get());
1992 if (sender_state_ == Call::kNetworkDown) {
1993 ++down_sender_rtp_;
1994 EXPECT_LE(down_sender_rtp_, kNumAcceptedDowntimeRtp)
1995 << "RTP sent during sender-side downtime.";
1996 if (down_sender_rtp_> kNumAcceptedDowntimeRtp)
1997 sender_packets_->Set();
1998 } else {
1999 sender_packets_->Set();
2000 }
2001 return SEND_PACKET;
2002 }
2003
2004 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) OVERRIDE {
2005 CriticalSectionScoped lock(test_crit_.get());
2006 if (sender_state_ == Call::kNetworkDown) {
2007 ++down_sender_rtcp_;
2008 EXPECT_LE(down_sender_rtcp_, kNumAcceptedDowntimeRtcp)
2009 << "RTCP sent during sender-side downtime.";
2010 if (down_sender_rtcp_ > kNumAcceptedDowntimeRtcp)
2011 sender_packets_->Set();
2012 } else {
2013 sender_packets_->Set();
2014 }
2015 return SEND_PACKET;
2016 }
2017
2018 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) OVERRIDE {
2019 ADD_FAILURE() << "Unexpected receiver RTP, should not be sending.";
2020 return SEND_PACKET;
2021 }
2022
2023 virtual Action OnReceiveRtcp(const uint8_t* packet,
2024 size_t length) OVERRIDE {
2025 CriticalSectionScoped lock(test_crit_.get());
2026 if (receiver_state_ == Call::kNetworkDown) {
2027 ++down_receiver_rtcp_;
2028 EXPECT_LE(down_receiver_rtcp_, kNumAcceptedDowntimeRtcp)
2029 << "RTCP sent during receiver-side downtime.";
2030 if (down_receiver_rtcp_ > kNumAcceptedDowntimeRtcp)
2031 receiver_packets_->Set();
2032 } else {
2033 receiver_packets_->Set();
2034 }
2035 return SEND_PACKET;
2036 }
2037
2038 virtual void OnCallsCreated(Call* sender_call,
2039 Call* receiver_call) OVERRIDE {
2040 sender_call_ = sender_call;
2041 receiver_call_ = receiver_call;
2042 }
2043
2044 virtual void ModifyConfigs(
2045 VideoSendStream::Config* send_config,
2046 std::vector<VideoReceiveStream::Config>* receive_configs,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +00002047 VideoEncoderConfig* encoder_config) OVERRIDE {
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002048 send_config->encoder_settings.encoder = this;
2049 }
2050
2051 virtual void PerformTest() OVERRIDE {
2052 EXPECT_EQ(kEventSignaled, encoded_frames_->Wait(kDefaultTimeoutMs))
2053 << "No frames received by the encoder.";
2054 EXPECT_EQ(kEventSignaled, sender_packets_->Wait(kDefaultTimeoutMs))
2055 << "Timed out waiting for send-side packets.";
2056 EXPECT_EQ(kEventSignaled, receiver_packets_->Wait(kDefaultTimeoutMs))
2057 << "Timed out waiting for receiver-side packets.";
2058
2059 // Sender-side network down.
2060 sender_call_->SignalNetworkState(Call::kNetworkDown);
2061 {
2062 CriticalSectionScoped lock(test_crit_.get());
2063 sender_packets_->Reset(); // Earlier packets should not count.
2064 sender_state_ = Call::kNetworkDown;
2065 }
2066 EXPECT_EQ(kEventTimeout, sender_packets_->Wait(kSilenceTimeoutMs))
2067 << "Packets sent during sender-network downtime.";
2068 EXPECT_EQ(kEventSignaled, receiver_packets_->Wait(kDefaultTimeoutMs))
2069 << "Timed out waiting for receiver-side packets.";
2070 // Receiver-side network down.
2071 receiver_call_->SignalNetworkState(Call::kNetworkDown);
2072 {
2073 CriticalSectionScoped lock(test_crit_.get());
2074 receiver_packets_->Reset(); // Earlier packets should not count.
2075 receiver_state_ = Call::kNetworkDown;
2076 }
2077 EXPECT_EQ(kEventTimeout, receiver_packets_->Wait(kSilenceTimeoutMs))
2078 << "Packets sent during receiver-network downtime.";
2079
2080 // Network back up again for both.
2081 {
2082 CriticalSectionScoped lock(test_crit_.get());
2083 sender_packets_->Reset(); // Earlier packets should not count.
2084 receiver_packets_->Reset(); // Earlier packets should not count.
2085 sender_state_ = receiver_state_ = Call::kNetworkUp;
2086 }
2087 sender_call_->SignalNetworkState(Call::kNetworkUp);
2088 receiver_call_->SignalNetworkState(Call::kNetworkUp);
2089 EXPECT_EQ(kEventSignaled, sender_packets_->Wait(kDefaultTimeoutMs))
2090 << "Timed out waiting for send-side packets.";
2091 EXPECT_EQ(kEventSignaled, receiver_packets_->Wait(kDefaultTimeoutMs))
2092 << "Timed out waiting for receiver-side packets.";
2093 }
2094
2095 virtual int32_t Encode(const I420VideoFrame& input_image,
2096 const CodecSpecificInfo* codec_specific_info,
2097 const std::vector<VideoFrameType>* frame_types)
2098 OVERRIDE {
2099 {
2100 CriticalSectionScoped lock(test_crit_.get());
2101 if (sender_state_ == Call::kNetworkDown) {
2102 ++down_frames_;
2103 EXPECT_LE(down_frames_, 1)
2104 << "Encoding more than one frame while network is down.";
2105 if (down_frames_ > 1)
2106 encoded_frames_->Set();
2107 } else {
2108 encoded_frames_->Set();
2109 }
2110 }
2111 return test::FakeEncoder::Encode(
2112 input_image, codec_specific_info, frame_types);
2113 }
2114
2115 private:
2116 const scoped_ptr<CriticalSectionWrapper> test_crit_;
2117 scoped_ptr<EventWrapper> encoded_frames_;
2118 scoped_ptr<EventWrapper> sender_packets_;
2119 scoped_ptr<EventWrapper> receiver_packets_;
2120 Call* sender_call_;
2121 Call* receiver_call_;
2122 Call::NetworkState sender_state_ GUARDED_BY(test_crit_);
2123 int down_sender_rtp_ GUARDED_BY(test_crit_);
2124 int down_sender_rtcp_ GUARDED_BY(test_crit_);
2125 Call::NetworkState receiver_state_ GUARDED_BY(test_crit_);
2126 int down_receiver_rtcp_ GUARDED_BY(test_crit_);
2127 int down_frames_ GUARDED_BY(test_crit_);
2128 } test;
2129
2130 RunBaseTest(&test);
2131}
2132
2133TEST_F(EndToEndTest, NewSendStreamsRespectNetworkDown) {
2134 class UnusedEncoder : public test::FakeEncoder {
2135 public:
2136 UnusedEncoder() : FakeEncoder(Clock::GetRealTimeClock()) {}
2137 virtual int32_t Encode(const I420VideoFrame& input_image,
2138 const CodecSpecificInfo* codec_specific_info,
2139 const std::vector<VideoFrameType>* frame_types)
2140 OVERRIDE {
2141 ADD_FAILURE() << "Unexpected frame encode.";
2142 return test::FakeEncoder::Encode(
2143 input_image, codec_specific_info, frame_types);
2144 }
2145 };
2146
2147 UnusedTransport transport;
2148 CreateSenderCall(Call::Config(&transport));
2149 sender_call_->SignalNetworkState(Call::kNetworkDown);
2150
2151 CreateSendConfig(1);
2152 UnusedEncoder unused_encoder;
2153 send_config_.encoder_settings.encoder = &unused_encoder;
2154 CreateStreams();
2155 CreateFrameGeneratorCapturer();
2156
2157 Start();
2158 SleepMs(kSilenceTimeoutMs);
2159 Stop();
2160
2161 DestroyStreams();
2162}
2163
2164TEST_F(EndToEndTest, NewReceiveStreamsRespectNetworkDown) {
2165 test::DirectTransport sender_transport;
2166 CreateSenderCall(Call::Config(&sender_transport));
2167 UnusedTransport transport;
2168 CreateReceiverCall(Call::Config(&transport));
2169 sender_transport.SetReceiver(receiver_call_->Receiver());
2170
2171 receiver_call_->SignalNetworkState(Call::kNetworkDown);
2172
2173 CreateSendConfig(1);
2174 CreateMatchingReceiveConfigs();
2175 CreateStreams();
2176 CreateFrameGeneratorCapturer();
2177
2178 Start();
2179 SleepMs(kSilenceTimeoutMs);
2180 Stop();
2181
2182 sender_transport.StopSending();
2183
2184 DestroyStreams();
2185}
pbos@webrtc.org09cc6862014-11-04 13:48:15 +00002186
2187// TODO(pbos): Remove this regression test when VideoEngine is no longer used as
2188// a backend. This is to test that we hand channels back properly.
2189TEST_F(EndToEndTest, CanCreateAndDestroyManyVideoStreams) {
2190 test::NullTransport transport;
2191 scoped_ptr<Call> call(Call::Create(Call::Config(&transport)));
2192 test::FakeDecoder fake_decoder;
2193 test::FakeEncoder fake_encoder(Clock::GetRealTimeClock());
2194 for (size_t i = 0; i < 100; ++i) {
2195 VideoSendStream::Config send_config;
2196 send_config.encoder_settings.encoder = &fake_encoder;
2197 send_config.encoder_settings.payload_name = "FAKE";
2198 send_config.encoder_settings.payload_type = 123;
2199
2200 VideoEncoderConfig encoder_config;
2201 encoder_config.streams = test::CreateVideoStreams(1);
2202 send_config.rtp.ssrcs.push_back(1);
2203 VideoSendStream* send_stream =
2204 call->CreateVideoSendStream(send_config, encoder_config);
2205 call->DestroyVideoSendStream(send_stream);
2206
2207 VideoReceiveStream::Config receive_config;
2208 receive_config.rtp.remote_ssrc = 1;
2209 receive_config.rtp.local_ssrc = kReceiverLocalSsrc;
2210 VideoReceiveStream::Decoder decoder;
2211 decoder.decoder = &fake_decoder;
2212 decoder.payload_type = 123;
2213 decoder.payload_name = "FAKE";
2214 receive_config.decoders.push_back(decoder);
2215 VideoReceiveStream* receive_stream =
2216 call->CreateVideoReceiveStream(receive_config);
2217 call->DestroyVideoReceiveStream(receive_stream);
2218 }
2219}
2220
pbos@webrtc.org994d0b72014-06-27 08:47:52 +00002221} // namespace webrtc