blob: 7ceabcabc40b250783b7c98736172763d28bb439 [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"
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +000034#include "talk/media/webrtc/fakewebrtcvideoengine.h"
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000035#include "talk/media/webrtc/simulcast.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000036#include "talk/media/webrtc/webrtcvideochannelfactory.h"
pbos@webrtc.org2a169642015-01-09 15:16:10 +000037#include "talk/media/webrtc/webrtcvideoengine.h"
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000038#include "talk/media/webrtc/webrtcvideoengine2.h"
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000039#include "talk/media/webrtc/webrtcvideoengine2_unittest.h"
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +000040#include "talk/media/webrtc/webrtcvoiceengine.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
60static const uint32 kSsrcs1[] = {1};
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000061static const uint32 kSsrcs3[] = {1, 2, 3};
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000062static const uint32 kRtxSsrcs1[] = {4};
pbos@webrtc.org3c107582014-07-20 15:27:35 +000063static const char kUnsupportedExtensionName[] =
64 "urn:ietf:params:rtp-hdrext:unsupported";
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +000065
66void VerifyCodecHasDefaultFeedbackParams(const cricket::VideoCodec& codec) {
67 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
68 cricket::kRtcpFbParamNack, cricket::kParamValueEmpty)));
69 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
70 cricket::kRtcpFbParamNack, cricket::kRtcpFbNackParamPli)));
71 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
72 cricket::kRtcpFbParamRemb, cricket::kParamValueEmpty)));
73 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
74 cricket::kRtcpFbParamCcm, cricket::kRtcpFbCcmParamFir)));
75}
76
pbos@webrtc.org2a169642015-01-09 15:16:10 +000077void VerifySendStreamHasRtxTypes(const webrtc::VideoSendStream::Config& config,
78 const std::map<int, int>& rtx_types) {
79 std::map<int, int>::const_iterator it;
80 it = rtx_types.find(config.encoder_settings.payload_type);
81 EXPECT_TRUE(it != rtx_types.end() &&
82 it->second == config.rtp.rtx.payload_type);
83
84 if (config.rtp.fec.rtx_payload_type != -1) {
85 it = rtx_types.find(config.rtp.fec.red_payload_type);
86 EXPECT_TRUE(it != rtx_types.end() &&
87 it->second == config.rtp.fec.rtx_payload_type);
88 }
89}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000090} // namespace
91
92namespace cricket {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000093FakeVideoSendStream::FakeVideoSendStream(
94 const webrtc::VideoSendStream::Config& config,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +000095 const webrtc::VideoEncoderConfig& encoder_config)
pbos@webrtc.org42684be2014-10-03 11:25:45 +000096 : sending_(false),
97 config_(config),
98 codec_settings_set_(false),
99 num_swapped_frames_(0) {
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000100 assert(config.encoder_settings.encoder != NULL);
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000101 ReconfigureVideoEncoder(encoder_config);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000102}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000103
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000104webrtc::VideoSendStream::Config FakeVideoSendStream::GetConfig() const {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000105 return config_;
106}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000107
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000108webrtc::VideoEncoderConfig FakeVideoSendStream::GetEncoderConfig() const {
109 return encoder_config_;
110}
111
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000112std::vector<webrtc::VideoStream> FakeVideoSendStream::GetVideoStreams() {
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000113 return encoder_config_.streams;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000114}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000115
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000116bool FakeVideoSendStream::IsSending() const {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000117 return sending_;
118}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000119
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000120bool FakeVideoSendStream::GetVp8Settings(
121 webrtc::VideoCodecVP8* settings) const {
122 if (!codec_settings_set_) {
123 return false;
124 }
125
126 *settings = vp8_settings_;
127 return true;
128}
129
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000130int FakeVideoSendStream::GetNumberOfSwappedFrames() const {
131 return num_swapped_frames_;
132}
133
134int FakeVideoSendStream::GetLastWidth() const {
135 return last_frame_.width();
136}
137
138int FakeVideoSendStream::GetLastHeight() const {
139 return last_frame_.height();
140}
141
142void FakeVideoSendStream::SwapFrame(webrtc::I420VideoFrame* frame) {
143 ++num_swapped_frames_;
144 last_frame_.SwapFrame(frame);
145}
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000146
147void FakeVideoSendStream::SetStats(
148 const webrtc::VideoSendStream::Stats& stats) {
149 stats_ = stats;
150}
151
152webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() {
153 return stats_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000154}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000155
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000156bool FakeVideoSendStream::ReconfigureVideoEncoder(
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000157 const webrtc::VideoEncoderConfig& config) {
158 encoder_config_ = config;
159 if (config.encoder_specific_settings != NULL) {
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000160 assert(config_.encoder_settings.payload_name == "VP8");
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000161 vp8_settings_ = *reinterpret_cast<const webrtc::VideoCodecVP8*>(
162 config.encoder_specific_settings);
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000163 }
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000164 codec_settings_set_ = config.encoder_specific_settings != NULL;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000165 return true;
166}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000167
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000168webrtc::VideoSendStreamInput* FakeVideoSendStream::Input() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000169 return this;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000170}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000171
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000172void FakeVideoSendStream::Start() {
173 sending_ = true;
174}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000175
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000176void FakeVideoSendStream::Stop() {
177 sending_ = false;
178}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000179
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000180FakeVideoReceiveStream::FakeVideoReceiveStream(
181 const webrtc::VideoReceiveStream::Config& config)
182 : config_(config), receiving_(false) {
183}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000184
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000185webrtc::VideoReceiveStream::Config FakeVideoReceiveStream::GetConfig() {
186 return config_;
187}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000188
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000189bool FakeVideoReceiveStream::IsReceiving() const {
190 return receiving_;
191}
192
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000193webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const {
194 return webrtc::VideoReceiveStream::Stats();
195}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000196
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000197void FakeVideoReceiveStream::Start() {
198 receiving_ = true;
199}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000200
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000201void FakeVideoReceiveStream::Stop() {
202 receiving_ = false;
203}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000204
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000205FakeCall::FakeCall(const webrtc::Call::Config& config)
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000206 : config_(config),
207 network_state_(kNetworkUp),
208 num_created_send_streams_(0),
209 num_created_receive_streams_(0) {
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000210 SetVideoCodecs(GetDefaultVideoCodecs());
211}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000212
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000213FakeCall::~FakeCall() {
214 EXPECT_EQ(0u, video_send_streams_.size());
215 EXPECT_EQ(0u, video_receive_streams_.size());
216}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000217
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000218void FakeCall::SetVideoCodecs(const std::vector<webrtc::VideoCodec> codecs) {
219 codecs_ = codecs;
220}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000221
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000222webrtc::Call::Config FakeCall::GetConfig() const {
223 return config_;
224}
225
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000226std::vector<FakeVideoSendStream*> FakeCall::GetVideoSendStreams() {
227 return video_send_streams_;
228}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000229
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000230std::vector<FakeVideoReceiveStream*> FakeCall::GetVideoReceiveStreams() {
231 return video_receive_streams_;
232}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000233
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000234webrtc::VideoCodec FakeCall::GetEmptyVideoCodec() {
235 webrtc::VideoCodec codec;
236 codec.minBitrate = 300;
237 codec.startBitrate = 800;
238 codec.maxBitrate = 1500;
239 codec.maxFramerate = 10;
240 codec.width = 640;
241 codec.height = 480;
242 codec.qpMax = 56;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000243
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000244 return codec;
245}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000246
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000247webrtc::VideoCodec FakeCall::GetVideoCodecVp8() {
248 webrtc::VideoCodec vp8_codec = GetEmptyVideoCodec();
249 vp8_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000250 rtc::strcpyn(
251 vp8_codec.plName, ARRAY_SIZE(vp8_codec.plName), kVp8Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000252 vp8_codec.plType = kVp8Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000253
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000254 return vp8_codec;
255}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000256
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000257webrtc::VideoCodec FakeCall::GetVideoCodecVp9() {
258 webrtc::VideoCodec vp9_codec = GetEmptyVideoCodec();
259 // TODO(pbos): Add a correct codecType when webrtc has one.
260 vp9_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000261 rtc::strcpyn(
262 vp9_codec.plName, ARRAY_SIZE(vp9_codec.plName), kVp9Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000263 vp9_codec.plType = kVp9Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000264
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000265 return vp9_codec;
266}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000267
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000268std::vector<webrtc::VideoCodec> FakeCall::GetDefaultVideoCodecs() {
269 std::vector<webrtc::VideoCodec> codecs;
270 codecs.push_back(GetVideoCodecVp8());
271 // codecs.push_back(GetVideoCodecVp9());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000272
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000273 return codecs;
274}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000275
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000276webrtc::Call::NetworkState FakeCall::GetNetworkState() const {
277 return network_state_;
278}
279
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000280webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
281 const webrtc::VideoSendStream::Config& config,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000282 const webrtc::VideoEncoderConfig& encoder_config) {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000283 FakeVideoSendStream* fake_stream =
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000284 new FakeVideoSendStream(config, encoder_config);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000285 video_send_streams_.push_back(fake_stream);
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000286 ++num_created_send_streams_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000287 return fake_stream;
288}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000289
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000290void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
291 FakeVideoSendStream* fake_stream =
292 static_cast<FakeVideoSendStream*>(send_stream);
293 for (size_t i = 0; i < video_send_streams_.size(); ++i) {
294 if (video_send_streams_[i] == fake_stream) {
295 delete video_send_streams_[i];
296 video_send_streams_.erase(video_send_streams_.begin() + i);
297 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000298 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000299 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000300 ADD_FAILURE() << "DestroyVideoSendStream called with unknown paramter.";
301}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000302
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000303webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
304 const webrtc::VideoReceiveStream::Config& config) {
305 video_receive_streams_.push_back(new FakeVideoReceiveStream(config));
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000306 ++num_created_receive_streams_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000307 return video_receive_streams_[video_receive_streams_.size() - 1];
308}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000309
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000310void FakeCall::DestroyVideoReceiveStream(
311 webrtc::VideoReceiveStream* receive_stream) {
312 FakeVideoReceiveStream* fake_stream =
313 static_cast<FakeVideoReceiveStream*>(receive_stream);
314 for (size_t i = 0; i < video_receive_streams_.size(); ++i) {
315 if (video_receive_streams_[i] == fake_stream) {
316 delete video_receive_streams_[i];
317 video_receive_streams_.erase(video_receive_streams_.begin() + i);
318 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000319 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000320 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000321 ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown paramter.";
322}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000323
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000324webrtc::PacketReceiver* FakeCall::Receiver() {
325 // TODO(pbos): Fix this.
326 return NULL;
327}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000328
pbos@webrtc.org2b19f062014-12-11 13:26:09 +0000329void FakeCall::SetStats(const webrtc::Call::Stats& stats) {
330 stats_ = stats;
331}
332
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000333int FakeCall::GetNumCreatedSendStreams() const {
334 return num_created_send_streams_;
335}
336
337int FakeCall::GetNumCreatedReceiveStreams() const {
338 return num_created_receive_streams_;
339}
340
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000341webrtc::Call::Stats FakeCall::GetStats() const {
pbos@webrtc.org2b19f062014-12-11 13:26:09 +0000342 return stats_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000343}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000344
pbos@webrtc.org00873182014-11-25 14:03:34 +0000345void FakeCall::SetBitrateConfig(
346 const webrtc::Call::Config::BitrateConfig& bitrate_config) {
347 config_.stream_bitrates = bitrate_config;
348}
349
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000350void FakeCall::SignalNetworkState(webrtc::Call::NetworkState state) {
351 network_state_ = state;
352}
353
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000354class WebRtcVideoEngine2Test : public ::testing::Test {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000355 public:
pbos@webrtc.orgb648b9d2014-08-26 11:08:06 +0000356 WebRtcVideoEngine2Test() {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000357 std::vector<VideoCodec> engine_codecs = engine_.codecs();
358 assert(!engine_codecs.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000359 bool codec_set = false;
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000360 for (size_t i = 0; i < engine_codecs.size(); ++i) {
361 if (engine_codecs[i].name == "red") {
362 default_red_codec_ = engine_codecs[i];
363 } else if (engine_codecs[i].name == "ulpfec") {
364 default_ulpfec_codec_ = engine_codecs[i];
365 } else if (engine_codecs[i].name == "rtx") {
pbos@webrtc.org2a169642015-01-09 15:16:10 +0000366 int associated_payload_type;
367 if (engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
368 &associated_payload_type)) {
369 default_apt_rtx_types_[associated_payload_type] = engine_codecs[i].id;
370 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000371 } else if (!codec_set) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000372 default_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000373 codec_set = true;
374 }
375 }
376
377 assert(codec_set);
378 }
379
380 protected:
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000381 class FakeCallFactory : public WebRtcCallFactory {
382 public:
383 FakeCallFactory() : fake_call_(NULL) {}
384 FakeCall* GetCall() { return fake_call_; }
385
386 private:
387 virtual webrtc::Call* CreateCall(
388 const webrtc::Call::Config& config) OVERRIDE {
389 assert(fake_call_ == NULL);
390 fake_call_ = new FakeCall(config);
391 return fake_call_;
392 }
393
394 FakeCall* fake_call_;
395 };
396
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000397 VideoMediaChannel* SetUpForExternalEncoderFactory(
398 cricket::WebRtcVideoEncoderFactory* encoder_factory,
399 const std::vector<VideoCodec>& codecs);
pbos@webrtc.orgfa553ef2014-10-20 11:07:07 +0000400
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000401 VideoMediaChannel* SetUpForExternalDecoderFactory(
402 cricket::WebRtcVideoDecoderFactory* decoder_factory,
403 const std::vector<VideoCodec>& codecs);
404
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000405 WebRtcVideoEngine2 engine_;
406 VideoCodec default_codec_;
407 VideoCodec default_red_codec_;
408 VideoCodec default_ulpfec_codec_;
pbos@webrtc.org2a169642015-01-09 15:16:10 +0000409 std::map<int, int> default_apt_rtx_types_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000410};
411
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000412TEST_F(WebRtcVideoEngine2Test, ConfiguresAvSyncForFirstReceiveChannel) {
413 FakeCallFactory call_factory;
414 engine_.SetCallFactory(&call_factory);
415
416 WebRtcVoiceEngine voice_engine;
417 engine_.SetVoiceEngine(&voice_engine);
418 voice_engine.Init(rtc::Thread::Current());
419 engine_.Init(rtc::Thread::Current());
420
421 rtc::scoped_ptr<VoiceMediaChannel> voice_channel(
422 voice_engine.CreateChannel());
423 ASSERT_TRUE(voice_channel.get() != NULL);
424 WebRtcVoiceMediaChannel* webrtc_voice_channel =
425 static_cast<WebRtcVoiceMediaChannel*>(voice_channel.get());
426 ASSERT_NE(webrtc_voice_channel->voe_channel(), -1);
427 rtc::scoped_ptr<VideoMediaChannel> channel(
428 engine_.CreateChannel(cricket::VideoOptions(), voice_channel.get()));
429
430 FakeCall* fake_call = call_factory.GetCall();
431 ASSERT_TRUE(fake_call != NULL);
432
433 webrtc::Call::Config call_config = fake_call->GetConfig();
434
435 ASSERT_TRUE(voice_engine.voe()->engine() != NULL);
436 ASSERT_EQ(voice_engine.voe()->engine(), call_config.voice_engine);
437
438 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc)));
439 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc + 1)));
440 std::vector<FakeVideoReceiveStream*> receive_streams =
441 fake_call->GetVideoReceiveStreams();
442
443 ASSERT_EQ(2u, receive_streams.size());
444 EXPECT_EQ(webrtc_voice_channel->voe_channel(),
445 receive_streams[0]->GetConfig().audio_channel_id);
446 EXPECT_EQ(-1, receive_streams[1]->GetConfig().audio_channel_id)
447 << "AV sync should only be set up for the first receive channel.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000448}
449
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000450TEST_F(WebRtcVideoEngine2Test, FindCodec) {
451 const std::vector<cricket::VideoCodec>& c = engine_.codecs();
pbos@webrtc.org2a169642015-01-09 15:16:10 +0000452 EXPECT_EQ(cricket::DefaultVideoCodecList().size(), c.size());
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000453
454 cricket::VideoCodec vp8(104, "VP8", 320, 200, 30, 0);
455 EXPECT_TRUE(engine_.FindCodec(vp8));
456
457 cricket::VideoCodec vp8_ci(104, "vp8", 320, 200, 30, 0);
458 EXPECT_TRUE(engine_.FindCodec(vp8));
459
460 cricket::VideoCodec vp8_diff_fr_diff_pref(104, "VP8", 320, 200, 50, 50);
461 EXPECT_TRUE(engine_.FindCodec(vp8_diff_fr_diff_pref));
462
463 cricket::VideoCodec vp8_diff_id(95, "VP8", 320, 200, 30, 0);
464 EXPECT_FALSE(engine_.FindCodec(vp8_diff_id));
465 vp8_diff_id.id = 97;
466 EXPECT_TRUE(engine_.FindCodec(vp8_diff_id));
467
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000468 // FindCodec ignores the codec size.
469 // Test that FindCodec can accept uncommon codec size.
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000470 cricket::VideoCodec vp8_diff_res(104, "VP8", 320, 111, 30, 0);
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000471 EXPECT_TRUE(engine_.FindCodec(vp8_diff_res));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000472
473 // PeerConnection doesn't negotiate the resolution at this point.
474 // Test that FindCodec can handle the case when width/height is 0.
475 cricket::VideoCodec vp8_zero_res(104, "VP8", 0, 0, 30, 0);
476 EXPECT_TRUE(engine_.FindCodec(vp8_zero_res));
477
478 cricket::VideoCodec red(101, "RED", 0, 0, 30, 0);
479 EXPECT_TRUE(engine_.FindCodec(red));
480
481 cricket::VideoCodec red_ci(101, "red", 0, 0, 30, 0);
482 EXPECT_TRUE(engine_.FindCodec(red));
483
484 cricket::VideoCodec fec(102, "ULPFEC", 0, 0, 30, 0);
485 EXPECT_TRUE(engine_.FindCodec(fec));
486
487 cricket::VideoCodec fec_ci(102, "ulpfec", 0, 0, 30, 0);
488 EXPECT_TRUE(engine_.FindCodec(fec));
489
490 cricket::VideoCodec rtx(96, "rtx", 0, 0, 30, 0);
491 EXPECT_TRUE(engine_.FindCodec(rtx));
492}
493
494TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
495 std::vector<VideoCodec> engine_codecs = engine_.codecs();
496 for (size_t i = 0; i < engine_codecs.size(); ++i) {
497 if (engine_codecs[i].name != kRtxCodecName)
498 continue;
499 int associated_payload_type;
500 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000501 &associated_payload_type));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000502 EXPECT_EQ(default_codec_.id, associated_payload_type);
503 return;
504 }
505 FAIL() << "No RTX codec found among default codecs.";
506}
507
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000508TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
509 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
510 ASSERT_FALSE(extensions.empty());
511 for (size_t i = 0; i < extensions.size(); ++i) {
512 if (extensions[i].uri == kRtpTimestampOffsetHeaderExtension) {
513 EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extensions[i].id);
514 return;
515 }
516 }
517 FAIL() << "Timestamp offset extension not in header-extension list.";
518}
519
520TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
521 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
522 ASSERT_FALSE(extensions.empty());
523 for (size_t i = 0; i < extensions.size(); ++i) {
524 if (extensions[i].uri == kRtpAbsoluteSenderTimeHeaderExtension) {
525 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId,
526 extensions[i].id);
527 return;
528 }
529 }
530 FAIL() << "Absolute Sender Time extension not in header-extension list.";
531}
532
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000533TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000534 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000535 rtc::scoped_ptr<VideoMediaChannel> channel(
536 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000537
538 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
539
540 EXPECT_FALSE(channel->SetSend(true))
541 << "Channel should not start without codecs.";
542 EXPECT_TRUE(channel->SetSend(false))
543 << "Channel should be stoppable even without set codecs.";
544}
545
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000546TEST_F(WebRtcVideoEngine2Test, GetStatsWithoutSendCodecsSetDoesNotCrash) {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000547 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000548 rtc::scoped_ptr<VideoMediaChannel> channel(
549 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000550 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
551 VideoMediaInfo info;
552 channel->GetStats(&info);
553}
554
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000555TEST_F(WebRtcVideoEngine2Test, UseExternalFactoryForVp8WhenSupported) {
556 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
557 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
558 std::vector<cricket::VideoCodec> codecs;
559 codecs.push_back(kVp8Codec);
560
561 rtc::scoped_ptr<VideoMediaChannel> channel(
562 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
563
564 EXPECT_TRUE(
565 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
566 ASSERT_EQ(1u, encoder_factory.encoders().size());
567 EXPECT_TRUE(channel->SetSend(true));
568
569 cricket::FakeVideoCapturer capturer;
570 EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer));
571 EXPECT_EQ(cricket::CS_RUNNING,
572 capturer.Start(capturer.GetSupportedFormats()->front()));
573 EXPECT_TRUE(capturer.CaptureFrame());
574
575 EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0,
576 kTimeout);
577
578 // Setting codecs of the same type should not reallocate the encoder.
579 EXPECT_TRUE(channel->SetSendCodecs(codecs));
580 EXPECT_EQ(1, encoder_factory.GetNumCreatedEncoders());
581
582 // Remove stream previously added to free the external encoder instance.
583 EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
584 EXPECT_EQ(0u, encoder_factory.encoders().size());
585}
586
587VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalEncoderFactory(
588 cricket::WebRtcVideoEncoderFactory* encoder_factory,
589 const std::vector<VideoCodec>& codecs) {
590 engine_.SetExternalEncoderFactory(encoder_factory);
591 engine_.Init(rtc::Thread::Current());
592
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000593 VideoMediaChannel* channel =
594 engine_.CreateChannel(cricket::VideoOptions(), NULL);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000595 EXPECT_TRUE(channel->SetSendCodecs(codecs));
596
597 return channel;
598}
599
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000600VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalDecoderFactory(
601 cricket::WebRtcVideoDecoderFactory* decoder_factory,
602 const std::vector<VideoCodec>& codecs) {
603 engine_.SetExternalDecoderFactory(decoder_factory);
604 engine_.Init(rtc::Thread::Current());
605
606 VideoMediaChannel* channel =
607 engine_.CreateChannel(cricket::VideoOptions(), NULL);
608 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
609
610 return channel;
611}
612
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000613TEST_F(WebRtcVideoEngine2Test, ChannelWithExternalH264CanChangeToInternalVp8) {
614 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
615 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
616 std::vector<cricket::VideoCodec> codecs;
617 codecs.push_back(kH264Codec);
618
619 rtc::scoped_ptr<VideoMediaChannel> channel(
620 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
621
622 EXPECT_TRUE(
623 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
624 ASSERT_EQ(1u, encoder_factory.encoders().size());
625
626 codecs.clear();
627 codecs.push_back(kVp8Codec);
628 EXPECT_TRUE(channel->SetSendCodecs(codecs));
629
630 ASSERT_EQ(0u, encoder_factory.encoders().size());
631}
632
633TEST_F(WebRtcVideoEngine2Test,
634 DontUseExternalEncoderFactoryForUnsupportedCodecs) {
635 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
636 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
637 std::vector<cricket::VideoCodec> codecs;
638 codecs.push_back(kVp8Codec);
639
640 rtc::scoped_ptr<VideoMediaChannel> channel(
641 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
642
643 EXPECT_TRUE(
644 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
645 ASSERT_EQ(0u, encoder_factory.encoders().size());
646}
647
648// Test external codec with be added to the end of the supported codec list.
649TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) {
650 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
651 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
652 engine_.SetExternalEncoderFactory(&encoder_factory);
653
654 engine_.Init(rtc::Thread::Current());
655
656 std::vector<cricket::VideoCodec> codecs(engine_.codecs());
657 ASSERT_GE(codecs.size(), 2u);
658 cricket::VideoCodec internal_codec = codecs.front();
659 cricket::VideoCodec external_codec = codecs.back();
660
661 // The external codec will appear at last.
662 EXPECT_EQ("VP8", internal_codec.name);
663 EXPECT_EQ("H264", external_codec.name);
664}
665
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000666TEST_F(WebRtcVideoEngine2Test, RegisterExternalDecodersIfSupported) {
667 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
668 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
669 std::vector<cricket::VideoCodec> codecs;
670 codecs.push_back(kVp8Codec);
671
672 rtc::scoped_ptr<VideoMediaChannel> channel(
673 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
674
675 EXPECT_TRUE(
676 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
677 ASSERT_EQ(1u, decoder_factory.decoders().size());
678
679 // Setting codecs of the same type should not reallocate the decoder.
680 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
681 EXPECT_EQ(1, decoder_factory.GetNumCreatedDecoders());
682
683 // Remove stream previously added to free the external decoder instance.
684 EXPECT_TRUE(channel->RemoveRecvStream(kSsrc));
685 EXPECT_EQ(0u, decoder_factory.decoders().size());
686}
687
688// Verifies that we can set up decoders that are not internally supported.
689TEST_F(WebRtcVideoEngine2Test, RegisterExternalH264DecoderIfSupported) {
690 // TODO(pbos): Do not assume that encoder/decoder support is symmetric. We
691 // can't even query the WebRtcVideoDecoderFactory for supported codecs.
692 // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported
693 // codecs.
694 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
695 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
696 engine_.SetExternalEncoderFactory(&encoder_factory);
697 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
698 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
699 std::vector<cricket::VideoCodec> codecs;
700 codecs.push_back(kH264Codec);
701
702 rtc::scoped_ptr<VideoMediaChannel> channel(
703 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
704
705 EXPECT_TRUE(
706 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
707 ASSERT_EQ(1u, decoder_factory.decoders().size());
708}
709
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000710class WebRtcVideoEngine2BaseTest
711 : public VideoEngineTest<cricket::WebRtcVideoEngine2> {
712 protected:
713 typedef VideoEngineTest<cricket::WebRtcVideoEngine2> Base;
714};
715
716#define WEBRTC_ENGINE_BASE_TEST(test) \
717 TEST_F(WebRtcVideoEngine2BaseTest, test) { Base::test##Body(); }
718
719WEBRTC_ENGINE_BASE_TEST(ConstrainNewCodec2);
720
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000721class WebRtcVideoChannel2BaseTest
722 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
723 protected:
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000724 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000725
726 virtual cricket::VideoCodec DefaultCodec() OVERRIDE { return kVp8Codec; }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000727};
728
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000729#define WEBRTC_BASE_TEST(test) \
730 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); }
731
732#define WEBRTC_DISABLED_BASE_TEST(test) \
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000733 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_##test) { Base::test(); }
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000734
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000735// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
736#if 0
737// TODO(juberti): Figure out why ViE is munging the COM refcount.
738#ifdef WIN32
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000739WEBRTC_DISABLED_BASE_TEST(CheckCoInitialize) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000740 Base::CheckCoInitialize();
741}
742#endif
743#endif
744
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000745WEBRTC_BASE_TEST(SetSend);
746WEBRTC_BASE_TEST(SetSendWithoutCodecs);
747WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000748
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000749WEBRTC_BASE_TEST(GetStats);
750WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
751WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000752
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000753WEBRTC_BASE_TEST(SetSendBandwidth);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000754
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000755WEBRTC_BASE_TEST(SetSendSsrc);
756WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000757
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000758WEBRTC_BASE_TEST(SetRenderer);
759WEBRTC_BASE_TEST(AddRemoveRecvStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000760
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000761WEBRTC_DISABLED_BASE_TEST(AddRemoveRecvStreamAndRender);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000762
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000763WEBRTC_BASE_TEST(AddRemoveRecvStreamsNoConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000764
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000765WEBRTC_BASE_TEST(AddRemoveSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000766
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000767WEBRTC_BASE_TEST(SimulateConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000768
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000769WEBRTC_BASE_TEST(AddRemoveCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000770
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000771WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000772
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000773WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000774
775// TODO(pbos): Figure out why this fails so often.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000776WEBRTC_DISABLED_BASE_TEST(HighAspectHighHeightCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000777
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000778WEBRTC_BASE_TEST(RejectEmptyStreamParams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000779
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000780WEBRTC_BASE_TEST(AdaptResolution16x10);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000781
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000782WEBRTC_BASE_TEST(AdaptResolution4x3);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000783
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000784// TODO(juberti): Restore this test once we support sending 0 fps.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000785WEBRTC_DISABLED_BASE_TEST(AdaptDropAllFrames);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000786// TODO(juberti): Understand why we get decode errors on this test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000787WEBRTC_DISABLED_BASE_TEST(AdaptFramerate);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000788
pbos@webrtc.orgc4175b92014-09-03 15:25:49 +0000789WEBRTC_BASE_TEST(SendsLowerResolutionOnSmallerFrames);
790
791WEBRTC_BASE_TEST(MuteStream);
792
793WEBRTC_BASE_TEST(MultipleSendStreams);
794
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000795WEBRTC_BASE_TEST(SetSendStreamFormat0x0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000796
797// TODO(zhurunz): Fix the flakey test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000798WEBRTC_DISABLED_BASE_TEST(SetSendStreamFormat);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000799
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000800TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Vga) {
801 SendAndReceive(cricket::VideoCodec(100, "VP8", 640, 400, 30, 0));
802}
803
804TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Qvga) {
805 SendAndReceive(cricket::VideoCodec(100, "VP8", 320, 200, 30, 0));
806}
807
808TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8SvcQqvga) {
809 SendAndReceive(cricket::VideoCodec(100, "VP8", 160, 100, 30, 0));
810}
811
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000812TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
813 Base::TwoStreamsSendAndReceive(kVp8Codec);
814}
815
816TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
817 Base::TwoStreamsReUseFirstStream(kVp8Codec);
818}
819
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000820WEBRTC_BASE_TEST(SendManyResizeOnce);
821
822// TODO(pbos): Enable and figure out why this fails (or should work).
823TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
824 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL));
825 EXPECT_TRUE(channel_->SetRenderer(kDefaultReceiveSsrc, &renderer_));
826 channel_->UpdateAspectRatio(1280, 720);
827 video_capturer_.reset(new cricket::FakeVideoCapturer);
828 const std::vector<cricket::VideoFormat>* formats =
829 video_capturer_->GetSupportedFormats();
830 cricket::VideoFormat capture_format_hd = (*formats)[0];
831 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(capture_format_hd));
832 EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get()));
833
834 // Capture format HD -> adapt (OnOutputFormatRequest VGA) -> VGA.
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000835 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000836 EXPECT_TRUE(SetOneCodec(codec));
837 codec.width /= 2;
838 codec.height /= 2;
839 EXPECT_TRUE(SetSend(true));
840 EXPECT_TRUE(channel_->SetRender(true));
841 EXPECT_EQ(0, renderer_.num_rendered_frames());
842 EXPECT_TRUE(SendFrame());
843 EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout);
844}
845
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000846class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test,
847 public WebRtcCallFactory {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000848 public:
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000849 WebRtcVideoChannel2Test() : fake_call_(NULL) {}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000850 virtual void SetUp() OVERRIDE {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000851 engine_.SetCallFactory(this);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000852 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000853 channel_.reset(engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000854 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000855 last_ssrc_ = 123;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000856 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000857 }
858
859 protected:
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000860 virtual webrtc::Call* CreateCall(
861 const webrtc::Call::Config& config) OVERRIDE {
862 assert(fake_call_ == NULL);
863 fake_call_ = new FakeCall(config);
864 return fake_call_;
865 }
866
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000867 FakeVideoSendStream* AddSendStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000868 return AddSendStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000869 }
870
871 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000872 size_t num_streams = fake_call_->GetVideoSendStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000873 EXPECT_TRUE(channel_->AddSendStream(sp));
874 std::vector<FakeVideoSendStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000875 fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000876 EXPECT_EQ(num_streams + 1, streams.size());
877 return streams[streams.size() - 1];
878 }
879
880 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000881 return fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000882 }
883
884 FakeVideoReceiveStream* AddRecvStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000885 return AddRecvStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000886 }
887
888 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000889 size_t num_streams = fake_call_->GetVideoReceiveStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000890 EXPECT_TRUE(channel_->AddRecvStream(sp));
891 std::vector<FakeVideoReceiveStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000892 fake_call_->GetVideoReceiveStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000893 EXPECT_EQ(num_streams + 1, streams.size());
894 return streams[streams.size() - 1];
895 }
896
pbos@webrtc.org00873182014-11-25 14:03:34 +0000897 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
898 int expected_min_bitrate_bps,
899 const char* start_bitrate_kbps,
900 int expected_start_bitrate_bps,
901 const char* max_bitrate_kbps,
902 int expected_max_bitrate_bps) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000903 std::vector<VideoCodec> codecs;
904 codecs.push_back(kVp8Codec);
pbos@webrtc.org00873182014-11-25 14:03:34 +0000905 codecs[0].params[kCodecParamMinBitrate] = min_bitrate_kbps;
906 codecs[0].params[kCodecParamStartBitrate] = start_bitrate_kbps;
907 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate_kbps;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000908 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
909
pbos@webrtc.org00873182014-11-25 14:03:34 +0000910 EXPECT_EQ(expected_min_bitrate_bps,
911 fake_call_->GetConfig().stream_bitrates.min_bitrate_bps);
912 EXPECT_EQ(expected_start_bitrate_bps,
913 fake_call_->GetConfig().stream_bitrates.start_bitrate_bps);
914 EXPECT_EQ(expected_max_bitrate_bps,
915 fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000916 }
917
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000918 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
919 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000920 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000921 // Enable extension.
922 const int id = 1;
923 std::vector<cricket::RtpHeaderExtension> extensions;
924 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
925 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
926
927 FakeVideoSendStream* send_stream =
928 AddSendStream(cricket::StreamParams::CreateLegacy(123));
929
930 // Verify the send extension id.
931 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
932 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
933 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
934 // Verify call with same set of extensions returns true.
935 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
936 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
937 // receivers.
938 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
939 ->GetConfig()
940 .rtp.extensions.empty());
941
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000942 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000943 std::vector<cricket::RtpHeaderExtension> empty_extensions;
944 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000945 ASSERT_EQ(1u, call->GetVideoSendStreams().size());
946 send_stream = call->GetVideoSendStreams()[0];
947 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
948
949 // Verify that adding receive RTP header extensions adds them for existing
950 // streams.
951 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
952 send_stream = call->GetVideoSendStreams()[0];
953 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
954 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
955 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000956 }
957
958 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
959 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000960 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000961 // Enable extension.
962 const int id = 1;
963 std::vector<cricket::RtpHeaderExtension> extensions;
964 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
965 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
966
967 FakeVideoReceiveStream* recv_stream =
968 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
969
970 // Verify the recv extension id.
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);
974 // Verify call with same set of extensions returns true.
975 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000976
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000977 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
978 // senders.
979 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
980 ->GetConfig()
981 .rtp.extensions.empty());
982
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000983 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000984 std::vector<cricket::RtpHeaderExtension> empty_extensions;
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000985 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(empty_extensions));
986 ASSERT_EQ(1u, call->GetVideoReceiveStreams().size());
987 recv_stream = call->GetVideoReceiveStreams()[0];
988 EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
989
990 // Verify that adding receive RTP header extensions adds them for existing
991 // streams.
992 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
993 recv_stream = call->GetVideoReceiveStreams()[0];
994 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
995 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
996 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000997 }
998
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000999 void TestCpuAdaptation(bool enable_overuse);
1000
1001 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
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001084TEST_F(WebRtcVideoChannel2Test, IdenticalSendExtensionsDoesntRecreateStream) {
1085 const int kTOffsetId = 1;
1086 const int kAbsSendTimeId = 2;
1087 std::vector<cricket::RtpHeaderExtension> extensions;
1088 extensions.push_back(cricket::RtpHeaderExtension(
1089 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1090 extensions.push_back(cricket::RtpHeaderExtension(
1091 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
1092
1093 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1094 FakeVideoSendStream* send_stream =
1095 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1096
1097 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1098 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
1099
1100 // Setting the same extensions (even if in different order) shouldn't
1101 // reallocate the stream.
1102 std::reverse(extensions.begin(), extensions.end());
1103 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1104
1105 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1106
1107 // Setting different extensions should recreate the stream.
1108 extensions.resize(1);
1109 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1110
1111 EXPECT_EQ(2, fake_call_->GetNumCreatedSendStreams());
1112}
1113
1114TEST_F(WebRtcVideoChannel2Test, IdenticalRecvExtensionsDoesntRecreateStream) {
1115 const int kTOffsetId = 1;
1116 const int kAbsSendTimeId = 2;
1117 std::vector<cricket::RtpHeaderExtension> extensions;
1118 extensions.push_back(cricket::RtpHeaderExtension(
1119 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1120 extensions.push_back(cricket::RtpHeaderExtension(
1121 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
1122
1123 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1124 FakeVideoReceiveStream* send_stream =
1125 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1126
1127 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1128 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
1129
1130 // Setting the same extensions (even if in different order) shouldn't
1131 // reallocate the stream.
1132 std::reverse(extensions.begin(), extensions.end());
1133 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1134
1135 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1136
1137 // Setting different extensions should recreate the stream.
1138 extensions.resize(1);
1139 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1140
1141 EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams());
1142}
1143
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001144TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001145 SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001146 const int kUnsupportedId = 1;
1147 const int kTOffsetId = 2;
1148
1149 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001150 extensions.push_back(
1151 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1152 extensions.push_back(
1153 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001154 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1155 FakeVideoSendStream* send_stream =
1156 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1157
1158 // Only timestamp offset extension is set to send stream,
1159 // unsupported rtp extension is ignored.
1160 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
1161 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001162 send_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001163}
1164
1165TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001166 SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001167 const int kUnsupportedId = 1;
1168 const int kTOffsetId = 2;
1169
1170 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001171 extensions.push_back(
1172 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1173 extensions.push_back(
1174 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001175 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1176 FakeVideoReceiveStream* recv_stream =
1177 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1178
1179 // Only timestamp offset extension is set to receive stream,
1180 // unsupported rtp extension is ignored.
1181 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1182 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001183 recv_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001184}
1185
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001186TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001187 const size_t kNumIncorrectIds = 4;
1188 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
1189 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
1190 std::vector<cricket::RtpHeaderExtension> extensions;
1191 extensions.push_back(cricket::RtpHeaderExtension(
1192 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1193 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions))
1194 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1195 }
1196}
1197
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001198TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001199 const size_t kNumIncorrectIds = 4;
1200 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
1201 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
1202 std::vector<cricket::RtpHeaderExtension> extensions;
1203 extensions.push_back(cricket::RtpHeaderExtension(
1204 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1205 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions))
1206 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1207 }
1208}
1209
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001210TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001211 const int id = 1;
1212 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001213 extensions.push_back(
1214 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1215 extensions.push_back(
1216 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001217 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1218
1219 // Duplicate entries are also not supported.
1220 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001221 extensions.push_back(
1222 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001223 extensions.push_back(extensions.back());
1224 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1225}
1226
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001227TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001228 const int id = 1;
1229 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001230 extensions.push_back(
1231 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1232 extensions.push_back(
1233 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001234 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1235
1236 // Duplicate entries are also not supported.
1237 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001238 extensions.push_back(
1239 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001240 extensions.push_back(extensions.back());
1241 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1242}
1243
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001244TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
1245 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1246}
1247
1248TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
1249 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1250}
1251
1252TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
1253 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1254}
1255
1256TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
1257 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001258 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001259}
1260
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001261TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
1262 FakeVideoReceiveStream* stream = AddRecvStream();
1263 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001264}
1265
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001266TEST_F(WebRtcVideoChannel2Test, RembCanBeEnabledAndDisabled) {
1267 FakeVideoReceiveStream* stream = AddRecvStream();
1268 EXPECT_TRUE(stream->GetConfig().rtp.remb);
1269
1270 // Verify that REMB is turned off when codecs without REMB are set.
1271 std::vector<VideoCodec> codecs;
1272 codecs.push_back(kVp8Codec);
1273 EXPECT_TRUE(codecs[0].feedback_params.params().empty());
1274 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001275 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001276 EXPECT_FALSE(stream->GetConfig().rtp.remb);
1277
1278 // Verify that REMB is turned on when setting default codecs since the
1279 // default codecs have REMB enabled.
1280 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001281 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001282 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001283}
1284
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001285TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
1286 VerifyCodecHasDefaultFeedbackParams(default_codec_);
1287
pbos@webrtc.org19864742014-05-30 07:35:47 +00001288 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1289 EXPECT_TRUE(channel_->SetSend(true));
1290
1291 // Send side.
1292 FakeVideoSendStream* send_stream =
1293 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1294 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1295
1296 // Receiver side.
1297 FakeVideoReceiveStream* recv_stream =
1298 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1299 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1300
1301 // Nack history size should match between sender and receiver.
1302 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
1303 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001304}
1305
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001306TEST_F(WebRtcVideoChannel2Test, NackCanBeDisabled) {
1307 std::vector<VideoCodec> codecs;
1308 codecs.push_back(kVp8Codec);
1309
1310 // Send side.
1311 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1312 FakeVideoSendStream* send_stream =
1313 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1314 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
1315
1316 // Receiver side.
1317 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1318 FakeVideoReceiveStream* recv_stream =
1319 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1320 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
1321}
1322
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001323TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
1324 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1325}
1326
1327TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
1328 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1329}
1330
1331TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
1332 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1333}
1334
1335TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
1336 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1337}
1338
1339TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
1340 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1341}
1342
1343TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
1344 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1345}
1346
1347TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
1348 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1349}
1350
1351TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
1352 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1353}
1354
1355TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
1356 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1357}
1358
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001359TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) {
1360 static const int kScreenshareMinBitrateKbps = 800;
1361 cricket::VideoCodec codec = kVp8Codec360p;
1362 std::vector<cricket::VideoCodec> codecs;
1363 codecs.push_back(codec);
1364 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1365 VideoOptions options;
1366 options.screencast_min_bitrate.Set(kScreenshareMinBitrateKbps);
1367 channel_->SetOptions(options);
1368
1369 AddSendStream();
1370
1371 cricket::FakeVideoCapturer capturer;
1372 capturer.SetScreencast(false);
1373 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1374 cricket::VideoFormat capture_format_hd =
1375 capturer.GetSupportedFormats()->front();
1376 EXPECT_EQ(1280, capture_format_hd.width);
1377 EXPECT_EQ(720, capture_format_hd.height);
1378 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1379
1380 EXPECT_TRUE(channel_->SetSend(true));
1381
1382 EXPECT_TRUE(capturer.CaptureFrame());
1383 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1384 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1385
1386 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1387
1388 // Verify non-screencast settings.
1389 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1390 EXPECT_EQ(webrtc::VideoEncoderConfig::kRealtimeVideo,
1391 encoder_config.content_type);
1392 EXPECT_EQ(codec.width, encoder_config.streams.front().width);
1393 EXPECT_EQ(codec.height, encoder_config.streams.front().height);
1394 EXPECT_EQ(0, encoder_config.min_transmit_bitrate_bps)
1395 << "Non-screenshare shouldn't use min-transmit bitrate.";
1396
1397 capturer.SetScreencast(true);
1398 EXPECT_TRUE(capturer.CaptureFrame());
1399
1400 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1401
1402 // Verify screencast settings.
1403 encoder_config = send_stream->GetEncoderConfig();
1404 EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
1405 encoder_config.content_type);
1406 EXPECT_EQ(kScreenshareMinBitrateKbps * 1000,
1407 encoder_config.min_transmit_bitrate_bps);
1408
1409 EXPECT_EQ(capture_format_hd.width, encoder_config.streams.front().width);
1410 EXPECT_EQ(capture_format_hd.height, encoder_config.streams.front().height);
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +00001411 EXPECT_TRUE(encoder_config.streams[0].temporal_layer_thresholds_bps.empty());
1412
1413 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
1414}
1415
1416TEST_F(WebRtcVideoChannel2Test,
1417 ConferenceModeScreencastConfiguresTemporalLayer) {
1418 static const int kConferenceScreencastTemporalBitrateBps = 100000;
1419 VideoOptions options;
1420 options.conference_mode.Set(true);
1421 channel_->SetOptions(options);
1422
1423 AddSendStream();
1424
1425 cricket::FakeVideoCapturer capturer;
1426 capturer.SetScreencast(true);
1427 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1428 cricket::VideoFormat capture_format_hd =
1429 capturer.GetSupportedFormats()->front();
1430 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1431
1432 EXPECT_TRUE(channel_->SetSend(true));
1433
1434 EXPECT_TRUE(capturer.CaptureFrame());
1435 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1436 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1437
1438 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1439
1440 // Verify screencast settings.
1441 encoder_config = send_stream->GetEncoderConfig();
1442 EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
1443 encoder_config.content_type);
1444 ASSERT_EQ(1u, encoder_config.streams.size());
1445 ASSERT_EQ(1u, encoder_config.streams[0].temporal_layer_thresholds_bps.size());
1446 EXPECT_EQ(kConferenceScreencastTemporalBitrateBps,
1447 encoder_config.streams[0].temporal_layer_thresholds_bps[0]);
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001448
1449 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001450}
1451
1452TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
1453 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1454}
1455
1456TEST_F(WebRtcVideoChannel2Test,
1457 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
1458 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1459}
1460
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001461TEST_F(WebRtcVideoChannel2Test, SuspendBelowMinBitrateDisabledByDefault) {
1462 FakeVideoSendStream* stream = AddSendStream();
1463 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1464}
1465
1466TEST_F(WebRtcVideoChannel2Test, SetOptionsWithSuspendBelowMinBitrate) {
1467 VideoOptions options;
1468 options.suspend_below_min_bitrate.Set(true);
1469 channel_->SetOptions(options);
1470
1471 FakeVideoSendStream* stream = AddSendStream();
1472 EXPECT_TRUE(stream->GetConfig().suspend_below_min_bitrate);
1473
1474 options.suspend_below_min_bitrate.Set(false);
1475 channel_->SetOptions(options);
1476
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001477 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001478 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1479}
1480
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001481TEST_F(WebRtcVideoChannel2Test, Vp8DenoisingEnabledByDefault) {
1482 FakeVideoSendStream* stream = AddSendStream();
1483 webrtc::VideoCodecVP8 vp8_settings;
1484 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1485 EXPECT_TRUE(vp8_settings.denoisingOn);
1486}
1487
1488TEST_F(WebRtcVideoChannel2Test, SetOptionsWithDenoising) {
1489 VideoOptions options;
1490 options.video_noise_reduction.Set(false);
1491 channel_->SetOptions(options);
1492
1493 FakeVideoSendStream* stream = AddSendStream();
1494 webrtc::VideoCodecVP8 vp8_settings;
1495 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1496 EXPECT_FALSE(vp8_settings.denoisingOn);
1497
1498 options.video_noise_reduction.Set(true);
1499 channel_->SetOptions(options);
1500
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001501 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001502 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1503 EXPECT_TRUE(vp8_settings.denoisingOn);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001504}
1505
1506TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
1507 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1508}
1509
pbos@webrtc.org8aed9452014-07-26 10:16:49 +00001510TEST_F(WebRtcVideoChannel2Test, DISABLED_SendReceiveBitratesStats) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001511 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1512}
1513
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001514TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruse) {
1515 TestCpuAdaptation(true);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001516}
1517
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001518TEST_F(WebRtcVideoChannel2Test, DoesNotAdaptOnOveruseWhenDisabled) {
1519 TestCpuAdaptation(false);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001520}
1521
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001522void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse) {
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001523 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001524 std::vector<cricket::VideoCodec> codecs;
1525 codecs.push_back(codec);
1526 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1527
1528 if (enable_overuse) {
1529 VideoOptions options;
1530 options.cpu_overuse_detection.Set(true);
1531 channel_->SetOptions(options);
1532 }
1533
1534 AddSendStream();
1535
1536 cricket::FakeVideoCapturer capturer;
1537 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1538 EXPECT_EQ(cricket::CS_RUNNING,
1539 capturer.Start(capturer.GetSupportedFormats()->front()));
1540
1541 EXPECT_TRUE(channel_->SetSend(true));
1542
1543 // Trigger overuse.
1544 webrtc::LoadObserver* overuse_callback =
1545 fake_call_->GetConfig().overuse_callback;
1546 ASSERT_TRUE(overuse_callback != NULL);
1547 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
1548
1549 EXPECT_TRUE(capturer.CaptureFrame());
1550 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1551 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1552
1553 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1554
1555 if (enable_overuse) {
1556 EXPECT_LT(send_stream->GetLastWidth(), codec.width);
1557 EXPECT_LT(send_stream->GetLastHeight(), codec.height);
1558 } else {
1559 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1560 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1561 }
1562
1563 // Trigger underuse which should go back to normal resolution.
1564 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
1565 EXPECT_TRUE(capturer.CaptureFrame());
1566
1567 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1568
1569 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1570 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1571
1572 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001573}
1574
1575TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldLog) {
1576 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1577}
1578
1579TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldNotLog) {
1580 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1581}
1582
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001583TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001584 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001585
1586 VideoCodec codec;
1587 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001588 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001589
1590 // Using a RTX setup to verify that the default RTX payload type is good.
1591 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1592 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1593 FakeVideoSendStream* stream = AddSendStream(
1594 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1595 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001596
1597 // Make sure NACK and FEC are enabled on the correct payload types.
1598 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
1599 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
1600 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001601
1602 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
1603 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
pbos@webrtc.org2a169642015-01-09 15:16:10 +00001604 VerifySendStreamHasRtxTypes(config, default_apt_rtx_types_);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001605 // TODO(juberti): Check RTCP, PLI, TMMBR.
1606}
1607
1608TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
1609 std::vector<VideoCodec> codecs;
1610 codecs.push_back(kVp8Codec);
1611 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1612
1613 FakeVideoSendStream* stream = AddSendStream();
1614 webrtc::VideoSendStream::Config config = stream->GetConfig();
1615
1616 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1617 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1618}
1619
1620TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001621 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1622 std::vector<VideoCodec> codecs;
1623 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1624 codecs.push_back(rtx_codec);
1625 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1626 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001627}
1628
1629TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001630 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1631 std::vector<VideoCodec> codecs;
1632 cricket::VideoCodec rtx_codec =
1633 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1634 codecs.push_back(kVp8Codec);
1635 codecs.push_back(rtx_codec);
1636 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1637
1638 cricket::VideoCodec rtx_codec2 =
1639 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1640 codecs.pop_back();
1641 codecs.push_back(rtx_codec2);
1642 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1643 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001644}
1645
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001646TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1647 std::vector<VideoCodec> codecs;
1648 codecs.push_back(kVp8Codec);
1649 codecs.push_back(kUlpfecCodec);
1650 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1651
1652 FakeVideoSendStream* stream = AddSendStream();
1653 webrtc::VideoSendStream::Config config = stream->GetConfig();
1654
1655 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1656
1657 codecs.pop_back();
1658 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001659 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001660 ASSERT_TRUE(stream != NULL);
1661 config = stream->GetConfig();
1662 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1663 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001664}
1665
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001666TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1667 std::vector<VideoCodec> codecs;
1668 codecs.push_back(kVp8Codec720p);
1669 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1670
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001671 std::vector<webrtc::VideoStream> streams = AddSendStream()->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001672 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1673 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1674
1675 codecs.clear();
1676 codecs.push_back(kVp8Codec360p);
1677 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001678 streams = fake_call_->GetVideoSendStreams()[0]->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001679 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1680 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001681}
1682
pbos@webrtc.org00873182014-11-25 14:03:34 +00001683TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithBitrates) {
1684 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1685 200000);
1686}
1687
1688TEST_F(WebRtcVideoChannel2Test,
1689 SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1690 SetSendCodecsShouldWorkForBitrates(
1691 "", 0, "", -1, "", -1);
1692}
1693
1694TEST_F(WebRtcVideoChannel2Test, SetSendCodecsCapsMinAndStartBitrate) {
1695 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001696}
1697
1698TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001699 std::vector<VideoCodec> video_codecs = engine_.codecs();
pbos@webrtc.org88ef6322014-11-04 15:29:29 +00001700 video_codecs[0].params[kCodecParamMinBitrate] = "300";
1701 video_codecs[0].params[kCodecParamMaxBitrate] = "200";
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001702 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001703}
1704
pbos@webrtc.org00873182014-11-25 14:03:34 +00001705TEST_F(WebRtcVideoChannel2Test,
1706 SetMaxSendBandwidthShouldPreserveOtherBitrates) {
1707 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1708 200000);
1709 channel_->SetMaxSendBandwidth(300000);
1710 EXPECT_EQ(100000, fake_call_->GetConfig().stream_bitrates.min_bitrate_bps)
1711 << "Setting max bitrate should keep previous min bitrate.";
1712 EXPECT_EQ(-1, fake_call_->GetConfig().stream_bitrates.start_bitrate_bps)
1713 << "Setting max bitrate should not reset start bitrate.";
1714 EXPECT_EQ(300000, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
1715}
1716
1717TEST_F(WebRtcVideoChannel2Test, SetMaxSendBandwidthShouldBeRemovable) {
1718 channel_->SetMaxSendBandwidth(300000);
1719 EXPECT_EQ(300000, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
1720 // <= 0 means disable (infinite) max bitrate.
1721 channel_->SetMaxSendBandwidth(0);
1722 EXPECT_EQ(-1, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps)
1723 << "Setting zero max bitrate did not reset start bitrate.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001724}
1725
1726TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1727 static const char* kMaxQuantization = "21";
1728 std::vector<VideoCodec> codecs;
1729 codecs.push_back(kVp8Codec);
1730 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1731 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001732 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1733 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001734
1735 VideoCodec codec;
1736 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1737 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1738}
1739
1740TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1741 std::vector<cricket::VideoCodec> codecs;
1742 codecs.push_back(kVp8Codec);
1743
1744 codecs[0].width = 0;
1745 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1746 << "Codec set though codec width is zero.";
1747
1748 codecs[0].width = kVp8Codec.width;
1749 codecs[0].height = 0;
1750 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1751 << "Codec set though codec height is zero.";
1752}
1753
1754TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
1755 // TODO(pbos): Should we only allow the dynamic range?
1756 static const size_t kNumIncorrectPayloads = 4;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001757 static const int kIncorrectPayloads[kNumIncorrectPayloads] = {
1758 -2, -1, 128, 129};
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001759 std::vector<cricket::VideoCodec> codecs;
1760 codecs.push_back(kVp8Codec);
1761 for (size_t i = 0; i < kNumIncorrectPayloads; ++i) {
1762 int payload_type = kIncorrectPayloads[i];
1763 codecs[0].id = payload_type;
1764 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1765 << "Bad payload type '" << payload_type << "' accepted.";
1766 }
1767}
1768
1769TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
1770 std::vector<cricket::VideoCodec> codecs;
1771 codecs.push_back(kVp8Codec);
1772 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
1773 codecs[0].id = payload_type;
1774 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
1775 << "Payload type '" << payload_type << "' rejected.";
1776 }
1777}
1778
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001779TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
1780 std::vector<cricket::VideoCodec> codecs;
1781 codecs.push_back(kVp8Codec);
1782 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1783}
1784
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001785// Test that we set our inbound RTX codecs properly.
1786TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
1787 std::vector<cricket::VideoCodec> codecs;
1788 codecs.push_back(kVp8Codec);
1789 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1790 codecs.push_back(rtx_codec);
1791 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1792 << "RTX codec without associated payload should be rejected.";
1793
1794 codecs[1].SetParam("apt", kVp8Codec.id + 1);
1795 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1796 << "RTX codec with invalid associated payload type should be rejected.";
1797
1798 codecs[1].SetParam("apt", kVp8Codec.id);
1799 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1800
1801 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
1802 rtx_codec2.SetParam("apt", rtx_codec.id);
1803 codecs.push_back(rtx_codec2);
1804
1805 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
1806 "as associated payload type "
1807 "should be rejected.";
1808}
1809
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001810TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
1811 std::vector<cricket::VideoCodec> codecs;
1812 codecs.push_back(kVp8Codec);
1813 codecs[0].id = 99;
1814 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1815}
1816
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001817TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001818 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001819
1820 FakeVideoReceiveStream* stream = AddRecvStream();
1821 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
pbos@webrtc.org776e6f22014-10-29 15:28:39 +00001822 EXPECT_EQ(engine_.codecs()[0].name, config.decoders[0].payload_name);
1823 EXPECT_EQ(engine_.codecs()[0].id, config.decoders[0].payload_type);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001824}
1825
1826TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
1827 std::vector<VideoCodec> codecs;
1828 codecs.push_back(kVp8Codec);
1829 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
1830 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1831}
1832
1833// TODO(pbos): Enable VP9 through external codec support
1834TEST_F(WebRtcVideoChannel2Test,
1835 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
1836 std::vector<VideoCodec> codecs;
1837 codecs.push_back(kVp8Codec);
1838 codecs.push_back(kVp9Codec);
1839 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1840}
1841
1842TEST_F(WebRtcVideoChannel2Test,
1843 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
1844 std::vector<VideoCodec> codecs;
1845 codecs.push_back(kVp8Codec);
1846 codecs.push_back(kVp9Codec);
1847 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1848 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
1849}
1850
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001851TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
1852 std::vector<VideoCodec> codecs;
1853 codecs.push_back(kVp8Codec);
1854 codecs.push_back(kUlpfecCodec);
1855 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1856
1857 FakeVideoReceiveStream* stream = AddRecvStream();
1858 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1859
1860 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1861
1862 codecs.pop_back();
1863 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001864 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001865 ASSERT_TRUE(stream != NULL);
1866 config = stream->GetConfig();
1867 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1868 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001869}
1870
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001871TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
1872 std::vector<VideoCodec> codecs;
1873 codecs.push_back(kVp8Codec);
1874 codecs.push_back(kRedCodec);
1875 codecs[1].id = codecs[0].id;
1876 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1877}
1878
1879TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
1880 std::vector<VideoCodec> codecs;
1881 codecs.push_back(kVp8Codec);
1882 codecs.push_back(kVp9Codec);
1883 codecs[1].id = codecs[0].id;
1884 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1885}
1886
1887TEST_F(WebRtcVideoChannel2Test,
1888 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
1889 std::vector<VideoCodec> codecs;
1890 codecs.push_back(kVp8Codec);
1891 codecs.push_back(kVp8Codec);
1892 codecs[1].id += 1;
1893 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1894}
1895
1896TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
1897 EXPECT_FALSE(AddSendStream()->IsSending());
1898}
1899
pbos@webrtc.org85f42942014-07-22 09:14:58 +00001900TEST_F(WebRtcVideoChannel2Test, ReceiveStreamReceivingByDefault) {
1901 EXPECT_TRUE(AddRecvStream()->IsReceiving());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001902}
1903
1904TEST_F(WebRtcVideoChannel2Test, SetSend) {
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +00001905 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001906 EXPECT_FALSE(stream->IsSending());
1907
1908 // false->true
1909 EXPECT_TRUE(channel_->SetSend(true));
1910 EXPECT_TRUE(stream->IsSending());
1911 // true->true
1912 EXPECT_TRUE(channel_->SetSend(true));
1913 EXPECT_TRUE(stream->IsSending());
1914 // true->false
1915 EXPECT_TRUE(channel_->SetSend(false));
1916 EXPECT_FALSE(stream->IsSending());
1917 // false->false
1918 EXPECT_TRUE(channel_->SetSend(false));
1919 EXPECT_FALSE(stream->IsSending());
1920
1921 EXPECT_TRUE(channel_->SetSend(true));
1922 FakeVideoSendStream* new_stream = AddSendStream();
1923 EXPECT_TRUE(new_stream->IsSending())
1924 << "Send stream created after SetSend(true) not sending initially.";
1925}
1926
pbos@webrtc.orgd8198032014-11-10 14:41:43 +00001927// This test verifies DSCP settings are properly applied on video media channel.
1928TEST_F(WebRtcVideoChannel2Test, TestSetDscpOptions) {
1929 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
1930 new cricket::FakeNetworkInterface);
1931 channel_->SetInterface(network_interface.get());
1932 cricket::VideoOptions options;
1933 options.dscp.Set(true);
1934 EXPECT_TRUE(channel_->SetOptions(options));
1935 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
1936 // Verify previous value is not modified if dscp option is not set.
1937 cricket::VideoOptions options1;
1938 EXPECT_TRUE(channel_->SetOptions(options1));
1939 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
1940 options.dscp.Set(false);
1941 EXPECT_TRUE(channel_->SetOptions(options));
1942 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
1943 channel_->SetInterface(NULL);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001944}
1945
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00001946TEST_F(WebRtcVideoChannel2Test, OnReadyToSendSignalsNetworkState) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001947 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00001948
1949 channel_->OnReadyToSend(false);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001950 EXPECT_EQ(webrtc::Call::kNetworkDown, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00001951
1952 channel_->OnReadyToSend(true);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001953 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001954}
1955
pbos@webrtc.org273a4142014-12-01 15:23:21 +00001956TEST_F(WebRtcVideoChannel2Test, GetStatsReportsUpperResolution) {
1957 FakeVideoSendStream* stream = AddSendStream();
1958 webrtc::VideoSendStream::Stats stats;
1959 stats.substreams[17].sent_width = 123;
1960 stats.substreams[17].sent_height = 40;
1961 stats.substreams[42].sent_width = 80;
1962 stats.substreams[42].sent_height = 31;
1963 stats.substreams[11].sent_width = 20;
1964 stats.substreams[11].sent_height = 90;
1965 stream->SetStats(stats);
1966
1967 cricket::VideoMediaInfo info;
1968 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
1969 ASSERT_EQ(1u, info.senders.size());
1970 EXPECT_EQ(123, info.senders[0].send_frame_width);
1971 EXPECT_EQ(90, info.senders[0].send_frame_height);
1972}
1973
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00001974TEST_F(WebRtcVideoChannel2Test, TranslatesCallStatsCorrectly) {
1975 AddSendStream();
1976 AddSendStream();
1977 webrtc::Call::Stats stats;
1978 stats.rtt_ms = 123;
1979 fake_call_->SetStats(stats);
1980
1981 cricket::VideoMediaInfo info;
1982 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
1983 ASSERT_EQ(2u, info.senders.size());
1984 EXPECT_EQ(stats.rtt_ms, info.senders[0].rtt_ms);
1985 EXPECT_EQ(stats.rtt_ms, info.senders[1].rtt_ms);
1986}
1987
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00001988class WebRtcVideoEngine2SimulcastTest : public testing::Test {
1989 public:
1990 WebRtcVideoEngine2SimulcastTest()
1991 : engine_codecs_(engine_.codecs()) {
1992 assert(!engine_codecs_.empty());
1993
1994 bool codec_set = false;
1995 for (size_t i = 0; i < engine_codecs_.size(); ++i) {
1996 if (engine_codecs_[i].name == "red") {
1997 default_red_codec_ = engine_codecs_[i];
1998 } else if (engine_codecs_[i].name == "ulpfec") {
1999 default_ulpfec_codec_ = engine_codecs_[i];
2000 } else if (engine_codecs_[i].name == "rtx") {
2001 default_rtx_codec_ = engine_codecs_[i];
2002 } else if (!codec_set) {
2003 default_codec_ = engine_codecs_[i];
2004 codec_set = true;
2005 }
2006 }
2007
2008 assert(codec_set);
2009 }
2010
2011 protected:
2012 WebRtcVideoEngine2 engine_;
2013 VideoCodec default_codec_;
2014 VideoCodec default_red_codec_;
2015 VideoCodec default_ulpfec_codec_;
2016 VideoCodec default_rtx_codec_;
2017 // TODO(pbos): Remove engine_codecs_ unless used a lot.
2018 std::vector<VideoCodec> engine_codecs_;
2019};
2020
2021class WebRtcVideoChannel2SimulcastTest : public WebRtcVideoEngine2SimulcastTest,
2022 public WebRtcCallFactory {
2023 public:
2024 WebRtcVideoChannel2SimulcastTest() : fake_call_(NULL) {}
2025
2026 virtual void SetUp() OVERRIDE {
2027 engine_.SetCallFactory(this);
2028 engine_.Init(rtc::Thread::Current());
2029 channel_.reset(engine_.CreateChannel(VideoOptions(), NULL));
2030 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
2031 last_ssrc_ = 123;
2032 }
2033
2034 protected:
2035 virtual webrtc::Call* CreateCall(
2036 const webrtc::Call::Config& config) OVERRIDE {
2037 assert(fake_call_ == NULL);
2038 fake_call_ = new FakeCall(config);
2039 return fake_call_;
2040 }
2041
2042 void VerifySimulcastSettings(const VideoCodec& codec,
2043 VideoOptions::HighestBitrate bitrate_mode,
2044 size_t num_configured_streams,
2045 size_t expected_num_streams,
2046 SimulcastBitrateMode simulcast_bitrate_mode) {
2047 cricket::VideoOptions options;
2048 options.video_highest_bitrate.Set(bitrate_mode);
2049 EXPECT_TRUE(channel_->SetOptions(options));
2050
2051 std::vector<VideoCodec> codecs;
2052 codecs.push_back(codec);
2053 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
2054
2055 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
2056 assert(num_configured_streams <= ssrcs.size());
2057 ssrcs.resize(num_configured_streams);
2058
2059 FakeVideoSendStream* stream =
2060 AddSendStream(CreateSimStreamParams("cname", ssrcs));
2061
2062 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
2063 ASSERT_EQ(expected_num_streams, video_streams.size());
2064
2065 std::vector<webrtc::VideoStream> expected_streams = GetSimulcastConfig(
2066 num_configured_streams,
2067 simulcast_bitrate_mode,
2068 codec.width,
2069 codec.height,
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002070 0,
2071 kDefaultQpMax,
2072 codec.framerate != 0 ? codec.framerate : kDefaultFramerate);
2073
2074 ASSERT_EQ(expected_streams.size(), video_streams.size());
2075
2076 size_t num_streams = video_streams.size();
2077 for (size_t i = 0; i < num_streams; ++i) {
2078 EXPECT_EQ(expected_streams[i].width, video_streams[i].width);
2079 EXPECT_EQ(expected_streams[i].height, video_streams[i].height);
2080
2081 EXPECT_GT(video_streams[i].max_framerate, 0);
2082 EXPECT_EQ(expected_streams[i].max_framerate,
2083 video_streams[i].max_framerate);
2084
2085 EXPECT_GT(video_streams[i].min_bitrate_bps, 0);
2086 EXPECT_EQ(expected_streams[i].min_bitrate_bps,
2087 video_streams[i].min_bitrate_bps);
2088
2089 EXPECT_GT(video_streams[i].target_bitrate_bps, 0);
2090 EXPECT_EQ(expected_streams[i].target_bitrate_bps,
2091 video_streams[i].target_bitrate_bps);
2092
2093 EXPECT_GT(video_streams[i].max_bitrate_bps, 0);
2094 EXPECT_EQ(expected_streams[i].max_bitrate_bps,
2095 video_streams[i].max_bitrate_bps);
2096
2097 EXPECT_GT(video_streams[i].max_qp, 0);
2098 EXPECT_EQ(expected_streams[i].max_qp, video_streams[i].max_qp);
2099
2100 EXPECT_FALSE(expected_streams[i].temporal_layer_thresholds_bps.empty());
2101 EXPECT_EQ(expected_streams[i].temporal_layer_thresholds_bps,
2102 video_streams[i].temporal_layer_thresholds_bps);
2103 }
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002104 }
2105
2106 FakeVideoSendStream* AddSendStream() {
2107 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
2108 }
2109
2110 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
2111 size_t num_streams =
2112 fake_call_->GetVideoSendStreams().size();
2113 EXPECT_TRUE(channel_->AddSendStream(sp));
2114 std::vector<FakeVideoSendStream*> streams =
2115 fake_call_->GetVideoSendStreams();
2116 EXPECT_EQ(num_streams + 1, streams.size());
2117 return streams[streams.size() - 1];
2118 }
2119
2120 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
2121 return fake_call_->GetVideoSendStreams();
2122 }
2123
2124 FakeVideoReceiveStream* AddRecvStream() {
2125 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
2126 }
2127
2128 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
2129 size_t num_streams =
2130 fake_call_->GetVideoReceiveStreams().size();
2131 EXPECT_TRUE(channel_->AddRecvStream(sp));
2132 std::vector<FakeVideoReceiveStream*> streams =
2133 fake_call_->GetVideoReceiveStreams();
2134 EXPECT_EQ(num_streams + 1, streams.size());
2135 return streams[streams.size() - 1];
2136 }
2137
2138 FakeCall* fake_call_;
2139 rtc::scoped_ptr<VideoMediaChannel> channel_;
2140 uint32 last_ssrc_;
2141};
2142
2143TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith2SimulcastStreams) {
2144 VerifySimulcastSettings(kVp8Codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2145}
2146
2147TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith3SimulcastStreams) {
2148 VerifySimulcastSettings(
2149 kVp8Codec720p, VideoOptions::NORMAL, 3, 3, SBM_NORMAL);
2150}
2151
2152TEST_F(WebRtcVideoChannel2SimulcastTest,
2153 SetSendCodecsWith2SimulcastStreamsHighBitrateMode) {
2154 VerifySimulcastSettings(kVp8Codec, VideoOptions::HIGH, 2, 2, SBM_HIGH);
2155}
2156
2157TEST_F(WebRtcVideoChannel2SimulcastTest,
2158 SetSendCodecsWith3SimulcastStreamsHighBitrateMode) {
2159 VerifySimulcastSettings(kVp8Codec720p, VideoOptions::HIGH, 3, 3, SBM_HIGH);
2160}
2161
2162TEST_F(WebRtcVideoChannel2SimulcastTest,
2163 SetSendCodecsWith2SimulcastStreamsVeryHighBitrateMode) {
2164 VerifySimulcastSettings(
2165 kVp8Codec, VideoOptions::VERY_HIGH, 2, 2, SBM_VERY_HIGH);
2166}
2167
2168TEST_F(WebRtcVideoChannel2SimulcastTest,
2169 SetSendCodecsWith3SimulcastStreamsVeryHighBitrateMode) {
2170 VerifySimulcastSettings(
2171 kVp8Codec720p, VideoOptions::VERY_HIGH, 3, 3, SBM_VERY_HIGH);
2172}
2173
2174// Test that we normalize send codec format size in simulcast.
2175TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) {
2176 cricket::VideoCodec codec(kVp8Codec270p);
2177 codec.width += 1;
2178 codec.height += 1;
2179 VerifySimulcastSettings(codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2180}
2181
2182// Test that if we add a stream with RTX SSRC's, SSRC's get set correctly.
2183TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestStreamWithRtx) {
2184 // TODO(pbos): Implement.
2185 FAIL() << "Not implemented.";
2186}
2187
2188// Test that if we get too few ssrcs are given in AddSendStream(),
2189// only supported sub-streams will be added.
2190TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TooFewSimulcastSsrcs) {
2191 // TODO(pbos): Implement.
2192 FAIL() << "Not implemented.";
2193}
2194
2195// Test that even more than enough ssrcs are given in AddSendStream(),
2196// only supported sub-streams will be added.
2197TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_MoreThanEnoughSimulcastSscrs) {
2198 // TODO(pbos): Implement.
2199 FAIL() << "Not implemented.";
2200}
2201
2202// Test that SetSendStreamFormat works well with simulcast.
2203TEST_F(WebRtcVideoEngine2SimulcastTest,
2204 DISABLED_SetSendStreamFormatWithSimulcast) {
2205 // TODO(pbos): Implement.
2206 FAIL() << "Not implemented.";
2207}
2208
2209// Test that simulcast send codec is reset on new video frame size.
2210TEST_F(WebRtcVideoEngine2SimulcastTest,
2211 DISABLED_ResetSimulcastSendCodecOnNewFrameSize) {
2212 // TODO(pbos): Implement.
2213 FAIL() << "Not implemented.";
2214}
2215
2216// Test that simulcast send codec is reset on new portait mode video frame.
2217TEST_F(WebRtcVideoEngine2SimulcastTest,
2218 DISABLED_ResetSimulcastSendCodecOnNewPortaitFrame) {
2219 // TODO(pbos): Implement.
2220 FAIL() << "Not implemented.";
2221}
2222
2223TEST_F(WebRtcVideoEngine2SimulcastTest,
2224 DISABLED_SetBandwidthInConferenceWithSimulcast) {
2225 // TODO(pbos): Implement.
2226 FAIL() << "Not implemented.";
2227}
2228
2229// Test that sending screencast frames in conference mode changes
2230// bitrate.
2231TEST_F(WebRtcVideoEngine2SimulcastTest,
2232 DISABLED_SetBandwidthScreencastInConference) {
2233 // TODO(pbos): Implement.
2234 FAIL() << "Not implemented.";
2235}
2236
2237// Test AddSendStream with simulcast rejects bad StreamParams.
2238TEST_F(WebRtcVideoEngine2SimulcastTest,
2239 DISABLED_AddSendStreamWithBadStreamParams) {
2240 // TODO(pbos): Implement.
2241 FAIL() << "Not implemented.";
2242}
2243
2244// Test AddSendStream with simulcast sets ssrc and cname correctly.
2245TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_AddSendStreamWithSimulcast) {
2246 // TODO(pbos): Implement.
2247 FAIL() << "Not implemented.";
2248}
2249
2250// Test RemoveSendStream with simulcast.
2251TEST_F(WebRtcVideoEngine2SimulcastTest,
2252 DISABLED_RemoveSendStreamWithSimulcast) {
2253 // TODO(pbos): Implement.
2254 FAIL() << "Not implemented.";
2255}
2256
2257// Test AddSendStream after send codec has already been set will reset
2258// send codec with simulcast settings.
2259TEST_F(WebRtcVideoEngine2SimulcastTest,
2260 DISABLED_AddSimulcastStreamAfterSetSendCodec) {
2261 // TODO(pbos): Implement.
2262 FAIL() << "Not implemented.";
2263}
2264
2265TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_GetStatsWithMultipleSsrcs) {
2266 // TODO(pbos): Implement.
2267 FAIL() << "Not implemented.";
2268}
2269
2270// Test receiving channel(s) local ssrc is set to the same as the first
2271// simulcast sending ssrc.
2272TEST_F(WebRtcVideoEngine2SimulcastTest,
2273 DISABLED_AddSimulcastStreamAfterCreatingRecvChannels) {
2274 // TODO(pbos): Implement.
2275 FAIL() << "Not implemented.";
2276}
2277
2278// Test 1:1 call never turn on simulcast.
2279TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_NoSimulcastWith1on1) {
2280 // TODO(pbos): Implement.
2281 FAIL() << "Not implemented.";
2282}
2283
2284// Test SetOptions with OPT_CONFERENCE flag.
2285TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_SetOptionsWithConferenceMode) {
2286 // TODO(pbos): Implement.
2287 FAIL() << "Not implemented.";
2288}
2289
2290// Test that two different streams can have different formats.
2291TEST_F(WebRtcVideoEngine2SimulcastTest,
2292 DISABLED_MultipleSendStreamsDifferentFormats) {
2293 // TODO(pbos): Implement.
2294 FAIL() << "Not implemented.";
2295}
2296
2297TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToOutputFormat) {
2298 // TODO(pbos): Implement.
2299 FAIL() << "Not implemented.";
2300}
2301
2302TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToCpuLoad) {
2303 // TODO(pbos): Implement.
2304 FAIL() << "Not implemented.";
2305}
2306
2307TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToCpuLoadDisabled) {
2308 // TODO(pbos): Implement.
2309 FAIL() << "Not implemented.";
2310}
2311
2312TEST_F(WebRtcVideoEngine2SimulcastTest,
2313 DISABLED_TestAdaptWithCpuOveruseObserver) {
2314 // TODO(pbos): Implement.
2315 FAIL() << "Not implemented.";
2316}
2317
2318// Test that codec is not reset for every frame sent in non-conference and
2319// non-screencast mode.
2320TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_DontResetCodecOnSendFrame) {
2321 // TODO(pbos): Implement.
2322 FAIL() << "Not implemented.";
2323}
2324
2325TEST_F(WebRtcVideoEngine2SimulcastTest,
2326 DISABLED_UseSimulcastAdapterOnVp8OnlyFactory) {
2327 // TODO(pbos): Implement.
2328 FAIL() << "Not implemented.";
2329}
2330
2331TEST_F(WebRtcVideoEngine2SimulcastTest,
2332 DISABLED_DontUseSimulcastAdapterOnNoneVp8Factory) {
2333 // TODO(pbos): Implement.
2334 FAIL() << "Not implemented.";
2335}
2336
2337TEST_F(WebRtcVideoEngine2SimulcastTest,
2338 DISABLED_DontUseSimulcastAdapterOnMultipleCodecsFactory) {
2339 // TODO(pbos): Implement.
2340 FAIL() << "Not implemented.";
2341}
2342
2343TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x800) {
2344 // TODO(pbos): Implement.
2345 FAIL() << "Not implemented.";
2346}
2347
2348TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x720) {
2349 // TODO(pbos): Implement.
2350 FAIL() << "Not implemented.";
2351}
2352
2353TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x540) {
2354 // TODO(pbos): Implement.
2355 FAIL() << "Not implemented.";
2356}
2357
2358TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x600) {
2359 // TODO(pbos): Implement.
2360 FAIL() << "Not implemented.";
2361}
2362
2363TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x400) {
2364 // TODO(pbos): Implement.
2365 FAIL() << "Not implemented.";
2366}
2367
2368TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x360) {
2369 // TODO(pbos): Implement.
2370 FAIL() << "Not implemented.";
2371}
2372
2373TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_480x300) {
2374 // TODO(pbos): Implement.
2375 FAIL() << "Not implemented.";
2376}
2377
2378TEST_F(WebRtcVideoChannel2SimulcastTest,
2379 DISABLED_DISABLED_SimulcastSend_480x270) {
2380 // TODO(pbos): Implement.
2381 FAIL() << "Not implemented.";
2382}
2383
2384TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x200) {
2385 // TODO(pbos): Implement.
2386 FAIL() << "Not implemented.";
2387}
2388
2389TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x180) {
2390 // TODO(pbos): Implement.
2391 FAIL() << "Not implemented.";
2392}
2393
2394// Test reset send codec with simulcast.
2395// Disabled per b/6773425
2396TEST_F(WebRtcVideoChannel2SimulcastTest,
2397 DISABLED_DISABLED_SimulcastResetSendCodec) {
2398 // TODO(pbos): Implement.
2399 FAIL() << "Not implemented.";
2400}
2401
2402// Test simulcast streams are decodeable with expected sizes.
2403TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastStreams) {
2404 // TODO(pbos): Implement.
2405 FAIL() << "Not implemented.";
2406}
2407
2408// Simulcast and resolution resizing should be turned off when screencasting
2409// but not otherwise.
2410TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_ScreencastRendering) {
2411 // TODO(pbos): Implement.
2412 FAIL() << "Not implemented.";
2413}
2414
2415// Ensures that the correct settings are applied to the codec when single
2416// temporal layer screencasting is enabled, and that the correct simulcast
2417// settings are reapplied when disabling screencasting.
2418TEST_F(WebRtcVideoChannel2SimulcastTest,
2419 DISABLED_OneTemporalLayerScreencastSettings) {
2420 // TODO(pbos): Implement.
2421 FAIL() << "Not implemented.";
2422}
2423
2424// Ensures that the correct settings are applied to the codec when two temporal
2425// layer screencasting is enabled, and that the correct simulcast settings are
2426// reapplied when disabling screencasting.
2427TEST_F(WebRtcVideoChannel2SimulcastTest,
2428 DISABLED_TwoTemporalLayerScreencastSettings) {
2429 // TODO(pbos): Implement.
2430 FAIL() << "Not implemented.";
2431}
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002432
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002433} // namespace cricket