blob: 93660a57224c4eabcbf5a140abbb2ba29a6e1118 [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.orgb5a22b12014-05-13 11:07:01 +000037#include "talk/media/webrtc/webrtcvideoengine2.h"
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000038#include "talk/media/webrtc/webrtcvideoengine2_unittest.h"
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +000039#include "talk/media/webrtc/webrtcvoiceengine.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000040#include "webrtc/base/gunit.h"
41#include "webrtc/base/stringutils.h"
pbos@webrtc.org42684be2014-10-03 11:25:45 +000042#include "webrtc/video_encoder.h"
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000043
44namespace {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000045static const int kDefaultQpMax = 56;
46static const int kDefaultFramerate = 30;
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000047
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000048static const cricket::VideoCodec kVp8Codec720p(100, "VP8", 1280, 720, 30, 0);
49static const cricket::VideoCodec kVp8Codec360p(100, "VP8", 640, 360, 30, 0);
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000050static const cricket::VideoCodec kVp8Codec270p(100, "VP8", 480, 270, 30, 0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000051
52static const cricket::VideoCodec kVp8Codec(100, "VP8", 640, 400, 30, 0);
53static const cricket::VideoCodec kVp9Codec(101, "VP9", 640, 400, 30, 0);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +000054static const cricket::VideoCodec kH264Codec(102, "H264", 640, 400, 30, 0);
55
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000056static const cricket::VideoCodec kRedCodec(116, "red", 0, 0, 0, 0);
57static const cricket::VideoCodec kUlpfecCodec(117, "ulpfec", 0, 0, 0, 0);
58
59static const uint32 kSsrcs1[] = {1};
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000060static const uint32 kSsrcs3[] = {1, 2, 3};
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000061static const uint32 kRtxSsrcs1[] = {4};
pbos@webrtc.org3c107582014-07-20 15:27:35 +000062static const char kUnsupportedExtensionName[] =
63 "urn:ietf:params:rtp-hdrext:unsupported";
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +000064
65void VerifyCodecHasDefaultFeedbackParams(const cricket::VideoCodec& codec) {
66 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
67 cricket::kRtcpFbParamNack, cricket::kParamValueEmpty)));
68 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
69 cricket::kRtcpFbParamNack, cricket::kRtcpFbNackParamPli)));
70 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
71 cricket::kRtcpFbParamRemb, cricket::kParamValueEmpty)));
72 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
73 cricket::kRtcpFbParamCcm, cricket::kRtcpFbCcmParamFir)));
74}
75
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000076} // namespace
77
78namespace cricket {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000079FakeVideoSendStream::FakeVideoSendStream(
80 const webrtc::VideoSendStream::Config& config,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +000081 const webrtc::VideoEncoderConfig& encoder_config)
pbos@webrtc.org42684be2014-10-03 11:25:45 +000082 : sending_(false),
83 config_(config),
84 codec_settings_set_(false),
85 num_swapped_frames_(0) {
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +000086 assert(config.encoder_settings.encoder != NULL);
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +000087 ReconfigureVideoEncoder(encoder_config);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000088}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000089
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +000090webrtc::VideoSendStream::Config FakeVideoSendStream::GetConfig() const {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000091 return config_;
92}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000093
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +000094webrtc::VideoEncoderConfig FakeVideoSendStream::GetEncoderConfig() const {
95 return encoder_config_;
96}
97
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000098std::vector<webrtc::VideoStream> FakeVideoSendStream::GetVideoStreams() {
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +000099 return encoder_config_.streams;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000100}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000101
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000102bool FakeVideoSendStream::IsSending() const {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000103 return sending_;
104}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000105
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000106bool FakeVideoSendStream::GetVp8Settings(
107 webrtc::VideoCodecVP8* settings) const {
108 if (!codec_settings_set_) {
109 return false;
110 }
111
112 *settings = vp8_settings_;
113 return true;
114}
115
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000116int FakeVideoSendStream::GetNumberOfSwappedFrames() const {
117 return num_swapped_frames_;
118}
119
120int FakeVideoSendStream::GetLastWidth() const {
121 return last_frame_.width();
122}
123
124int FakeVideoSendStream::GetLastHeight() const {
125 return last_frame_.height();
126}
127
128void FakeVideoSendStream::SwapFrame(webrtc::I420VideoFrame* frame) {
129 ++num_swapped_frames_;
130 last_frame_.SwapFrame(frame);
131}
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000132
133void FakeVideoSendStream::SetStats(
134 const webrtc::VideoSendStream::Stats& stats) {
135 stats_ = stats;
136}
137
138webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() {
139 return stats_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000140}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000141
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000142bool FakeVideoSendStream::ReconfigureVideoEncoder(
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000143 const webrtc::VideoEncoderConfig& config) {
144 encoder_config_ = config;
145 if (config.encoder_specific_settings != NULL) {
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000146 assert(config_.encoder_settings.payload_name == "VP8");
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000147 vp8_settings_ = *reinterpret_cast<const webrtc::VideoCodecVP8*>(
148 config.encoder_specific_settings);
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000149 }
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000150 codec_settings_set_ = config.encoder_specific_settings != NULL;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000151 return true;
152}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000153
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000154webrtc::VideoSendStreamInput* FakeVideoSendStream::Input() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000155 return this;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000156}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000157
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000158void FakeVideoSendStream::Start() {
159 sending_ = true;
160}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000161
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000162void FakeVideoSendStream::Stop() {
163 sending_ = false;
164}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000165
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000166FakeVideoReceiveStream::FakeVideoReceiveStream(
167 const webrtc::VideoReceiveStream::Config& config)
168 : config_(config), receiving_(false) {
169}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000170
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000171webrtc::VideoReceiveStream::Config FakeVideoReceiveStream::GetConfig() {
172 return config_;
173}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000174
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000175bool FakeVideoReceiveStream::IsReceiving() const {
176 return receiving_;
177}
178
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000179webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const {
180 return webrtc::VideoReceiveStream::Stats();
181}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000182
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000183void FakeVideoReceiveStream::Start() {
184 receiving_ = true;
185}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000186
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000187void FakeVideoReceiveStream::Stop() {
188 receiving_ = false;
189}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000190
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000191FakeCall::FakeCall(const webrtc::Call::Config& config)
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000192 : config_(config),
193 network_state_(kNetworkUp),
194 num_created_send_streams_(0),
195 num_created_receive_streams_(0) {
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000196 SetVideoCodecs(GetDefaultVideoCodecs());
197}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000198
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000199FakeCall::~FakeCall() {
200 EXPECT_EQ(0u, video_send_streams_.size());
201 EXPECT_EQ(0u, video_receive_streams_.size());
202}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000203
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000204void FakeCall::SetVideoCodecs(const std::vector<webrtc::VideoCodec> codecs) {
205 codecs_ = codecs;
206}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000207
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000208webrtc::Call::Config FakeCall::GetConfig() const {
209 return config_;
210}
211
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000212std::vector<FakeVideoSendStream*> FakeCall::GetVideoSendStreams() {
213 return video_send_streams_;
214}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000215
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000216std::vector<FakeVideoReceiveStream*> FakeCall::GetVideoReceiveStreams() {
217 return video_receive_streams_;
218}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000219
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000220webrtc::VideoCodec FakeCall::GetEmptyVideoCodec() {
221 webrtc::VideoCodec codec;
222 codec.minBitrate = 300;
223 codec.startBitrate = 800;
224 codec.maxBitrate = 1500;
225 codec.maxFramerate = 10;
226 codec.width = 640;
227 codec.height = 480;
228 codec.qpMax = 56;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000229
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000230 return codec;
231}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000232
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000233webrtc::VideoCodec FakeCall::GetVideoCodecVp8() {
234 webrtc::VideoCodec vp8_codec = GetEmptyVideoCodec();
235 vp8_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000236 rtc::strcpyn(
237 vp8_codec.plName, ARRAY_SIZE(vp8_codec.plName), kVp8Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000238 vp8_codec.plType = kVp8Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000239
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000240 return vp8_codec;
241}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000242
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000243webrtc::VideoCodec FakeCall::GetVideoCodecVp9() {
244 webrtc::VideoCodec vp9_codec = GetEmptyVideoCodec();
245 // TODO(pbos): Add a correct codecType when webrtc has one.
246 vp9_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000247 rtc::strcpyn(
248 vp9_codec.plName, ARRAY_SIZE(vp9_codec.plName), kVp9Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000249 vp9_codec.plType = kVp9Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000250
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000251 return vp9_codec;
252}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000253
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000254std::vector<webrtc::VideoCodec> FakeCall::GetDefaultVideoCodecs() {
255 std::vector<webrtc::VideoCodec> codecs;
256 codecs.push_back(GetVideoCodecVp8());
257 // codecs.push_back(GetVideoCodecVp9());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000258
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000259 return codecs;
260}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000261
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000262webrtc::Call::NetworkState FakeCall::GetNetworkState() const {
263 return network_state_;
264}
265
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000266webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
267 const webrtc::VideoSendStream::Config& config,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000268 const webrtc::VideoEncoderConfig& encoder_config) {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000269 FakeVideoSendStream* fake_stream =
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000270 new FakeVideoSendStream(config, encoder_config);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000271 video_send_streams_.push_back(fake_stream);
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000272 ++num_created_send_streams_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000273 return fake_stream;
274}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000275
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000276void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
277 FakeVideoSendStream* fake_stream =
278 static_cast<FakeVideoSendStream*>(send_stream);
279 for (size_t i = 0; i < video_send_streams_.size(); ++i) {
280 if (video_send_streams_[i] == fake_stream) {
281 delete video_send_streams_[i];
282 video_send_streams_.erase(video_send_streams_.begin() + i);
283 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000284 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000285 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000286 ADD_FAILURE() << "DestroyVideoSendStream called with unknown paramter.";
287}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000288
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000289webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
290 const webrtc::VideoReceiveStream::Config& config) {
291 video_receive_streams_.push_back(new FakeVideoReceiveStream(config));
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000292 ++num_created_receive_streams_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000293 return video_receive_streams_[video_receive_streams_.size() - 1];
294}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000295
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000296void FakeCall::DestroyVideoReceiveStream(
297 webrtc::VideoReceiveStream* receive_stream) {
298 FakeVideoReceiveStream* fake_stream =
299 static_cast<FakeVideoReceiveStream*>(receive_stream);
300 for (size_t i = 0; i < video_receive_streams_.size(); ++i) {
301 if (video_receive_streams_[i] == fake_stream) {
302 delete video_receive_streams_[i];
303 video_receive_streams_.erase(video_receive_streams_.begin() + i);
304 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000305 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000306 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000307 ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown paramter.";
308}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000309
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000310webrtc::PacketReceiver* FakeCall::Receiver() {
311 // TODO(pbos): Fix this.
312 return NULL;
313}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000314
pbos@webrtc.org2b19f062014-12-11 13:26:09 +0000315void FakeCall::SetStats(const webrtc::Call::Stats& stats) {
316 stats_ = stats;
317}
318
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000319int FakeCall::GetNumCreatedSendStreams() const {
320 return num_created_send_streams_;
321}
322
323int FakeCall::GetNumCreatedReceiveStreams() const {
324 return num_created_receive_streams_;
325}
326
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000327webrtc::Call::Stats FakeCall::GetStats() const {
pbos@webrtc.org2b19f062014-12-11 13:26:09 +0000328 return stats_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000329}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000330
pbos@webrtc.org00873182014-11-25 14:03:34 +0000331void FakeCall::SetBitrateConfig(
332 const webrtc::Call::Config::BitrateConfig& bitrate_config) {
333 config_.stream_bitrates = bitrate_config;
334}
335
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000336void FakeCall::SignalNetworkState(webrtc::Call::NetworkState state) {
337 network_state_ = state;
338}
339
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000340class WebRtcVideoEngine2Test : public ::testing::Test {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000341 public:
pbos@webrtc.orgb648b9d2014-08-26 11:08:06 +0000342 WebRtcVideoEngine2Test() {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000343 std::vector<VideoCodec> engine_codecs = engine_.codecs();
344 assert(!engine_codecs.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000345 bool codec_set = false;
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000346 for (size_t i = 0; i < engine_codecs.size(); ++i) {
347 if (engine_codecs[i].name == "red") {
348 default_red_codec_ = engine_codecs[i];
349 } else if (engine_codecs[i].name == "ulpfec") {
350 default_ulpfec_codec_ = engine_codecs[i];
351 } else if (engine_codecs[i].name == "rtx") {
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000352 default_rtx_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000353 } else if (!codec_set) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000354 default_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000355 codec_set = true;
356 }
357 }
358
359 assert(codec_set);
360 }
361
362 protected:
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000363 class FakeCallFactory : public WebRtcCallFactory {
364 public:
365 FakeCallFactory() : fake_call_(NULL) {}
366 FakeCall* GetCall() { return fake_call_; }
367
368 private:
369 virtual webrtc::Call* CreateCall(
370 const webrtc::Call::Config& config) OVERRIDE {
371 assert(fake_call_ == NULL);
372 fake_call_ = new FakeCall(config);
373 return fake_call_;
374 }
375
376 FakeCall* fake_call_;
377 };
378
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000379 VideoMediaChannel* SetUpForExternalEncoderFactory(
380 cricket::WebRtcVideoEncoderFactory* encoder_factory,
381 const std::vector<VideoCodec>& codecs);
pbos@webrtc.orgfa553ef2014-10-20 11:07:07 +0000382
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000383 VideoMediaChannel* SetUpForExternalDecoderFactory(
384 cricket::WebRtcVideoDecoderFactory* decoder_factory,
385 const std::vector<VideoCodec>& codecs);
386
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000387 WebRtcVideoEngine2 engine_;
388 VideoCodec default_codec_;
389 VideoCodec default_red_codec_;
390 VideoCodec default_ulpfec_codec_;
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000391 VideoCodec default_rtx_codec_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000392};
393
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000394TEST_F(WebRtcVideoEngine2Test, ConfiguresAvSyncForFirstReceiveChannel) {
395 FakeCallFactory call_factory;
396 engine_.SetCallFactory(&call_factory);
397
398 WebRtcVoiceEngine voice_engine;
399 engine_.SetVoiceEngine(&voice_engine);
400 voice_engine.Init(rtc::Thread::Current());
401 engine_.Init(rtc::Thread::Current());
402
403 rtc::scoped_ptr<VoiceMediaChannel> voice_channel(
404 voice_engine.CreateChannel());
405 ASSERT_TRUE(voice_channel.get() != NULL);
406 WebRtcVoiceMediaChannel* webrtc_voice_channel =
407 static_cast<WebRtcVoiceMediaChannel*>(voice_channel.get());
408 ASSERT_NE(webrtc_voice_channel->voe_channel(), -1);
409 rtc::scoped_ptr<VideoMediaChannel> channel(
410 engine_.CreateChannel(cricket::VideoOptions(), voice_channel.get()));
411
412 FakeCall* fake_call = call_factory.GetCall();
413 ASSERT_TRUE(fake_call != NULL);
414
415 webrtc::Call::Config call_config = fake_call->GetConfig();
416
417 ASSERT_TRUE(voice_engine.voe()->engine() != NULL);
418 ASSERT_EQ(voice_engine.voe()->engine(), call_config.voice_engine);
419
420 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc)));
421 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc + 1)));
422 std::vector<FakeVideoReceiveStream*> receive_streams =
423 fake_call->GetVideoReceiveStreams();
424
425 ASSERT_EQ(2u, receive_streams.size());
426 EXPECT_EQ(webrtc_voice_channel->voe_channel(),
427 receive_streams[0]->GetConfig().audio_channel_id);
428 EXPECT_EQ(-1, receive_streams[1]->GetConfig().audio_channel_id)
429 << "AV sync should only be set up for the first receive channel.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000430}
431
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000432TEST_F(WebRtcVideoEngine2Test, FindCodec) {
433 const std::vector<cricket::VideoCodec>& c = engine_.codecs();
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000434 EXPECT_EQ(4U, c.size());
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000435
436 cricket::VideoCodec vp8(104, "VP8", 320, 200, 30, 0);
437 EXPECT_TRUE(engine_.FindCodec(vp8));
438
439 cricket::VideoCodec vp8_ci(104, "vp8", 320, 200, 30, 0);
440 EXPECT_TRUE(engine_.FindCodec(vp8));
441
442 cricket::VideoCodec vp8_diff_fr_diff_pref(104, "VP8", 320, 200, 50, 50);
443 EXPECT_TRUE(engine_.FindCodec(vp8_diff_fr_diff_pref));
444
445 cricket::VideoCodec vp8_diff_id(95, "VP8", 320, 200, 30, 0);
446 EXPECT_FALSE(engine_.FindCodec(vp8_diff_id));
447 vp8_diff_id.id = 97;
448 EXPECT_TRUE(engine_.FindCodec(vp8_diff_id));
449
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000450 // FindCodec ignores the codec size.
451 // Test that FindCodec can accept uncommon codec size.
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000452 cricket::VideoCodec vp8_diff_res(104, "VP8", 320, 111, 30, 0);
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000453 EXPECT_TRUE(engine_.FindCodec(vp8_diff_res));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000454
455 // PeerConnection doesn't negotiate the resolution at this point.
456 // Test that FindCodec can handle the case when width/height is 0.
457 cricket::VideoCodec vp8_zero_res(104, "VP8", 0, 0, 30, 0);
458 EXPECT_TRUE(engine_.FindCodec(vp8_zero_res));
459
460 cricket::VideoCodec red(101, "RED", 0, 0, 30, 0);
461 EXPECT_TRUE(engine_.FindCodec(red));
462
463 cricket::VideoCodec red_ci(101, "red", 0, 0, 30, 0);
464 EXPECT_TRUE(engine_.FindCodec(red));
465
466 cricket::VideoCodec fec(102, "ULPFEC", 0, 0, 30, 0);
467 EXPECT_TRUE(engine_.FindCodec(fec));
468
469 cricket::VideoCodec fec_ci(102, "ulpfec", 0, 0, 30, 0);
470 EXPECT_TRUE(engine_.FindCodec(fec));
471
472 cricket::VideoCodec rtx(96, "rtx", 0, 0, 30, 0);
473 EXPECT_TRUE(engine_.FindCodec(rtx));
474}
475
476TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
477 std::vector<VideoCodec> engine_codecs = engine_.codecs();
478 for (size_t i = 0; i < engine_codecs.size(); ++i) {
479 if (engine_codecs[i].name != kRtxCodecName)
480 continue;
481 int associated_payload_type;
482 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000483 &associated_payload_type));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000484 EXPECT_EQ(default_codec_.id, associated_payload_type);
485 return;
486 }
487 FAIL() << "No RTX codec found among default codecs.";
488}
489
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000490TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
491 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
492 ASSERT_FALSE(extensions.empty());
493 for (size_t i = 0; i < extensions.size(); ++i) {
494 if (extensions[i].uri == kRtpTimestampOffsetHeaderExtension) {
495 EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extensions[i].id);
496 return;
497 }
498 }
499 FAIL() << "Timestamp offset extension not in header-extension list.";
500}
501
502TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
503 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
504 ASSERT_FALSE(extensions.empty());
505 for (size_t i = 0; i < extensions.size(); ++i) {
506 if (extensions[i].uri == kRtpAbsoluteSenderTimeHeaderExtension) {
507 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId,
508 extensions[i].id);
509 return;
510 }
511 }
512 FAIL() << "Absolute Sender Time extension not in header-extension list.";
513}
514
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000515TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000516 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000517 rtc::scoped_ptr<VideoMediaChannel> channel(
518 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000519
520 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
521
522 EXPECT_FALSE(channel->SetSend(true))
523 << "Channel should not start without codecs.";
524 EXPECT_TRUE(channel->SetSend(false))
525 << "Channel should be stoppable even without set codecs.";
526}
527
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000528TEST_F(WebRtcVideoEngine2Test, GetStatsWithoutSendCodecsSetDoesNotCrash) {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000529 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000530 rtc::scoped_ptr<VideoMediaChannel> channel(
531 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000532 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
533 VideoMediaInfo info;
534 channel->GetStats(&info);
535}
536
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000537TEST_F(WebRtcVideoEngine2Test, UseExternalFactoryForVp8WhenSupported) {
538 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
539 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
540 std::vector<cricket::VideoCodec> codecs;
541 codecs.push_back(kVp8Codec);
542
543 rtc::scoped_ptr<VideoMediaChannel> channel(
544 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
545
546 EXPECT_TRUE(
547 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
548 ASSERT_EQ(1u, encoder_factory.encoders().size());
549 EXPECT_TRUE(channel->SetSend(true));
550
551 cricket::FakeVideoCapturer capturer;
552 EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer));
553 EXPECT_EQ(cricket::CS_RUNNING,
554 capturer.Start(capturer.GetSupportedFormats()->front()));
555 EXPECT_TRUE(capturer.CaptureFrame());
556
557 EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0,
558 kTimeout);
559
560 // Setting codecs of the same type should not reallocate the encoder.
561 EXPECT_TRUE(channel->SetSendCodecs(codecs));
562 EXPECT_EQ(1, encoder_factory.GetNumCreatedEncoders());
563
564 // Remove stream previously added to free the external encoder instance.
565 EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
566 EXPECT_EQ(0u, encoder_factory.encoders().size());
567}
568
569VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalEncoderFactory(
570 cricket::WebRtcVideoEncoderFactory* encoder_factory,
571 const std::vector<VideoCodec>& codecs) {
572 engine_.SetExternalEncoderFactory(encoder_factory);
573 engine_.Init(rtc::Thread::Current());
574
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000575 VideoMediaChannel* channel =
576 engine_.CreateChannel(cricket::VideoOptions(), NULL);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000577 EXPECT_TRUE(channel->SetSendCodecs(codecs));
578
579 return channel;
580}
581
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000582VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalDecoderFactory(
583 cricket::WebRtcVideoDecoderFactory* decoder_factory,
584 const std::vector<VideoCodec>& codecs) {
585 engine_.SetExternalDecoderFactory(decoder_factory);
586 engine_.Init(rtc::Thread::Current());
587
588 VideoMediaChannel* channel =
589 engine_.CreateChannel(cricket::VideoOptions(), NULL);
590 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
591
592 return channel;
593}
594
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000595TEST_F(WebRtcVideoEngine2Test, ChannelWithExternalH264CanChangeToInternalVp8) {
596 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
597 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
598 std::vector<cricket::VideoCodec> codecs;
599 codecs.push_back(kH264Codec);
600
601 rtc::scoped_ptr<VideoMediaChannel> channel(
602 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
603
604 EXPECT_TRUE(
605 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
606 ASSERT_EQ(1u, encoder_factory.encoders().size());
607
608 codecs.clear();
609 codecs.push_back(kVp8Codec);
610 EXPECT_TRUE(channel->SetSendCodecs(codecs));
611
612 ASSERT_EQ(0u, encoder_factory.encoders().size());
613}
614
615TEST_F(WebRtcVideoEngine2Test,
616 DontUseExternalEncoderFactoryForUnsupportedCodecs) {
617 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
618 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
619 std::vector<cricket::VideoCodec> codecs;
620 codecs.push_back(kVp8Codec);
621
622 rtc::scoped_ptr<VideoMediaChannel> channel(
623 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
624
625 EXPECT_TRUE(
626 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
627 ASSERT_EQ(0u, encoder_factory.encoders().size());
628}
629
630// Test external codec with be added to the end of the supported codec list.
631TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) {
632 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
633 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
634 engine_.SetExternalEncoderFactory(&encoder_factory);
635
636 engine_.Init(rtc::Thread::Current());
637
638 std::vector<cricket::VideoCodec> codecs(engine_.codecs());
639 ASSERT_GE(codecs.size(), 2u);
640 cricket::VideoCodec internal_codec = codecs.front();
641 cricket::VideoCodec external_codec = codecs.back();
642
643 // The external codec will appear at last.
644 EXPECT_EQ("VP8", internal_codec.name);
645 EXPECT_EQ("H264", external_codec.name);
646}
647
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000648TEST_F(WebRtcVideoEngine2Test, RegisterExternalDecodersIfSupported) {
649 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
650 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
651 std::vector<cricket::VideoCodec> codecs;
652 codecs.push_back(kVp8Codec);
653
654 rtc::scoped_ptr<VideoMediaChannel> channel(
655 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
656
657 EXPECT_TRUE(
658 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
659 ASSERT_EQ(1u, decoder_factory.decoders().size());
660
661 // Setting codecs of the same type should not reallocate the decoder.
662 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
663 EXPECT_EQ(1, decoder_factory.GetNumCreatedDecoders());
664
665 // Remove stream previously added to free the external decoder instance.
666 EXPECT_TRUE(channel->RemoveRecvStream(kSsrc));
667 EXPECT_EQ(0u, decoder_factory.decoders().size());
668}
669
670// Verifies that we can set up decoders that are not internally supported.
671TEST_F(WebRtcVideoEngine2Test, RegisterExternalH264DecoderIfSupported) {
672 // TODO(pbos): Do not assume that encoder/decoder support is symmetric. We
673 // can't even query the WebRtcVideoDecoderFactory for supported codecs.
674 // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported
675 // codecs.
676 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
677 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
678 engine_.SetExternalEncoderFactory(&encoder_factory);
679 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
680 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
681 std::vector<cricket::VideoCodec> codecs;
682 codecs.push_back(kH264Codec);
683
684 rtc::scoped_ptr<VideoMediaChannel> channel(
685 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
686
687 EXPECT_TRUE(
688 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
689 ASSERT_EQ(1u, decoder_factory.decoders().size());
690}
691
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000692class WebRtcVideoEngine2BaseTest
693 : public VideoEngineTest<cricket::WebRtcVideoEngine2> {
694 protected:
695 typedef VideoEngineTest<cricket::WebRtcVideoEngine2> Base;
696};
697
698#define WEBRTC_ENGINE_BASE_TEST(test) \
699 TEST_F(WebRtcVideoEngine2BaseTest, test) { Base::test##Body(); }
700
701WEBRTC_ENGINE_BASE_TEST(ConstrainNewCodec2);
702
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000703class WebRtcVideoChannel2BaseTest
704 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
705 protected:
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000706 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000707
708 virtual cricket::VideoCodec DefaultCodec() OVERRIDE { return kVp8Codec; }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000709};
710
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000711#define WEBRTC_BASE_TEST(test) \
712 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); }
713
714#define WEBRTC_DISABLED_BASE_TEST(test) \
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000715 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_##test) { Base::test(); }
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000716
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000717// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
718#if 0
719// TODO(juberti): Figure out why ViE is munging the COM refcount.
720#ifdef WIN32
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000721WEBRTC_DISABLED_BASE_TEST(CheckCoInitialize) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000722 Base::CheckCoInitialize();
723}
724#endif
725#endif
726
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000727WEBRTC_BASE_TEST(SetSend);
728WEBRTC_BASE_TEST(SetSendWithoutCodecs);
729WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000730
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000731WEBRTC_BASE_TEST(GetStats);
732WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
733WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000734
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000735WEBRTC_BASE_TEST(SetSendBandwidth);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000736
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000737WEBRTC_BASE_TEST(SetSendSsrc);
738WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000739
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000740WEBRTC_BASE_TEST(SetRenderer);
741WEBRTC_BASE_TEST(AddRemoveRecvStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000742
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000743WEBRTC_DISABLED_BASE_TEST(AddRemoveRecvStreamAndRender);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000744
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000745WEBRTC_BASE_TEST(AddRemoveRecvStreamsNoConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000746
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000747WEBRTC_BASE_TEST(AddRemoveSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000748
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000749WEBRTC_BASE_TEST(SimulateConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000750
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000751WEBRTC_BASE_TEST(AddRemoveCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000752
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000753WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000754
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000755WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000756
757// TODO(pbos): Figure out why this fails so often.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000758WEBRTC_DISABLED_BASE_TEST(HighAspectHighHeightCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000759
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000760WEBRTC_BASE_TEST(RejectEmptyStreamParams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000761
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000762WEBRTC_BASE_TEST(AdaptResolution16x10);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000763
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000764WEBRTC_BASE_TEST(AdaptResolution4x3);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000765
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000766// TODO(juberti): Restore this test once we support sending 0 fps.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000767WEBRTC_DISABLED_BASE_TEST(AdaptDropAllFrames);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000768// TODO(juberti): Understand why we get decode errors on this test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000769WEBRTC_DISABLED_BASE_TEST(AdaptFramerate);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000770
pbos@webrtc.orgc4175b92014-09-03 15:25:49 +0000771WEBRTC_BASE_TEST(SendsLowerResolutionOnSmallerFrames);
772
773WEBRTC_BASE_TEST(MuteStream);
774
775WEBRTC_BASE_TEST(MultipleSendStreams);
776
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000777WEBRTC_BASE_TEST(SetSendStreamFormat0x0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000778
779// TODO(zhurunz): Fix the flakey test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000780WEBRTC_DISABLED_BASE_TEST(SetSendStreamFormat);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000781
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000782TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Vga) {
783 SendAndReceive(cricket::VideoCodec(100, "VP8", 640, 400, 30, 0));
784}
785
786TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Qvga) {
787 SendAndReceive(cricket::VideoCodec(100, "VP8", 320, 200, 30, 0));
788}
789
790TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8SvcQqvga) {
791 SendAndReceive(cricket::VideoCodec(100, "VP8", 160, 100, 30, 0));
792}
793
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000794TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
795 Base::TwoStreamsSendAndReceive(kVp8Codec);
796}
797
798TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
799 Base::TwoStreamsReUseFirstStream(kVp8Codec);
800}
801
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000802WEBRTC_BASE_TEST(SendManyResizeOnce);
803
804// TODO(pbos): Enable and figure out why this fails (or should work).
805TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
806 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL));
807 EXPECT_TRUE(channel_->SetRenderer(kDefaultReceiveSsrc, &renderer_));
808 channel_->UpdateAspectRatio(1280, 720);
809 video_capturer_.reset(new cricket::FakeVideoCapturer);
810 const std::vector<cricket::VideoFormat>* formats =
811 video_capturer_->GetSupportedFormats();
812 cricket::VideoFormat capture_format_hd = (*formats)[0];
813 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(capture_format_hd));
814 EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get()));
815
816 // Capture format HD -> adapt (OnOutputFormatRequest VGA) -> VGA.
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000817 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000818 EXPECT_TRUE(SetOneCodec(codec));
819 codec.width /= 2;
820 codec.height /= 2;
821 EXPECT_TRUE(SetSend(true));
822 EXPECT_TRUE(channel_->SetRender(true));
823 EXPECT_EQ(0, renderer_.num_rendered_frames());
824 EXPECT_TRUE(SendFrame());
825 EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout);
826}
827
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000828class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test,
829 public WebRtcCallFactory {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000830 public:
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000831 WebRtcVideoChannel2Test() : fake_call_(NULL) {}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000832 virtual void SetUp() OVERRIDE {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000833 engine_.SetCallFactory(this);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000834 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000835 channel_.reset(engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000836 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000837 last_ssrc_ = 123;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000838 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000839 }
840
841 protected:
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000842 virtual webrtc::Call* CreateCall(
843 const webrtc::Call::Config& config) OVERRIDE {
844 assert(fake_call_ == NULL);
845 fake_call_ = new FakeCall(config);
846 return fake_call_;
847 }
848
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000849 FakeVideoSendStream* AddSendStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000850 return AddSendStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000851 }
852
853 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000854 size_t num_streams = fake_call_->GetVideoSendStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000855 EXPECT_TRUE(channel_->AddSendStream(sp));
856 std::vector<FakeVideoSendStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000857 fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000858 EXPECT_EQ(num_streams + 1, streams.size());
859 return streams[streams.size() - 1];
860 }
861
862 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000863 return fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000864 }
865
866 FakeVideoReceiveStream* AddRecvStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000867 return AddRecvStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000868 }
869
870 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000871 size_t num_streams = fake_call_->GetVideoReceiveStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000872 EXPECT_TRUE(channel_->AddRecvStream(sp));
873 std::vector<FakeVideoReceiveStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000874 fake_call_->GetVideoReceiveStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000875 EXPECT_EQ(num_streams + 1, streams.size());
876 return streams[streams.size() - 1];
877 }
878
pbos@webrtc.org00873182014-11-25 14:03:34 +0000879 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
880 int expected_min_bitrate_bps,
881 const char* start_bitrate_kbps,
882 int expected_start_bitrate_bps,
883 const char* max_bitrate_kbps,
884 int expected_max_bitrate_bps) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000885 std::vector<VideoCodec> codecs;
886 codecs.push_back(kVp8Codec);
pbos@webrtc.org00873182014-11-25 14:03:34 +0000887 codecs[0].params[kCodecParamMinBitrate] = min_bitrate_kbps;
888 codecs[0].params[kCodecParamStartBitrate] = start_bitrate_kbps;
889 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate_kbps;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000890 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
891
pbos@webrtc.org00873182014-11-25 14:03:34 +0000892 EXPECT_EQ(expected_min_bitrate_bps,
893 fake_call_->GetConfig().stream_bitrates.min_bitrate_bps);
894 EXPECT_EQ(expected_start_bitrate_bps,
895 fake_call_->GetConfig().stream_bitrates.start_bitrate_bps);
896 EXPECT_EQ(expected_max_bitrate_bps,
897 fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000898 }
899
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000900 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
901 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000902 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000903 // Enable extension.
904 const int id = 1;
905 std::vector<cricket::RtpHeaderExtension> extensions;
906 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
907 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
908
909 FakeVideoSendStream* send_stream =
910 AddSendStream(cricket::StreamParams::CreateLegacy(123));
911
912 // Verify the send extension id.
913 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
914 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
915 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
916 // Verify call with same set of extensions returns true.
917 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
918 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
919 // receivers.
920 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
921 ->GetConfig()
922 .rtp.extensions.empty());
923
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000924 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000925 std::vector<cricket::RtpHeaderExtension> empty_extensions;
926 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000927 ASSERT_EQ(1u, call->GetVideoSendStreams().size());
928 send_stream = call->GetVideoSendStreams()[0];
929 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
930
931 // Verify that adding receive RTP header extensions adds them for existing
932 // streams.
933 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
934 send_stream = call->GetVideoSendStreams()[0];
935 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
936 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
937 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000938 }
939
940 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
941 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000942 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000943 // Enable extension.
944 const int id = 1;
945 std::vector<cricket::RtpHeaderExtension> extensions;
946 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
947 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
948
949 FakeVideoReceiveStream* recv_stream =
950 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
951
952 // Verify the recv extension id.
953 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
954 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
955 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
956 // Verify call with same set of extensions returns true.
957 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000958
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000959 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
960 // senders.
961 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
962 ->GetConfig()
963 .rtp.extensions.empty());
964
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000965 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000966 std::vector<cricket::RtpHeaderExtension> empty_extensions;
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000967 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(empty_extensions));
968 ASSERT_EQ(1u, call->GetVideoReceiveStreams().size());
969 recv_stream = call->GetVideoReceiveStreams()[0];
970 EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
971
972 // Verify that adding receive RTP header extensions adds them for existing
973 // streams.
974 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
975 recv_stream = call->GetVideoReceiveStreams()[0];
976 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
977 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
978 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000979 }
980
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000981 void TestCpuAdaptation(bool enable_overuse);
982
983 FakeCall* fake_call_;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000984 rtc::scoped_ptr<VideoMediaChannel> channel_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000985 uint32 last_ssrc_;
986};
987
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000988TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000989 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
990 EXPECT_TRUE(channel_->SetSend(true));
991 cricket::VideoOptions options;
992 options.conference_mode.Set(true);
993 EXPECT_TRUE(channel_->SetOptions(options));
994
995 // Send side.
996 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
997 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
998 FakeVideoSendStream* send_stream = AddSendStream(
999 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1000
1001 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
1002 for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
1003 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
1004
1005 // Receiver side.
1006 FakeVideoReceiveStream* recv_stream = AddRecvStream(
1007 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1008 ASSERT_GT(recv_stream->GetConfig().rtp.rtx.size(), 0u)
1009 << "No SSRCs for RTX configured by AddRecvStream.";
1010 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size())
1011 << "This test only works with one receive codec. Please update the test.";
1012 EXPECT_EQ(rtx_ssrcs[0],
1013 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
1014 // TODO(pbos): Make sure we set the RTX for correct payloads etc.
1015}
1016
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001017TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
1018 // Setup one channel with an associated RTX stream.
1019 cricket::StreamParams params =
1020 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
1021 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
1022 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
1023 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
1024 EXPECT_EQ(kRtxSsrcs1[0],
1025 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001026}
1027
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001028TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
1029 // Setup one channel without an associated RTX stream.
1030 cricket::StreamParams params =
1031 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
1032 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
1033 ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001034}
1035
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001036TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
1037 FakeVideoSendStream* send_stream =
1038 AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
1039 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
1040
1041 FakeVideoReceiveStream* recv_stream =
1042 AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
1043 ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001044}
1045
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001046// Test support for RTP timestamp offset header extension.
1047TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
1048 TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
1049 webrtc::RtpExtension::kTOffset);
1050}
1051TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
1052 TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
1053 webrtc::RtpExtension::kTOffset);
1054}
1055
1056// Test support for absolute send time header extension.
1057TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
1058 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
1059 webrtc::RtpExtension::kAbsSendTime);
1060}
1061TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
1062 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
1063 webrtc::RtpExtension::kAbsSendTime);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001064}
1065
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001066TEST_F(WebRtcVideoChannel2Test, IdenticalSendExtensionsDoesntRecreateStream) {
1067 const int kTOffsetId = 1;
1068 const int kAbsSendTimeId = 2;
1069 std::vector<cricket::RtpHeaderExtension> extensions;
1070 extensions.push_back(cricket::RtpHeaderExtension(
1071 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1072 extensions.push_back(cricket::RtpHeaderExtension(
1073 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
1074
1075 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1076 FakeVideoSendStream* send_stream =
1077 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1078
1079 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1080 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
1081
1082 // Setting the same extensions (even if in different order) shouldn't
1083 // reallocate the stream.
1084 std::reverse(extensions.begin(), extensions.end());
1085 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1086
1087 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1088
1089 // Setting different extensions should recreate the stream.
1090 extensions.resize(1);
1091 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1092
1093 EXPECT_EQ(2, fake_call_->GetNumCreatedSendStreams());
1094}
1095
1096TEST_F(WebRtcVideoChannel2Test, IdenticalRecvExtensionsDoesntRecreateStream) {
1097 const int kTOffsetId = 1;
1098 const int kAbsSendTimeId = 2;
1099 std::vector<cricket::RtpHeaderExtension> extensions;
1100 extensions.push_back(cricket::RtpHeaderExtension(
1101 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1102 extensions.push_back(cricket::RtpHeaderExtension(
1103 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
1104
1105 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1106 FakeVideoReceiveStream* send_stream =
1107 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1108
1109 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1110 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
1111
1112 // Setting the same extensions (even if in different order) shouldn't
1113 // reallocate the stream.
1114 std::reverse(extensions.begin(), extensions.end());
1115 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1116
1117 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1118
1119 // Setting different extensions should recreate the stream.
1120 extensions.resize(1);
1121 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1122
1123 EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams());
1124}
1125
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001126TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001127 SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001128 const int kUnsupportedId = 1;
1129 const int kTOffsetId = 2;
1130
1131 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001132 extensions.push_back(
1133 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1134 extensions.push_back(
1135 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001136 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1137 FakeVideoSendStream* send_stream =
1138 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1139
1140 // Only timestamp offset extension is set to send stream,
1141 // unsupported rtp extension is ignored.
1142 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
1143 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001144 send_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001145}
1146
1147TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001148 SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001149 const int kUnsupportedId = 1;
1150 const int kTOffsetId = 2;
1151
1152 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001153 extensions.push_back(
1154 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1155 extensions.push_back(
1156 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001157 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1158 FakeVideoReceiveStream* recv_stream =
1159 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1160
1161 // Only timestamp offset extension is set to receive stream,
1162 // unsupported rtp extension is ignored.
1163 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1164 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001165 recv_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001166}
1167
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001168TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001169 const size_t kNumIncorrectIds = 4;
1170 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
1171 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
1172 std::vector<cricket::RtpHeaderExtension> extensions;
1173 extensions.push_back(cricket::RtpHeaderExtension(
1174 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1175 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions))
1176 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1177 }
1178}
1179
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001180TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001181 const size_t kNumIncorrectIds = 4;
1182 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
1183 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
1184 std::vector<cricket::RtpHeaderExtension> extensions;
1185 extensions.push_back(cricket::RtpHeaderExtension(
1186 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1187 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions))
1188 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1189 }
1190}
1191
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001192TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001193 const int id = 1;
1194 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001195 extensions.push_back(
1196 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1197 extensions.push_back(
1198 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001199 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1200
1201 // Duplicate entries are also not supported.
1202 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001203 extensions.push_back(
1204 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001205 extensions.push_back(extensions.back());
1206 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1207}
1208
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001209TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001210 const int id = 1;
1211 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001212 extensions.push_back(
1213 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1214 extensions.push_back(
1215 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001216 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1217
1218 // Duplicate entries are also not supported.
1219 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001220 extensions.push_back(
1221 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001222 extensions.push_back(extensions.back());
1223 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1224}
1225
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001226TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
1227 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1228}
1229
1230TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
1231 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1232}
1233
1234TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
1235 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1236}
1237
1238TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
1239 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001240 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001241}
1242
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001243TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
1244 FakeVideoReceiveStream* stream = AddRecvStream();
1245 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001246}
1247
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001248TEST_F(WebRtcVideoChannel2Test, RembCanBeEnabledAndDisabled) {
1249 FakeVideoReceiveStream* stream = AddRecvStream();
1250 EXPECT_TRUE(stream->GetConfig().rtp.remb);
1251
1252 // Verify that REMB is turned off when codecs without REMB are set.
1253 std::vector<VideoCodec> codecs;
1254 codecs.push_back(kVp8Codec);
1255 EXPECT_TRUE(codecs[0].feedback_params.params().empty());
1256 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001257 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001258 EXPECT_FALSE(stream->GetConfig().rtp.remb);
1259
1260 // Verify that REMB is turned on when setting default codecs since the
1261 // default codecs have REMB enabled.
1262 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001263 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001264 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001265}
1266
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001267TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
1268 VerifyCodecHasDefaultFeedbackParams(default_codec_);
1269
pbos@webrtc.org19864742014-05-30 07:35:47 +00001270 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1271 EXPECT_TRUE(channel_->SetSend(true));
1272
1273 // Send side.
1274 FakeVideoSendStream* send_stream =
1275 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1276 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1277
1278 // Receiver side.
1279 FakeVideoReceiveStream* recv_stream =
1280 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1281 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1282
1283 // Nack history size should match between sender and receiver.
1284 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
1285 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001286}
1287
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001288TEST_F(WebRtcVideoChannel2Test, NackCanBeDisabled) {
1289 std::vector<VideoCodec> codecs;
1290 codecs.push_back(kVp8Codec);
1291
1292 // Send side.
1293 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1294 FakeVideoSendStream* send_stream =
1295 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1296 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
1297
1298 // Receiver side.
1299 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1300 FakeVideoReceiveStream* recv_stream =
1301 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1302 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
1303}
1304
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001305TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
1306 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1307}
1308
1309TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
1310 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1311}
1312
1313TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
1314 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1315}
1316
1317TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
1318 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1319}
1320
1321TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
1322 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1323}
1324
1325TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
1326 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1327}
1328
1329TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
1330 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1331}
1332
1333TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
1334 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1335}
1336
1337TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
1338 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1339}
1340
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001341TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) {
1342 static const int kScreenshareMinBitrateKbps = 800;
1343 cricket::VideoCodec codec = kVp8Codec360p;
1344 std::vector<cricket::VideoCodec> codecs;
1345 codecs.push_back(codec);
1346 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1347 VideoOptions options;
1348 options.screencast_min_bitrate.Set(kScreenshareMinBitrateKbps);
1349 channel_->SetOptions(options);
1350
1351 AddSendStream();
1352
1353 cricket::FakeVideoCapturer capturer;
1354 capturer.SetScreencast(false);
1355 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1356 cricket::VideoFormat capture_format_hd =
1357 capturer.GetSupportedFormats()->front();
1358 EXPECT_EQ(1280, capture_format_hd.width);
1359 EXPECT_EQ(720, capture_format_hd.height);
1360 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1361
1362 EXPECT_TRUE(channel_->SetSend(true));
1363
1364 EXPECT_TRUE(capturer.CaptureFrame());
1365 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1366 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1367
1368 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1369
1370 // Verify non-screencast settings.
1371 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1372 EXPECT_EQ(webrtc::VideoEncoderConfig::kRealtimeVideo,
1373 encoder_config.content_type);
1374 EXPECT_EQ(codec.width, encoder_config.streams.front().width);
1375 EXPECT_EQ(codec.height, encoder_config.streams.front().height);
1376 EXPECT_EQ(0, encoder_config.min_transmit_bitrate_bps)
1377 << "Non-screenshare shouldn't use min-transmit bitrate.";
1378
1379 capturer.SetScreencast(true);
1380 EXPECT_TRUE(capturer.CaptureFrame());
1381
1382 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1383
1384 // Verify screencast settings.
1385 encoder_config = send_stream->GetEncoderConfig();
1386 EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
1387 encoder_config.content_type);
1388 EXPECT_EQ(kScreenshareMinBitrateKbps * 1000,
1389 encoder_config.min_transmit_bitrate_bps);
1390
1391 EXPECT_EQ(capture_format_hd.width, encoder_config.streams.front().width);
1392 EXPECT_EQ(capture_format_hd.height, encoder_config.streams.front().height);
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +00001393 EXPECT_TRUE(encoder_config.streams[0].temporal_layer_thresholds_bps.empty());
1394
1395 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
1396}
1397
1398TEST_F(WebRtcVideoChannel2Test,
1399 ConferenceModeScreencastConfiguresTemporalLayer) {
1400 static const int kConferenceScreencastTemporalBitrateBps = 100000;
1401 VideoOptions options;
1402 options.conference_mode.Set(true);
1403 channel_->SetOptions(options);
1404
1405 AddSendStream();
1406
1407 cricket::FakeVideoCapturer capturer;
1408 capturer.SetScreencast(true);
1409 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1410 cricket::VideoFormat capture_format_hd =
1411 capturer.GetSupportedFormats()->front();
1412 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1413
1414 EXPECT_TRUE(channel_->SetSend(true));
1415
1416 EXPECT_TRUE(capturer.CaptureFrame());
1417 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1418 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1419
1420 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1421
1422 // Verify screencast settings.
1423 encoder_config = send_stream->GetEncoderConfig();
1424 EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
1425 encoder_config.content_type);
1426 ASSERT_EQ(1u, encoder_config.streams.size());
1427 ASSERT_EQ(1u, encoder_config.streams[0].temporal_layer_thresholds_bps.size());
1428 EXPECT_EQ(kConferenceScreencastTemporalBitrateBps,
1429 encoder_config.streams[0].temporal_layer_thresholds_bps[0]);
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001430
1431 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001432}
1433
1434TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
1435 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1436}
1437
1438TEST_F(WebRtcVideoChannel2Test,
1439 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
1440 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1441}
1442
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001443TEST_F(WebRtcVideoChannel2Test, SuspendBelowMinBitrateDisabledByDefault) {
1444 FakeVideoSendStream* stream = AddSendStream();
1445 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1446}
1447
1448TEST_F(WebRtcVideoChannel2Test, SetOptionsWithSuspendBelowMinBitrate) {
1449 VideoOptions options;
1450 options.suspend_below_min_bitrate.Set(true);
1451 channel_->SetOptions(options);
1452
1453 FakeVideoSendStream* stream = AddSendStream();
1454 EXPECT_TRUE(stream->GetConfig().suspend_below_min_bitrate);
1455
1456 options.suspend_below_min_bitrate.Set(false);
1457 channel_->SetOptions(options);
1458
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001459 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001460 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1461}
1462
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001463TEST_F(WebRtcVideoChannel2Test, Vp8DenoisingEnabledByDefault) {
1464 FakeVideoSendStream* stream = AddSendStream();
1465 webrtc::VideoCodecVP8 vp8_settings;
1466 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1467 EXPECT_TRUE(vp8_settings.denoisingOn);
1468}
1469
1470TEST_F(WebRtcVideoChannel2Test, SetOptionsWithDenoising) {
1471 VideoOptions options;
1472 options.video_noise_reduction.Set(false);
1473 channel_->SetOptions(options);
1474
1475 FakeVideoSendStream* stream = AddSendStream();
1476 webrtc::VideoCodecVP8 vp8_settings;
1477 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1478 EXPECT_FALSE(vp8_settings.denoisingOn);
1479
1480 options.video_noise_reduction.Set(true);
1481 channel_->SetOptions(options);
1482
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001483 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001484 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1485 EXPECT_TRUE(vp8_settings.denoisingOn);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001486}
1487
1488TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
1489 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1490}
1491
pbos@webrtc.org8aed9452014-07-26 10:16:49 +00001492TEST_F(WebRtcVideoChannel2Test, DISABLED_SendReceiveBitratesStats) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001493 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1494}
1495
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001496TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruse) {
1497 TestCpuAdaptation(true);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001498}
1499
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001500TEST_F(WebRtcVideoChannel2Test, DoesNotAdaptOnOveruseWhenDisabled) {
1501 TestCpuAdaptation(false);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001502}
1503
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001504void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse) {
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001505 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001506 std::vector<cricket::VideoCodec> codecs;
1507 codecs.push_back(codec);
1508 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1509
1510 if (enable_overuse) {
1511 VideoOptions options;
1512 options.cpu_overuse_detection.Set(true);
1513 channel_->SetOptions(options);
1514 }
1515
1516 AddSendStream();
1517
1518 cricket::FakeVideoCapturer capturer;
1519 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1520 EXPECT_EQ(cricket::CS_RUNNING,
1521 capturer.Start(capturer.GetSupportedFormats()->front()));
1522
1523 EXPECT_TRUE(channel_->SetSend(true));
1524
1525 // Trigger overuse.
1526 webrtc::LoadObserver* overuse_callback =
1527 fake_call_->GetConfig().overuse_callback;
1528 ASSERT_TRUE(overuse_callback != NULL);
1529 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
1530
1531 EXPECT_TRUE(capturer.CaptureFrame());
1532 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1533 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1534
1535 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1536
1537 if (enable_overuse) {
1538 EXPECT_LT(send_stream->GetLastWidth(), codec.width);
1539 EXPECT_LT(send_stream->GetLastHeight(), codec.height);
1540 } else {
1541 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1542 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1543 }
1544
1545 // Trigger underuse which should go back to normal resolution.
1546 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
1547 EXPECT_TRUE(capturer.CaptureFrame());
1548
1549 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1550
1551 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1552 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1553
1554 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001555}
1556
1557TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldLog) {
1558 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1559}
1560
1561TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldNotLog) {
1562 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1563}
1564
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001565TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001566 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001567
1568 VideoCodec codec;
1569 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001570 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001571
1572 // Using a RTX setup to verify that the default RTX payload type is good.
1573 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1574 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1575 FakeVideoSendStream* stream = AddSendStream(
1576 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1577 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001578
1579 // Make sure NACK and FEC are enabled on the correct payload types.
1580 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
1581 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
1582 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001583
1584 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
1585 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +00001586 EXPECT_EQ(static_cast<int>(default_rtx_codec_.id),
1587 config.rtp.rtx.payload_type);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001588 // TODO(juberti): Check RTCP, PLI, TMMBR.
1589}
1590
1591TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
1592 std::vector<VideoCodec> codecs;
1593 codecs.push_back(kVp8Codec);
1594 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1595
1596 FakeVideoSendStream* stream = AddSendStream();
1597 webrtc::VideoSendStream::Config config = stream->GetConfig();
1598
1599 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1600 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1601}
1602
1603TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001604 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1605 std::vector<VideoCodec> codecs;
1606 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1607 codecs.push_back(rtx_codec);
1608 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1609 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001610}
1611
1612TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001613 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1614 std::vector<VideoCodec> codecs;
1615 cricket::VideoCodec rtx_codec =
1616 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1617 codecs.push_back(kVp8Codec);
1618 codecs.push_back(rtx_codec);
1619 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1620
1621 cricket::VideoCodec rtx_codec2 =
1622 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1623 codecs.pop_back();
1624 codecs.push_back(rtx_codec2);
1625 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1626 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001627}
1628
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001629TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1630 std::vector<VideoCodec> codecs;
1631 codecs.push_back(kVp8Codec);
1632 codecs.push_back(kUlpfecCodec);
1633 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1634
1635 FakeVideoSendStream* stream = AddSendStream();
1636 webrtc::VideoSendStream::Config config = stream->GetConfig();
1637
1638 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1639
1640 codecs.pop_back();
1641 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001642 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001643 ASSERT_TRUE(stream != NULL);
1644 config = stream->GetConfig();
1645 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1646 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001647}
1648
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001649TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1650 std::vector<VideoCodec> codecs;
1651 codecs.push_back(kVp8Codec720p);
1652 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1653
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001654 std::vector<webrtc::VideoStream> streams = AddSendStream()->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001655 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1656 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1657
1658 codecs.clear();
1659 codecs.push_back(kVp8Codec360p);
1660 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001661 streams = fake_call_->GetVideoSendStreams()[0]->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001662 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1663 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001664}
1665
pbos@webrtc.org00873182014-11-25 14:03:34 +00001666TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithBitrates) {
1667 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1668 200000);
1669}
1670
1671TEST_F(WebRtcVideoChannel2Test,
1672 SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1673 SetSendCodecsShouldWorkForBitrates(
1674 "", 0, "", -1, "", -1);
1675}
1676
1677TEST_F(WebRtcVideoChannel2Test, SetSendCodecsCapsMinAndStartBitrate) {
1678 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001679}
1680
1681TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001682 std::vector<VideoCodec> video_codecs = engine_.codecs();
pbos@webrtc.org88ef6322014-11-04 15:29:29 +00001683 video_codecs[0].params[kCodecParamMinBitrate] = "300";
1684 video_codecs[0].params[kCodecParamMaxBitrate] = "200";
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001685 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001686}
1687
pbos@webrtc.org00873182014-11-25 14:03:34 +00001688TEST_F(WebRtcVideoChannel2Test,
1689 SetMaxSendBandwidthShouldPreserveOtherBitrates) {
1690 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1691 200000);
1692 channel_->SetMaxSendBandwidth(300000);
1693 EXPECT_EQ(100000, fake_call_->GetConfig().stream_bitrates.min_bitrate_bps)
1694 << "Setting max bitrate should keep previous min bitrate.";
1695 EXPECT_EQ(-1, fake_call_->GetConfig().stream_bitrates.start_bitrate_bps)
1696 << "Setting max bitrate should not reset start bitrate.";
1697 EXPECT_EQ(300000, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
1698}
1699
1700TEST_F(WebRtcVideoChannel2Test, SetMaxSendBandwidthShouldBeRemovable) {
1701 channel_->SetMaxSendBandwidth(300000);
1702 EXPECT_EQ(300000, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
1703 // <= 0 means disable (infinite) max bitrate.
1704 channel_->SetMaxSendBandwidth(0);
1705 EXPECT_EQ(-1, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps)
1706 << "Setting zero max bitrate did not reset start bitrate.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001707}
1708
1709TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1710 static const char* kMaxQuantization = "21";
1711 std::vector<VideoCodec> codecs;
1712 codecs.push_back(kVp8Codec);
1713 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1714 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001715 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1716 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001717
1718 VideoCodec codec;
1719 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1720 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1721}
1722
1723TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1724 std::vector<cricket::VideoCodec> codecs;
1725 codecs.push_back(kVp8Codec);
1726
1727 codecs[0].width = 0;
1728 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1729 << "Codec set though codec width is zero.";
1730
1731 codecs[0].width = kVp8Codec.width;
1732 codecs[0].height = 0;
1733 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1734 << "Codec set though codec height is zero.";
1735}
1736
1737TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
1738 // TODO(pbos): Should we only allow the dynamic range?
1739 static const size_t kNumIncorrectPayloads = 4;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001740 static const int kIncorrectPayloads[kNumIncorrectPayloads] = {
1741 -2, -1, 128, 129};
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001742 std::vector<cricket::VideoCodec> codecs;
1743 codecs.push_back(kVp8Codec);
1744 for (size_t i = 0; i < kNumIncorrectPayloads; ++i) {
1745 int payload_type = kIncorrectPayloads[i];
1746 codecs[0].id = payload_type;
1747 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1748 << "Bad payload type '" << payload_type << "' accepted.";
1749 }
1750}
1751
1752TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
1753 std::vector<cricket::VideoCodec> codecs;
1754 codecs.push_back(kVp8Codec);
1755 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
1756 codecs[0].id = payload_type;
1757 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
1758 << "Payload type '" << payload_type << "' rejected.";
1759 }
1760}
1761
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001762TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
1763 std::vector<cricket::VideoCodec> codecs;
1764 codecs.push_back(kVp8Codec);
1765 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1766}
1767
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001768// Test that we set our inbound RTX codecs properly.
1769TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
1770 std::vector<cricket::VideoCodec> codecs;
1771 codecs.push_back(kVp8Codec);
1772 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1773 codecs.push_back(rtx_codec);
1774 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1775 << "RTX codec without associated payload should be rejected.";
1776
1777 codecs[1].SetParam("apt", kVp8Codec.id + 1);
1778 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1779 << "RTX codec with invalid associated payload type should be rejected.";
1780
1781 codecs[1].SetParam("apt", kVp8Codec.id);
1782 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1783
1784 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
1785 rtx_codec2.SetParam("apt", rtx_codec.id);
1786 codecs.push_back(rtx_codec2);
1787
1788 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
1789 "as associated payload type "
1790 "should be rejected.";
1791}
1792
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001793TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
1794 std::vector<cricket::VideoCodec> codecs;
1795 codecs.push_back(kVp8Codec);
1796 codecs[0].id = 99;
1797 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1798}
1799
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001800TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001801 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001802
1803 FakeVideoReceiveStream* stream = AddRecvStream();
1804 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
pbos@webrtc.org776e6f22014-10-29 15:28:39 +00001805 EXPECT_EQ(engine_.codecs()[0].name, config.decoders[0].payload_name);
1806 EXPECT_EQ(engine_.codecs()[0].id, config.decoders[0].payload_type);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001807}
1808
1809TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
1810 std::vector<VideoCodec> codecs;
1811 codecs.push_back(kVp8Codec);
1812 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
1813 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1814}
1815
1816// TODO(pbos): Enable VP9 through external codec support
1817TEST_F(WebRtcVideoChannel2Test,
1818 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
1819 std::vector<VideoCodec> codecs;
1820 codecs.push_back(kVp8Codec);
1821 codecs.push_back(kVp9Codec);
1822 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1823}
1824
1825TEST_F(WebRtcVideoChannel2Test,
1826 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
1827 std::vector<VideoCodec> codecs;
1828 codecs.push_back(kVp8Codec);
1829 codecs.push_back(kVp9Codec);
1830 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1831 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
1832}
1833
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001834TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
1835 std::vector<VideoCodec> codecs;
1836 codecs.push_back(kVp8Codec);
1837 codecs.push_back(kUlpfecCodec);
1838 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1839
1840 FakeVideoReceiveStream* stream = AddRecvStream();
1841 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1842
1843 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1844
1845 codecs.pop_back();
1846 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001847 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001848 ASSERT_TRUE(stream != NULL);
1849 config = stream->GetConfig();
1850 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1851 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001852}
1853
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001854TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
1855 std::vector<VideoCodec> codecs;
1856 codecs.push_back(kVp8Codec);
1857 codecs.push_back(kRedCodec);
1858 codecs[1].id = codecs[0].id;
1859 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1860}
1861
1862TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
1863 std::vector<VideoCodec> codecs;
1864 codecs.push_back(kVp8Codec);
1865 codecs.push_back(kVp9Codec);
1866 codecs[1].id = codecs[0].id;
1867 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1868}
1869
1870TEST_F(WebRtcVideoChannel2Test,
1871 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
1872 std::vector<VideoCodec> codecs;
1873 codecs.push_back(kVp8Codec);
1874 codecs.push_back(kVp8Codec);
1875 codecs[1].id += 1;
1876 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1877}
1878
1879TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
1880 EXPECT_FALSE(AddSendStream()->IsSending());
1881}
1882
pbos@webrtc.org85f42942014-07-22 09:14:58 +00001883TEST_F(WebRtcVideoChannel2Test, ReceiveStreamReceivingByDefault) {
1884 EXPECT_TRUE(AddRecvStream()->IsReceiving());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001885}
1886
1887TEST_F(WebRtcVideoChannel2Test, SetSend) {
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +00001888 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001889 EXPECT_FALSE(stream->IsSending());
1890
1891 // false->true
1892 EXPECT_TRUE(channel_->SetSend(true));
1893 EXPECT_TRUE(stream->IsSending());
1894 // true->true
1895 EXPECT_TRUE(channel_->SetSend(true));
1896 EXPECT_TRUE(stream->IsSending());
1897 // true->false
1898 EXPECT_TRUE(channel_->SetSend(false));
1899 EXPECT_FALSE(stream->IsSending());
1900 // false->false
1901 EXPECT_TRUE(channel_->SetSend(false));
1902 EXPECT_FALSE(stream->IsSending());
1903
1904 EXPECT_TRUE(channel_->SetSend(true));
1905 FakeVideoSendStream* new_stream = AddSendStream();
1906 EXPECT_TRUE(new_stream->IsSending())
1907 << "Send stream created after SetSend(true) not sending initially.";
1908}
1909
pbos@webrtc.orgd8198032014-11-10 14:41:43 +00001910// This test verifies DSCP settings are properly applied on video media channel.
1911TEST_F(WebRtcVideoChannel2Test, TestSetDscpOptions) {
1912 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
1913 new cricket::FakeNetworkInterface);
1914 channel_->SetInterface(network_interface.get());
1915 cricket::VideoOptions options;
1916 options.dscp.Set(true);
1917 EXPECT_TRUE(channel_->SetOptions(options));
1918 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
1919 // Verify previous value is not modified if dscp option is not set.
1920 cricket::VideoOptions options1;
1921 EXPECT_TRUE(channel_->SetOptions(options1));
1922 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
1923 options.dscp.Set(false);
1924 EXPECT_TRUE(channel_->SetOptions(options));
1925 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
1926 channel_->SetInterface(NULL);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001927}
1928
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00001929TEST_F(WebRtcVideoChannel2Test, OnReadyToSendSignalsNetworkState) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001930 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00001931
1932 channel_->OnReadyToSend(false);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001933 EXPECT_EQ(webrtc::Call::kNetworkDown, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00001934
1935 channel_->OnReadyToSend(true);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001936 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001937}
1938
pbos@webrtc.org273a4142014-12-01 15:23:21 +00001939TEST_F(WebRtcVideoChannel2Test, GetStatsReportsUpperResolution) {
1940 FakeVideoSendStream* stream = AddSendStream();
1941 webrtc::VideoSendStream::Stats stats;
1942 stats.substreams[17].sent_width = 123;
1943 stats.substreams[17].sent_height = 40;
1944 stats.substreams[42].sent_width = 80;
1945 stats.substreams[42].sent_height = 31;
1946 stats.substreams[11].sent_width = 20;
1947 stats.substreams[11].sent_height = 90;
1948 stream->SetStats(stats);
1949
1950 cricket::VideoMediaInfo info;
1951 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
1952 ASSERT_EQ(1u, info.senders.size());
1953 EXPECT_EQ(123, info.senders[0].send_frame_width);
1954 EXPECT_EQ(90, info.senders[0].send_frame_height);
1955}
1956
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00001957TEST_F(WebRtcVideoChannel2Test, TranslatesCallStatsCorrectly) {
1958 AddSendStream();
1959 AddSendStream();
1960 webrtc::Call::Stats stats;
1961 stats.rtt_ms = 123;
1962 fake_call_->SetStats(stats);
1963
1964 cricket::VideoMediaInfo info;
1965 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
1966 ASSERT_EQ(2u, info.senders.size());
1967 EXPECT_EQ(stats.rtt_ms, info.senders[0].rtt_ms);
1968 EXPECT_EQ(stats.rtt_ms, info.senders[1].rtt_ms);
1969}
1970
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00001971class WebRtcVideoEngine2SimulcastTest : public testing::Test {
1972 public:
1973 WebRtcVideoEngine2SimulcastTest()
1974 : engine_codecs_(engine_.codecs()) {
1975 assert(!engine_codecs_.empty());
1976
1977 bool codec_set = false;
1978 for (size_t i = 0; i < engine_codecs_.size(); ++i) {
1979 if (engine_codecs_[i].name == "red") {
1980 default_red_codec_ = engine_codecs_[i];
1981 } else if (engine_codecs_[i].name == "ulpfec") {
1982 default_ulpfec_codec_ = engine_codecs_[i];
1983 } else if (engine_codecs_[i].name == "rtx") {
1984 default_rtx_codec_ = engine_codecs_[i];
1985 } else if (!codec_set) {
1986 default_codec_ = engine_codecs_[i];
1987 codec_set = true;
1988 }
1989 }
1990
1991 assert(codec_set);
1992 }
1993
1994 protected:
1995 WebRtcVideoEngine2 engine_;
1996 VideoCodec default_codec_;
1997 VideoCodec default_red_codec_;
1998 VideoCodec default_ulpfec_codec_;
1999 VideoCodec default_rtx_codec_;
2000 // TODO(pbos): Remove engine_codecs_ unless used a lot.
2001 std::vector<VideoCodec> engine_codecs_;
2002};
2003
2004class WebRtcVideoChannel2SimulcastTest : public WebRtcVideoEngine2SimulcastTest,
2005 public WebRtcCallFactory {
2006 public:
2007 WebRtcVideoChannel2SimulcastTest() : fake_call_(NULL) {}
2008
2009 virtual void SetUp() OVERRIDE {
2010 engine_.SetCallFactory(this);
2011 engine_.Init(rtc::Thread::Current());
2012 channel_.reset(engine_.CreateChannel(VideoOptions(), NULL));
2013 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
2014 last_ssrc_ = 123;
2015 }
2016
2017 protected:
2018 virtual webrtc::Call* CreateCall(
2019 const webrtc::Call::Config& config) OVERRIDE {
2020 assert(fake_call_ == NULL);
2021 fake_call_ = new FakeCall(config);
2022 return fake_call_;
2023 }
2024
2025 void VerifySimulcastSettings(const VideoCodec& codec,
2026 VideoOptions::HighestBitrate bitrate_mode,
2027 size_t num_configured_streams,
2028 size_t expected_num_streams,
2029 SimulcastBitrateMode simulcast_bitrate_mode) {
2030 cricket::VideoOptions options;
2031 options.video_highest_bitrate.Set(bitrate_mode);
2032 EXPECT_TRUE(channel_->SetOptions(options));
2033
2034 std::vector<VideoCodec> codecs;
2035 codecs.push_back(codec);
2036 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
2037
2038 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
2039 assert(num_configured_streams <= ssrcs.size());
2040 ssrcs.resize(num_configured_streams);
2041
2042 FakeVideoSendStream* stream =
2043 AddSendStream(CreateSimStreamParams("cname", ssrcs));
2044
2045 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
2046 ASSERT_EQ(expected_num_streams, video_streams.size());
2047
2048 std::vector<webrtc::VideoStream> expected_streams = GetSimulcastConfig(
2049 num_configured_streams,
2050 simulcast_bitrate_mode,
2051 codec.width,
2052 codec.height,
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002053 0,
2054 kDefaultQpMax,
2055 codec.framerate != 0 ? codec.framerate : kDefaultFramerate);
2056
2057 ASSERT_EQ(expected_streams.size(), video_streams.size());
2058
2059 size_t num_streams = video_streams.size();
2060 for (size_t i = 0; i < num_streams; ++i) {
2061 EXPECT_EQ(expected_streams[i].width, video_streams[i].width);
2062 EXPECT_EQ(expected_streams[i].height, video_streams[i].height);
2063
2064 EXPECT_GT(video_streams[i].max_framerate, 0);
2065 EXPECT_EQ(expected_streams[i].max_framerate,
2066 video_streams[i].max_framerate);
2067
2068 EXPECT_GT(video_streams[i].min_bitrate_bps, 0);
2069 EXPECT_EQ(expected_streams[i].min_bitrate_bps,
2070 video_streams[i].min_bitrate_bps);
2071
2072 EXPECT_GT(video_streams[i].target_bitrate_bps, 0);
2073 EXPECT_EQ(expected_streams[i].target_bitrate_bps,
2074 video_streams[i].target_bitrate_bps);
2075
2076 EXPECT_GT(video_streams[i].max_bitrate_bps, 0);
2077 EXPECT_EQ(expected_streams[i].max_bitrate_bps,
2078 video_streams[i].max_bitrate_bps);
2079
2080 EXPECT_GT(video_streams[i].max_qp, 0);
2081 EXPECT_EQ(expected_streams[i].max_qp, video_streams[i].max_qp);
2082
2083 EXPECT_FALSE(expected_streams[i].temporal_layer_thresholds_bps.empty());
2084 EXPECT_EQ(expected_streams[i].temporal_layer_thresholds_bps,
2085 video_streams[i].temporal_layer_thresholds_bps);
2086 }
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002087 }
2088
2089 FakeVideoSendStream* AddSendStream() {
2090 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
2091 }
2092
2093 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
2094 size_t num_streams =
2095 fake_call_->GetVideoSendStreams().size();
2096 EXPECT_TRUE(channel_->AddSendStream(sp));
2097 std::vector<FakeVideoSendStream*> streams =
2098 fake_call_->GetVideoSendStreams();
2099 EXPECT_EQ(num_streams + 1, streams.size());
2100 return streams[streams.size() - 1];
2101 }
2102
2103 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
2104 return fake_call_->GetVideoSendStreams();
2105 }
2106
2107 FakeVideoReceiveStream* AddRecvStream() {
2108 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
2109 }
2110
2111 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
2112 size_t num_streams =
2113 fake_call_->GetVideoReceiveStreams().size();
2114 EXPECT_TRUE(channel_->AddRecvStream(sp));
2115 std::vector<FakeVideoReceiveStream*> streams =
2116 fake_call_->GetVideoReceiveStreams();
2117 EXPECT_EQ(num_streams + 1, streams.size());
2118 return streams[streams.size() - 1];
2119 }
2120
2121 FakeCall* fake_call_;
2122 rtc::scoped_ptr<VideoMediaChannel> channel_;
2123 uint32 last_ssrc_;
2124};
2125
2126TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith2SimulcastStreams) {
2127 VerifySimulcastSettings(kVp8Codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2128}
2129
2130TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith3SimulcastStreams) {
2131 VerifySimulcastSettings(
2132 kVp8Codec720p, VideoOptions::NORMAL, 3, 3, SBM_NORMAL);
2133}
2134
2135TEST_F(WebRtcVideoChannel2SimulcastTest,
2136 SetSendCodecsWith2SimulcastStreamsHighBitrateMode) {
2137 VerifySimulcastSettings(kVp8Codec, VideoOptions::HIGH, 2, 2, SBM_HIGH);
2138}
2139
2140TEST_F(WebRtcVideoChannel2SimulcastTest,
2141 SetSendCodecsWith3SimulcastStreamsHighBitrateMode) {
2142 VerifySimulcastSettings(kVp8Codec720p, VideoOptions::HIGH, 3, 3, SBM_HIGH);
2143}
2144
2145TEST_F(WebRtcVideoChannel2SimulcastTest,
2146 SetSendCodecsWith2SimulcastStreamsVeryHighBitrateMode) {
2147 VerifySimulcastSettings(
2148 kVp8Codec, VideoOptions::VERY_HIGH, 2, 2, SBM_VERY_HIGH);
2149}
2150
2151TEST_F(WebRtcVideoChannel2SimulcastTest,
2152 SetSendCodecsWith3SimulcastStreamsVeryHighBitrateMode) {
2153 VerifySimulcastSettings(
2154 kVp8Codec720p, VideoOptions::VERY_HIGH, 3, 3, SBM_VERY_HIGH);
2155}
2156
2157// Test that we normalize send codec format size in simulcast.
2158TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) {
2159 cricket::VideoCodec codec(kVp8Codec270p);
2160 codec.width += 1;
2161 codec.height += 1;
2162 VerifySimulcastSettings(codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2163}
2164
2165// Test that if we add a stream with RTX SSRC's, SSRC's get set correctly.
2166TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestStreamWithRtx) {
2167 // TODO(pbos): Implement.
2168 FAIL() << "Not implemented.";
2169}
2170
2171// Test that if we get too few ssrcs are given in AddSendStream(),
2172// only supported sub-streams will be added.
2173TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TooFewSimulcastSsrcs) {
2174 // TODO(pbos): Implement.
2175 FAIL() << "Not implemented.";
2176}
2177
2178// Test that even more than enough ssrcs are given in AddSendStream(),
2179// only supported sub-streams will be added.
2180TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_MoreThanEnoughSimulcastSscrs) {
2181 // TODO(pbos): Implement.
2182 FAIL() << "Not implemented.";
2183}
2184
2185// Test that SetSendStreamFormat works well with simulcast.
2186TEST_F(WebRtcVideoEngine2SimulcastTest,
2187 DISABLED_SetSendStreamFormatWithSimulcast) {
2188 // TODO(pbos): Implement.
2189 FAIL() << "Not implemented.";
2190}
2191
2192// Test that simulcast send codec is reset on new video frame size.
2193TEST_F(WebRtcVideoEngine2SimulcastTest,
2194 DISABLED_ResetSimulcastSendCodecOnNewFrameSize) {
2195 // TODO(pbos): Implement.
2196 FAIL() << "Not implemented.";
2197}
2198
2199// Test that simulcast send codec is reset on new portait mode video frame.
2200TEST_F(WebRtcVideoEngine2SimulcastTest,
2201 DISABLED_ResetSimulcastSendCodecOnNewPortaitFrame) {
2202 // TODO(pbos): Implement.
2203 FAIL() << "Not implemented.";
2204}
2205
2206TEST_F(WebRtcVideoEngine2SimulcastTest,
2207 DISABLED_SetBandwidthInConferenceWithSimulcast) {
2208 // TODO(pbos): Implement.
2209 FAIL() << "Not implemented.";
2210}
2211
2212// Test that sending screencast frames in conference mode changes
2213// bitrate.
2214TEST_F(WebRtcVideoEngine2SimulcastTest,
2215 DISABLED_SetBandwidthScreencastInConference) {
2216 // TODO(pbos): Implement.
2217 FAIL() << "Not implemented.";
2218}
2219
2220// Test AddSendStream with simulcast rejects bad StreamParams.
2221TEST_F(WebRtcVideoEngine2SimulcastTest,
2222 DISABLED_AddSendStreamWithBadStreamParams) {
2223 // TODO(pbos): Implement.
2224 FAIL() << "Not implemented.";
2225}
2226
2227// Test AddSendStream with simulcast sets ssrc and cname correctly.
2228TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_AddSendStreamWithSimulcast) {
2229 // TODO(pbos): Implement.
2230 FAIL() << "Not implemented.";
2231}
2232
2233// Test RemoveSendStream with simulcast.
2234TEST_F(WebRtcVideoEngine2SimulcastTest,
2235 DISABLED_RemoveSendStreamWithSimulcast) {
2236 // TODO(pbos): Implement.
2237 FAIL() << "Not implemented.";
2238}
2239
2240// Test AddSendStream after send codec has already been set will reset
2241// send codec with simulcast settings.
2242TEST_F(WebRtcVideoEngine2SimulcastTest,
2243 DISABLED_AddSimulcastStreamAfterSetSendCodec) {
2244 // TODO(pbos): Implement.
2245 FAIL() << "Not implemented.";
2246}
2247
2248TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_GetStatsWithMultipleSsrcs) {
2249 // TODO(pbos): Implement.
2250 FAIL() << "Not implemented.";
2251}
2252
2253// Test receiving channel(s) local ssrc is set to the same as the first
2254// simulcast sending ssrc.
2255TEST_F(WebRtcVideoEngine2SimulcastTest,
2256 DISABLED_AddSimulcastStreamAfterCreatingRecvChannels) {
2257 // TODO(pbos): Implement.
2258 FAIL() << "Not implemented.";
2259}
2260
2261// Test 1:1 call never turn on simulcast.
2262TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_NoSimulcastWith1on1) {
2263 // TODO(pbos): Implement.
2264 FAIL() << "Not implemented.";
2265}
2266
2267// Test SetOptions with OPT_CONFERENCE flag.
2268TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_SetOptionsWithConferenceMode) {
2269 // TODO(pbos): Implement.
2270 FAIL() << "Not implemented.";
2271}
2272
2273// Test that two different streams can have different formats.
2274TEST_F(WebRtcVideoEngine2SimulcastTest,
2275 DISABLED_MultipleSendStreamsDifferentFormats) {
2276 // TODO(pbos): Implement.
2277 FAIL() << "Not implemented.";
2278}
2279
2280TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToOutputFormat) {
2281 // TODO(pbos): Implement.
2282 FAIL() << "Not implemented.";
2283}
2284
2285TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToCpuLoad) {
2286 // TODO(pbos): Implement.
2287 FAIL() << "Not implemented.";
2288}
2289
2290TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToCpuLoadDisabled) {
2291 // TODO(pbos): Implement.
2292 FAIL() << "Not implemented.";
2293}
2294
2295TEST_F(WebRtcVideoEngine2SimulcastTest,
2296 DISABLED_TestAdaptWithCpuOveruseObserver) {
2297 // TODO(pbos): Implement.
2298 FAIL() << "Not implemented.";
2299}
2300
2301// Test that codec is not reset for every frame sent in non-conference and
2302// non-screencast mode.
2303TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_DontResetCodecOnSendFrame) {
2304 // TODO(pbos): Implement.
2305 FAIL() << "Not implemented.";
2306}
2307
2308TEST_F(WebRtcVideoEngine2SimulcastTest,
2309 DISABLED_UseSimulcastAdapterOnVp8OnlyFactory) {
2310 // TODO(pbos): Implement.
2311 FAIL() << "Not implemented.";
2312}
2313
2314TEST_F(WebRtcVideoEngine2SimulcastTest,
2315 DISABLED_DontUseSimulcastAdapterOnNoneVp8Factory) {
2316 // TODO(pbos): Implement.
2317 FAIL() << "Not implemented.";
2318}
2319
2320TEST_F(WebRtcVideoEngine2SimulcastTest,
2321 DISABLED_DontUseSimulcastAdapterOnMultipleCodecsFactory) {
2322 // TODO(pbos): Implement.
2323 FAIL() << "Not implemented.";
2324}
2325
2326TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x800) {
2327 // TODO(pbos): Implement.
2328 FAIL() << "Not implemented.";
2329}
2330
2331TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x720) {
2332 // TODO(pbos): Implement.
2333 FAIL() << "Not implemented.";
2334}
2335
2336TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x540) {
2337 // TODO(pbos): Implement.
2338 FAIL() << "Not implemented.";
2339}
2340
2341TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x600) {
2342 // TODO(pbos): Implement.
2343 FAIL() << "Not implemented.";
2344}
2345
2346TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x400) {
2347 // TODO(pbos): Implement.
2348 FAIL() << "Not implemented.";
2349}
2350
2351TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x360) {
2352 // TODO(pbos): Implement.
2353 FAIL() << "Not implemented.";
2354}
2355
2356TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_480x300) {
2357 // TODO(pbos): Implement.
2358 FAIL() << "Not implemented.";
2359}
2360
2361TEST_F(WebRtcVideoChannel2SimulcastTest,
2362 DISABLED_DISABLED_SimulcastSend_480x270) {
2363 // TODO(pbos): Implement.
2364 FAIL() << "Not implemented.";
2365}
2366
2367TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x200) {
2368 // TODO(pbos): Implement.
2369 FAIL() << "Not implemented.";
2370}
2371
2372TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x180) {
2373 // TODO(pbos): Implement.
2374 FAIL() << "Not implemented.";
2375}
2376
2377// Test reset send codec with simulcast.
2378// Disabled per b/6773425
2379TEST_F(WebRtcVideoChannel2SimulcastTest,
2380 DISABLED_DISABLED_SimulcastResetSendCodec) {
2381 // TODO(pbos): Implement.
2382 FAIL() << "Not implemented.";
2383}
2384
2385// Test simulcast streams are decodeable with expected sizes.
2386TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastStreams) {
2387 // TODO(pbos): Implement.
2388 FAIL() << "Not implemented.";
2389}
2390
2391// Simulcast and resolution resizing should be turned off when screencasting
2392// but not otherwise.
2393TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_ScreencastRendering) {
2394 // TODO(pbos): Implement.
2395 FAIL() << "Not implemented.";
2396}
2397
2398// Ensures that the correct settings are applied to the codec when single
2399// temporal layer screencasting is enabled, and that the correct simulcast
2400// settings are reapplied when disabling screencasting.
2401TEST_F(WebRtcVideoChannel2SimulcastTest,
2402 DISABLED_OneTemporalLayerScreencastSettings) {
2403 // TODO(pbos): Implement.
2404 FAIL() << "Not implemented.";
2405}
2406
2407// Ensures that the correct settings are applied to the codec when two temporal
2408// layer screencasting is enabled, and that the correct simulcast settings are
2409// reapplied when disabling screencasting.
2410TEST_F(WebRtcVideoChannel2SimulcastTest,
2411 DISABLED_TwoTemporalLayerScreencastSettings) {
2412 // TODO(pbos): Implement.
2413 FAIL() << "Not implemented.";
2414}
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002415
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002416} // namespace cricket