blob: 71eebba0b0afd5e6ac95155e38100cb176a497dd [file] [log] [blame]
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001/*
2 * libjingle
3 * Copyright 2004 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +000028#include <algorithm>
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000029#include <map>
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000030#include <vector>
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000031
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000032#include "talk/media/base/testutils.h"
33#include "talk/media/base/videoengine_unittest.h"
Fredrik Solenbergb6728822015-04-22 15:35:17 +020034#include "talk/media/webrtc/fakewebrtccall.h"
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +000035#include "talk/media/webrtc/fakewebrtcvideoengine.h"
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000036#include "talk/media/webrtc/simulcast.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000037#include "talk/media/webrtc/webrtcvideochannelfactory.h"
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000038#include "talk/media/webrtc/webrtcvideoengine2.h"
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +000039#include "talk/media/webrtc/webrtcvoiceengine.h"
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +000040#include "webrtc/base/arraysize.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000041#include "webrtc/base/gunit.h"
42#include "webrtc/base/stringutils.h"
pbos@webrtc.org42684be2014-10-03 11:25:45 +000043#include "webrtc/video_encoder.h"
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000044
45namespace {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000046static const int kDefaultQpMax = 56;
47static const int kDefaultFramerate = 30;
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000048
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000049static const cricket::VideoCodec kVp8Codec720p(100, "VP8", 1280, 720, 30, 0);
50static const cricket::VideoCodec kVp8Codec360p(100, "VP8", 640, 360, 30, 0);
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000051static const cricket::VideoCodec kVp8Codec270p(100, "VP8", 480, 270, 30, 0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000052
53static const cricket::VideoCodec kVp8Codec(100, "VP8", 640, 400, 30, 0);
54static const cricket::VideoCodec kVp9Codec(101, "VP9", 640, 400, 30, 0);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +000055static const cricket::VideoCodec kH264Codec(102, "H264", 640, 400, 30, 0);
56
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000057static const cricket::VideoCodec kRedCodec(116, "red", 0, 0, 0, 0);
58static const cricket::VideoCodec kUlpfecCodec(117, "ulpfec", 0, 0, 0, 0);
59
noahricd10a68e2015-07-10 11:27:55 -070060static const uint8_t kRedRtxPayloadType = 125;
61
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000062static const uint32 kSsrcs1[] = {1};
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000063static const uint32 kSsrcs3[] = {1, 2, 3};
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000064static const uint32 kRtxSsrcs1[] = {4};
noahricd10a68e2015-07-10 11:27:55 -070065static const uint32 kIncomingUnsignalledSsrc = 0xC0FFEE;
pbos@webrtc.org3c107582014-07-20 15:27:35 +000066static const char kUnsupportedExtensionName[] =
67 "urn:ietf:params:rtp-hdrext:unsupported";
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +000068
69void VerifyCodecHasDefaultFeedbackParams(const cricket::VideoCodec& codec) {
70 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
71 cricket::kRtcpFbParamNack, cricket::kParamValueEmpty)));
72 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
73 cricket::kRtcpFbParamNack, cricket::kRtcpFbNackParamPli)));
74 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
75 cricket::kRtcpFbParamRemb, cricket::kParamValueEmpty)));
76 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
77 cricket::kRtcpFbParamCcm, cricket::kRtcpFbCcmParamFir)));
78}
79
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -070080static void CreateBlackFrame(webrtc::VideoFrame* video_frame,
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +000081 int width,
82 int height) {
83 video_frame->CreateEmptyFrame(
84 width, height, width, (width + 1) / 2, (width + 1) / 2);
85 memset(video_frame->buffer(webrtc::kYPlane), 16,
86 video_frame->allocated_size(webrtc::kYPlane));
87 memset(video_frame->buffer(webrtc::kUPlane), 128,
88 video_frame->allocated_size(webrtc::kUPlane));
89 memset(video_frame->buffer(webrtc::kVPlane), 128,
90 video_frame->allocated_size(webrtc::kVPlane));
91}
92
Shao Changbine62202f2015-04-21 20:24:50 +080093void VerifySendStreamHasRtxTypes(const webrtc::VideoSendStream::Config& config,
94 const std::map<int, int>& rtx_types) {
95 std::map<int, int>::const_iterator it;
96 it = rtx_types.find(config.encoder_settings.payload_type);
97 EXPECT_TRUE(it != rtx_types.end() &&
98 it->second == config.rtp.rtx.payload_type);
99
100 if (config.rtp.fec.red_rtx_payload_type != -1) {
101 it = rtx_types.find(config.rtp.fec.red_payload_type);
102 EXPECT_TRUE(it != rtx_types.end() &&
103 it->second == config.rtp.fec.red_rtx_payload_type);
104 }
105}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000106} // namespace
107
108namespace cricket {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000109class WebRtcVideoEngine2Test : public ::testing::Test {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000110 public:
pbos@webrtc.orgf1f0d9a2015-03-02 13:30:15 +0000111 WebRtcVideoEngine2Test() : WebRtcVideoEngine2Test(nullptr) {}
112 WebRtcVideoEngine2Test(WebRtcVoiceEngine* voice_engine)
113 : engine_(voice_engine) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000114 std::vector<VideoCodec> engine_codecs = engine_.codecs();
Fredrik Solenbergd3ddc1b2015-05-07 17:07:34 +0200115 DCHECK(!engine_codecs.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000116 bool codec_set = false;
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000117 for (size_t i = 0; i < engine_codecs.size(); ++i) {
118 if (engine_codecs[i].name == "red") {
119 default_red_codec_ = engine_codecs[i];
120 } else if (engine_codecs[i].name == "ulpfec") {
121 default_ulpfec_codec_ = engine_codecs[i];
122 } else if (engine_codecs[i].name == "rtx") {
Shao Changbine62202f2015-04-21 20:24:50 +0800123 int associated_payload_type;
124 if (engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
125 &associated_payload_type)) {
126 default_apt_rtx_types_[associated_payload_type] = engine_codecs[i].id;
127 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000128 } else if (!codec_set) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000129 default_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000130 codec_set = true;
131 }
132 }
133
Fredrik Solenbergd3ddc1b2015-05-07 17:07:34 +0200134 DCHECK(codec_set);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000135 }
136
137 protected:
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000138 class FakeCallFactory : public WebRtcCallFactory {
139 public:
140 FakeCallFactory() : fake_call_(NULL) {}
141 FakeCall* GetCall() { return fake_call_; }
142
143 private:
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000144 webrtc::Call* CreateCall(const webrtc::Call::Config& config) override {
Fredrik Solenbergd3ddc1b2015-05-07 17:07:34 +0200145 DCHECK(fake_call_ == NULL);
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000146 fake_call_ = new FakeCall(config);
147 return fake_call_;
148 }
149
150 FakeCall* fake_call_;
151 };
152
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000153 VideoMediaChannel* SetUpForExternalEncoderFactory(
154 cricket::WebRtcVideoEncoderFactory* encoder_factory,
155 const std::vector<VideoCodec>& codecs);
pbos@webrtc.orgfa553ef2014-10-20 11:07:07 +0000156
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000157 VideoMediaChannel* SetUpForExternalDecoderFactory(
158 cricket::WebRtcVideoDecoderFactory* decoder_factory,
159 const std::vector<VideoCodec>& codecs);
160
pbos@webrtc.orgf1f0d9a2015-03-02 13:30:15 +0000161 // Used in WebRtcVideoEngine2VoiceTest, but defined here so it's properly
162 // initialized when the constructor is called.
163 WebRtcVoiceEngine voice_engine_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000164 WebRtcVideoEngine2 engine_;
165 VideoCodec default_codec_;
166 VideoCodec default_red_codec_;
167 VideoCodec default_ulpfec_codec_;
Shao Changbine62202f2015-04-21 20:24:50 +0800168 std::map<int, int> default_apt_rtx_types_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000169};
170
pbos@webrtc.orgf1f0d9a2015-03-02 13:30:15 +0000171class WebRtcVideoEngine2VoiceTest : public WebRtcVideoEngine2Test {
172 public:
173 WebRtcVideoEngine2VoiceTest() : WebRtcVideoEngine2Test(&voice_engine_) {}
174};
175
176TEST_F(WebRtcVideoEngine2VoiceTest, ConfiguresAvSyncForFirstReceiveChannel) {
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000177 FakeCallFactory call_factory;
178 engine_.SetCallFactory(&call_factory);
pbos@webrtc.orgf1f0d9a2015-03-02 13:30:15 +0000179 voice_engine_.Init(rtc::Thread::Current());
Fredrik Solenberg9a416bd2015-05-22 09:04:09 +0200180 engine_.Init();
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000181
182 rtc::scoped_ptr<VoiceMediaChannel> voice_channel(
Jelena Marusicc28a8962015-05-29 15:05:44 +0200183 voice_engine_.CreateChannel(cricket::AudioOptions()));
184 ASSERT_TRUE(voice_channel.get() != nullptr);
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000185 WebRtcVoiceMediaChannel* webrtc_voice_channel =
186 static_cast<WebRtcVoiceMediaChannel*>(voice_channel.get());
187 ASSERT_NE(webrtc_voice_channel->voe_channel(), -1);
188 rtc::scoped_ptr<VideoMediaChannel> channel(
189 engine_.CreateChannel(cricket::VideoOptions(), voice_channel.get()));
190
191 FakeCall* fake_call = call_factory.GetCall();
Jelena Marusicc28a8962015-05-29 15:05:44 +0200192 ASSERT_TRUE(fake_call != nullptr);
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000193
194 webrtc::Call::Config call_config = fake_call->GetConfig();
195
Jelena Marusicc28a8962015-05-29 15:05:44 +0200196 ASSERT_TRUE(voice_engine_.voe()->engine() != nullptr);
pbos@webrtc.orgf1f0d9a2015-03-02 13:30:15 +0000197 ASSERT_EQ(voice_engine_.voe()->engine(), call_config.voice_engine);
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000198
199 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc)));
200 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc + 1)));
201 std::vector<FakeVideoReceiveStream*> receive_streams =
202 fake_call->GetVideoReceiveStreams();
203
204 ASSERT_EQ(2u, receive_streams.size());
205 EXPECT_EQ(webrtc_voice_channel->voe_channel(),
206 receive_streams[0]->GetConfig().audio_channel_id);
207 EXPECT_EQ(-1, receive_streams[1]->GetConfig().audio_channel_id)
208 << "AV sync should only be set up for the first receive channel.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000209}
210
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000211TEST_F(WebRtcVideoEngine2Test, FindCodec) {
212 const std::vector<cricket::VideoCodec>& c = engine_.codecs();
Shao Changbine62202f2015-04-21 20:24:50 +0800213 EXPECT_EQ(cricket::DefaultVideoCodecList().size(), c.size());
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000214
215 cricket::VideoCodec vp8(104, "VP8", 320, 200, 30, 0);
216 EXPECT_TRUE(engine_.FindCodec(vp8));
217
218 cricket::VideoCodec vp8_ci(104, "vp8", 320, 200, 30, 0);
219 EXPECT_TRUE(engine_.FindCodec(vp8));
220
221 cricket::VideoCodec vp8_diff_fr_diff_pref(104, "VP8", 320, 200, 50, 50);
222 EXPECT_TRUE(engine_.FindCodec(vp8_diff_fr_diff_pref));
223
224 cricket::VideoCodec vp8_diff_id(95, "VP8", 320, 200, 30, 0);
225 EXPECT_FALSE(engine_.FindCodec(vp8_diff_id));
226 vp8_diff_id.id = 97;
227 EXPECT_TRUE(engine_.FindCodec(vp8_diff_id));
228
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000229 // FindCodec ignores the codec size.
230 // Test that FindCodec can accept uncommon codec size.
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000231 cricket::VideoCodec vp8_diff_res(104, "VP8", 320, 111, 30, 0);
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000232 EXPECT_TRUE(engine_.FindCodec(vp8_diff_res));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000233
234 // PeerConnection doesn't negotiate the resolution at this point.
235 // Test that FindCodec can handle the case when width/height is 0.
236 cricket::VideoCodec vp8_zero_res(104, "VP8", 0, 0, 30, 0);
237 EXPECT_TRUE(engine_.FindCodec(vp8_zero_res));
238
239 cricket::VideoCodec red(101, "RED", 0, 0, 30, 0);
240 EXPECT_TRUE(engine_.FindCodec(red));
241
242 cricket::VideoCodec red_ci(101, "red", 0, 0, 30, 0);
243 EXPECT_TRUE(engine_.FindCodec(red));
244
245 cricket::VideoCodec fec(102, "ULPFEC", 0, 0, 30, 0);
246 EXPECT_TRUE(engine_.FindCodec(fec));
247
248 cricket::VideoCodec fec_ci(102, "ulpfec", 0, 0, 30, 0);
249 EXPECT_TRUE(engine_.FindCodec(fec));
250
251 cricket::VideoCodec rtx(96, "rtx", 0, 0, 30, 0);
252 EXPECT_TRUE(engine_.FindCodec(rtx));
253}
254
pbos@webrtc.org2a72c652015-02-26 16:01:24 +0000255TEST_F(WebRtcVideoEngine2Test, SetDefaultEncoderConfigPreservesFeedbackParams) {
256 cricket::VideoCodec max_settings(
257 engine_.codecs()[0].id, engine_.codecs()[0].name,
258 engine_.codecs()[0].width / 2, engine_.codecs()[0].height / 2, 30, 0);
259 // This codec shouldn't have NACK by default or the test is pointless.
260 EXPECT_FALSE(max_settings.HasFeedbackParam(
261 FeedbackParam(kRtcpFbParamNack, kParamValueEmpty)));
262 // The engine should by default have it however.
263 EXPECT_TRUE(engine_.codecs()[0].HasFeedbackParam(
264 FeedbackParam(kRtcpFbParamNack, kParamValueEmpty)));
265
266 // Set constrained max codec settings.
267 EXPECT_TRUE(engine_.SetDefaultEncoderConfig(
268 cricket::VideoEncoderConfig(max_settings)));
269
270 // Verify that feedback parameters are retained.
271 EXPECT_TRUE(engine_.codecs()[0].HasFeedbackParam(
272 FeedbackParam(kRtcpFbParamNack, kParamValueEmpty)));
273}
274
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000275TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
276 std::vector<VideoCodec> engine_codecs = engine_.codecs();
277 for (size_t i = 0; i < engine_codecs.size(); ++i) {
278 if (engine_codecs[i].name != kRtxCodecName)
279 continue;
280 int associated_payload_type;
281 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000282 &associated_payload_type));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000283 EXPECT_EQ(default_codec_.id, associated_payload_type);
284 return;
285 }
286 FAIL() << "No RTX codec found among default codecs.";
287}
288
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000289TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
290 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
291 ASSERT_FALSE(extensions.empty());
292 for (size_t i = 0; i < extensions.size(); ++i) {
293 if (extensions[i].uri == kRtpTimestampOffsetHeaderExtension) {
294 EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extensions[i].id);
295 return;
296 }
297 }
298 FAIL() << "Timestamp offset extension not in header-extension list.";
299}
300
301TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
302 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
303 ASSERT_FALSE(extensions.empty());
304 for (size_t i = 0; i < extensions.size(); ++i) {
305 if (extensions[i].uri == kRtpAbsoluteSenderTimeHeaderExtension) {
306 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId,
307 extensions[i].id);
308 return;
309 }
310 }
311 FAIL() << "Absolute Sender Time extension not in header-extension list.";
312}
313
Guo-wei Shieh64c1e8c2015-04-01 15:33:06 -0700314TEST_F(WebRtcVideoEngine2Test, SupportsVideoRotationHeaderExtension) {
315 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
316 ASSERT_FALSE(extensions.empty());
317 for (size_t i = 0; i < extensions.size(); ++i) {
318 if (extensions[i].uri == kRtpVideoRotationHeaderExtension) {
319 EXPECT_EQ(kRtpVideoRotationHeaderExtensionDefaultId, extensions[i].id);
320 return;
321 }
322 }
323 FAIL() << "Video Rotation extension not in header-extension list.";
324}
325
326TEST_F(WebRtcVideoEngine2Test, CVOSetHeaderExtensionBeforeCapturer) {
327 // Allocate the capturer first to prevent early destruction before channel's
328 // dtor is called.
329 cricket::FakeVideoCapturer capturer;
330
331 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
332 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
333 std::vector<cricket::VideoCodec> codecs;
334 codecs.push_back(kVp8Codec);
335
336 rtc::scoped_ptr<VideoMediaChannel> channel(
337 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
338 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
339
340 // Add CVO extension.
341 const int id = 1;
342 std::vector<cricket::RtpHeaderExtension> extensions;
343 extensions.push_back(
344 cricket::RtpHeaderExtension(kRtpVideoRotationHeaderExtension, id));
345 EXPECT_TRUE(channel->SetSendRtpHeaderExtensions(extensions));
346
347 // Set capturer.
348 EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer));
349
350 // Verify capturer has turned off applying rotation.
351 EXPECT_FALSE(capturer.GetApplyRotation());
352
353 // Verify removing header extension turns on applying rotation.
354 extensions.clear();
355 EXPECT_TRUE(channel->SetSendRtpHeaderExtensions(extensions));
356 EXPECT_TRUE(capturer.GetApplyRotation());
357}
358
359TEST_F(WebRtcVideoEngine2Test, CVOSetHeaderExtensionAfterCapturer) {
360 cricket::FakeVideoCapturer capturer;
361
362 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
363 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
364 std::vector<cricket::VideoCodec> codecs;
365 codecs.push_back(kVp8Codec);
366
367 rtc::scoped_ptr<VideoMediaChannel> channel(
368 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
369 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
370
371 // Set capturer.
372 EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer));
373
374 // Add CVO extension.
375 const int id = 1;
376 std::vector<cricket::RtpHeaderExtension> extensions;
377 extensions.push_back(
378 cricket::RtpHeaderExtension(kRtpVideoRotationHeaderExtension, id));
379 EXPECT_TRUE(channel->SetSendRtpHeaderExtensions(extensions));
380
381 // Verify capturer has turned off applying rotation.
382 EXPECT_FALSE(capturer.GetApplyRotation());
383
384 // Verify removing header extension turns on applying rotation.
385 extensions.clear();
386 EXPECT_TRUE(channel->SetSendRtpHeaderExtensions(extensions));
387 EXPECT_TRUE(capturer.GetApplyRotation());
388}
389
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000390TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
Fredrik Solenberg9a416bd2015-05-22 09:04:09 +0200391 engine_.Init();
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000392 rtc::scoped_ptr<VideoMediaChannel> channel(
393 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000394
395 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
396
397 EXPECT_FALSE(channel->SetSend(true))
398 << "Channel should not start without codecs.";
399 EXPECT_TRUE(channel->SetSend(false))
400 << "Channel should be stoppable even without set codecs.";
401}
402
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000403TEST_F(WebRtcVideoEngine2Test, GetStatsWithoutSendCodecsSetDoesNotCrash) {
Fredrik Solenberg9a416bd2015-05-22 09:04:09 +0200404 engine_.Init();
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000405 rtc::scoped_ptr<VideoMediaChannel> channel(
406 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000407 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
408 VideoMediaInfo info;
409 channel->GetStats(&info);
410}
411
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000412TEST_F(WebRtcVideoEngine2Test, UseExternalFactoryForVp8WhenSupported) {
413 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
414 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
415 std::vector<cricket::VideoCodec> codecs;
416 codecs.push_back(kVp8Codec);
417
418 rtc::scoped_ptr<VideoMediaChannel> channel(
419 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
420
421 EXPECT_TRUE(
422 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
423 ASSERT_EQ(1u, encoder_factory.encoders().size());
424 EXPECT_TRUE(channel->SetSend(true));
425
426 cricket::FakeVideoCapturer capturer;
427 EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer));
428 EXPECT_EQ(cricket::CS_RUNNING,
429 capturer.Start(capturer.GetSupportedFormats()->front()));
430 EXPECT_TRUE(capturer.CaptureFrame());
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000431 EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0,
432 kTimeout);
433
pbos@webrtc.org86196c42015-02-16 21:02:00 +0000434 // Sending one frame will have reallocated the encoder since input size
435 // changes from a small default to the actual frame width/height.
436 int num_created_encoders = encoder_factory.GetNumCreatedEncoders();
437 EXPECT_EQ(num_created_encoders, 2);
438
439 // Setting codecs of the same type should not reallocate any encoders
440 // (expecting a no-op).
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000441 EXPECT_TRUE(channel->SetSendCodecs(codecs));
pbos@webrtc.org86196c42015-02-16 21:02:00 +0000442 EXPECT_EQ(num_created_encoders, encoder_factory.GetNumCreatedEncoders());
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000443
444 // Remove stream previously added to free the external encoder instance.
445 EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
446 EXPECT_EQ(0u, encoder_factory.encoders().size());
447}
448
Peter Boström53eda3d2015-03-27 15:53:18 +0100449TEST_F(WebRtcVideoEngine2Test, CanConstructDecoderForVp9EncoderFactory) {
450 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
451 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP9, "VP9");
452 std::vector<cricket::VideoCodec> codecs;
453 codecs.push_back(kVp9Codec);
454
455 rtc::scoped_ptr<VideoMediaChannel> channel(
456 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
457
458 EXPECT_TRUE(
459 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
460}
461
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000462VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalEncoderFactory(
463 cricket::WebRtcVideoEncoderFactory* encoder_factory,
464 const std::vector<VideoCodec>& codecs) {
465 engine_.SetExternalEncoderFactory(encoder_factory);
Fredrik Solenberg9a416bd2015-05-22 09:04:09 +0200466 engine_.Init();
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000467
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000468 VideoMediaChannel* channel =
469 engine_.CreateChannel(cricket::VideoOptions(), NULL);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000470 EXPECT_TRUE(channel->SetSendCodecs(codecs));
471
472 return channel;
473}
474
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000475VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalDecoderFactory(
476 cricket::WebRtcVideoDecoderFactory* decoder_factory,
477 const std::vector<VideoCodec>& codecs) {
478 engine_.SetExternalDecoderFactory(decoder_factory);
Fredrik Solenberg9a416bd2015-05-22 09:04:09 +0200479 engine_.Init();
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000480
481 VideoMediaChannel* channel =
482 engine_.CreateChannel(cricket::VideoOptions(), NULL);
483 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
484
485 return channel;
486}
487
pbos@webrtc.orgf18fba22015-01-14 16:26:23 +0000488TEST_F(WebRtcVideoEngine2Test, UsesSimulcastAdapterForVp8Factories) {
489 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
490 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
491 std::vector<cricket::VideoCodec> codecs;
492 codecs.push_back(kVp8Codec);
493
494 rtc::scoped_ptr<VideoMediaChannel> channel(
495 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
496
497 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
498
499 EXPECT_TRUE(
500 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
501 EXPECT_TRUE(channel->SetSend(true));
502
pbos@webrtc.org86196c42015-02-16 21:02:00 +0000503 cricket::FakeVideoCapturer capturer;
504 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), &capturer));
505 EXPECT_EQ(cricket::CS_RUNNING,
506 capturer.Start(capturer.GetSupportedFormats()->front()));
507 EXPECT_TRUE(capturer.CaptureFrame());
508
pbos@webrtc.orgf18fba22015-01-14 16:26:23 +0000509 EXPECT_GT(encoder_factory.encoders().size(), 1u);
510
511 // Verify that encoders are configured for simulcast through adapter
512 // (increasing resolution and only configured to send one stream each).
513 int prev_width = -1;
514 for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) {
515 webrtc::VideoCodec codec_settings =
516 encoder_factory.encoders()[i]->GetCodecSettings();
517 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams);
518 EXPECT_GT(codec_settings.width, prev_width);
519 prev_width = codec_settings.width;
520 }
pbos@webrtc.org86196c42015-02-16 21:02:00 +0000521
522 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), NULL));
pthatcher@webrtc.org818c4982015-03-06 02:20:58 +0000523
524 channel.reset();
525 ASSERT_EQ(0u, encoder_factory.encoders().size());
pbos@webrtc.orgf18fba22015-01-14 16:26:23 +0000526}
527
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000528TEST_F(WebRtcVideoEngine2Test, ChannelWithExternalH264CanChangeToInternalVp8) {
529 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
530 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
531 std::vector<cricket::VideoCodec> codecs;
532 codecs.push_back(kH264Codec);
533
534 rtc::scoped_ptr<VideoMediaChannel> channel(
535 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
536
537 EXPECT_TRUE(
538 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
539 ASSERT_EQ(1u, encoder_factory.encoders().size());
540
541 codecs.clear();
542 codecs.push_back(kVp8Codec);
543 EXPECT_TRUE(channel->SetSendCodecs(codecs));
544
545 ASSERT_EQ(0u, encoder_factory.encoders().size());
546}
547
548TEST_F(WebRtcVideoEngine2Test,
549 DontUseExternalEncoderFactoryForUnsupportedCodecs) {
550 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
551 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
552 std::vector<cricket::VideoCodec> codecs;
553 codecs.push_back(kVp8Codec);
554
555 rtc::scoped_ptr<VideoMediaChannel> channel(
556 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
557
558 EXPECT_TRUE(
559 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
pthatcher@webrtc.org818c4982015-03-06 02:20:58 +0000560 // Make sure DestroyVideoEncoder was called on the factory.
561 ASSERT_EQ(0u, encoder_factory.encoders().size());
562}
563
564TEST_F(WebRtcVideoEngine2Test,
565 UsesSimulcastAdapterForVp8WithCombinedVP8AndH264Factory) {
566 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
567 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
568 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
569
570 std::vector<cricket::VideoCodec> codecs;
571 codecs.push_back(kVp8Codec);
572
573 rtc::scoped_ptr<VideoMediaChannel> channel(
574 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
575
576 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
577
578 EXPECT_TRUE(
579 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
580 EXPECT_TRUE(channel->SetSend(true));
581
582 // Send a fake frame, or else the media engine will configure the simulcast
583 // encoder adapter at a low-enough size that it'll only create a single
584 // encoder layer.
585 cricket::FakeVideoCapturer capturer;
586 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), &capturer));
587 EXPECT_EQ(cricket::CS_RUNNING,
588 capturer.Start(capturer.GetSupportedFormats()->front()));
589 EXPECT_TRUE(capturer.CaptureFrame());
590
591 ASSERT_GT(encoder_factory.encoders().size(), 1u);
592 EXPECT_EQ(webrtc::kVideoCodecVP8,
593 encoder_factory.encoders()[0]->GetCodecSettings().codecType);
594
595 channel.reset();
596 // Make sure DestroyVideoEncoder was called on the factory.
597 EXPECT_EQ(0u, encoder_factory.encoders().size());
598}
599
600TEST_F(WebRtcVideoEngine2Test,
601 DestroysNonSimulcastEncoderFromCombinedVP8AndH264Factory) {
602 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
603 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
604 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
605
606 std::vector<cricket::VideoCodec> codecs;
607 codecs.push_back(kH264Codec);
608
609 rtc::scoped_ptr<VideoMediaChannel> channel(
610 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
611
612 EXPECT_TRUE(
613 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
614 ASSERT_EQ(1u, encoder_factory.encoders().size());
615 EXPECT_EQ(webrtc::kVideoCodecH264,
616 encoder_factory.encoders()[0]->GetCodecSettings().codecType);
617
618 channel.reset();
619 // Make sure DestroyVideoEncoder was called on the factory.
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000620 ASSERT_EQ(0u, encoder_factory.encoders().size());
621}
622
623// Test external codec with be added to the end of the supported codec list.
624TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) {
625 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
626 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
627 engine_.SetExternalEncoderFactory(&encoder_factory);
Fredrik Solenberg9a416bd2015-05-22 09:04:09 +0200628 engine_.Init();
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000629
630 std::vector<cricket::VideoCodec> codecs(engine_.codecs());
631 ASSERT_GE(codecs.size(), 2u);
632 cricket::VideoCodec internal_codec = codecs.front();
633 cricket::VideoCodec external_codec = codecs.back();
634
635 // The external codec will appear at last.
636 EXPECT_EQ("VP8", internal_codec.name);
637 EXPECT_EQ("H264", external_codec.name);
638}
639
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000640TEST_F(WebRtcVideoEngine2Test, RegisterExternalDecodersIfSupported) {
641 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
642 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
643 std::vector<cricket::VideoCodec> codecs;
644 codecs.push_back(kVp8Codec);
645
646 rtc::scoped_ptr<VideoMediaChannel> channel(
647 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
648
649 EXPECT_TRUE(
650 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
651 ASSERT_EQ(1u, decoder_factory.decoders().size());
652
653 // Setting codecs of the same type should not reallocate the decoder.
654 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
655 EXPECT_EQ(1, decoder_factory.GetNumCreatedDecoders());
656
657 // Remove stream previously added to free the external decoder instance.
658 EXPECT_TRUE(channel->RemoveRecvStream(kSsrc));
659 EXPECT_EQ(0u, decoder_factory.decoders().size());
660}
661
662// Verifies that we can set up decoders that are not internally supported.
663TEST_F(WebRtcVideoEngine2Test, RegisterExternalH264DecoderIfSupported) {
664 // TODO(pbos): Do not assume that encoder/decoder support is symmetric. We
665 // can't even query the WebRtcVideoDecoderFactory for supported codecs.
666 // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported
667 // codecs.
668 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
669 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
670 engine_.SetExternalEncoderFactory(&encoder_factory);
671 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
672 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
673 std::vector<cricket::VideoCodec> codecs;
674 codecs.push_back(kH264Codec);
675
676 rtc::scoped_ptr<VideoMediaChannel> channel(
677 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
678
679 EXPECT_TRUE(
680 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
681 ASSERT_EQ(1u, decoder_factory.decoders().size());
682}
683
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000684class WebRtcVideoEngine2BaseTest
685 : public VideoEngineTest<cricket::WebRtcVideoEngine2> {
686 protected:
687 typedef VideoEngineTest<cricket::WebRtcVideoEngine2> Base;
688};
689
690#define WEBRTC_ENGINE_BASE_TEST(test) \
691 TEST_F(WebRtcVideoEngine2BaseTest, test) { Base::test##Body(); }
692
693WEBRTC_ENGINE_BASE_TEST(ConstrainNewCodec2);
694
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000695class WebRtcVideoChannel2BaseTest
696 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
697 protected:
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000698 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000699
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000700 cricket::VideoCodec DefaultCodec() override { return kVp8Codec; }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000701};
702
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000703#define WEBRTC_BASE_TEST(test) \
704 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); }
705
706#define WEBRTC_DISABLED_BASE_TEST(test) \
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000707 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_##test) { Base::test(); }
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000708
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000709// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
710#if 0
711// TODO(juberti): Figure out why ViE is munging the COM refcount.
712#ifdef WIN32
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000713WEBRTC_DISABLED_BASE_TEST(CheckCoInitialize) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000714 Base::CheckCoInitialize();
715}
716#endif
717#endif
718
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000719WEBRTC_BASE_TEST(SetSend);
720WEBRTC_BASE_TEST(SetSendWithoutCodecs);
721WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000722
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000723WEBRTC_BASE_TEST(GetStats);
724WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
725WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000726
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000727WEBRTC_BASE_TEST(SetSendBandwidth);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000728
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000729WEBRTC_BASE_TEST(SetSendSsrc);
730WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000731
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000732WEBRTC_BASE_TEST(SetRenderer);
733WEBRTC_BASE_TEST(AddRemoveRecvStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000734
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000735WEBRTC_DISABLED_BASE_TEST(AddRemoveRecvStreamAndRender);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000736
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000737WEBRTC_BASE_TEST(AddRemoveRecvStreamsNoConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000738
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000739WEBRTC_BASE_TEST(AddRemoveSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000740
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000741WEBRTC_BASE_TEST(SimulateConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000742
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000743WEBRTC_BASE_TEST(AddRemoveCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000744
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000745WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000746
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000747WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000748
749// TODO(pbos): Figure out why this fails so often.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000750WEBRTC_DISABLED_BASE_TEST(HighAspectHighHeightCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000751
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000752WEBRTC_BASE_TEST(RejectEmptyStreamParams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000753
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000754WEBRTC_BASE_TEST(AdaptResolution16x10);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000755
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000756WEBRTC_BASE_TEST(AdaptResolution4x3);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000757
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000758// TODO(juberti): Restore this test once we support sending 0 fps.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000759WEBRTC_DISABLED_BASE_TEST(AdaptDropAllFrames);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000760// TODO(juberti): Understand why we get decode errors on this test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000761WEBRTC_DISABLED_BASE_TEST(AdaptFramerate);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000762
pbos@webrtc.orgc4175b92014-09-03 15:25:49 +0000763WEBRTC_BASE_TEST(SendsLowerResolutionOnSmallerFrames);
764
765WEBRTC_BASE_TEST(MuteStream);
766
767WEBRTC_BASE_TEST(MultipleSendStreams);
768
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000769WEBRTC_BASE_TEST(SetSendStreamFormat0x0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000770
771// TODO(zhurunz): Fix the flakey test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000772WEBRTC_DISABLED_BASE_TEST(SetSendStreamFormat);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000773
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000774TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Vga) {
775 SendAndReceive(cricket::VideoCodec(100, "VP8", 640, 400, 30, 0));
776}
777
778TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Qvga) {
779 SendAndReceive(cricket::VideoCodec(100, "VP8", 320, 200, 30, 0));
780}
781
782TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8SvcQqvga) {
783 SendAndReceive(cricket::VideoCodec(100, "VP8", 160, 100, 30, 0));
784}
785
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000786TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
787 Base::TwoStreamsSendAndReceive(kVp8Codec);
788}
789
790TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
791 Base::TwoStreamsReUseFirstStream(kVp8Codec);
792}
793
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000794WEBRTC_BASE_TEST(SendManyResizeOnce);
795
796// TODO(pbos): Enable and figure out why this fails (or should work).
797TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
798 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL));
799 EXPECT_TRUE(channel_->SetRenderer(kDefaultReceiveSsrc, &renderer_));
800 channel_->UpdateAspectRatio(1280, 720);
801 video_capturer_.reset(new cricket::FakeVideoCapturer);
802 const std::vector<cricket::VideoFormat>* formats =
803 video_capturer_->GetSupportedFormats();
804 cricket::VideoFormat capture_format_hd = (*formats)[0];
805 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(capture_format_hd));
806 EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get()));
807
808 // Capture format HD -> adapt (OnOutputFormatRequest VGA) -> VGA.
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000809 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000810 EXPECT_TRUE(SetOneCodec(codec));
811 codec.width /= 2;
812 codec.height /= 2;
813 EXPECT_TRUE(SetSend(true));
814 EXPECT_TRUE(channel_->SetRender(true));
815 EXPECT_EQ(0, renderer_.num_rendered_frames());
816 EXPECT_TRUE(SendFrame());
817 EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout);
818}
819
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000820class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test,
821 public WebRtcCallFactory {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000822 public:
Erik SprĂ¥ng143cec12015-04-28 10:01:41 +0200823 WebRtcVideoChannel2Test() : fake_call_(NULL), last_ssrc_(0) {}
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000824 void SetUp() override {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000825 engine_.SetCallFactory(this);
Fredrik Solenberg9a416bd2015-05-22 09:04:09 +0200826 engine_.Init();
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000827 channel_.reset(engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000828 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000829 last_ssrc_ = 123;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000830 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000831 }
832
833 protected:
Erik SprĂ¥ng143cec12015-04-28 10:01:41 +0200834 virtual std::vector<cricket::VideoCodec> GetCodecs() {
835 return engine_.codecs();
836 }
837
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000838 webrtc::Call* CreateCall(const webrtc::Call::Config& config) override {
Fredrik Solenbergd3ddc1b2015-05-07 17:07:34 +0200839 DCHECK(fake_call_ == NULL);
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000840 fake_call_ = new FakeCall(config);
841 return fake_call_;
842 }
843
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000844 FakeVideoSendStream* AddSendStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000845 return AddSendStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000846 }
847
848 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000849 size_t num_streams = fake_call_->GetVideoSendStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000850 EXPECT_TRUE(channel_->AddSendStream(sp));
851 std::vector<FakeVideoSendStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000852 fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000853 EXPECT_EQ(num_streams + 1, streams.size());
854 return streams[streams.size() - 1];
855 }
856
857 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000858 return fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000859 }
860
861 FakeVideoReceiveStream* AddRecvStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000862 return AddRecvStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000863 }
864
865 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000866 size_t num_streams = fake_call_->GetVideoReceiveStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000867 EXPECT_TRUE(channel_->AddRecvStream(sp));
868 std::vector<FakeVideoReceiveStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000869 fake_call_->GetVideoReceiveStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000870 EXPECT_EQ(num_streams + 1, streams.size());
871 return streams[streams.size() - 1];
872 }
873
pbos@webrtc.org00873182014-11-25 14:03:34 +0000874 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
875 int expected_min_bitrate_bps,
876 const char* start_bitrate_kbps,
877 int expected_start_bitrate_bps,
878 const char* max_bitrate_kbps,
879 int expected_max_bitrate_bps) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000880 std::vector<VideoCodec> codecs;
881 codecs.push_back(kVp8Codec);
pbos@webrtc.org00873182014-11-25 14:03:34 +0000882 codecs[0].params[kCodecParamMinBitrate] = min_bitrate_kbps;
883 codecs[0].params[kCodecParamStartBitrate] = start_bitrate_kbps;
884 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate_kbps;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000885 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
886
pbos@webrtc.org00873182014-11-25 14:03:34 +0000887 EXPECT_EQ(expected_min_bitrate_bps,
Stefan Holmere5904162015-03-26 11:11:06 +0100888 fake_call_->GetConfig().bitrate_config.min_bitrate_bps);
pbos@webrtc.org00873182014-11-25 14:03:34 +0000889 EXPECT_EQ(expected_start_bitrate_bps,
Stefan Holmere5904162015-03-26 11:11:06 +0100890 fake_call_->GetConfig().bitrate_config.start_bitrate_bps);
pbos@webrtc.org00873182014-11-25 14:03:34 +0000891 EXPECT_EQ(expected_max_bitrate_bps,
Stefan Holmere5904162015-03-26 11:11:06 +0100892 fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000893 }
894
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000895 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
896 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000897 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000898 // Enable extension.
899 const int id = 1;
900 std::vector<cricket::RtpHeaderExtension> extensions;
901 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
902 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
903
904 FakeVideoSendStream* send_stream =
905 AddSendStream(cricket::StreamParams::CreateLegacy(123));
906
907 // Verify the send extension id.
908 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
909 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
910 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
911 // Verify call with same set of extensions returns true.
912 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
913 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
914 // receivers.
915 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
916 ->GetConfig()
917 .rtp.extensions.empty());
918
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000919 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000920 std::vector<cricket::RtpHeaderExtension> empty_extensions;
921 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000922 ASSERT_EQ(1u, call->GetVideoSendStreams().size());
923 send_stream = call->GetVideoSendStreams()[0];
924 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
925
926 // Verify that adding receive RTP header extensions adds them for existing
927 // streams.
928 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
929 send_stream = call->GetVideoSendStreams()[0];
930 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
931 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
932 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000933 }
934
935 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
936 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000937 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000938 // Enable extension.
939 const int id = 1;
940 std::vector<cricket::RtpHeaderExtension> extensions;
941 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
942 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
943
944 FakeVideoReceiveStream* recv_stream =
945 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
946
947 // Verify the recv extension id.
948 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
949 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
950 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
951 // Verify call with same set of extensions returns true.
952 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000953
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000954 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
955 // senders.
956 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
957 ->GetConfig()
958 .rtp.extensions.empty());
959
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000960 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000961 std::vector<cricket::RtpHeaderExtension> empty_extensions;
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000962 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(empty_extensions));
963 ASSERT_EQ(1u, call->GetVideoReceiveStreams().size());
964 recv_stream = call->GetVideoReceiveStreams()[0];
965 EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
966
967 // Verify that adding receive RTP header extensions adds them for existing
968 // streams.
969 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
970 recv_stream = call->GetVideoReceiveStreams()[0];
971 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
972 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
973 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000974 }
975
Erik SprĂ¥ngefbde372015-04-29 16:21:28 +0200976 void TestCpuAdaptation(bool enable_overuse, bool is_screenshare);
Peter Boström3548dd22015-05-22 18:48:36 +0200977 void TestReceiverLocalSsrcConfiguration(bool receiver_first);
noahricd10a68e2015-07-10 11:27:55 -0700978 void TestReceiveUnsignalledSsrcPacket(uint8_t payload_type,
979 bool expect_created_receive_stream);
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000980
Erik SprĂ¥ng143cec12015-04-28 10:01:41 +0200981 FakeVideoSendStream* SetDenoisingOption(bool enabled) {
982 VideoOptions options;
983 options.video_noise_reduction.Set(enabled);
984 channel_->SetOptions(options);
985 return fake_call_->GetVideoSendStreams().back();
986 }
987
988 FakeVideoSendStream* SetUpSimulcast(bool enabled) {
989 last_ssrc_ += 3;
990 if (enabled) {
991 std::vector<uint32_t> ssrcs;
992 ssrcs.push_back(last_ssrc_);
993 ssrcs.push_back(last_ssrc_ + 1);
994 ssrcs.push_back(last_ssrc_ + 2);
995 return AddSendStream(CreateSimStreamParams("cname", ssrcs));
996 } else {
997 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_));
998 }
999 }
1000
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001001 FakeCall* fake_call_;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001002 rtc::scoped_ptr<VideoMediaChannel> channel_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001003 uint32 last_ssrc_;
1004};
1005
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001006TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001007 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1008 EXPECT_TRUE(channel_->SetSend(true));
1009 cricket::VideoOptions options;
1010 options.conference_mode.Set(true);
1011 EXPECT_TRUE(channel_->SetOptions(options));
1012
1013 // Send side.
1014 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1015 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1016 FakeVideoSendStream* send_stream = AddSendStream(
1017 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1018
1019 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
1020 for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
1021 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
1022
1023 // Receiver side.
1024 FakeVideoReceiveStream* recv_stream = AddRecvStream(
1025 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1026 ASSERT_GT(recv_stream->GetConfig().rtp.rtx.size(), 0u)
1027 << "No SSRCs for RTX configured by AddRecvStream.";
1028 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size())
1029 << "This test only works with one receive codec. Please update the test.";
1030 EXPECT_EQ(rtx_ssrcs[0],
1031 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
1032 // TODO(pbos): Make sure we set the RTX for correct payloads etc.
1033}
1034
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001035TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
1036 // Setup one channel with an associated RTX stream.
1037 cricket::StreamParams params =
1038 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
1039 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
1040 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
1041 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
1042 EXPECT_EQ(kRtxSsrcs1[0],
1043 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001044}
1045
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001046TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
1047 // Setup one channel without an associated RTX stream.
1048 cricket::StreamParams params =
1049 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
1050 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
1051 ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001052}
1053
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001054TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
1055 FakeVideoSendStream* send_stream =
1056 AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
1057 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
1058
1059 FakeVideoReceiveStream* recv_stream =
1060 AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
1061 ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001062}
1063
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001064// Test support for RTP timestamp offset header extension.
1065TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
1066 TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
1067 webrtc::RtpExtension::kTOffset);
1068}
1069TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
1070 TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
1071 webrtc::RtpExtension::kTOffset);
1072}
1073
1074// Test support for absolute send time header extension.
1075TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
1076 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
1077 webrtc::RtpExtension::kAbsSendTime);
1078}
1079TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
1080 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
1081 webrtc::RtpExtension::kAbsSendTime);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001082}
1083
Guo-wei Shieh64c1e8c2015-04-01 15:33:06 -07001084// Test support for video rotation header extension.
1085TEST_F(WebRtcVideoChannel2Test, SendVideoRotationHeaderExtensions) {
1086 TestSetSendRtpHeaderExtensions(kRtpVideoRotationHeaderExtension,
1087 webrtc::RtpExtension::kVideoRotation);
1088}
1089TEST_F(WebRtcVideoChannel2Test, RecvVideoRotationHeaderExtensions) {
1090 TestSetRecvRtpHeaderExtensions(kRtpVideoRotationHeaderExtension,
1091 webrtc::RtpExtension::kVideoRotation);
1092}
1093
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001094TEST_F(WebRtcVideoChannel2Test, IdenticalSendExtensionsDoesntRecreateStream) {
1095 const int kTOffsetId = 1;
1096 const int kAbsSendTimeId = 2;
Guo-wei Shieh64c1e8c2015-04-01 15:33:06 -07001097 const int kVideoRotationId = 3;
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001098 std::vector<cricket::RtpHeaderExtension> extensions;
1099 extensions.push_back(cricket::RtpHeaderExtension(
1100 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1101 extensions.push_back(cricket::RtpHeaderExtension(
1102 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
Guo-wei Shieh64c1e8c2015-04-01 15:33:06 -07001103 extensions.push_back(cricket::RtpHeaderExtension(
1104 kRtpVideoRotationHeaderExtension, kVideoRotationId));
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001105
1106 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1107 FakeVideoSendStream* send_stream =
1108 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1109
1110 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
Guo-wei Shieh64c1e8c2015-04-01 15:33:06 -07001111 ASSERT_EQ(3u, send_stream->GetConfig().rtp.extensions.size());
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001112
1113 // Setting the same extensions (even if in different order) shouldn't
1114 // reallocate the stream.
1115 std::reverse(extensions.begin(), extensions.end());
1116 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1117
1118 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1119
1120 // Setting different extensions should recreate the stream.
1121 extensions.resize(1);
1122 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1123
1124 EXPECT_EQ(2, fake_call_->GetNumCreatedSendStreams());
1125}
1126
1127TEST_F(WebRtcVideoChannel2Test, IdenticalRecvExtensionsDoesntRecreateStream) {
1128 const int kTOffsetId = 1;
1129 const int kAbsSendTimeId = 2;
Guo-wei Shieh64c1e8c2015-04-01 15:33:06 -07001130 const int kVideoRotationId = 3;
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001131 std::vector<cricket::RtpHeaderExtension> extensions;
1132 extensions.push_back(cricket::RtpHeaderExtension(
1133 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1134 extensions.push_back(cricket::RtpHeaderExtension(
1135 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
Guo-wei Shieh64c1e8c2015-04-01 15:33:06 -07001136 extensions.push_back(cricket::RtpHeaderExtension(
1137 kRtpVideoRotationHeaderExtension, kVideoRotationId));
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001138
1139 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
Peter Boström54be3e02015-05-25 15:04:24 +02001140 FakeVideoReceiveStream* recv_stream =
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001141 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1142
1143 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
Peter Boström54be3e02015-05-25 15:04:24 +02001144 ASSERT_EQ(3u, recv_stream->GetConfig().rtp.extensions.size());
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001145
1146 // Setting the same extensions (even if in different order) shouldn't
1147 // reallocate the stream.
1148 std::reverse(extensions.begin(), extensions.end());
1149 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1150
1151 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1152
1153 // Setting different extensions should recreate the stream.
1154 extensions.resize(1);
1155 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1156
1157 EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams());
1158}
1159
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001160TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001161 SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001162 const int kUnsupportedId = 1;
1163 const int kTOffsetId = 2;
1164
1165 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001166 extensions.push_back(
1167 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1168 extensions.push_back(
1169 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001170 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1171 FakeVideoSendStream* send_stream =
1172 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1173
1174 // Only timestamp offset extension is set to send stream,
1175 // unsupported rtp extension is ignored.
1176 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
1177 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001178 send_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001179}
1180
1181TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001182 SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001183 const int kUnsupportedId = 1;
1184 const int kTOffsetId = 2;
1185
1186 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001187 extensions.push_back(
1188 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1189 extensions.push_back(
1190 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001191 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1192 FakeVideoReceiveStream* recv_stream =
1193 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1194
1195 // Only timestamp offset extension is set to receive stream,
1196 // unsupported rtp extension is ignored.
1197 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1198 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001199 recv_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001200}
1201
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001202TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
Peter Boström23914fe2015-03-31 15:08:04 +02001203 const int kIncorrectIds[] = {-2, -1, 0, 15, 16};
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001204 for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001205 std::vector<cricket::RtpHeaderExtension> extensions;
1206 extensions.push_back(cricket::RtpHeaderExtension(
1207 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1208 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions))
1209 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1210 }
1211}
1212
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001213TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
Peter Boström23914fe2015-03-31 15:08:04 +02001214 const int kIncorrectIds[] = {-2, -1, 0, 15, 16};
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001215 for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001216 std::vector<cricket::RtpHeaderExtension> extensions;
1217 extensions.push_back(cricket::RtpHeaderExtension(
1218 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1219 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions))
1220 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1221 }
1222}
1223
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001224TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001225 const int id = 1;
1226 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001227 extensions.push_back(
1228 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1229 extensions.push_back(
1230 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001231 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1232
1233 // Duplicate entries are also not supported.
1234 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001235 extensions.push_back(
1236 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001237 extensions.push_back(extensions.back());
1238 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1239}
1240
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001241TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001242 const int id = 1;
1243 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001244 extensions.push_back(
1245 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1246 extensions.push_back(
1247 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001248 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1249
1250 // Duplicate entries are also not supported.
1251 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001252 extensions.push_back(
1253 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001254 extensions.push_back(extensions.back());
1255 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1256}
1257
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001258TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
1259 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1260}
1261
1262TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
1263 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1264}
1265
1266TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
1267 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1268}
1269
1270TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
1271 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001272 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001273}
1274
Peter Boströmd7da1202015-06-05 14:09:38 +02001275TEST_F(WebRtcVideoChannel2Test, RtcpIsCompoundByDefault) {
1276 FakeVideoReceiveStream* stream = AddRecvStream();
1277 EXPECT_EQ(webrtc::newapi::kRtcpCompound, stream->GetConfig().rtp.rtcp_mode);
1278}
1279
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001280TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
1281 FakeVideoReceiveStream* stream = AddRecvStream();
1282 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001283}
1284
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001285TEST_F(WebRtcVideoChannel2Test, RembCanBeEnabledAndDisabled) {
1286 FakeVideoReceiveStream* stream = AddRecvStream();
1287 EXPECT_TRUE(stream->GetConfig().rtp.remb);
1288
Peter Boström126c03e2015-05-11 12:48:12 +02001289 // Verify that REMB is turned off when send(!) codecs without REMB are set.
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001290 std::vector<VideoCodec> codecs;
1291 codecs.push_back(kVp8Codec);
1292 EXPECT_TRUE(codecs[0].feedback_params.params().empty());
Peter Boström126c03e2015-05-11 12:48:12 +02001293 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001294 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001295 EXPECT_FALSE(stream->GetConfig().rtp.remb);
1296
1297 // Verify that REMB is turned on when setting default codecs since the
1298 // default codecs have REMB enabled.
Peter Boström126c03e2015-05-11 12:48:12 +02001299 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001300 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001301 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001302}
1303
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001304TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
1305 VerifyCodecHasDefaultFeedbackParams(default_codec_);
1306
pbos@webrtc.org19864742014-05-30 07:35:47 +00001307 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1308 EXPECT_TRUE(channel_->SetSend(true));
1309
1310 // Send side.
1311 FakeVideoSendStream* send_stream =
1312 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1313 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1314
1315 // Receiver side.
1316 FakeVideoReceiveStream* recv_stream =
1317 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1318 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1319
1320 // Nack history size should match between sender and receiver.
1321 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
1322 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001323}
1324
Peter Boström67c9df72015-05-11 14:34:58 +02001325TEST_F(WebRtcVideoChannel2Test, NackCanBeEnabledAndDisabled) {
Peter Boström67c9df72015-05-11 14:34:58 +02001326 FakeVideoSendStream* send_stream = AddSendStream();
Peter Boström3548dd22015-05-22 18:48:36 +02001327 FakeVideoReceiveStream* recv_stream = AddRecvStream();
Peter Boström67c9df72015-05-11 14:34:58 +02001328
1329 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1330 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1331
1332 // Verify that NACK is turned off when send(!) codecs without NACK are set.
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001333 std::vector<VideoCodec> codecs;
1334 codecs.push_back(kVp8Codec);
Peter Boström67c9df72015-05-11 14:34:58 +02001335 EXPECT_TRUE(codecs[0].feedback_params.params().empty());
1336 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1337 recv_stream = fake_call_->GetVideoReceiveStreams()[0];
1338 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
1339 send_stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001340 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
1341
Peter Boström67c9df72015-05-11 14:34:58 +02001342 // Verify that NACK is turned on when setting default codecs since the
1343 // default codecs have NACK enabled.
1344 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1345 recv_stream = fake_call_->GetVideoReceiveStreams()[0];
1346 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1347 send_stream = fake_call_->GetVideoSendStreams()[0];
1348 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001349}
1350
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001351TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
1352 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1353}
1354
1355TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
1356 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1357}
1358
1359TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
1360 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1361}
1362
1363TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
1364 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1365}
1366
1367TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
1368 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1369}
1370
1371TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
1372 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1373}
1374
1375TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
1376 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1377}
1378
1379TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
1380 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1381}
1382
1383TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
1384 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1385}
1386
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001387TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) {
1388 static const int kScreenshareMinBitrateKbps = 800;
1389 cricket::VideoCodec codec = kVp8Codec360p;
1390 std::vector<cricket::VideoCodec> codecs;
1391 codecs.push_back(codec);
1392 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1393 VideoOptions options;
1394 options.screencast_min_bitrate.Set(kScreenshareMinBitrateKbps);
1395 channel_->SetOptions(options);
1396
1397 AddSendStream();
1398
1399 cricket::FakeVideoCapturer capturer;
1400 capturer.SetScreencast(false);
1401 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1402 cricket::VideoFormat capture_format_hd =
1403 capturer.GetSupportedFormats()->front();
1404 EXPECT_EQ(1280, capture_format_hd.width);
1405 EXPECT_EQ(720, capture_format_hd.height);
1406 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1407
1408 EXPECT_TRUE(channel_->SetSend(true));
1409
1410 EXPECT_TRUE(capturer.CaptureFrame());
1411 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1412 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1413
1414 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1415
1416 // Verify non-screencast settings.
1417 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
Erik SprĂ¥ng143cec12015-04-28 10:01:41 +02001418 EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo,
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001419 encoder_config.content_type);
1420 EXPECT_EQ(codec.width, encoder_config.streams.front().width);
1421 EXPECT_EQ(codec.height, encoder_config.streams.front().height);
1422 EXPECT_EQ(0, encoder_config.min_transmit_bitrate_bps)
1423 << "Non-screenshare shouldn't use min-transmit bitrate.";
1424
1425 capturer.SetScreencast(true);
1426 EXPECT_TRUE(capturer.CaptureFrame());
1427
1428 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1429
1430 // Verify screencast settings.
1431 encoder_config = send_stream->GetEncoderConfig();
Erik SprĂ¥ng143cec12015-04-28 10:01:41 +02001432 EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kScreen,
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001433 encoder_config.content_type);
1434 EXPECT_EQ(kScreenshareMinBitrateKbps * 1000,
1435 encoder_config.min_transmit_bitrate_bps);
1436
1437 EXPECT_EQ(capture_format_hd.width, encoder_config.streams.front().width);
1438 EXPECT_EQ(capture_format_hd.height, encoder_config.streams.front().height);
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +00001439 EXPECT_TRUE(encoder_config.streams[0].temporal_layer_thresholds_bps.empty());
1440
1441 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
1442}
1443
1444TEST_F(WebRtcVideoChannel2Test,
1445 ConferenceModeScreencastConfiguresTemporalLayer) {
Erik SprĂ¥ng2c4c9142015-06-24 11:24:44 +02001446 static const int kConferenceScreencastTemporalBitrateBps =
1447 ScreenshareLayerConfig::GetDefault().tl0_bitrate_kbps * 1000;
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +00001448 VideoOptions options;
1449 options.conference_mode.Set(true);
1450 channel_->SetOptions(options);
1451
1452 AddSendStream();
1453
1454 cricket::FakeVideoCapturer capturer;
1455 capturer.SetScreencast(true);
1456 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1457 cricket::VideoFormat capture_format_hd =
1458 capturer.GetSupportedFormats()->front();
1459 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1460
1461 EXPECT_TRUE(channel_->SetSend(true));
1462
1463 EXPECT_TRUE(capturer.CaptureFrame());
1464 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1465 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1466
1467 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1468
1469 // Verify screencast settings.
1470 encoder_config = send_stream->GetEncoderConfig();
Erik SprĂ¥ng143cec12015-04-28 10:01:41 +02001471 EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kScreen,
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +00001472 encoder_config.content_type);
1473 ASSERT_EQ(1u, encoder_config.streams.size());
1474 ASSERT_EQ(1u, encoder_config.streams[0].temporal_layer_thresholds_bps.size());
1475 EXPECT_EQ(kConferenceScreencastTemporalBitrateBps,
1476 encoder_config.streams[0].temporal_layer_thresholds_bps[0]);
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001477
1478 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001479}
1480
1481TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
1482 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1483}
1484
1485TEST_F(WebRtcVideoChannel2Test,
1486 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
1487 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1488}
1489
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001490TEST_F(WebRtcVideoChannel2Test, SuspendBelowMinBitrateDisabledByDefault) {
1491 FakeVideoSendStream* stream = AddSendStream();
1492 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1493}
1494
1495TEST_F(WebRtcVideoChannel2Test, SetOptionsWithSuspendBelowMinBitrate) {
1496 VideoOptions options;
1497 options.suspend_below_min_bitrate.Set(true);
1498 channel_->SetOptions(options);
1499
1500 FakeVideoSendStream* stream = AddSendStream();
1501 EXPECT_TRUE(stream->GetConfig().suspend_below_min_bitrate);
1502
1503 options.suspend_below_min_bitrate.Set(false);
1504 channel_->SetOptions(options);
1505
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001506 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001507 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1508}
1509
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001510TEST_F(WebRtcVideoChannel2Test, Vp8DenoisingEnabledByDefault) {
1511 FakeVideoSendStream* stream = AddSendStream();
1512 webrtc::VideoCodecVP8 vp8_settings;
1513 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1514 EXPECT_TRUE(vp8_settings.denoisingOn);
1515}
1516
Erik SprĂ¥ng143cec12015-04-28 10:01:41 +02001517TEST_F(WebRtcVideoChannel2Test, VerifyVp8SpecificSettings) {
1518 std::vector<cricket::VideoCodec> codecs;
1519 codecs.push_back(kVp8Codec720p);
1520 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001521
Erik SprĂ¥ng143cec12015-04-28 10:01:41 +02001522 FakeVideoSendStream* stream = SetUpSimulcast(false);
1523
1524 cricket::FakeVideoCapturer capturer;
1525 capturer.SetScreencast(false);
1526 EXPECT_EQ(cricket::CS_RUNNING,
1527 capturer.Start(capturer.GetSupportedFormats()->front()));
1528 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1529 channel_->SetSend(true);
1530
1531 EXPECT_TRUE(capturer.CaptureFrame());
1532
1533 stream = SetDenoisingOption(false);
1534
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001535 webrtc::VideoCodecVP8 vp8_settings;
1536 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1537 EXPECT_FALSE(vp8_settings.denoisingOn);
Erik SprĂ¥ng143cec12015-04-28 10:01:41 +02001538 EXPECT_TRUE(vp8_settings.automaticResizeOn);
1539 EXPECT_TRUE(vp8_settings.frameDroppingOn);
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001540
Erik SprĂ¥ng143cec12015-04-28 10:01:41 +02001541 stream = SetDenoisingOption(true);
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001542
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001543 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1544 EXPECT_TRUE(vp8_settings.denoisingOn);
Erik SprĂ¥ng143cec12015-04-28 10:01:41 +02001545 EXPECT_TRUE(vp8_settings.automaticResizeOn);
1546 EXPECT_TRUE(vp8_settings.frameDroppingOn);
1547
1548 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
1549 stream = SetUpSimulcast(true);
1550 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1551 channel_->SetSend(true);
1552 EXPECT_TRUE(capturer.CaptureFrame());
1553
1554 EXPECT_EQ(3, stream->GetVideoStreams().size());
1555 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1556 // Autmatic resize off when using simulcast.
1557 EXPECT_FALSE(vp8_settings.automaticResizeOn);
1558 EXPECT_TRUE(vp8_settings.frameDroppingOn);
1559
1560 // In screen-share mode, denoising is forced off and simulcast disabled.
1561 capturer.SetScreencast(true);
1562 EXPECT_TRUE(capturer.CaptureFrame());
1563 stream = SetDenoisingOption(false);
1564
1565 EXPECT_EQ(1, stream->GetVideoStreams().size());
1566 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1567 EXPECT_FALSE(vp8_settings.denoisingOn);
1568 // Resizing and frame dropping always off for screen sharing.
1569 EXPECT_FALSE(vp8_settings.automaticResizeOn);
1570 EXPECT_FALSE(vp8_settings.frameDroppingOn);
1571
1572 stream = SetDenoisingOption(true);
1573
1574 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1575 EXPECT_FALSE(vp8_settings.denoisingOn);
1576 EXPECT_FALSE(vp8_settings.automaticResizeOn);
1577 EXPECT_FALSE(vp8_settings.frameDroppingOn);
1578
1579 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
1580}
1581
1582class Vp9SettingsTest : public WebRtcVideoChannel2Test {
1583 public:
1584 Vp9SettingsTest() : WebRtcVideoChannel2Test() {
1585 encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP9, "VP9");
1586 }
1587 virtual ~Vp9SettingsTest() {}
1588
1589 protected:
1590 void SetUp() override {
1591 engine_.SetExternalEncoderFactory(&encoder_factory_);
1592
1593 WebRtcVideoChannel2Test::SetUp();
1594 }
1595
1596 void TearDown() override {
1597 // Remove references to encoder_factory_ since this will be destroyed
1598 // before channel_ and engine_.
Erik SprĂ¥ng143cec12015-04-28 10:01:41 +02001599 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1600 }
1601
1602 cricket::FakeWebRtcVideoEncoderFactory encoder_factory_;
1603};
1604
1605TEST_F(Vp9SettingsTest, VerifyVp9SpecificSettings) {
1606 std::vector<cricket::VideoCodec> codecs;
1607 codecs.push_back(kVp9Codec);
1608 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1609
1610 FakeVideoSendStream* stream = SetUpSimulcast(false);
1611
1612 cricket::FakeVideoCapturer capturer;
1613 capturer.SetScreencast(false);
1614 EXPECT_EQ(cricket::CS_RUNNING,
1615 capturer.Start(capturer.GetSupportedFormats()->front()));
1616 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1617 channel_->SetSend(true);
1618
1619 EXPECT_TRUE(capturer.CaptureFrame());
1620
1621 stream = SetDenoisingOption(false);
1622
1623 webrtc::VideoCodecVP9 vp9_settings;
1624 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
1625 EXPECT_FALSE(vp9_settings.denoisingOn);
1626 // Frame dropping always on for real time video.
1627 EXPECT_TRUE(vp9_settings.frameDroppingOn);
1628
1629 stream = SetDenoisingOption(true);
1630
1631 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
1632 EXPECT_TRUE(vp9_settings.denoisingOn);
1633 EXPECT_TRUE(vp9_settings.frameDroppingOn);
1634
1635 // In screen-share mode, denoising is forced off.
1636 capturer.SetScreencast(true);
1637 EXPECT_TRUE(capturer.CaptureFrame());
1638 stream = SetDenoisingOption(false);
1639
1640 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
1641 EXPECT_FALSE(vp9_settings.denoisingOn);
1642 // Frame dropping always off for screen sharing.
1643 EXPECT_FALSE(vp9_settings.frameDroppingOn);
1644
1645 stream = SetDenoisingOption(false);
1646
1647 ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
1648 EXPECT_FALSE(vp9_settings.denoisingOn);
1649 EXPECT_FALSE(vp9_settings.frameDroppingOn);
1650
1651 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001652}
1653
1654TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
1655 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1656}
1657
pbos@webrtc.org8aed9452014-07-26 10:16:49 +00001658TEST_F(WebRtcVideoChannel2Test, DISABLED_SendReceiveBitratesStats) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001659 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1660}
1661
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001662TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruse) {
Erik SprĂ¥ngefbde372015-04-29 16:21:28 +02001663 TestCpuAdaptation(true, false);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001664}
1665
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001666TEST_F(WebRtcVideoChannel2Test, DoesNotAdaptOnOveruseWhenDisabled) {
Erik SprĂ¥ngefbde372015-04-29 16:21:28 +02001667 TestCpuAdaptation(false, false);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001668}
1669
Erik SprĂ¥ngefbde372015-04-29 16:21:28 +02001670TEST_F(WebRtcVideoChannel2Test, DoesNotAdaptOnOveruseWhenScreensharing) {
1671 TestCpuAdaptation(true, true);
1672}
1673
1674void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse,
1675 bool is_screenshare) {
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001676 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001677 std::vector<cricket::VideoCodec> codecs;
1678 codecs.push_back(codec);
1679 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1680
Peter Boströme4328002015-04-14 22:45:29 +02001681 if (!enable_overuse) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001682 VideoOptions options;
Peter Boströme4328002015-04-14 22:45:29 +02001683 options.cpu_overuse_detection.Set(false);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001684 channel_->SetOptions(options);
1685 }
1686
1687 AddSendStream();
1688
1689 cricket::FakeVideoCapturer capturer;
Erik SprĂ¥ngefbde372015-04-29 16:21:28 +02001690 capturer.SetScreencast(is_screenshare);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001691 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1692 EXPECT_EQ(cricket::CS_RUNNING,
1693 capturer.Start(capturer.GetSupportedFormats()->front()));
1694
1695 EXPECT_TRUE(channel_->SetSend(true));
1696
1697 // Trigger overuse.
1698 webrtc::LoadObserver* overuse_callback =
1699 fake_call_->GetConfig().overuse_callback;
1700 ASSERT_TRUE(overuse_callback != NULL);
1701 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
1702
1703 EXPECT_TRUE(capturer.CaptureFrame());
1704 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1705 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1706
1707 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1708
Erik SprĂ¥ngefbde372015-04-29 16:21:28 +02001709 if (enable_overuse && !is_screenshare) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001710 EXPECT_LT(send_stream->GetLastWidth(), codec.width);
1711 EXPECT_LT(send_stream->GetLastHeight(), codec.height);
1712 } else {
1713 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1714 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1715 }
1716
1717 // Trigger underuse which should go back to normal resolution.
1718 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
1719 EXPECT_TRUE(capturer.CaptureFrame());
1720
1721 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1722
1723 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1724 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1725
1726 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001727}
1728
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001729TEST_F(WebRtcVideoChannel2Test, EstimatesNtpStartTimeAndElapsedTimeCorrectly) {
1730 // Start at last timestamp to verify that wraparounds are estimated correctly.
1731 static const uint32_t kInitialTimestamp = 0xFFFFFFFFu;
1732 static const int64_t kInitialNtpTimeMs = 1247891230;
1733 static const int kFrameOffsetMs = 20;
1734 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001735
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001736 FakeVideoReceiveStream* stream = AddRecvStream();
1737 cricket::FakeVideoRenderer renderer;
1738 EXPECT_TRUE(channel_->SetRenderer(last_ssrc_, &renderer));
1739 EXPECT_TRUE(channel_->SetRender(true));
1740
Miguel Casas-Sanchez47650702015-05-29 17:21:40 -07001741 webrtc::VideoFrame video_frame;
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001742 CreateBlackFrame(&video_frame, 4, 4);
1743 video_frame.set_timestamp(kInitialTimestamp);
1744 // Initial NTP time is not available on the first frame, but should still be
1745 // able to be estimated.
1746 stream->InjectFrame(video_frame, 0);
1747
1748 EXPECT_EQ(1, renderer.num_rendered_frames());
1749 EXPECT_EQ(0, renderer.last_frame_elapsed_time_ns());
1750
1751 // This timestamp is kInitialTimestamp (-1) + kFrameOffsetMs * 90, which
1752 // triggers a constant-overflow warning, hence we're calculating it explicitly
1753 // here.
1754 video_frame.set_timestamp(kFrameOffsetMs * 90 - 1);
1755 video_frame.set_ntp_time_ms(kInitialNtpTimeMs + kFrameOffsetMs);
1756 stream->InjectFrame(video_frame, 0);
1757
1758 EXPECT_EQ(2, renderer.num_rendered_frames());
1759 EXPECT_EQ(kFrameOffsetMs * rtc::kNumNanosecsPerMillisec,
1760 renderer.last_frame_elapsed_time_ns());
1761
1762 // Verify that NTP time has been correctly deduced.
1763 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00001764 ASSERT_TRUE(channel_->GetStats(&info));
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001765 ASSERT_EQ(1u, info.receivers.size());
1766 EXPECT_EQ(kInitialNtpTimeMs, info.receivers[0].capture_start_ntp_time_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001767}
1768
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001769TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001770 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001771
1772 VideoCodec codec;
1773 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001774 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001775
1776 // Using a RTX setup to verify that the default RTX payload type is good.
1777 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1778 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1779 FakeVideoSendStream* stream = AddSendStream(
1780 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1781 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001782
1783 // Make sure NACK and FEC are enabled on the correct payload types.
1784 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
1785 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
1786 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001787
1788 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
1789 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
Shao Changbine62202f2015-04-21 20:24:50 +08001790 VerifySendStreamHasRtxTypes(config, default_apt_rtx_types_);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001791 // TODO(juberti): Check RTCP, PLI, TMMBR.
1792}
1793
1794TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
1795 std::vector<VideoCodec> codecs;
1796 codecs.push_back(kVp8Codec);
1797 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1798
1799 FakeVideoSendStream* stream = AddSendStream();
1800 webrtc::VideoSendStream::Config config = stream->GetConfig();
1801
1802 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1803 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1804}
1805
1806TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001807 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1808 std::vector<VideoCodec> codecs;
1809 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1810 codecs.push_back(rtx_codec);
1811 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1812 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001813}
1814
1815TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001816 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1817 std::vector<VideoCodec> codecs;
1818 cricket::VideoCodec rtx_codec =
1819 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1820 codecs.push_back(kVp8Codec);
1821 codecs.push_back(rtx_codec);
1822 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1823
1824 cricket::VideoCodec rtx_codec2 =
1825 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1826 codecs.pop_back();
1827 codecs.push_back(rtx_codec2);
1828 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1829 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001830}
1831
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001832TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1833 std::vector<VideoCodec> codecs;
1834 codecs.push_back(kVp8Codec);
1835 codecs.push_back(kUlpfecCodec);
1836 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1837
1838 FakeVideoSendStream* stream = AddSendStream();
1839 webrtc::VideoSendStream::Config config = stream->GetConfig();
1840
1841 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1842
1843 codecs.pop_back();
1844 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001845 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001846 ASSERT_TRUE(stream != NULL);
1847 config = stream->GetConfig();
1848 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1849 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001850}
1851
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001852TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1853 std::vector<VideoCodec> codecs;
1854 codecs.push_back(kVp8Codec720p);
1855 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org86196c42015-02-16 21:02:00 +00001856 channel_->SetSend(true);
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001857
pbos@webrtc.org86196c42015-02-16 21:02:00 +00001858 FakeVideoSendStream* stream = AddSendStream();
1859
1860 cricket::FakeVideoCapturer capturer;
1861 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1862 EXPECT_EQ(cricket::CS_RUNNING,
1863 capturer.Start(capturer.GetSupportedFormats()->front()));
1864 EXPECT_TRUE(capturer.CaptureFrame());
1865
1866 std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001867 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1868 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1869
1870 codecs.clear();
1871 codecs.push_back(kVp8Codec360p);
1872 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001873 streams = fake_call_->GetVideoSendStreams()[0]->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001874 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1875 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.org86196c42015-02-16 21:02:00 +00001876 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001877}
1878
pbos@webrtc.org00873182014-11-25 14:03:34 +00001879TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithBitrates) {
1880 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1881 200000);
1882}
1883
pbos@webrtc.orga5f6fb52015-03-23 22:29:39 +00001884TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithHighMaxBitrate) {
1885 SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000);
1886 std::vector<webrtc::VideoStream> streams = AddSendStream()->GetVideoStreams();
1887 ASSERT_EQ(1u, streams.size());
1888 EXPECT_EQ(10000000, streams[0].max_bitrate_bps);
1889}
1890
pbos@webrtc.org00873182014-11-25 14:03:34 +00001891TEST_F(WebRtcVideoChannel2Test,
1892 SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1893 SetSendCodecsShouldWorkForBitrates(
1894 "", 0, "", -1, "", -1);
1895}
1896
1897TEST_F(WebRtcVideoChannel2Test, SetSendCodecsCapsMinAndStartBitrate) {
1898 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001899}
1900
1901TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001902 std::vector<VideoCodec> video_codecs = engine_.codecs();
pbos@webrtc.org88ef6322014-11-04 15:29:29 +00001903 video_codecs[0].params[kCodecParamMinBitrate] = "300";
1904 video_codecs[0].params[kCodecParamMaxBitrate] = "200";
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001905 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001906}
1907
pbos@webrtc.org00873182014-11-25 14:03:34 +00001908TEST_F(WebRtcVideoChannel2Test,
1909 SetMaxSendBandwidthShouldPreserveOtherBitrates) {
1910 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1911 200000);
1912 channel_->SetMaxSendBandwidth(300000);
Stefan Holmere5904162015-03-26 11:11:06 +01001913 EXPECT_EQ(100000, fake_call_->GetConfig().bitrate_config.min_bitrate_bps)
pbos@webrtc.org00873182014-11-25 14:03:34 +00001914 << "Setting max bitrate should keep previous min bitrate.";
Stefan Holmere5904162015-03-26 11:11:06 +01001915 EXPECT_EQ(-1, fake_call_->GetConfig().bitrate_config.start_bitrate_bps)
pbos@webrtc.org00873182014-11-25 14:03:34 +00001916 << "Setting max bitrate should not reset start bitrate.";
Stefan Holmere5904162015-03-26 11:11:06 +01001917 EXPECT_EQ(300000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
pbos@webrtc.org00873182014-11-25 14:03:34 +00001918}
1919
1920TEST_F(WebRtcVideoChannel2Test, SetMaxSendBandwidthShouldBeRemovable) {
1921 channel_->SetMaxSendBandwidth(300000);
Stefan Holmere5904162015-03-26 11:11:06 +01001922 EXPECT_EQ(300000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
pbos@webrtc.org00873182014-11-25 14:03:34 +00001923 // <= 0 means disable (infinite) max bitrate.
1924 channel_->SetMaxSendBandwidth(0);
Stefan Holmere5904162015-03-26 11:11:06 +01001925 EXPECT_EQ(-1, fake_call_->GetConfig().bitrate_config.max_bitrate_bps)
pbos@webrtc.org00873182014-11-25 14:03:34 +00001926 << "Setting zero max bitrate did not reset start bitrate.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001927}
1928
Peter Boströmdfd53fe2015-03-27 15:58:11 +01001929TEST_F(WebRtcVideoChannel2Test, SetMaxSendBitrateCanIncreaseSenderBitrate) {
1930 std::vector<VideoCodec> codecs;
1931 codecs.push_back(kVp8Codec720p);
1932 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1933 channel_->SetSend(true);
1934
1935 FakeVideoSendStream* stream = AddSendStream();
1936
1937 std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
1938 int initial_max_bitrate_bps = streams[0].max_bitrate_bps;
1939 EXPECT_GT(initial_max_bitrate_bps, 0);
1940
1941 EXPECT_TRUE(channel_->SetMaxSendBandwidth(initial_max_bitrate_bps * 2));
1942 streams = stream->GetVideoStreams();
1943 EXPECT_EQ(initial_max_bitrate_bps * 2, streams[0].max_bitrate_bps);
1944}
1945
1946TEST_F(WebRtcVideoChannel2Test,
1947 SetMaxSendBitrateCanIncreaseSimulcastSenderBitrate) {
1948 std::vector<VideoCodec> codecs;
1949 codecs.push_back(kVp8Codec720p);
1950 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1951 channel_->SetSend(true);
1952
1953 FakeVideoSendStream* stream = AddSendStream(
1954 cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3)));
1955
1956 // Send a frame to make sure this scales up to >1 stream (simulcast).
1957 cricket::FakeVideoCapturer capturer;
1958 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], &capturer));
1959 EXPECT_EQ(cricket::CS_RUNNING,
1960 capturer.Start(capturer.GetSupportedFormats()->front()));
1961 EXPECT_TRUE(capturer.CaptureFrame());
1962
1963 std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
1964 ASSERT_GT(streams.size(), 1u)
1965 << "Without simulcast this test doesn't make sense.";
1966 int initial_max_bitrate_bps = 0;
1967 for (auto& video_stream : streams)
1968 initial_max_bitrate_bps += video_stream.max_bitrate_bps;
1969 EXPECT_GT(initial_max_bitrate_bps, 0);
1970
1971 EXPECT_TRUE(channel_->SetMaxSendBandwidth(initial_max_bitrate_bps * 2));
1972 streams = stream->GetVideoStreams();
1973 int increased_max_bitrate_bps = 0;
1974 for (auto& video_stream : streams)
1975 increased_max_bitrate_bps += video_stream.max_bitrate_bps;
1976 EXPECT_EQ(initial_max_bitrate_bps * 2, increased_max_bitrate_bps);
1977
1978 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], nullptr));
1979}
1980
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001981TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1982 static const char* kMaxQuantization = "21";
1983 std::vector<VideoCodec> codecs;
1984 codecs.push_back(kVp8Codec);
1985 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1986 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001987 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1988 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001989
1990 VideoCodec codec;
1991 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1992 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1993}
1994
1995TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1996 std::vector<cricket::VideoCodec> codecs;
1997 codecs.push_back(kVp8Codec);
1998
1999 codecs[0].width = 0;
2000 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
2001 << "Codec set though codec width is zero.";
2002
2003 codecs[0].width = kVp8Codec.width;
2004 codecs[0].height = 0;
2005 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
2006 << "Codec set though codec height is zero.";
2007}
2008
2009TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
2010 // TODO(pbos): Should we only allow the dynamic range?
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00002011 static const int kIncorrectPayloads[] = {-2, -1, 128, 129};
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002012 std::vector<cricket::VideoCodec> codecs;
2013 codecs.push_back(kVp8Codec);
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00002014 for (size_t i = 0; i < arraysize(kIncorrectPayloads); ++i) {
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00002015 codecs[0].id = kIncorrectPayloads[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002016 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00002017 << "Bad payload type '" << kIncorrectPayloads[i] << "' accepted.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002018 }
2019}
2020
2021TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
2022 std::vector<cricket::VideoCodec> codecs;
2023 codecs.push_back(kVp8Codec);
2024 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
2025 codecs[0].id = payload_type;
2026 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
2027 << "Payload type '" << payload_type << "' rejected.";
2028 }
2029}
2030
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002031TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
2032 std::vector<cricket::VideoCodec> codecs;
2033 codecs.push_back(kVp8Codec);
2034 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
2035}
2036
pbos@webrtc.orge322a172014-06-13 11:47:28 +00002037// Test that we set our inbound RTX codecs properly.
2038TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
2039 std::vector<cricket::VideoCodec> codecs;
2040 codecs.push_back(kVp8Codec);
2041 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
2042 codecs.push_back(rtx_codec);
2043 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
2044 << "RTX codec without associated payload should be rejected.";
2045
2046 codecs[1].SetParam("apt", kVp8Codec.id + 1);
2047 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
2048 << "RTX codec with invalid associated payload type should be rejected.";
2049
2050 codecs[1].SetParam("apt", kVp8Codec.id);
2051 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
2052
2053 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
2054 rtx_codec2.SetParam("apt", rtx_codec.id);
2055 codecs.push_back(rtx_codec2);
2056
2057 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
2058 "as associated payload type "
2059 "should be rejected.";
2060}
2061
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002062TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
2063 std::vector<cricket::VideoCodec> codecs;
2064 codecs.push_back(kVp8Codec);
2065 codecs[0].id = 99;
2066 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
2067}
2068
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00002069TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002070 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00002071
2072 FakeVideoReceiveStream* stream = AddRecvStream();
2073 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
pbos@webrtc.org776e6f22014-10-29 15:28:39 +00002074 EXPECT_EQ(engine_.codecs()[0].name, config.decoders[0].payload_name);
2075 EXPECT_EQ(engine_.codecs()[0].id, config.decoders[0].payload_type);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002076}
2077
2078TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
2079 std::vector<VideoCodec> codecs;
2080 codecs.push_back(kVp8Codec);
2081 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
2082 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
2083}
2084
2085// TODO(pbos): Enable VP9 through external codec support
2086TEST_F(WebRtcVideoChannel2Test,
2087 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
2088 std::vector<VideoCodec> codecs;
2089 codecs.push_back(kVp8Codec);
2090 codecs.push_back(kVp9Codec);
2091 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
2092}
2093
2094TEST_F(WebRtcVideoChannel2Test,
2095 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
2096 std::vector<VideoCodec> codecs;
2097 codecs.push_back(kVp8Codec);
2098 codecs.push_back(kVp9Codec);
2099 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
2100 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
2101}
2102
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00002103TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
2104 std::vector<VideoCodec> codecs;
2105 codecs.push_back(kVp8Codec);
2106 codecs.push_back(kUlpfecCodec);
2107 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
2108
2109 FakeVideoReceiveStream* stream = AddRecvStream();
2110 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
2111
2112 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
2113
2114 codecs.pop_back();
2115 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002116 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00002117 ASSERT_TRUE(stream != NULL);
2118 config = stream->GetConfig();
2119 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
2120 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.org269605c2014-06-26 08:49:03 +00002121}
2122
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002123TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
2124 std::vector<VideoCodec> codecs;
2125 codecs.push_back(kVp8Codec);
2126 codecs.push_back(kRedCodec);
2127 codecs[1].id = codecs[0].id;
2128 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
2129}
2130
2131TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
2132 std::vector<VideoCodec> codecs;
2133 codecs.push_back(kVp8Codec);
2134 codecs.push_back(kVp9Codec);
2135 codecs[1].id = codecs[0].id;
2136 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
2137}
2138
2139TEST_F(WebRtcVideoChannel2Test,
2140 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
2141 std::vector<VideoCodec> codecs;
2142 codecs.push_back(kVp8Codec);
2143 codecs.push_back(kVp8Codec);
2144 codecs[1].id += 1;
2145 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
2146}
2147
2148TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
2149 EXPECT_FALSE(AddSendStream()->IsSending());
2150}
2151
pbos@webrtc.org85f42942014-07-22 09:14:58 +00002152TEST_F(WebRtcVideoChannel2Test, ReceiveStreamReceivingByDefault) {
2153 EXPECT_TRUE(AddRecvStream()->IsReceiving());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002154}
2155
2156TEST_F(WebRtcVideoChannel2Test, SetSend) {
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +00002157 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002158 EXPECT_FALSE(stream->IsSending());
2159
2160 // false->true
2161 EXPECT_TRUE(channel_->SetSend(true));
2162 EXPECT_TRUE(stream->IsSending());
2163 // true->true
2164 EXPECT_TRUE(channel_->SetSend(true));
2165 EXPECT_TRUE(stream->IsSending());
2166 // true->false
2167 EXPECT_TRUE(channel_->SetSend(false));
2168 EXPECT_FALSE(stream->IsSending());
2169 // false->false
2170 EXPECT_TRUE(channel_->SetSend(false));
2171 EXPECT_FALSE(stream->IsSending());
2172
2173 EXPECT_TRUE(channel_->SetSend(true));
2174 FakeVideoSendStream* new_stream = AddSendStream();
2175 EXPECT_TRUE(new_stream->IsSending())
2176 << "Send stream created after SetSend(true) not sending initially.";
2177}
2178
pbos@webrtc.orgd8198032014-11-10 14:41:43 +00002179// This test verifies DSCP settings are properly applied on video media channel.
2180TEST_F(WebRtcVideoChannel2Test, TestSetDscpOptions) {
2181 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
2182 new cricket::FakeNetworkInterface);
2183 channel_->SetInterface(network_interface.get());
2184 cricket::VideoOptions options;
2185 options.dscp.Set(true);
2186 EXPECT_TRUE(channel_->SetOptions(options));
2187 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
2188 // Verify previous value is not modified if dscp option is not set.
2189 cricket::VideoOptions options1;
2190 EXPECT_TRUE(channel_->SetOptions(options1));
2191 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
2192 options.dscp.Set(false);
2193 EXPECT_TRUE(channel_->SetOptions(options));
2194 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
2195 channel_->SetInterface(NULL);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002196}
2197
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002198TEST_F(WebRtcVideoChannel2Test, OnReadyToSendSignalsNetworkState) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002199 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002200
2201 channel_->OnReadyToSend(false);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002202 EXPECT_EQ(webrtc::Call::kNetworkDown, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002203
2204 channel_->OnReadyToSend(true);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002205 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002206}
2207
Peter Boström74d9ed72015-03-26 16:28:31 +01002208TEST_F(WebRtcVideoChannel2Test, GetStatsReportsSentCodecName) {
2209 std::vector<cricket::VideoCodec> codecs;
2210 codecs.push_back(kVp8Codec);
2211 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
2212
2213 AddSendStream();
2214
2215 cricket::VideoMediaInfo info;
2216 ASSERT_TRUE(channel_->GetStats(&info));
2217 EXPECT_EQ(kVp8Codec.name, info.senders[0].codec_name);
2218}
2219
pbos@webrtc.org3e6e2712015-02-26 12:19:31 +00002220TEST_F(WebRtcVideoChannel2Test, GetStatsReportsCpuOveruseMetrics) {
2221 FakeVideoSendStream* stream = AddSendStream();
2222 webrtc::VideoSendStream::Stats stats;
2223 stats.avg_encode_time_ms = 13;
2224 stats.encode_usage_percent = 42;
2225 stream->SetStats(stats);
2226
2227 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002228 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org3e6e2712015-02-26 12:19:31 +00002229 EXPECT_EQ(stats.avg_encode_time_ms, info.senders[0].avg_encode_ms);
2230 EXPECT_EQ(stats.encode_usage_percent, info.senders[0].encode_usage_percent);
2231}
2232
pbos@webrtc.org273a4142014-12-01 15:23:21 +00002233TEST_F(WebRtcVideoChannel2Test, GetStatsReportsUpperResolution) {
2234 FakeVideoSendStream* stream = AddSendStream();
2235 webrtc::VideoSendStream::Stats stats;
pbos@webrtc.org09c77b92015-02-25 10:42:16 +00002236 stats.substreams[17].width = 123;
2237 stats.substreams[17].height = 40;
2238 stats.substreams[42].width = 80;
2239 stats.substreams[42].height = 31;
2240 stats.substreams[11].width = 20;
2241 stats.substreams[11].height = 90;
pbos@webrtc.org273a4142014-12-01 15:23:21 +00002242 stream->SetStats(stats);
2243
2244 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002245 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org273a4142014-12-01 15:23:21 +00002246 ASSERT_EQ(1u, info.senders.size());
2247 EXPECT_EQ(123, info.senders[0].send_frame_width);
2248 EXPECT_EQ(90, info.senders[0].send_frame_height);
2249}
2250
pbos@webrtc.org9a4410e2015-02-26 10:03:39 +00002251TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationStats) {
2252 AddSendStream(cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3)));
2253
2254 // Capture format VGA.
2255 cricket::FakeVideoCapturer video_capturer_vga;
2256 const std::vector<cricket::VideoFormat>* formats =
2257 video_capturer_vga.GetSupportedFormats();
2258 cricket::VideoFormat capture_format_vga = (*formats)[1];
2259 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_vga.Start(capture_format_vga));
2260 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], &video_capturer_vga));
2261 EXPECT_TRUE(video_capturer_vga.CaptureFrame());
2262
2263 cricket::VideoCodec send_codec(100, "VP8", 640, 480, 30, 0);
2264 std::vector<cricket::VideoCodec> codecs;
2265 codecs.push_back(send_codec);
2266 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
2267 EXPECT_TRUE(channel_->SetSend(true));
2268
2269 // Verify that the CpuOveruseObserver is registered and trigger downgrade.
2270 cricket::VideoOptions options;
2271 options.cpu_overuse_detection.Set(true);
2272 EXPECT_TRUE(channel_->SetOptions(options));
2273 // Trigger overuse.
2274 webrtc::LoadObserver* overuse_callback =
2275 fake_call_->GetConfig().overuse_callback;
2276 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
2277
2278 // Capture format VGA -> adapt (OnCpuResolutionRequest downgrade) -> VGA/2.
2279 EXPECT_TRUE(video_capturer_vga.CaptureFrame());
2280 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002281 EXPECT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org9a4410e2015-02-26 10:03:39 +00002282 ASSERT_EQ(1U, info.senders.size());
2283 EXPECT_EQ(1, info.senders[0].adapt_changes);
2284 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_CPU,
2285 info.senders[0].adapt_reason);
2286
2287 // Trigger upgrade and verify that we adapt back up to VGA.
2288 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
2289 EXPECT_TRUE(video_capturer_vga.CaptureFrame());
2290 info.Clear();
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002291 EXPECT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org9a4410e2015-02-26 10:03:39 +00002292 ASSERT_EQ(1U, info.senders.size());
2293 EXPECT_EQ(2, info.senders[0].adapt_changes);
2294 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_NONE,
2295 info.senders[0].adapt_reason);
2296
2297 // No capturer (no adapter). Adapt changes from old adapter should be kept.
2298 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL));
2299 info.Clear();
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002300 EXPECT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org9a4410e2015-02-26 10:03:39 +00002301 ASSERT_EQ(1U, info.senders.size());
2302 EXPECT_EQ(2, info.senders[0].adapt_changes);
2303 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_NONE,
2304 info.senders[0].adapt_reason);
2305
2306 // Set new capturer, capture format HD.
2307 cricket::FakeVideoCapturer video_capturer_hd;
2308 cricket::VideoFormat capture_format_hd = (*formats)[0];
2309 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_hd.Start(capture_format_hd));
2310 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], &video_capturer_hd));
2311 EXPECT_TRUE(video_capturer_hd.CaptureFrame());
2312
2313 // Trigger overuse, HD -> adapt (OnCpuResolutionRequest downgrade) -> HD/2.
2314 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
2315 EXPECT_TRUE(video_capturer_hd.CaptureFrame());
2316 info.Clear();
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002317 EXPECT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org9a4410e2015-02-26 10:03:39 +00002318 ASSERT_EQ(1U, info.senders.size());
2319 EXPECT_EQ(3, info.senders[0].adapt_changes);
2320 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_CPU,
2321 info.senders[0].adapt_reason);
2322
2323 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL));
2324}
2325
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00 +00002326TEST_F(WebRtcVideoChannel2Test,
2327 GetStatsTranslatesSendRtcpPacketTypesCorrectly) {
2328 FakeVideoSendStream* stream = AddSendStream();
2329 webrtc::VideoSendStream::Stats stats;
2330 stats.substreams[17].rtcp_packet_type_counts.fir_packets = 2;
2331 stats.substreams[17].rtcp_packet_type_counts.nack_packets = 3;
2332 stats.substreams[17].rtcp_packet_type_counts.pli_packets = 4;
2333
2334 stats.substreams[42].rtcp_packet_type_counts.fir_packets = 5;
2335 stats.substreams[42].rtcp_packet_type_counts.nack_packets = 7;
2336 stats.substreams[42].rtcp_packet_type_counts.pli_packets = 9;
2337
2338 stream->SetStats(stats);
2339
2340 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002341 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00 +00002342 EXPECT_EQ(7, info.senders[0].firs_rcvd);
2343 EXPECT_EQ(10, info.senders[0].nacks_rcvd);
2344 EXPECT_EQ(13, info.senders[0].plis_rcvd);
2345}
2346
2347TEST_F(WebRtcVideoChannel2Test,
2348 GetStatsTranslatesReceiveRtcpPacketTypesCorrectly) {
2349 FakeVideoReceiveStream* stream = AddRecvStream();
2350 webrtc::VideoReceiveStream::Stats stats;
2351 stats.rtcp_packet_type_counts.fir_packets = 2;
2352 stats.rtcp_packet_type_counts.nack_packets = 3;
2353 stats.rtcp_packet_type_counts.pli_packets = 4;
2354 stream->SetStats(stats);
2355
2356 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002357 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00 +00002358 EXPECT_EQ(stats.rtcp_packet_type_counts.fir_packets,
2359 info.receivers[0].firs_sent);
2360 EXPECT_EQ(stats.rtcp_packet_type_counts.nack_packets,
2361 info.receivers[0].nacks_sent);
2362 EXPECT_EQ(stats.rtcp_packet_type_counts.pli_packets,
2363 info.receivers[0].plis_sent);
2364}
2365
pbos@webrtc.org09c77b92015-02-25 10:42:16 +00002366TEST_F(WebRtcVideoChannel2Test, GetStatsTranslatesDecodeStatsCorrectly) {
2367 FakeVideoReceiveStream* stream = AddRecvStream();
2368 webrtc::VideoReceiveStream::Stats stats;
2369 stats.decode_ms = 2;
2370 stats.max_decode_ms = 3;
2371 stats.current_delay_ms = 4;
2372 stats.target_delay_ms = 5;
2373 stats.jitter_buffer_ms = 6;
2374 stats.min_playout_delay_ms = 7;
2375 stats.render_delay_ms = 8;
2376 stream->SetStats(stats);
2377
2378 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002379 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org09c77b92015-02-25 10:42:16 +00002380 EXPECT_EQ(stats.decode_ms, info.receivers[0].decode_ms);
2381 EXPECT_EQ(stats.max_decode_ms, info.receivers[0].max_decode_ms);
2382 EXPECT_EQ(stats.current_delay_ms, info.receivers[0].current_delay_ms);
2383 EXPECT_EQ(stats.target_delay_ms, info.receivers[0].target_delay_ms);
2384 EXPECT_EQ(stats.jitter_buffer_ms, info.receivers[0].jitter_buffer_ms);
2385 EXPECT_EQ(stats.min_playout_delay_ms, info.receivers[0].min_playout_delay_ms);
2386 EXPECT_EQ(stats.render_delay_ms, info.receivers[0].render_delay_ms);
2387}
2388
Peter Boström393347f2015-04-22 14:52:45 +02002389TEST_F(WebRtcVideoChannel2Test, GetStatsTranslatesReceivePacketStatsCorrectly) {
2390 FakeVideoReceiveStream* stream = AddRecvStream();
2391 webrtc::VideoReceiveStream::Stats stats;
2392 stats.rtp_stats.transmitted.payload_bytes = 2;
2393 stats.rtp_stats.transmitted.header_bytes = 3;
2394 stats.rtp_stats.transmitted.padding_bytes = 4;
2395 stats.rtp_stats.transmitted.packets = 5;
2396 stats.rtcp_stats.cumulative_lost = 6;
2397 stats.rtcp_stats.fraction_lost = 7;
2398 stream->SetStats(stats);
2399
2400 cricket::VideoMediaInfo info;
2401 ASSERT_TRUE(channel_->GetStats(&info));
2402 EXPECT_EQ(stats.rtp_stats.transmitted.payload_bytes +
2403 stats.rtp_stats.transmitted.header_bytes +
2404 stats.rtp_stats.transmitted.padding_bytes,
2405 info.receivers[0].bytes_rcvd);
2406 EXPECT_EQ(stats.rtp_stats.transmitted.packets,
2407 info.receivers[0].packets_rcvd);
2408 EXPECT_EQ(stats.rtcp_stats.cumulative_lost, info.receivers[0].packets_lost);
2409 EXPECT_EQ(static_cast<float>(stats.rtcp_stats.fraction_lost) / (1 << 8),
2410 info.receivers[0].fraction_lost);
2411}
2412
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002413TEST_F(WebRtcVideoChannel2Test, TranslatesCallStatsCorrectly) {
2414 AddSendStream();
2415 AddSendStream();
2416 webrtc::Call::Stats stats;
2417 stats.rtt_ms = 123;
2418 fake_call_->SetStats(stats);
2419
2420 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002421 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002422 ASSERT_EQ(2u, info.senders.size());
2423 EXPECT_EQ(stats.rtt_ms, info.senders[0].rtt_ms);
2424 EXPECT_EQ(stats.rtt_ms, info.senders[1].rtt_ms);
2425}
2426
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002427TEST_F(WebRtcVideoChannel2Test, TranslatesSenderBitrateStatsCorrectly) {
2428 FakeVideoSendStream* stream = AddSendStream();
2429 webrtc::VideoSendStream::Stats stats;
pbos@webrtc.org891d4832015-02-26 13:15:22 +00002430 stats.target_media_bitrate_bps = 156;
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002431 stats.media_bitrate_bps = 123;
2432 stats.substreams[17].total_bitrate_bps = 1;
2433 stats.substreams[17].retransmit_bitrate_bps = 2;
2434 stats.substreams[42].total_bitrate_bps = 3;
2435 stats.substreams[42].retransmit_bitrate_bps = 4;
2436 stream->SetStats(stats);
2437
2438 FakeVideoSendStream* stream2 = AddSendStream();
2439 webrtc::VideoSendStream::Stats stats2;
pbos@webrtc.org891d4832015-02-26 13:15:22 +00002440 stats2.target_media_bitrate_bps = 200;
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002441 stats2.media_bitrate_bps = 321;
2442 stats2.substreams[13].total_bitrate_bps = 5;
2443 stats2.substreams[13].retransmit_bitrate_bps = 6;
2444 stats2.substreams[21].total_bitrate_bps = 7;
2445 stats2.substreams[21].retransmit_bitrate_bps = 8;
2446 stream2->SetStats(stats2);
2447
2448 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002449 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002450 ASSERT_EQ(2u, info.senders.size());
2451 // Assuming stream and stream2 corresponds to senders[0] and [1] respectively
2452 // is OK as std::maps are sorted and AddSendStream() gives increasing SSRCs.
2453 EXPECT_EQ(stats.media_bitrate_bps, info.senders[0].nominal_bitrate);
2454 EXPECT_EQ(stats2.media_bitrate_bps, info.senders[1].nominal_bitrate);
pbos@webrtc.org891d4832015-02-26 13:15:22 +00002455 EXPECT_EQ(stats.target_media_bitrate_bps + stats2.target_media_bitrate_bps,
2456 info.bw_estimations[0].target_enc_bitrate);
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002457 EXPECT_EQ(stats.media_bitrate_bps + stats2.media_bitrate_bps,
2458 info.bw_estimations[0].actual_enc_bitrate);
2459 EXPECT_EQ(1 + 3 + 5 + 7, info.bw_estimations[0].transmit_bitrate)
2460 << "Bandwidth stats should take all streams into account.";
2461 EXPECT_EQ(2 + 4 + 6 + 8, info.bw_estimations[0].retransmit_bitrate)
2462 << "Bandwidth stats should take all streams into account.";
2463}
2464
pbos@webrtc.orga2a6fe62015-03-06 15:35:19 +00002465TEST_F(WebRtcVideoChannel2Test, DefaultReceiveStreamReconfiguresToUseRtx) {
2466 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
2467
2468 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
2469 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
2470
2471 ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
2472 const size_t kDataLength = 12;
2473 uint8_t data[kDataLength];
2474 memset(data, 0, sizeof(data));
2475 rtc::SetBE32(&data[8], ssrcs[0]);
2476 rtc::Buffer packet(data, kDataLength);
2477 rtc::PacketTime packet_time;
2478 channel_->OnPacketReceived(&packet, packet_time);
2479
2480 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
2481 << "No default receive stream created.";
2482 FakeVideoReceiveStream* recv_stream = fake_call_->GetVideoReceiveStreams()[0];
2483 EXPECT_EQ(0u, recv_stream->GetConfig().rtp.rtx.size())
2484 << "Default receive stream should not have configured RTX";
2485
2486 EXPECT_TRUE(channel_->AddRecvStream(
2487 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs)));
2488 ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
2489 << "AddRecvStream should've reconfigured, not added a new receiver.";
2490 recv_stream = fake_call_->GetVideoReceiveStreams()[0];
2491 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
2492 EXPECT_EQ(rtx_ssrcs[0],
2493 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
2494}
2495
Peter Boströmd4362cd2015-03-25 14:17:23 +01002496TEST_F(WebRtcVideoChannel2Test, RejectsAddingStreamsWithMissingSsrcsForRtx) {
2497 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
2498
2499 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
2500 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
2501
2502 StreamParams sp =
2503 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs);
2504 sp.ssrcs = ssrcs; // Without RTXs, this is the important part.
2505
2506 EXPECT_FALSE(channel_->AddSendStream(sp));
2507 EXPECT_FALSE(channel_->AddRecvStream(sp));
2508}
2509
Peter Boströmd6f4c252015-03-26 16:23:04 +01002510TEST_F(WebRtcVideoChannel2Test, RejectsAddingStreamsWithOverlappingRtxSsrcs) {
2511 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
2512
2513 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
2514 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
2515
2516 StreamParams sp =
2517 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs);
2518
2519 EXPECT_TRUE(channel_->AddSendStream(sp));
2520 EXPECT_TRUE(channel_->AddRecvStream(sp));
2521
2522 // The RTX SSRC is already used in previous streams, using it should fail.
2523 sp = cricket::StreamParams::CreateLegacy(rtx_ssrcs[0]);
2524 EXPECT_FALSE(channel_->AddSendStream(sp));
2525 EXPECT_FALSE(channel_->AddRecvStream(sp));
2526
2527 // After removing the original stream this should be fine to add (makes sure
2528 // that RTX ssrcs are not forever taken).
2529 EXPECT_TRUE(channel_->RemoveSendStream(ssrcs[0]));
2530 EXPECT_TRUE(channel_->RemoveRecvStream(ssrcs[0]));
2531 EXPECT_TRUE(channel_->AddSendStream(sp));
2532 EXPECT_TRUE(channel_->AddRecvStream(sp));
2533}
2534
2535TEST_F(WebRtcVideoChannel2Test,
2536 RejectsAddingStreamsWithOverlappingSimulcastSsrcs) {
2537 static const uint32 kFirstStreamSsrcs[] = {1, 2, 3};
2538 static const uint32 kOverlappingStreamSsrcs[] = {4, 3, 5};
2539 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
2540
Peter Boströmd6f4c252015-03-26 16:23:04 +01002541 StreamParams sp =
2542 cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kFirstStreamSsrcs));
2543
2544 EXPECT_TRUE(channel_->AddSendStream(sp));
2545 EXPECT_TRUE(channel_->AddRecvStream(sp));
2546
2547 // One of the SSRCs is already used in previous streams, using it should fail.
2548 sp = cricket::CreateSimStreamParams("cname",
2549 MAKE_VECTOR(kOverlappingStreamSsrcs));
2550 EXPECT_FALSE(channel_->AddSendStream(sp));
2551 EXPECT_FALSE(channel_->AddRecvStream(sp));
2552
2553 // After removing the original stream this should be fine to add (makes sure
2554 // that RTX ssrcs are not forever taken).
Peter Boström3548dd22015-05-22 18:48:36 +02002555 EXPECT_TRUE(channel_->RemoveSendStream(kFirstStreamSsrcs[0]));
2556 EXPECT_TRUE(channel_->RemoveRecvStream(kFirstStreamSsrcs[0]));
Peter Boströmd6f4c252015-03-26 16:23:04 +01002557 EXPECT_TRUE(channel_->AddSendStream(sp));
2558 EXPECT_TRUE(channel_->AddRecvStream(sp));
2559}
2560
Peter Boström259bd202015-05-28 13:39:50 +02002561TEST_F(WebRtcVideoChannel2Test, ReportsSsrcGroupsInStats) {
2562 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
2563
2564 static const uint32_t kSenderSsrcs[] = {4, 7, 10};
2565 static const uint32_t kSenderRtxSsrcs[] = {5, 8, 11};
2566
2567 StreamParams sender_sp = cricket::CreateSimWithRtxStreamParams(
2568 "cname", MAKE_VECTOR(kSenderSsrcs), MAKE_VECTOR(kSenderRtxSsrcs));
2569
2570 EXPECT_TRUE(channel_->AddSendStream(sender_sp));
2571
2572 static const uint32_t kReceiverSsrcs[] = {3};
2573 static const uint32_t kReceiverRtxSsrcs[] = {2};
2574
2575 StreamParams receiver_sp = cricket::CreateSimWithRtxStreamParams(
2576 "cname", MAKE_VECTOR(kReceiverSsrcs), MAKE_VECTOR(kReceiverRtxSsrcs));
2577 EXPECT_TRUE(channel_->AddRecvStream(receiver_sp));
2578
2579 cricket::VideoMediaInfo info;
2580 ASSERT_TRUE(channel_->GetStats(&info));
2581
2582 ASSERT_EQ(1u, info.senders.size());
2583 ASSERT_EQ(1u, info.receivers.size());
2584
2585 EXPECT_NE(sender_sp.ssrc_groups, receiver_sp.ssrc_groups);
2586 EXPECT_EQ(sender_sp.ssrc_groups, info.senders[0].ssrc_groups);
2587 EXPECT_EQ(receiver_sp.ssrc_groups, info.receivers[0].ssrc_groups);
2588}
2589
noahricd10a68e2015-07-10 11:27:55 -07002590void WebRtcVideoChannel2Test::TestReceiveUnsignalledSsrcPacket(
2591 uint8_t payload_type,
2592 bool expect_created_receive_stream) {
2593 std::vector<VideoCodec> codecs(engine_.codecs());
2594 // Add a RED RTX codec.
2595 VideoCodec red_rtx_codec =
2596 VideoCodec::CreateRtxCodec(kRedRtxPayloadType, kDefaultRedPlType);
2597 codecs.push_back(red_rtx_codec);
2598 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
2599
2600 ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
2601 const size_t kDataLength = 12;
2602 uint8_t data[kDataLength];
2603 memset(data, 0, sizeof(data));
2604
2605 rtc::Set8(data, 1, payload_type);
2606 rtc::SetBE32(&data[8], kIncomingUnsignalledSsrc);
2607 rtc::Buffer packet(data, kDataLength);
2608 rtc::PacketTime packet_time;
2609 channel_->OnPacketReceived(&packet, packet_time);
2610
2611 if (expect_created_receive_stream) {
2612 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
2613 << "Should have created a receive stream for payload type: "
2614 << payload_type;
2615 } else {
2616 EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size())
2617 << "Shouldn't have created a receive stream for payload type: "
2618 << payload_type;
2619 }
2620}
2621
2622TEST_F(WebRtcVideoChannel2Test, Vp8PacketCreatesUnsignalledStream) {
2623 TestReceiveUnsignalledSsrcPacket(kDefaultVp8PlType, true);
2624}
2625
2626TEST_F(WebRtcVideoChannel2Test, Vp9PacketCreatesUnsignalledStream) {
2627 TestReceiveUnsignalledSsrcPacket(kDefaultVp9PlType, true);
2628}
2629
2630TEST_F(WebRtcVideoChannel2Test, RtxPacketDoesntCreateUnsignalledStream) {
2631 TestReceiveUnsignalledSsrcPacket(kDefaultRtxVp8PlType, false);
2632}
2633
2634TEST_F(WebRtcVideoChannel2Test, UlpfecPacketDoesntCreateUnsignalledStream) {
2635 TestReceiveUnsignalledSsrcPacket(kDefaultUlpfecType, false);
2636}
2637
2638TEST_F(WebRtcVideoChannel2Test, RedRtxPacketDoesntCreateUnsignalledStream) {
2639 TestReceiveUnsignalledSsrcPacket(kRedRtxPayloadType, false);
2640}
2641
Peter Boström3548dd22015-05-22 18:48:36 +02002642void WebRtcVideoChannel2Test::TestReceiverLocalSsrcConfiguration(
2643 bool receiver_first) {
2644 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
2645
2646 const uint32_t kSenderSsrc = 0xC0FFEE;
2647 const uint32_t kReceiverSsrc = 0x4711;
2648
2649 if (receiver_first) {
2650 AddRecvStream(StreamParams::CreateLegacy(kReceiverSsrc));
2651 std::vector<FakeVideoReceiveStream*> receive_streams =
2652 fake_call_->GetVideoReceiveStreams();
2653 ASSERT_EQ(1u, receive_streams.size());
2654 // Bogus local SSRC when we have no sender.
2655 EXPECT_EQ(1, receive_streams[0]->GetConfig().rtp.local_ssrc);
2656 }
2657 AddSendStream(StreamParams::CreateLegacy(kSenderSsrc));
2658 if (!receiver_first)
2659 AddRecvStream(StreamParams::CreateLegacy(kReceiverSsrc));
2660 std::vector<FakeVideoReceiveStream*> receive_streams =
2661 fake_call_->GetVideoReceiveStreams();
2662 ASSERT_EQ(1u, receive_streams.size());
2663 EXPECT_EQ(kSenderSsrc, receive_streams[0]->GetConfig().rtp.local_ssrc);
2664}
2665
2666TEST_F(WebRtcVideoChannel2Test, ConfiguresLocalSsrc) {
2667 TestReceiverLocalSsrcConfiguration(false);
2668}
2669
2670TEST_F(WebRtcVideoChannel2Test, ConfiguresLocalSsrcOnExistingReceivers) {
2671 TestReceiverLocalSsrcConfiguration(true);
2672}
2673
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002674class WebRtcVideoEngine2SimulcastTest : public testing::Test {
2675 public:
Peter Boströmd4362cd2015-03-25 14:17:23 +01002676 WebRtcVideoEngine2SimulcastTest() : engine_(nullptr) {}
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002677
2678 protected:
2679 WebRtcVideoEngine2 engine_;
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002680};
2681
2682class WebRtcVideoChannel2SimulcastTest : public WebRtcVideoEngine2SimulcastTest,
pbos@webrtc.org86196c42015-02-16 21:02:00 +00002683 public WebRtcCallFactory {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002684 public:
2685 WebRtcVideoChannel2SimulcastTest() : fake_call_(NULL) {}
2686
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +00002687 void SetUp() override {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002688 engine_.SetCallFactory(this);
Fredrik Solenberg9a416bd2015-05-22 09:04:09 +02002689 engine_.Init();
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002690 channel_.reset(engine_.CreateChannel(VideoOptions(), NULL));
2691 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
2692 last_ssrc_ = 123;
2693 }
2694
2695 protected:
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +00002696 webrtc::Call* CreateCall(const webrtc::Call::Config& config) override {
Fredrik Solenbergd3ddc1b2015-05-07 17:07:34 +02002697 DCHECK(fake_call_ == NULL);
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002698 fake_call_ = new FakeCall(config);
2699 return fake_call_;
2700 }
2701
2702 void VerifySimulcastSettings(const VideoCodec& codec,
2703 VideoOptions::HighestBitrate bitrate_mode,
2704 size_t num_configured_streams,
2705 size_t expected_num_streams,
2706 SimulcastBitrateMode simulcast_bitrate_mode) {
2707 cricket::VideoOptions options;
2708 options.video_highest_bitrate.Set(bitrate_mode);
2709 EXPECT_TRUE(channel_->SetOptions(options));
2710
2711 std::vector<VideoCodec> codecs;
2712 codecs.push_back(codec);
2713 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
2714
2715 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
Fredrik Solenbergd3ddc1b2015-05-07 17:07:34 +02002716 DCHECK(num_configured_streams <= ssrcs.size());
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002717 ssrcs.resize(num_configured_streams);
2718
2719 FakeVideoSendStream* stream =
2720 AddSendStream(CreateSimStreamParams("cname", ssrcs));
pbos@webrtc.org86196c42015-02-16 21:02:00 +00002721 // Send a full-size frame to trigger a stream reconfiguration to use all
2722 // expected simulcast layers.
2723 cricket::FakeVideoCapturer capturer;
2724 EXPECT_TRUE(channel_->SetCapturer(ssrcs.front(), &capturer));
2725 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(cricket::VideoFormat(
2726 codec.width, codec.height,
2727 cricket::VideoFormat::FpsToInterval(30),
2728 cricket::FOURCC_I420)));
2729 channel_->SetSend(true);
2730 EXPECT_TRUE(capturer.CaptureFrame());
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002731
2732 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
2733 ASSERT_EQ(expected_num_streams, video_streams.size());
2734
2735 std::vector<webrtc::VideoStream> expected_streams = GetSimulcastConfig(
2736 num_configured_streams,
2737 simulcast_bitrate_mode,
2738 codec.width,
2739 codec.height,
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002740 0,
2741 kDefaultQpMax,
2742 codec.framerate != 0 ? codec.framerate : kDefaultFramerate);
2743
2744 ASSERT_EQ(expected_streams.size(), video_streams.size());
2745
2746 size_t num_streams = video_streams.size();
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002747 int total_max_bitrate_bps = 0;
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002748 for (size_t i = 0; i < num_streams; ++i) {
2749 EXPECT_EQ(expected_streams[i].width, video_streams[i].width);
2750 EXPECT_EQ(expected_streams[i].height, video_streams[i].height);
2751
2752 EXPECT_GT(video_streams[i].max_framerate, 0);
2753 EXPECT_EQ(expected_streams[i].max_framerate,
2754 video_streams[i].max_framerate);
2755
2756 EXPECT_GT(video_streams[i].min_bitrate_bps, 0);
2757 EXPECT_EQ(expected_streams[i].min_bitrate_bps,
2758 video_streams[i].min_bitrate_bps);
2759
2760 EXPECT_GT(video_streams[i].target_bitrate_bps, 0);
2761 EXPECT_EQ(expected_streams[i].target_bitrate_bps,
2762 video_streams[i].target_bitrate_bps);
2763
2764 EXPECT_GT(video_streams[i].max_bitrate_bps, 0);
2765 EXPECT_EQ(expected_streams[i].max_bitrate_bps,
2766 video_streams[i].max_bitrate_bps);
2767
2768 EXPECT_GT(video_streams[i].max_qp, 0);
2769 EXPECT_EQ(expected_streams[i].max_qp, video_streams[i].max_qp);
2770
2771 EXPECT_FALSE(expected_streams[i].temporal_layer_thresholds_bps.empty());
2772 EXPECT_EQ(expected_streams[i].temporal_layer_thresholds_bps,
2773 video_streams[i].temporal_layer_thresholds_bps);
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002774
2775 if (i == num_streams - 1) {
2776 total_max_bitrate_bps += video_streams[i].max_bitrate_bps;
2777 } else {
2778 total_max_bitrate_bps += video_streams[i].target_bitrate_bps;
2779 }
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002780 }
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002781 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002782 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002783 ASSERT_EQ(1u, info.senders.size());
2784 EXPECT_EQ(total_max_bitrate_bps, info.senders[0].preferred_bitrate);
2785
pbos@webrtc.org86196c42015-02-16 21:02:00 +00002786 EXPECT_TRUE(channel_->SetCapturer(ssrcs.front(), NULL));
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002787 }
2788
2789 FakeVideoSendStream* AddSendStream() {
2790 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
2791 }
2792
2793 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
2794 size_t num_streams =
2795 fake_call_->GetVideoSendStreams().size();
2796 EXPECT_TRUE(channel_->AddSendStream(sp));
2797 std::vector<FakeVideoSendStream*> streams =
2798 fake_call_->GetVideoSendStreams();
2799 EXPECT_EQ(num_streams + 1, streams.size());
2800 return streams[streams.size() - 1];
2801 }
2802
2803 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
2804 return fake_call_->GetVideoSendStreams();
2805 }
2806
2807 FakeVideoReceiveStream* AddRecvStream() {
2808 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
2809 }
2810
2811 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
2812 size_t num_streams =
2813 fake_call_->GetVideoReceiveStreams().size();
2814 EXPECT_TRUE(channel_->AddRecvStream(sp));
2815 std::vector<FakeVideoReceiveStream*> streams =
2816 fake_call_->GetVideoReceiveStreams();
2817 EXPECT_EQ(num_streams + 1, streams.size());
2818 return streams[streams.size() - 1];
2819 }
2820
2821 FakeCall* fake_call_;
2822 rtc::scoped_ptr<VideoMediaChannel> channel_;
2823 uint32 last_ssrc_;
2824};
2825
2826TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith2SimulcastStreams) {
2827 VerifySimulcastSettings(kVp8Codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2828}
2829
2830TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith3SimulcastStreams) {
2831 VerifySimulcastSettings(
2832 kVp8Codec720p, VideoOptions::NORMAL, 3, 3, SBM_NORMAL);
2833}
2834
2835TEST_F(WebRtcVideoChannel2SimulcastTest,
2836 SetSendCodecsWith2SimulcastStreamsHighBitrateMode) {
2837 VerifySimulcastSettings(kVp8Codec, VideoOptions::HIGH, 2, 2, SBM_HIGH);
2838}
2839
2840TEST_F(WebRtcVideoChannel2SimulcastTest,
2841 SetSendCodecsWith3SimulcastStreamsHighBitrateMode) {
2842 VerifySimulcastSettings(kVp8Codec720p, VideoOptions::HIGH, 3, 3, SBM_HIGH);
2843}
2844
2845TEST_F(WebRtcVideoChannel2SimulcastTest,
2846 SetSendCodecsWith2SimulcastStreamsVeryHighBitrateMode) {
2847 VerifySimulcastSettings(
2848 kVp8Codec, VideoOptions::VERY_HIGH, 2, 2, SBM_VERY_HIGH);
2849}
2850
2851TEST_F(WebRtcVideoChannel2SimulcastTest,
2852 SetSendCodecsWith3SimulcastStreamsVeryHighBitrateMode) {
2853 VerifySimulcastSettings(
2854 kVp8Codec720p, VideoOptions::VERY_HIGH, 3, 3, SBM_VERY_HIGH);
2855}
2856
2857// Test that we normalize send codec format size in simulcast.
2858TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) {
2859 cricket::VideoCodec codec(kVp8Codec270p);
2860 codec.width += 1;
2861 codec.height += 1;
2862 VerifySimulcastSettings(codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2863}
2864
2865// Test that if we add a stream with RTX SSRC's, SSRC's get set correctly.
2866TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestStreamWithRtx) {
2867 // TODO(pbos): Implement.
2868 FAIL() << "Not implemented.";
2869}
2870
2871// Test that if we get too few ssrcs are given in AddSendStream(),
2872// only supported sub-streams will be added.
2873TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TooFewSimulcastSsrcs) {
2874 // TODO(pbos): Implement.
2875 FAIL() << "Not implemented.";
2876}
2877
2878// Test that even more than enough ssrcs are given in AddSendStream(),
2879// only supported sub-streams will be added.
2880TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_MoreThanEnoughSimulcastSscrs) {
2881 // TODO(pbos): Implement.
2882 FAIL() << "Not implemented.";
2883}
2884
2885// Test that SetSendStreamFormat works well with simulcast.
2886TEST_F(WebRtcVideoEngine2SimulcastTest,
2887 DISABLED_SetSendStreamFormatWithSimulcast) {
2888 // TODO(pbos): Implement.
2889 FAIL() << "Not implemented.";
2890}
2891
2892// Test that simulcast send codec is reset on new video frame size.
2893TEST_F(WebRtcVideoEngine2SimulcastTest,
2894 DISABLED_ResetSimulcastSendCodecOnNewFrameSize) {
2895 // TODO(pbos): Implement.
2896 FAIL() << "Not implemented.";
2897}
2898
2899// Test that simulcast send codec is reset on new portait mode video frame.
2900TEST_F(WebRtcVideoEngine2SimulcastTest,
2901 DISABLED_ResetSimulcastSendCodecOnNewPortaitFrame) {
2902 // TODO(pbos): Implement.
2903 FAIL() << "Not implemented.";
2904}
2905
2906TEST_F(WebRtcVideoEngine2SimulcastTest,
2907 DISABLED_SetBandwidthInConferenceWithSimulcast) {
2908 // TODO(pbos): Implement.
2909 FAIL() << "Not implemented.";
2910}
2911
2912// Test that sending screencast frames in conference mode changes
2913// bitrate.
2914TEST_F(WebRtcVideoEngine2SimulcastTest,
2915 DISABLED_SetBandwidthScreencastInConference) {
2916 // TODO(pbos): Implement.
2917 FAIL() << "Not implemented.";
2918}
2919
2920// Test AddSendStream with simulcast rejects bad StreamParams.
2921TEST_F(WebRtcVideoEngine2SimulcastTest,
2922 DISABLED_AddSendStreamWithBadStreamParams) {
2923 // TODO(pbos): Implement.
2924 FAIL() << "Not implemented.";
2925}
2926
2927// Test AddSendStream with simulcast sets ssrc and cname correctly.
2928TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_AddSendStreamWithSimulcast) {
2929 // TODO(pbos): Implement.
2930 FAIL() << "Not implemented.";
2931}
2932
2933// Test RemoveSendStream with simulcast.
2934TEST_F(WebRtcVideoEngine2SimulcastTest,
2935 DISABLED_RemoveSendStreamWithSimulcast) {
2936 // TODO(pbos): Implement.
2937 FAIL() << "Not implemented.";
2938}
2939
2940// Test AddSendStream after send codec has already been set will reset
2941// send codec with simulcast settings.
2942TEST_F(WebRtcVideoEngine2SimulcastTest,
2943 DISABLED_AddSimulcastStreamAfterSetSendCodec) {
2944 // TODO(pbos): Implement.
2945 FAIL() << "Not implemented.";
2946}
2947
2948TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_GetStatsWithMultipleSsrcs) {
2949 // TODO(pbos): Implement.
2950 FAIL() << "Not implemented.";
2951}
2952
2953// Test receiving channel(s) local ssrc is set to the same as the first
2954// simulcast sending ssrc.
2955TEST_F(WebRtcVideoEngine2SimulcastTest,
2956 DISABLED_AddSimulcastStreamAfterCreatingRecvChannels) {
2957 // TODO(pbos): Implement.
2958 FAIL() << "Not implemented.";
2959}
2960
2961// Test 1:1 call never turn on simulcast.
2962TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_NoSimulcastWith1on1) {
2963 // TODO(pbos): Implement.
2964 FAIL() << "Not implemented.";
2965}
2966
2967// Test SetOptions with OPT_CONFERENCE flag.
2968TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_SetOptionsWithConferenceMode) {
2969 // TODO(pbos): Implement.
2970 FAIL() << "Not implemented.";
2971}
2972
2973// Test that two different streams can have different formats.
2974TEST_F(WebRtcVideoEngine2SimulcastTest,
2975 DISABLED_MultipleSendStreamsDifferentFormats) {
2976 // TODO(pbos): Implement.
2977 FAIL() << "Not implemented.";
2978}
2979
2980TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToOutputFormat) {
2981 // TODO(pbos): Implement.
2982 FAIL() << "Not implemented.";
2983}
2984
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002985TEST_F(WebRtcVideoEngine2SimulcastTest,
2986 DISABLED_TestAdaptWithCpuOveruseObserver) {
2987 // TODO(pbos): Implement.
2988 FAIL() << "Not implemented.";
2989}
2990
2991// Test that codec is not reset for every frame sent in non-conference and
2992// non-screencast mode.
2993TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_DontResetCodecOnSendFrame) {
2994 // TODO(pbos): Implement.
2995 FAIL() << "Not implemented.";
2996}
2997
2998TEST_F(WebRtcVideoEngine2SimulcastTest,
2999 DISABLED_UseSimulcastAdapterOnVp8OnlyFactory) {
3000 // TODO(pbos): Implement.
3001 FAIL() << "Not implemented.";
3002}
3003
3004TEST_F(WebRtcVideoEngine2SimulcastTest,
Peter Boström54be3e02015-05-25 15:04:24 +02003005 DISABLED_DontUseSimulcastAdapterOnNonVp8Factory) {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00003006 // TODO(pbos): Implement.
3007 FAIL() << "Not implemented.";
3008}
3009
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00003010TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x800) {
3011 // TODO(pbos): Implement.
3012 FAIL() << "Not implemented.";
3013}
3014
3015TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x720) {
3016 // TODO(pbos): Implement.
3017 FAIL() << "Not implemented.";
3018}
3019
3020TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x540) {
3021 // TODO(pbos): Implement.
3022 FAIL() << "Not implemented.";
3023}
3024
3025TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x600) {
3026 // TODO(pbos): Implement.
3027 FAIL() << "Not implemented.";
3028}
3029
3030TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x400) {
3031 // TODO(pbos): Implement.
3032 FAIL() << "Not implemented.";
3033}
3034
3035TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x360) {
3036 // TODO(pbos): Implement.
3037 FAIL() << "Not implemented.";
3038}
3039
3040TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_480x300) {
3041 // TODO(pbos): Implement.
3042 FAIL() << "Not implemented.";
3043}
3044
Peter Boström54be3e02015-05-25 15:04:24 +02003045TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_480x270) {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00003046 // TODO(pbos): Implement.
3047 FAIL() << "Not implemented.";
3048}
3049
3050TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x200) {
3051 // TODO(pbos): Implement.
3052 FAIL() << "Not implemented.";
3053}
3054
3055TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x180) {
3056 // TODO(pbos): Implement.
3057 FAIL() << "Not implemented.";
3058}
3059
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00003060// Test simulcast streams are decodeable with expected sizes.
3061TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastStreams) {
3062 // TODO(pbos): Implement.
3063 FAIL() << "Not implemented.";
3064}
3065
3066// Simulcast and resolution resizing should be turned off when screencasting
3067// but not otherwise.
3068TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_ScreencastRendering) {
3069 // TODO(pbos): Implement.
3070 FAIL() << "Not implemented.";
3071}
3072
3073// Ensures that the correct settings are applied to the codec when single
3074// temporal layer screencasting is enabled, and that the correct simulcast
3075// settings are reapplied when disabling screencasting.
3076TEST_F(WebRtcVideoChannel2SimulcastTest,
3077 DISABLED_OneTemporalLayerScreencastSettings) {
3078 // TODO(pbos): Implement.
3079 FAIL() << "Not implemented.";
3080}
3081
3082// Ensures that the correct settings are applied to the codec when two temporal
3083// layer screencasting is enabled, and that the correct simulcast settings are
3084// reapplied when disabling screencasting.
3085TEST_F(WebRtcVideoChannel2SimulcastTest,
3086 DISABLED_TwoTemporalLayerScreencastSettings) {
3087 // TODO(pbos): Implement.
3088 FAIL() << "Not implemented.";
3089}
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00003090
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00003091} // namespace cricket