2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
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.
17 #include "testing/gtest/include/gtest/gtest.h"
19 #include "webrtc/call.h"
20 #include "webrtc/frame_callback.h"
21 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
22 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
23 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
24 #include "webrtc/system_wrappers/interface/event_wrapper.h"
25 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
26 #include "webrtc/system_wrappers/interface/sleep.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"
37 #include "webrtc/test/testsupport/perf_test.h"
38 #include "webrtc/video/transport_adapter.h"
42 static unsigned int kDefaultTimeoutMs = 30 * 1000;
43 static unsigned int kLongTimeoutMs = 120 * 1000;
44 static const uint32_t kSendSsrc = 0x654321;
45 static const uint32_t kSendRtxSsrc = 0x424242;
46 static const uint32_t kReceiverLocalSsrc = 0x123456;
47 static const uint8_t kSendPayloadType = 125;
48 static const uint8_t kSendRtxPayloadType = 126;
49 static const int kRedPayloadType = 118;
50 static const int kUlpfecPayloadType = 119;
52 class CallTest : public ::testing::Test {
56 receive_stream_(NULL),
57 fake_encoder_(Clock::GetRealTimeClock()) {}
60 EXPECT_EQ(NULL, send_stream_);
61 EXPECT_EQ(NULL, receive_stream_);
65 void CreateCalls(const Call::Config& sender_config,
66 const Call::Config& receiver_config) {
67 sender_call_.reset(Call::Create(sender_config));
68 receiver_call_.reset(Call::Create(receiver_config));
71 void CreateTestConfigs() {
72 send_config_ = sender_call_->GetDefaultSendConfig();
73 receive_config_ = receiver_call_->GetDefaultReceiveConfig();
75 send_config_.rtp.ssrcs.push_back(kSendSsrc);
76 send_config_.encoder_settings = test::CreateEncoderSettings(
77 &fake_encoder_, "FAKE", kSendPayloadType, 1);
79 assert(receive_config_.codecs.empty());
81 test::CreateDecoderVideoCodec(send_config_.encoder_settings);
82 receive_config_.codecs.push_back(codec);
83 ExternalVideoDecoder decoder;
84 decoder.decoder = &fake_decoder_;
85 decoder.payload_type = send_config_.encoder_settings.payload_type;
86 receive_config_.external_decoders.push_back(decoder);
87 receive_config_.rtp.remote_ssrc = send_config_.rtp.ssrcs[0];
88 receive_config_.rtp.local_ssrc = kReceiverLocalSsrc;
91 void CreateStreams() {
92 assert(send_stream_ == NULL);
93 assert(receive_stream_ == NULL);
95 send_stream_ = sender_call_->CreateVideoSendStream(send_config_);
96 receive_stream_ = receiver_call_->CreateVideoReceiveStream(receive_config_);
99 void CreateFrameGenerator() {
100 frame_generator_capturer_.reset(test::FrameGeneratorCapturer::Create(
101 send_stream_->Input(),
102 send_config_.encoder_settings.streams[0].width,
103 send_config_.encoder_settings.streams[0].height,
105 Clock::GetRealTimeClock()));
108 void StartSending() {
109 receive_stream_->Start();
110 send_stream_->Start();
111 if (frame_generator_capturer_.get() != NULL)
112 frame_generator_capturer_->Start();
116 if (frame_generator_capturer_.get() != NULL)
117 frame_generator_capturer_->Stop();
118 if (send_stream_ != NULL)
119 send_stream_->Stop();
120 if (receive_stream_ != NULL)
121 receive_stream_->Stop();
124 void DestroyStreams() {
125 if (send_stream_ != NULL)
126 sender_call_->DestroyVideoSendStream(send_stream_);
127 if (receive_stream_ != NULL)
128 receiver_call_->DestroyVideoReceiveStream(receive_stream_);
130 receive_stream_ = NULL;
133 void DecodesRetransmittedFrame(bool retransmit_over_rtx);
134 void ReceivesPliAndRecovers(int rtp_history_ms);
135 void RespectsRtcpMode(newapi::RtcpMode rtcp_mode);
136 void TestXrReceiverReferenceTimeReport(bool enable_rrtr);
138 scoped_ptr<Call> sender_call_;
139 scoped_ptr<Call> receiver_call_;
141 VideoSendStream::Config send_config_;
142 VideoReceiveStream::Config receive_config_;
144 VideoSendStream* send_stream_;
145 VideoReceiveStream* receive_stream_;
147 scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_;
149 test::FakeEncoder fake_encoder_;
150 test::FakeDecoder fake_decoder_;
153 class NackObserver : public test::RtpRtcpObserver {
154 static const int kNumberOfNacksToObserve = 2;
155 static const int kLossBurstSize = 2;
156 static const int kPacketsBetweenLossBursts = 9;
160 : test::RtpRtcpObserver(kLongTimeoutMs),
161 rtp_parser_(RtpHeaderParser::Create()),
162 sent_rtp_packets_(0),
163 packets_left_to_drop_(0),
164 nacks_left_(kNumberOfNacksToObserve) {}
167 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
169 EXPECT_TRUE(rtp_parser_->Parse(packet, static_cast<int>(length), &header));
171 // Never drop retransmitted packets.
172 if (dropped_packets_.find(header.sequenceNumber) !=
173 dropped_packets_.end()) {
174 retransmitted_packets_.insert(header.sequenceNumber);
175 if (nacks_left_ == 0 &&
176 retransmitted_packets_.size() == dropped_packets_.size()) {
177 observation_complete_->Set();
184 // Enough NACKs received, stop dropping packets.
185 if (nacks_left_ == 0)
188 // Check if it's time for a new loss burst.
189 if (sent_rtp_packets_ % kPacketsBetweenLossBursts == 0)
190 packets_left_to_drop_ = kLossBurstSize;
192 if (packets_left_to_drop_ > 0) {
193 --packets_left_to_drop_;
194 dropped_packets_.insert(header.sequenceNumber);
201 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) OVERRIDE {
202 RTCPUtility::RTCPParserV2 parser(packet, length, true);
203 EXPECT_TRUE(parser.IsValid());
205 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
206 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
207 if (packet_type == RTCPUtility::kRtcpRtpfbNackCode) {
211 packet_type = parser.Iterate();
217 scoped_ptr<RtpHeaderParser> rtp_parser_;
218 std::set<uint16_t> dropped_packets_;
219 std::set<uint16_t> retransmitted_packets_;
220 uint64_t sent_rtp_packets_;
221 int packets_left_to_drop_;
225 TEST_F(CallTest, ReceiverCanBeStartedTwice) {
226 test::NullTransport transport;
227 CreateCalls(Call::Config(&transport), Call::Config(&transport));
232 receive_stream_->Start();
233 receive_stream_->Start();
238 TEST_F(CallTest, ReceiverCanBeStoppedTwice) {
239 test::NullTransport transport;
240 CreateCalls(Call::Config(&transport), Call::Config(&transport));
245 receive_stream_->Stop();
246 receive_stream_->Stop();
251 TEST_F(CallTest, RendersSingleDelayedFrame) {
252 static const int kWidth = 320;
253 static const int kHeight = 240;
254 // This constant is chosen to be higher than the timeout in the video_render
255 // module. This makes sure that frames aren't dropped if there are no other
256 // frames in the queue.
257 static const int kDelayRenderCallbackMs = 1000;
259 class Renderer : public VideoRenderer {
261 Renderer() : event_(EventWrapper::Create()) {}
263 virtual void RenderFrame(const I420VideoFrame& video_frame,
264 int /*time_to_render_ms*/) OVERRIDE {
268 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
270 scoped_ptr<EventWrapper> event_;
273 class TestFrameCallback : public I420FrameCallback {
275 TestFrameCallback() : event_(EventWrapper::Create()) {}
277 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
280 virtual void FrameCallback(I420VideoFrame* frame) OVERRIDE {
281 SleepMs(kDelayRenderCallbackMs);
285 scoped_ptr<EventWrapper> event_;
288 test::DirectTransport sender_transport, receiver_transport;
290 CreateCalls(Call::Config(&sender_transport),
291 Call::Config(&receiver_transport));
293 sender_transport.SetReceiver(receiver_call_->Receiver());
294 receiver_transport.SetReceiver(sender_call_->Receiver());
298 TestFrameCallback pre_render_callback;
299 receive_config_.pre_render_callback = &pre_render_callback;
300 receive_config_.renderer = &renderer;
305 // Create frames that are smaller than the send width/height, this is done to
306 // check that the callbacks are done after processing video.
307 scoped_ptr<test::FrameGenerator> frame_generator(
308 test::FrameGenerator::Create(kWidth, kHeight));
309 send_stream_->Input()->SwapFrame(frame_generator->NextFrame());
310 EXPECT_EQ(kEventSignaled, pre_render_callback.Wait())
311 << "Timed out while waiting for pre-render callback.";
312 EXPECT_EQ(kEventSignaled, renderer.Wait())
313 << "Timed out while waiting for the frame to render.";
317 sender_transport.StopSending();
318 receiver_transport.StopSending();
323 TEST_F(CallTest, TransmitsFirstFrame) {
324 class Renderer : public VideoRenderer {
326 Renderer() : event_(EventWrapper::Create()) {}
328 virtual void RenderFrame(const I420VideoFrame& video_frame,
329 int /*time_to_render_ms*/) OVERRIDE {
333 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
335 scoped_ptr<EventWrapper> event_;
338 test::DirectTransport sender_transport, receiver_transport;
340 CreateCalls(Call::Config(&sender_transport),
341 Call::Config(&receiver_transport));
343 sender_transport.SetReceiver(receiver_call_->Receiver());
344 receiver_transport.SetReceiver(sender_call_->Receiver());
347 receive_config_.renderer = &renderer;
352 scoped_ptr<test::FrameGenerator> frame_generator(test::FrameGenerator::Create(
353 send_config_.encoder_settings.streams[0].width,
354 send_config_.encoder_settings.streams[0].height));
355 send_stream_->Input()->SwapFrame(frame_generator->NextFrame());
357 EXPECT_EQ(kEventSignaled, renderer.Wait())
358 << "Timed out while waiting for the frame to render.";
362 sender_transport.StopSending();
363 receiver_transport.StopSending();
368 TEST_F(CallTest, ReceiverUsesLocalSsrc) {
369 class SyncRtcpObserver : public test::RtpRtcpObserver {
371 SyncRtcpObserver() : test::RtpRtcpObserver(kDefaultTimeoutMs) {}
373 virtual Action OnReceiveRtcp(const uint8_t* packet,
374 size_t length) OVERRIDE {
375 RTCPUtility::RTCPParserV2 parser(packet, length, true);
376 EXPECT_TRUE(parser.IsValid());
378 ssrc |= static_cast<uint32_t>(packet[4]) << 24;
379 ssrc |= static_cast<uint32_t>(packet[5]) << 16;
380 ssrc |= static_cast<uint32_t>(packet[6]) << 8;
381 ssrc |= static_cast<uint32_t>(packet[7]) << 0;
382 EXPECT_EQ(kReceiverLocalSsrc, ssrc);
383 observation_complete_->Set();
389 CreateCalls(Call::Config(observer.SendTransport()),
390 Call::Config(observer.ReceiveTransport()));
392 observer.SetReceivers(receiver_call_->Receiver(), sender_call_->Receiver());
397 CreateFrameGenerator();
400 EXPECT_EQ(kEventSignaled, observer.Wait())
401 << "Timed out while waiting for a receiver RTCP packet to be sent.";
405 observer.StopSending();
410 TEST_F(CallTest, ReceivesAndRetransmitsNack) {
411 NackObserver observer;
413 CreateCalls(Call::Config(observer.SendTransport()),
414 Call::Config(observer.ReceiveTransport()));
416 observer.SetReceivers(receiver_call_->Receiver(), sender_call_->Receiver());
419 int rtp_history_ms = 1000;
420 send_config_.rtp.nack.rtp_history_ms = rtp_history_ms;
421 receive_config_.rtp.nack.rtp_history_ms = rtp_history_ms;
424 CreateFrameGenerator();
427 // Wait() waits for an event triggered when NACKs have been received, NACKed
428 // packets retransmitted and frames rendered again.
429 EXPECT_EQ(kEventSignaled, observer.Wait());
433 observer.StopSending();
438 // TODO(pbos): Flaky, webrtc:3269
439 TEST_F(CallTest, DISABLED_CanReceiveFec) {
440 class FecRenderObserver : public test::RtpRtcpObserver, public VideoRenderer {
443 : RtpRtcpObserver(kDefaultTimeoutMs),
444 state_(kFirstPacket),
445 protected_sequence_number_(0),
446 protected_frame_timestamp_(0) {}
449 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE
450 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
452 EXPECT_TRUE(parser_->Parse(packet, static_cast<int>(length), &header));
454 EXPECT_EQ(kRedPayloadType, header.payloadType);
455 int encapsulated_payload_type =
456 static_cast<int>(packet[header.headerLength]);
457 if (encapsulated_payload_type != kSendPayloadType)
458 EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type);
462 state_ = kDropEveryOtherPacketUntilFec;
464 case kDropEveryOtherPacketUntilFec:
465 if (encapsulated_payload_type == kUlpfecPayloadType) {
466 state_ = kDropNextMediaPacket;
469 if (header.sequenceNumber % 2 == 0)
472 case kDropNextMediaPacket:
473 if (encapsulated_payload_type == kSendPayloadType) {
474 protected_sequence_number_ = header.sequenceNumber;
475 protected_frame_timestamp_ = header.timestamp;
476 state_ = kProtectedPacketDropped;
480 case kProtectedPacketDropped:
481 EXPECT_NE(header.sequenceNumber, protected_sequence_number_)
482 << "Protected packet retransmitted. Should not happen with FEC.";
489 virtual void RenderFrame(const I420VideoFrame& video_frame,
490 int time_to_render_ms) OVERRIDE {
491 CriticalSectionScoped lock(crit_.get());
492 // Rendering frame with timestamp associated with dropped packet -> FEC
493 // protection worked.
494 if (state_ == kProtectedPacketDropped &&
495 video_frame.timestamp() == protected_frame_timestamp_) {
496 observation_complete_->Set();
502 kDropEveryOtherPacketUntilFec,
503 kDropNextMediaPacket,
504 kProtectedPacketDropped,
507 uint32_t protected_sequence_number_ GUARDED_BY(crit_);
508 uint32_t protected_frame_timestamp_ GUARDED_BY(crit_);
511 CreateCalls(Call::Config(observer.SendTransport()),
512 Call::Config(observer.ReceiveTransport()));
514 observer.SetReceivers(receiver_call_->Receiver(), sender_call_->Receiver());
517 // TODO(pbos): Run this test with combined NACK/FEC enabled as well.
518 // int rtp_history_ms = 1000;
519 // receive_config_.rtp.nack.rtp_history_ms = rtp_history_ms;
520 // send_config_.rtp.nack.rtp_history_ms = rtp_history_ms;
521 send_config_.rtp.fec.red_payload_type = kRedPayloadType;
522 send_config_.rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
524 receive_config_.rtp.fec.red_payload_type = kRedPayloadType;
525 receive_config_.rtp.fec.ulpfec_payload_type = kUlpfecPayloadType;
526 receive_config_.renderer = &observer;
529 CreateFrameGenerator();
532 // Wait() waits for an event triggered when NACKs have been received, NACKed
533 // packets retransmitted and frames rendered again.
534 EXPECT_EQ(kEventSignaled, observer.Wait());
538 observer.StopSending();
543 // This test drops second RTP packet with a marker bit set, makes sure it's
544 // retransmitted and renders. Retransmission SSRCs are also checked.
545 void CallTest::DecodesRetransmittedFrame(bool retransmit_over_rtx) {
546 static const int kDroppedFrameNumber = 2;
547 class RetransmissionObserver : public test::RtpRtcpObserver,
548 public I420FrameCallback {
550 RetransmissionObserver(bool expect_rtx)
551 : RtpRtcpObserver(kDefaultTimeoutMs),
552 retransmission_ssrc_(expect_rtx ? kSendRtxSsrc : kSendSsrc),
553 retransmission_payload_type_(expect_rtx ? kSendRtxPayloadType
555 marker_bits_observed_(0),
556 retransmitted_timestamp_(0),
557 frame_retransmitted_(false) {}
560 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
562 EXPECT_TRUE(parser_->Parse(packet, static_cast<int>(length), &header));
564 if (header.timestamp == retransmitted_timestamp_) {
565 EXPECT_EQ(retransmission_ssrc_, header.ssrc);
566 EXPECT_EQ(retransmission_payload_type_, header.payloadType);
567 frame_retransmitted_ = true;
571 EXPECT_EQ(kSendSsrc, header.ssrc);
572 EXPECT_EQ(kSendPayloadType, header.payloadType);
574 // Found the second frame's final packet, drop this and expect a
576 if (header.markerBit && ++marker_bits_observed_ == kDroppedFrameNumber) {
577 retransmitted_timestamp_ = header.timestamp;
584 virtual void FrameCallback(I420VideoFrame* frame) OVERRIDE {
585 CriticalSectionScoped lock(crit_.get());
586 if (frame->timestamp() == retransmitted_timestamp_) {
587 EXPECT_TRUE(frame_retransmitted_);
588 observation_complete_->Set();
592 const uint32_t retransmission_ssrc_;
593 const int retransmission_payload_type_;
594 int marker_bits_observed_;
595 uint32_t retransmitted_timestamp_;
596 bool frame_retransmitted_;
597 } observer(retransmit_over_rtx);
599 CreateCalls(Call::Config(observer.SendTransport()),
600 Call::Config(observer.ReceiveTransport()));
602 observer.SetReceivers(receiver_call_->Receiver(), sender_call_->Receiver());
605 send_config_.rtp.nack.rtp_history_ms =
606 receive_config_.rtp.nack.rtp_history_ms = 1000;
607 if (retransmit_over_rtx) {
608 send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrc);
609 send_config_.rtp.rtx.payload_type = kSendRtxPayloadType;
610 int payload_type = send_config_.encoder_settings.payload_type;
611 receive_config_.rtp.rtx[payload_type].ssrc = kSendRtxSsrc;
612 receive_config_.rtp.rtx[payload_type].payload_type = kSendRtxPayloadType;
614 receive_config_.pre_render_callback = &observer;
617 CreateFrameGenerator();
620 EXPECT_EQ(kEventSignaled, observer.Wait())
621 << "Timed out while waiting for retransmission to render.";
624 observer.StopSending();
628 TEST_F(CallTest, DecodesRetransmittedFrame) {
629 DecodesRetransmittedFrame(false);
632 TEST_F(CallTest, DecodesRetransmittedFrameOverRtx) {
633 DecodesRetransmittedFrame(true);
636 TEST_F(CallTest, UsesFrameCallbacks) {
637 static const int kWidth = 320;
638 static const int kHeight = 240;
640 class Renderer : public VideoRenderer {
642 Renderer() : event_(EventWrapper::Create()) {}
644 virtual void RenderFrame(const I420VideoFrame& video_frame,
645 int /*time_to_render_ms*/) OVERRIDE {
646 EXPECT_EQ(0, *video_frame.buffer(kYPlane))
647 << "Rendered frame should have zero luma which is applied by the "
648 "pre-render callback.";
652 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
653 scoped_ptr<EventWrapper> event_;
656 class TestFrameCallback : public I420FrameCallback {
658 TestFrameCallback(int expected_luma_byte, int next_luma_byte)
659 : event_(EventWrapper::Create()),
660 expected_luma_byte_(expected_luma_byte),
661 next_luma_byte_(next_luma_byte) {}
663 EventTypeWrapper Wait() { return event_->Wait(kDefaultTimeoutMs); }
666 virtual void FrameCallback(I420VideoFrame* frame) {
667 EXPECT_EQ(kWidth, frame->width())
668 << "Width not as expected, callback done before resize?";
669 EXPECT_EQ(kHeight, frame->height())
670 << "Height not as expected, callback done before resize?";
672 // Previous luma specified, observed luma should be fairly close.
673 if (expected_luma_byte_ != -1) {
674 EXPECT_NEAR(expected_luma_byte_, *frame->buffer(kYPlane), 10);
677 memset(frame->buffer(kYPlane),
679 frame->allocated_size(kYPlane));
684 scoped_ptr<EventWrapper> event_;
685 int expected_luma_byte_;
689 TestFrameCallback pre_encode_callback(-1, 255); // Changes luma to 255.
690 TestFrameCallback pre_render_callback(255, 0); // Changes luma from 255 to 0.
692 test::DirectTransport sender_transport, receiver_transport;
694 CreateCalls(Call::Config(&sender_transport),
695 Call::Config(&receiver_transport));
697 sender_transport.SetReceiver(receiver_call_->Receiver());
698 receiver_transport.SetReceiver(sender_call_->Receiver());
701 scoped_ptr<VP8Encoder> encoder(VP8Encoder::Create());
702 send_config_.encoder_settings.encoder = encoder.get();
703 send_config_.encoder_settings.payload_name = "VP8";
704 ASSERT_EQ(1u, send_config_.encoder_settings.streams.size())
705 << "Test setup error.";
706 send_config_.encoder_settings.streams[0].width = kWidth;
707 send_config_.encoder_settings.streams[0].height = kHeight;
708 send_config_.pre_encode_callback = &pre_encode_callback;
709 receive_config_.codecs.clear();
711 test::CreateDecoderVideoCodec(send_config_.encoder_settings);
712 receive_config_.external_decoders.clear();
713 receive_config_.codecs.push_back(codec);
714 receive_config_.pre_render_callback = &pre_render_callback;
715 receive_config_.renderer = &renderer;
720 // Create frames that are smaller than the send width/height, this is done to
721 // check that the callbacks are done after processing video.
722 scoped_ptr<test::FrameGenerator> frame_generator(
723 test::FrameGenerator::Create(kWidth / 2, kHeight / 2));
724 send_stream_->Input()->SwapFrame(frame_generator->NextFrame());
726 EXPECT_EQ(kEventSignaled, pre_encode_callback.Wait())
727 << "Timed out while waiting for pre-encode callback.";
728 EXPECT_EQ(kEventSignaled, pre_render_callback.Wait())
729 << "Timed out while waiting for pre-render callback.";
730 EXPECT_EQ(kEventSignaled, renderer.Wait())
731 << "Timed out while waiting for the frame to render.";
735 sender_transport.StopSending();
736 receiver_transport.StopSending();
741 class PliObserver : public test::RtpRtcpObserver, public VideoRenderer {
742 static const int kInverseDropProbability = 16;
745 explicit PliObserver(bool nack_enabled)
746 : test::RtpRtcpObserver(kLongTimeoutMs),
747 nack_enabled_(nack_enabled),
748 highest_dropped_timestamp_(0),
750 received_pli_(false) {}
752 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
754 EXPECT_TRUE(parser_->Parse(packet, static_cast<int>(length), &header));
756 // Drop all retransmitted packets to force a PLI.
757 if (header.timestamp <= highest_dropped_timestamp_)
760 if (frames_to_drop_ > 0) {
761 highest_dropped_timestamp_ = header.timestamp;
769 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) OVERRIDE {
770 RTCPUtility::RTCPParserV2 parser(packet, length, true);
771 EXPECT_TRUE(parser.IsValid());
773 for (RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
774 packet_type != RTCPUtility::kRtcpNotValidCode;
775 packet_type = parser.Iterate()) {
777 EXPECT_NE(packet_type, RTCPUtility::kRtcpRtpfbNackCode);
779 if (packet_type == RTCPUtility::kRtcpPsfbPliCode) {
780 received_pli_ = true;
787 virtual void RenderFrame(const I420VideoFrame& video_frame,
788 int time_to_render_ms) OVERRIDE {
789 CriticalSectionScoped lock(crit_.get());
790 if (received_pli_ && video_frame.timestamp() > highest_dropped_timestamp_) {
791 observation_complete_->Set();
794 frames_to_drop_ = kPacketsToDrop;
798 static const int kPacketsToDrop = 1;
801 uint32_t highest_dropped_timestamp_;
806 void CallTest::ReceivesPliAndRecovers(int rtp_history_ms) {
807 PliObserver observer(rtp_history_ms > 0);
809 CreateCalls(Call::Config(observer.SendTransport()),
810 Call::Config(observer.ReceiveTransport()));
812 observer.SetReceivers(receiver_call_->Receiver(), sender_call_->Receiver());
815 send_config_.rtp.nack.rtp_history_ms = rtp_history_ms;
816 receive_config_.rtp.nack.rtp_history_ms = rtp_history_ms;
817 receive_config_.renderer = &observer;
820 CreateFrameGenerator();
823 // Wait() waits for an event triggered when Pli has been received and frames
824 // have been rendered afterwards.
825 EXPECT_EQ(kEventSignaled, observer.Wait());
829 observer.StopSending();
834 TEST_F(CallTest, ReceivesPliAndRecoversWithNack) {
835 ReceivesPliAndRecovers(1000);
838 // TODO(pbos): Enable this when 2250 is resolved.
839 TEST_F(CallTest, DISABLED_ReceivesPliAndRecoversWithoutNack) {
840 ReceivesPliAndRecovers(0);
843 TEST_F(CallTest, SurvivesIncomingRtpPacketsToDestroyedReceiveStream) {
844 class PacketInputObserver : public PacketReceiver {
846 explicit PacketInputObserver(PacketReceiver* receiver)
847 : receiver_(receiver), delivered_packet_(EventWrapper::Create()) {}
849 EventTypeWrapper Wait() {
850 return delivered_packet_->Wait(kDefaultTimeoutMs);
854 virtual bool DeliverPacket(const uint8_t* packet, size_t length) {
855 if (RtpHeaderParser::IsRtcp(packet, static_cast<int>(length))) {
856 return receiver_->DeliverPacket(packet, length);
858 EXPECT_FALSE(receiver_->DeliverPacket(packet, length));
859 delivered_packet_->Set();
864 PacketReceiver* receiver_;
865 scoped_ptr<EventWrapper> delivered_packet_;
868 test::DirectTransport send_transport, receive_transport;
870 CreateCalls(Call::Config(&send_transport), Call::Config(&receive_transport));
871 PacketInputObserver input_observer(receiver_call_->Receiver());
873 send_transport.SetReceiver(&input_observer);
874 receive_transport.SetReceiver(sender_call_->Receiver());
879 CreateFrameGenerator();
882 receiver_call_->DestroyVideoReceiveStream(receive_stream_);
883 receive_stream_ = NULL;
885 // Wait() waits for a received packet.
886 EXPECT_EQ(kEventSignaled, input_observer.Wait());
892 send_transport.StopSending();
893 receive_transport.StopSending();
896 void CallTest::RespectsRtcpMode(newapi::RtcpMode rtcp_mode) {
897 static const int kRtpHistoryMs = 1000;
898 static const int kNumCompoundRtcpPacketsToObserve = 10;
899 class RtcpModeObserver : public test::RtpRtcpObserver {
901 explicit RtcpModeObserver(newapi::RtcpMode rtcp_mode)
902 : test::RtpRtcpObserver(kDefaultTimeoutMs),
903 rtcp_mode_(rtcp_mode),
908 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
909 if (++sent_rtp_ % 3 == 0)
915 virtual Action OnReceiveRtcp(const uint8_t* packet,
916 size_t length) OVERRIDE {
918 RTCPUtility::RTCPParserV2 parser(packet, length, true);
919 EXPECT_TRUE(parser.IsValid());
921 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
922 bool has_report_block = false;
923 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
924 EXPECT_NE(RTCPUtility::kRtcpSrCode, packet_type);
925 if (packet_type == RTCPUtility::kRtcpRrCode) {
926 has_report_block = true;
929 packet_type = parser.Iterate();
932 switch (rtcp_mode_) {
933 case newapi::kRtcpCompound:
934 if (!has_report_block) {
935 ADD_FAILURE() << "Received RTCP packet without receiver report for "
937 observation_complete_->Set();
940 if (sent_rtcp_ >= kNumCompoundRtcpPacketsToObserve)
941 observation_complete_->Set();
944 case newapi::kRtcpReducedSize:
945 if (!has_report_block)
946 observation_complete_->Set();
953 newapi::RtcpMode rtcp_mode_;
956 } observer(rtcp_mode);
958 CreateCalls(Call::Config(observer.SendTransport()),
959 Call::Config(observer.ReceiveTransport()));
961 observer.SetReceivers(receiver_call_->Receiver(), sender_call_->Receiver());
964 send_config_.rtp.nack.rtp_history_ms = kRtpHistoryMs;
965 receive_config_.rtp.nack.rtp_history_ms = kRtpHistoryMs;
966 receive_config_.rtp.rtcp_mode = rtcp_mode;
969 CreateFrameGenerator();
972 EXPECT_EQ(kEventSignaled, observer.Wait())
973 << (rtcp_mode == newapi::kRtcpCompound
974 ? "Timed out before observing enough compound packets."
975 : "Timed out before receiving a non-compound RTCP packet.");
978 observer.StopSending();
982 TEST_F(CallTest, UsesRtcpCompoundMode) {
983 RespectsRtcpMode(newapi::kRtcpCompound);
986 TEST_F(CallTest, UsesRtcpReducedSizeMode) {
987 RespectsRtcpMode(newapi::kRtcpReducedSize);
990 // Test sets up a Call multiple senders with different resolutions and SSRCs.
991 // Another is set up to receive all three of these with different renderers.
992 // Each renderer verifies that it receives the expected resolution, and as soon
993 // as every renderer has received a frame, the test finishes.
994 TEST_F(CallTest, SendsAndReceivesMultipleStreams) {
995 static const size_t kNumStreams = 3;
997 class VideoOutputObserver : public VideoRenderer {
999 VideoOutputObserver(test::FrameGeneratorCapturer** capturer,
1002 : capturer_(capturer),
1005 done_(EventWrapper::Create()) {}
1007 virtual void RenderFrame(const I420VideoFrame& video_frame,
1008 int time_to_render_ms) OVERRIDE {
1009 EXPECT_EQ(width_, video_frame.width());
1010 EXPECT_EQ(height_, video_frame.height());
1011 (*capturer_)->Stop();
1015 EventTypeWrapper Wait() { return done_->Wait(kDefaultTimeoutMs); }
1018 test::FrameGeneratorCapturer** capturer_;
1021 scoped_ptr<EventWrapper> done_;
1028 } codec_settings[kNumStreams] = {{1, 640, 480}, {2, 320, 240}, {3, 240, 160}};
1030 test::DirectTransport sender_transport, receiver_transport;
1031 scoped_ptr<Call> sender_call(Call::Create(Call::Config(&sender_transport)));
1032 scoped_ptr<Call> receiver_call(
1033 Call::Create(Call::Config(&receiver_transport)));
1034 sender_transport.SetReceiver(receiver_call->Receiver());
1035 receiver_transport.SetReceiver(sender_call->Receiver());
1037 VideoSendStream* send_streams[kNumStreams];
1038 VideoReceiveStream* receive_streams[kNumStreams];
1040 VideoOutputObserver* observers[kNumStreams];
1041 test::FrameGeneratorCapturer* frame_generators[kNumStreams];
1043 scoped_ptr<VP8Encoder> encoders[kNumStreams];
1044 for (size_t i = 0; i < kNumStreams; ++i)
1045 encoders[i].reset(VP8Encoder::Create());
1047 for (size_t i = 0; i < kNumStreams; ++i) {
1048 uint32_t ssrc = codec_settings[i].ssrc;
1049 int width = codec_settings[i].width;
1050 int height = codec_settings[i].height;
1051 observers[i] = new VideoOutputObserver(&frame_generators[i], width, height);
1053 VideoSendStream::Config send_config = sender_call->GetDefaultSendConfig();
1054 send_config.rtp.ssrcs.push_back(ssrc);
1055 send_config.encoder_settings =
1056 test::CreateEncoderSettings(encoders[i].get(), "VP8", 124, 1);
1057 VideoStream* stream = &send_config.encoder_settings.streams[0];
1058 stream->width = width;
1059 stream->height = height;
1060 stream->max_framerate = 5;
1061 stream->min_bitrate_bps = stream->target_bitrate_bps =
1062 stream->max_bitrate_bps = 100000;
1063 send_streams[i] = sender_call->CreateVideoSendStream(send_config);
1064 send_streams[i]->Start();
1066 VideoReceiveStream::Config receive_config =
1067 receiver_call->GetDefaultReceiveConfig();
1068 receive_config.renderer = observers[i];
1069 receive_config.rtp.remote_ssrc = ssrc;
1070 receive_config.rtp.local_ssrc = kReceiverLocalSsrc;
1072 test::CreateDecoderVideoCodec(send_config.encoder_settings);
1073 receive_config.codecs.push_back(codec);
1074 receive_streams[i] =
1075 receiver_call->CreateVideoReceiveStream(receive_config);
1076 receive_streams[i]->Start();
1078 frame_generators[i] = test::FrameGeneratorCapturer::Create(
1079 send_streams[i]->Input(), width, height, 30, Clock::GetRealTimeClock());
1080 frame_generators[i]->Start();
1083 for (size_t i = 0; i < kNumStreams; ++i) {
1084 EXPECT_EQ(kEventSignaled, observers[i]->Wait())
1085 << "Timed out while waiting for observer " << i << " to render.";
1088 for (size_t i = 0; i < kNumStreams; ++i) {
1089 frame_generators[i]->Stop();
1090 sender_call->DestroyVideoSendStream(send_streams[i]);
1091 receiver_call->DestroyVideoReceiveStream(receive_streams[i]);
1092 delete frame_generators[i];
1093 delete observers[i];
1096 sender_transport.StopSending();
1097 receiver_transport.StopSending();
1100 TEST_F(CallTest, ObserversEncodedFrames) {
1101 class EncodedFrameTestObserver : public EncodedFrameObserver {
1103 EncodedFrameTestObserver()
1105 frame_type_(kFrameEmpty),
1106 called_(EventWrapper::Create()) {}
1107 virtual ~EncodedFrameTestObserver() {}
1109 virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) {
1110 frame_type_ = encoded_frame.frame_type_;
1111 length_ = encoded_frame.length_;
1112 buffer_.reset(new uint8_t[length_]);
1113 memcpy(buffer_.get(), encoded_frame.data_, length_);
1117 EventTypeWrapper Wait() { return called_->Wait(kDefaultTimeoutMs); }
1119 void ExpectEqualFrames(const EncodedFrameTestObserver& observer) {
1120 ASSERT_EQ(length_, observer.length_)
1121 << "Observed frames are of different lengths.";
1122 EXPECT_EQ(frame_type_, observer.frame_type_)
1123 << "Observed frames have different frame types.";
1124 EXPECT_EQ(0, memcmp(buffer_.get(), observer.buffer_.get(), length_))
1125 << "Observed encoded frames have different content.";
1129 scoped_ptr<uint8_t[]> buffer_;
1131 FrameType frame_type_;
1132 scoped_ptr<EventWrapper> called_;
1135 EncodedFrameTestObserver post_encode_observer;
1136 EncodedFrameTestObserver pre_decode_observer;
1138 test::DirectTransport sender_transport, receiver_transport;
1140 CreateCalls(Call::Config(&sender_transport),
1141 Call::Config(&receiver_transport));
1143 sender_transport.SetReceiver(receiver_call_->Receiver());
1144 receiver_transport.SetReceiver(sender_call_->Receiver());
1146 CreateTestConfigs();
1147 send_config_.post_encode_callback = &post_encode_observer;
1148 receive_config_.pre_decode_callback = &pre_decode_observer;
1153 scoped_ptr<test::FrameGenerator> frame_generator(test::FrameGenerator::Create(
1154 send_config_.encoder_settings.streams[0].width,
1155 send_config_.encoder_settings.streams[0].height));
1156 send_stream_->Input()->SwapFrame(frame_generator->NextFrame());
1158 EXPECT_EQ(kEventSignaled, post_encode_observer.Wait())
1159 << "Timed out while waiting for send-side encoded-frame callback.";
1161 EXPECT_EQ(kEventSignaled, pre_decode_observer.Wait())
1162 << "Timed out while waiting for pre-decode encoded-frame callback.";
1164 post_encode_observer.ExpectEqualFrames(pre_decode_observer);
1168 sender_transport.StopSending();
1169 receiver_transport.StopSending();
1174 TEST_F(CallTest, ReceiveStreamSendsRemb) {
1175 class RembObserver : public test::RtpRtcpObserver {
1177 RembObserver() : test::RtpRtcpObserver(kDefaultTimeoutMs) {}
1179 virtual Action OnReceiveRtcp(const uint8_t* packet,
1180 size_t length) OVERRIDE {
1181 RTCPUtility::RTCPParserV2 parser(packet, length, true);
1182 EXPECT_TRUE(parser.IsValid());
1184 bool received_psfb = false;
1185 bool received_remb = false;
1186 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
1187 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
1188 if (packet_type == RTCPUtility::kRtcpPsfbRembCode) {
1189 const RTCPUtility::RTCPPacket& packet = parser.Packet();
1190 EXPECT_EQ(packet.PSFBAPP.SenderSSRC, kReceiverLocalSsrc);
1191 received_psfb = true;
1192 } else if (packet_type == RTCPUtility::kRtcpPsfbRembItemCode) {
1193 const RTCPUtility::RTCPPacket& packet = parser.Packet();
1194 EXPECT_GT(packet.REMBItem.BitRate, 0u);
1195 EXPECT_EQ(packet.REMBItem.NumberOfSSRCs, 1u);
1196 EXPECT_EQ(packet.REMBItem.SSRCs[0], kSendSsrc);
1197 received_remb = true;
1199 packet_type = parser.Iterate();
1201 if (received_psfb && received_remb)
1202 observation_complete_->Set();
1207 CreateCalls(Call::Config(observer.SendTransport()),
1208 Call::Config(observer.ReceiveTransport()));
1209 observer.SetReceivers(receiver_call_->Receiver(), sender_call_->Receiver());
1210 CreateTestConfigs();
1212 CreateFrameGenerator();
1215 EXPECT_EQ(kEventSignaled, observer.Wait())
1216 << "Timed out while waiting for a receiver RTCP REMB packet to be sent.";
1219 observer.StopSending();
1223 void CallTest::TestXrReceiverReferenceTimeReport(bool enable_rrtr) {
1224 static const int kNumRtcpReportPacketsToObserve = 5;
1225 class RtcpXrObserver : public test::RtpRtcpObserver {
1227 explicit RtcpXrObserver(bool enable_rrtr)
1228 : test::RtpRtcpObserver(kDefaultTimeoutMs),
1229 enable_rrtr_(enable_rrtr),
1233 sent_rtcp_dlrr_(0) {}
1236 // Receive stream should send RR packets (and RRTR packets if enabled).
1237 virtual Action OnReceiveRtcp(const uint8_t* packet,
1238 size_t length) OVERRIDE {
1239 RTCPUtility::RTCPParserV2 parser(packet, length, true);
1240 EXPECT_TRUE(parser.IsValid());
1242 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
1243 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
1244 if (packet_type == RTCPUtility::kRtcpRrCode) {
1246 } else if (packet_type ==
1247 RTCPUtility::kRtcpXrReceiverReferenceTimeCode) {
1250 EXPECT_NE(packet_type, RTCPUtility::kRtcpSrCode);
1251 EXPECT_NE(packet_type, RTCPUtility::kRtcpXrDlrrReportBlockItemCode);
1252 packet_type = parser.Iterate();
1256 // Send stream should send SR packets (and DLRR packets if enabled).
1257 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
1258 RTCPUtility::RTCPParserV2 parser(packet, length, true);
1259 EXPECT_TRUE(parser.IsValid());
1261 RTCPUtility::RTCPPacketTypes packet_type = parser.Begin();
1262 while (packet_type != RTCPUtility::kRtcpNotValidCode) {
1263 if (packet_type == RTCPUtility::kRtcpSrCode) {
1265 } else if (packet_type == RTCPUtility::kRtcpXrDlrrReportBlockItemCode) {
1268 EXPECT_NE(packet_type, RTCPUtility::kRtcpXrReceiverReferenceTimeCode);
1269 packet_type = parser.Iterate();
1271 if (sent_rtcp_sr_ > kNumRtcpReportPacketsToObserve &&
1272 sent_rtcp_rr_ > kNumRtcpReportPacketsToObserve) {
1274 EXPECT_GT(sent_rtcp_rrtr_, 0);
1275 EXPECT_GT(sent_rtcp_dlrr_, 0);
1277 EXPECT_EQ(0, sent_rtcp_rrtr_);
1278 EXPECT_EQ(0, sent_rtcp_dlrr_);
1280 observation_complete_->Set();
1287 int sent_rtcp_rrtr_;
1288 int sent_rtcp_dlrr_;
1289 } observer(enable_rrtr);
1291 CreateCalls(Call::Config(observer.SendTransport()),
1292 Call::Config(observer.ReceiveTransport()));
1293 observer.SetReceivers(receiver_call_->Receiver(), sender_call_->Receiver());
1295 CreateTestConfigs();
1296 receive_config_.rtp.rtcp_mode = newapi::kRtcpReducedSize;
1297 receive_config_.rtp.rtcp_xr.receiver_reference_time_report = enable_rrtr;
1300 CreateFrameGenerator();
1303 EXPECT_EQ(kEventSignaled, observer.Wait())
1304 << "Timed out while waiting for RTCP SR/RR packets to be sent.";
1307 observer.StopSending();
1311 class StatsObserver : public test::RtpRtcpObserver, public I420FrameCallback {
1314 : test::RtpRtcpObserver(kLongTimeoutMs),
1315 receive_stream_(NULL),
1317 expected_receive_ssrc_(),
1318 expected_send_ssrcs_(),
1319 check_stats_event_(EventWrapper::Create()) {}
1321 void SetExpectedReceiveSsrc(uint32_t ssrc) { expected_receive_ssrc_ = ssrc; }
1323 void SetExpectedSendSsrcs(const std::vector<uint32_t>& ssrcs) {
1324 for (std::vector<uint32_t>::const_iterator it = ssrcs.begin();
1327 expected_send_ssrcs_.insert(*it);
1331 void SetExpectedCName(std::string cname) { expected_cname_ = cname; }
1333 void SetReceiveStream(VideoReceiveStream* stream) {
1334 receive_stream_ = stream;
1337 void SetSendStream(VideoSendStream* stream) { send_stream_ = stream; }
1339 void WaitForFilledStats() {
1340 Clock* clock = Clock::GetRealTimeClock();
1341 int64_t now = clock->TimeInMilliseconds();
1342 int64_t stop_time = now + kLongTimeoutMs;
1343 bool receive_ok = false;
1344 bool send_ok = false;
1346 while (now < stop_time) {
1348 receive_ok = CheckReceiveStats();
1350 send_ok = CheckSendStats();
1352 if (receive_ok && send_ok)
1355 int64_t time_until_timout_ = stop_time - now;
1356 if (time_until_timout_ > 0)
1357 check_stats_event_->Wait(time_until_timout_);
1358 now = clock->TimeInMilliseconds();
1361 ADD_FAILURE() << "Timed out waiting for filled stats.";
1362 for (std::map<std::string, bool>::const_iterator it =
1363 receive_stats_filled_.begin();
1364 it != receive_stats_filled_.end();
1367 ADD_FAILURE() << "Missing receive stats: " << it->first;
1371 for (std::map<std::string, bool>::const_iterator it =
1372 send_stats_filled_.begin();
1373 it != send_stats_filled_.end();
1376 ADD_FAILURE() << "Missing send stats: " << it->first;
1382 virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
1383 check_stats_event_->Set();
1387 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) OVERRIDE {
1388 check_stats_event_->Set();
1392 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) OVERRIDE {
1393 check_stats_event_->Set();
1397 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) OVERRIDE {
1398 check_stats_event_->Set();
1402 virtual void FrameCallback(I420VideoFrame* video_frame) OVERRIDE {
1403 // Ensure that we have at least 5ms send side delay.
1404 int64_t render_time = video_frame->render_time_ms();
1405 if (render_time > 0)
1406 video_frame->set_render_time_ms(render_time - 5);
1409 bool CheckReceiveStats() {
1410 assert(receive_stream_ != NULL);
1411 VideoReceiveStream::Stats stats = receive_stream_->GetStats();
1412 EXPECT_EQ(expected_receive_ssrc_, stats.ssrc);
1414 // Make sure all fields have been populated.
1416 receive_stats_filled_["IncomingRate"] |=
1417 stats.network_frame_rate != 0 || stats.bitrate_bps != 0;
1419 receive_stats_filled_["FrameCallback"] |= stats.decode_frame_rate != 0;
1421 receive_stats_filled_["FrameRendered"] |= stats.render_frame_rate != 0;
1423 receive_stats_filled_["StatisticsUpdated"] |=
1424 stats.rtcp_stats.cumulative_lost != 0 ||
1425 stats.rtcp_stats.extended_max_sequence_number != 0 ||
1426 stats.rtcp_stats.fraction_lost != 0 || stats.rtcp_stats.jitter != 0;
1428 receive_stats_filled_["DataCountersUpdated"] |=
1429 stats.rtp_stats.bytes != 0 || stats.rtp_stats.fec_packets != 0 ||
1430 stats.rtp_stats.header_bytes != 0 || stats.rtp_stats.packets != 0 ||
1431 stats.rtp_stats.padding_bytes != 0 ||
1432 stats.rtp_stats.retransmitted_packets != 0;
1434 receive_stats_filled_["CodecStats"] |=
1435 stats.avg_delay_ms != 0 || stats.discarded_packets != 0 ||
1436 stats.key_frames != 0 || stats.delta_frames != 0;
1438 receive_stats_filled_["CName"] |= stats.c_name == expected_cname_;
1440 return AllStatsFilled(receive_stats_filled_);
1443 bool CheckSendStats() {
1444 assert(send_stream_ != NULL);
1445 VideoSendStream::Stats stats = send_stream_->GetStats();
1447 send_stats_filled_["NumStreams"] |=
1448 stats.substreams.size() == expected_send_ssrcs_.size();
1450 send_stats_filled_["Delay"] |=
1451 stats.avg_delay_ms != 0 || stats.max_delay_ms != 0;
1453 receive_stats_filled_["CName"] |= stats.c_name == expected_cname_;
1455 for (std::map<uint32_t, StreamStats>::const_iterator it =
1456 stats.substreams.begin();
1457 it != stats.substreams.end();
1459 EXPECT_TRUE(expected_send_ssrcs_.find(it->first) !=
1460 expected_send_ssrcs_.end());
1462 send_stats_filled_[CompoundKey("IncomingRate", it->first)] |=
1463 stats.input_frame_rate != 0;
1465 const StreamStats& stream_stats = it->second;
1467 send_stats_filled_[CompoundKey("StatisticsUpdated", it->first)] |=
1468 stream_stats.rtcp_stats.cumulative_lost != 0 ||
1469 stream_stats.rtcp_stats.extended_max_sequence_number != 0 ||
1470 stream_stats.rtcp_stats.fraction_lost != 0;
1472 send_stats_filled_[CompoundKey("DataCountersUpdated", it->first)] |=
1473 stream_stats.rtp_stats.fec_packets != 0 ||
1474 stream_stats.rtp_stats.padding_bytes != 0 ||
1475 stream_stats.rtp_stats.retransmitted_packets != 0 ||
1476 stream_stats.rtp_stats.packets != 0;
1478 send_stats_filled_[CompoundKey("BitrateStatisticsObserver", it->first)] |=
1479 stream_stats.bitrate_bps != 0;
1481 send_stats_filled_[CompoundKey("FrameCountObserver", it->first)] |=
1482 stream_stats.delta_frames != 0 || stream_stats.key_frames != 0;
1484 send_stats_filled_[CompoundKey("OutgoingRate", it->first)] |=
1485 stats.encode_frame_rate != 0;
1488 return AllStatsFilled(send_stats_filled_);
1491 std::string CompoundKey(const char* name, uint32_t ssrc) {
1492 std::ostringstream oss;
1493 oss << name << "_" << ssrc;
1497 bool AllStatsFilled(const std::map<std::string, bool>& stats_map) {
1498 for (std::map<std::string, bool>::const_iterator it = stats_map.begin();
1499 it != stats_map.end();
1507 VideoReceiveStream* receive_stream_;
1508 std::map<std::string, bool> receive_stats_filled_;
1510 VideoSendStream* send_stream_;
1511 std::map<std::string, bool> send_stats_filled_;
1513 uint32_t expected_receive_ssrc_;
1514 std::set<uint32_t> expected_send_ssrcs_;
1515 std::string expected_cname_;
1517 scoped_ptr<EventWrapper> check_stats_event_;
1520 TEST_F(CallTest, GetStats) {
1521 StatsObserver observer;
1523 CreateCalls(Call::Config(observer.SendTransport()),
1524 Call::Config(observer.ReceiveTransport()));
1526 observer.SetReceivers(receiver_call_->Receiver(), sender_call_->Receiver());
1528 CreateTestConfigs();
1529 send_config_.pre_encode_callback = &observer; // Used to inject delay.
1530 send_config_.rtp.c_name = "SomeCName";
1532 observer.SetExpectedReceiveSsrc(receive_config_.rtp.local_ssrc);
1533 observer.SetExpectedSendSsrcs(send_config_.rtp.ssrcs);
1534 observer.SetExpectedCName(send_config_.rtp.c_name);
1537 observer.SetReceiveStream(receive_stream_);
1538 observer.SetSendStream(send_stream_);
1539 CreateFrameGenerator();
1542 observer.WaitForFilledStats();
1545 observer.StopSending();
1549 TEST_F(CallTest, ReceiverReferenceTimeReportEnabled) {
1550 TestXrReceiverReferenceTimeReport(true);
1553 TEST_F(CallTest, ReceiverReferenceTimeReportDisabled) {
1554 TestXrReceiverReferenceTimeReport(false);
1557 } // namespace webrtc