blob: 116949e98957e4d1a97f9bb7309f2235e8a21215 [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
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +000076static void CreateBlackFrame(webrtc::I420VideoFrame* video_frame,
77 int width,
78 int height) {
79 video_frame->CreateEmptyFrame(
80 width, height, width, (width + 1) / 2, (width + 1) / 2);
81 memset(video_frame->buffer(webrtc::kYPlane), 16,
82 video_frame->allocated_size(webrtc::kYPlane));
83 memset(video_frame->buffer(webrtc::kUPlane), 128,
84 video_frame->allocated_size(webrtc::kUPlane));
85 memset(video_frame->buffer(webrtc::kVPlane), 128,
86 video_frame->allocated_size(webrtc::kVPlane));
87}
88
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000089} // namespace
90
91namespace cricket {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000092FakeVideoSendStream::FakeVideoSendStream(
93 const webrtc::VideoSendStream::Config& config,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +000094 const webrtc::VideoEncoderConfig& encoder_config)
pbos@webrtc.org42684be2014-10-03 11:25:45 +000095 : sending_(false),
96 config_(config),
97 codec_settings_set_(false),
98 num_swapped_frames_(0) {
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +000099 assert(config.encoder_settings.encoder != NULL);
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000100 ReconfigureVideoEncoder(encoder_config);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000101}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000102
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000103webrtc::VideoSendStream::Config FakeVideoSendStream::GetConfig() const {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000104 return config_;
105}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000106
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000107webrtc::VideoEncoderConfig FakeVideoSendStream::GetEncoderConfig() const {
108 return encoder_config_;
109}
110
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000111std::vector<webrtc::VideoStream> FakeVideoSendStream::GetVideoStreams() {
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000112 return encoder_config_.streams;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000113}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000114
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000115bool FakeVideoSendStream::IsSending() const {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000116 return sending_;
117}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000118
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000119bool FakeVideoSendStream::GetVp8Settings(
120 webrtc::VideoCodecVP8* settings) const {
121 if (!codec_settings_set_) {
122 return false;
123 }
124
125 *settings = vp8_settings_;
126 return true;
127}
128
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000129int FakeVideoSendStream::GetNumberOfSwappedFrames() const {
130 return num_swapped_frames_;
131}
132
133int FakeVideoSendStream::GetLastWidth() const {
134 return last_frame_.width();
135}
136
137int FakeVideoSendStream::GetLastHeight() const {
138 return last_frame_.height();
139}
140
141void FakeVideoSendStream::SwapFrame(webrtc::I420VideoFrame* frame) {
142 ++num_swapped_frames_;
143 last_frame_.SwapFrame(frame);
144}
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000145
146void FakeVideoSendStream::SetStats(
147 const webrtc::VideoSendStream::Stats& stats) {
148 stats_ = stats;
149}
150
151webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() {
152 return stats_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000153}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000154
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000155bool FakeVideoSendStream::ReconfigureVideoEncoder(
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000156 const webrtc::VideoEncoderConfig& config) {
157 encoder_config_ = config;
158 if (config.encoder_specific_settings != NULL) {
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000159 assert(config_.encoder_settings.payload_name == "VP8");
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000160 vp8_settings_ = *reinterpret_cast<const webrtc::VideoCodecVP8*>(
161 config.encoder_specific_settings);
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000162 }
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000163 codec_settings_set_ = config.encoder_specific_settings != NULL;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000164 return true;
165}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000166
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000167webrtc::VideoSendStreamInput* FakeVideoSendStream::Input() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000168 return this;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000169}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000170
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000171void FakeVideoSendStream::Start() {
172 sending_ = true;
173}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000174
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000175void FakeVideoSendStream::Stop() {
176 sending_ = false;
177}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000178
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000179FakeVideoReceiveStream::FakeVideoReceiveStream(
180 const webrtc::VideoReceiveStream::Config& config)
181 : config_(config), receiving_(false) {
182}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000183
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000184webrtc::VideoReceiveStream::Config FakeVideoReceiveStream::GetConfig() {
185 return config_;
186}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000187
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000188bool FakeVideoReceiveStream::IsReceiving() const {
189 return receiving_;
190}
191
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +0000192void FakeVideoReceiveStream::InjectFrame(const webrtc::I420VideoFrame& frame,
193 int time_to_render_ms) {
194 config_.renderer->RenderFrame(frame, time_to_render_ms);
195}
196
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000197webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const {
198 return webrtc::VideoReceiveStream::Stats();
199}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000200
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000201void FakeVideoReceiveStream::Start() {
202 receiving_ = true;
203}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000204
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000205void FakeVideoReceiveStream::Stop() {
206 receiving_ = false;
207}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000208
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000209FakeCall::FakeCall(const webrtc::Call::Config& config)
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000210 : config_(config),
211 network_state_(kNetworkUp),
212 num_created_send_streams_(0),
213 num_created_receive_streams_(0) {
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000214 SetVideoCodecs(GetDefaultVideoCodecs());
215}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000216
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000217FakeCall::~FakeCall() {
218 EXPECT_EQ(0u, video_send_streams_.size());
219 EXPECT_EQ(0u, video_receive_streams_.size());
220}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000221
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000222void FakeCall::SetVideoCodecs(const std::vector<webrtc::VideoCodec> codecs) {
223 codecs_ = codecs;
224}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000225
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000226webrtc::Call::Config FakeCall::GetConfig() const {
227 return config_;
228}
229
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000230std::vector<FakeVideoSendStream*> FakeCall::GetVideoSendStreams() {
231 return video_send_streams_;
232}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000233
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000234std::vector<FakeVideoReceiveStream*> FakeCall::GetVideoReceiveStreams() {
235 return video_receive_streams_;
236}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000237
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000238webrtc::VideoCodec FakeCall::GetEmptyVideoCodec() {
239 webrtc::VideoCodec codec;
240 codec.minBitrate = 300;
241 codec.startBitrate = 800;
242 codec.maxBitrate = 1500;
243 codec.maxFramerate = 10;
244 codec.width = 640;
245 codec.height = 480;
246 codec.qpMax = 56;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000247
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000248 return codec;
249}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000250
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000251webrtc::VideoCodec FakeCall::GetVideoCodecVp8() {
252 webrtc::VideoCodec vp8_codec = GetEmptyVideoCodec();
253 vp8_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000254 rtc::strcpyn(
255 vp8_codec.plName, ARRAY_SIZE(vp8_codec.plName), kVp8Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000256 vp8_codec.plType = kVp8Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000257
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000258 return vp8_codec;
259}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000260
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000261webrtc::VideoCodec FakeCall::GetVideoCodecVp9() {
262 webrtc::VideoCodec vp9_codec = GetEmptyVideoCodec();
263 // TODO(pbos): Add a correct codecType when webrtc has one.
264 vp9_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000265 rtc::strcpyn(
266 vp9_codec.plName, ARRAY_SIZE(vp9_codec.plName), kVp9Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000267 vp9_codec.plType = kVp9Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000268
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000269 return vp9_codec;
270}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000271
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000272std::vector<webrtc::VideoCodec> FakeCall::GetDefaultVideoCodecs() {
273 std::vector<webrtc::VideoCodec> codecs;
274 codecs.push_back(GetVideoCodecVp8());
275 // codecs.push_back(GetVideoCodecVp9());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000276
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000277 return codecs;
278}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000279
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000280webrtc::Call::NetworkState FakeCall::GetNetworkState() const {
281 return network_state_;
282}
283
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000284webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
285 const webrtc::VideoSendStream::Config& config,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000286 const webrtc::VideoEncoderConfig& encoder_config) {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000287 FakeVideoSendStream* fake_stream =
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000288 new FakeVideoSendStream(config, encoder_config);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000289 video_send_streams_.push_back(fake_stream);
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000290 ++num_created_send_streams_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000291 return fake_stream;
292}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000293
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000294void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
295 FakeVideoSendStream* fake_stream =
296 static_cast<FakeVideoSendStream*>(send_stream);
297 for (size_t i = 0; i < video_send_streams_.size(); ++i) {
298 if (video_send_streams_[i] == fake_stream) {
299 delete video_send_streams_[i];
300 video_send_streams_.erase(video_send_streams_.begin() + i);
301 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000302 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000303 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000304 ADD_FAILURE() << "DestroyVideoSendStream called with unknown paramter.";
305}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000306
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000307webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
308 const webrtc::VideoReceiveStream::Config& config) {
309 video_receive_streams_.push_back(new FakeVideoReceiveStream(config));
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000310 ++num_created_receive_streams_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000311 return video_receive_streams_[video_receive_streams_.size() - 1];
312}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000313
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000314void FakeCall::DestroyVideoReceiveStream(
315 webrtc::VideoReceiveStream* receive_stream) {
316 FakeVideoReceiveStream* fake_stream =
317 static_cast<FakeVideoReceiveStream*>(receive_stream);
318 for (size_t i = 0; i < video_receive_streams_.size(); ++i) {
319 if (video_receive_streams_[i] == fake_stream) {
320 delete video_receive_streams_[i];
321 video_receive_streams_.erase(video_receive_streams_.begin() + i);
322 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000323 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000324 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000325 ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown paramter.";
326}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000327
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000328webrtc::PacketReceiver* FakeCall::Receiver() {
329 // TODO(pbos): Fix this.
330 return NULL;
331}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000332
pbos@webrtc.org2b19f062014-12-11 13:26:09 +0000333void FakeCall::SetStats(const webrtc::Call::Stats& stats) {
334 stats_ = stats;
335}
336
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000337int FakeCall::GetNumCreatedSendStreams() const {
338 return num_created_send_streams_;
339}
340
341int FakeCall::GetNumCreatedReceiveStreams() const {
342 return num_created_receive_streams_;
343}
344
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000345webrtc::Call::Stats FakeCall::GetStats() const {
pbos@webrtc.org2b19f062014-12-11 13:26:09 +0000346 return stats_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000347}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000348
pbos@webrtc.org00873182014-11-25 14:03:34 +0000349void FakeCall::SetBitrateConfig(
350 const webrtc::Call::Config::BitrateConfig& bitrate_config) {
351 config_.stream_bitrates = bitrate_config;
352}
353
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000354void FakeCall::SignalNetworkState(webrtc::Call::NetworkState state) {
355 network_state_ = state;
356}
357
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000358class WebRtcVideoEngine2Test : public ::testing::Test {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000359 public:
pbos@webrtc.orgb648b9d2014-08-26 11:08:06 +0000360 WebRtcVideoEngine2Test() {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000361 std::vector<VideoCodec> engine_codecs = engine_.codecs();
362 assert(!engine_codecs.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000363 bool codec_set = false;
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000364 for (size_t i = 0; i < engine_codecs.size(); ++i) {
365 if (engine_codecs[i].name == "red") {
366 default_red_codec_ = engine_codecs[i];
367 } else if (engine_codecs[i].name == "ulpfec") {
368 default_ulpfec_codec_ = engine_codecs[i];
369 } else if (engine_codecs[i].name == "rtx") {
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000370 default_rtx_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000371 } else if (!codec_set) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000372 default_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000373 codec_set = true;
374 }
375 }
376
377 assert(codec_set);
378 }
379
380 protected:
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000381 class FakeCallFactory : public WebRtcCallFactory {
382 public:
383 FakeCallFactory() : fake_call_(NULL) {}
384 FakeCall* GetCall() { return fake_call_; }
385
386 private:
387 virtual webrtc::Call* CreateCall(
388 const webrtc::Call::Config& config) OVERRIDE {
389 assert(fake_call_ == NULL);
390 fake_call_ = new FakeCall(config);
391 return fake_call_;
392 }
393
394 FakeCall* fake_call_;
395 };
396
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000397 VideoMediaChannel* SetUpForExternalEncoderFactory(
398 cricket::WebRtcVideoEncoderFactory* encoder_factory,
399 const std::vector<VideoCodec>& codecs);
pbos@webrtc.orgfa553ef2014-10-20 11:07:07 +0000400
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000401 VideoMediaChannel* SetUpForExternalDecoderFactory(
402 cricket::WebRtcVideoDecoderFactory* decoder_factory,
403 const std::vector<VideoCodec>& codecs);
404
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000405 WebRtcVideoEngine2 engine_;
406 VideoCodec default_codec_;
407 VideoCodec default_red_codec_;
408 VideoCodec default_ulpfec_codec_;
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000409 VideoCodec default_rtx_codec_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000410};
411
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000412TEST_F(WebRtcVideoEngine2Test, ConfiguresAvSyncForFirstReceiveChannel) {
413 FakeCallFactory call_factory;
414 engine_.SetCallFactory(&call_factory);
415
416 WebRtcVoiceEngine voice_engine;
417 engine_.SetVoiceEngine(&voice_engine);
418 voice_engine.Init(rtc::Thread::Current());
419 engine_.Init(rtc::Thread::Current());
420
421 rtc::scoped_ptr<VoiceMediaChannel> voice_channel(
422 voice_engine.CreateChannel());
423 ASSERT_TRUE(voice_channel.get() != NULL);
424 WebRtcVoiceMediaChannel* webrtc_voice_channel =
425 static_cast<WebRtcVoiceMediaChannel*>(voice_channel.get());
426 ASSERT_NE(webrtc_voice_channel->voe_channel(), -1);
427 rtc::scoped_ptr<VideoMediaChannel> channel(
428 engine_.CreateChannel(cricket::VideoOptions(), voice_channel.get()));
429
430 FakeCall* fake_call = call_factory.GetCall();
431 ASSERT_TRUE(fake_call != NULL);
432
433 webrtc::Call::Config call_config = fake_call->GetConfig();
434
435 ASSERT_TRUE(voice_engine.voe()->engine() != NULL);
436 ASSERT_EQ(voice_engine.voe()->engine(), call_config.voice_engine);
437
438 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc)));
439 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc + 1)));
440 std::vector<FakeVideoReceiveStream*> receive_streams =
441 fake_call->GetVideoReceiveStreams();
442
443 ASSERT_EQ(2u, receive_streams.size());
444 EXPECT_EQ(webrtc_voice_channel->voe_channel(),
445 receive_streams[0]->GetConfig().audio_channel_id);
446 EXPECT_EQ(-1, receive_streams[1]->GetConfig().audio_channel_id)
447 << "AV sync should only be set up for the first receive channel.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000448}
449
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000450TEST_F(WebRtcVideoEngine2Test, FindCodec) {
451 const std::vector<cricket::VideoCodec>& c = engine_.codecs();
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000452 EXPECT_EQ(4U, c.size());
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000453
454 cricket::VideoCodec vp8(104, "VP8", 320, 200, 30, 0);
455 EXPECT_TRUE(engine_.FindCodec(vp8));
456
457 cricket::VideoCodec vp8_ci(104, "vp8", 320, 200, 30, 0);
458 EXPECT_TRUE(engine_.FindCodec(vp8));
459
460 cricket::VideoCodec vp8_diff_fr_diff_pref(104, "VP8", 320, 200, 50, 50);
461 EXPECT_TRUE(engine_.FindCodec(vp8_diff_fr_diff_pref));
462
463 cricket::VideoCodec vp8_diff_id(95, "VP8", 320, 200, 30, 0);
464 EXPECT_FALSE(engine_.FindCodec(vp8_diff_id));
465 vp8_diff_id.id = 97;
466 EXPECT_TRUE(engine_.FindCodec(vp8_diff_id));
467
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000468 // FindCodec ignores the codec size.
469 // Test that FindCodec can accept uncommon codec size.
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000470 cricket::VideoCodec vp8_diff_res(104, "VP8", 320, 111, 30, 0);
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000471 EXPECT_TRUE(engine_.FindCodec(vp8_diff_res));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000472
473 // PeerConnection doesn't negotiate the resolution at this point.
474 // Test that FindCodec can handle the case when width/height is 0.
475 cricket::VideoCodec vp8_zero_res(104, "VP8", 0, 0, 30, 0);
476 EXPECT_TRUE(engine_.FindCodec(vp8_zero_res));
477
478 cricket::VideoCodec red(101, "RED", 0, 0, 30, 0);
479 EXPECT_TRUE(engine_.FindCodec(red));
480
481 cricket::VideoCodec red_ci(101, "red", 0, 0, 30, 0);
482 EXPECT_TRUE(engine_.FindCodec(red));
483
484 cricket::VideoCodec fec(102, "ULPFEC", 0, 0, 30, 0);
485 EXPECT_TRUE(engine_.FindCodec(fec));
486
487 cricket::VideoCodec fec_ci(102, "ulpfec", 0, 0, 30, 0);
488 EXPECT_TRUE(engine_.FindCodec(fec));
489
490 cricket::VideoCodec rtx(96, "rtx", 0, 0, 30, 0);
491 EXPECT_TRUE(engine_.FindCodec(rtx));
492}
493
494TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
495 std::vector<VideoCodec> engine_codecs = engine_.codecs();
496 for (size_t i = 0; i < engine_codecs.size(); ++i) {
497 if (engine_codecs[i].name != kRtxCodecName)
498 continue;
499 int associated_payload_type;
500 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000501 &associated_payload_type));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000502 EXPECT_EQ(default_codec_.id, associated_payload_type);
503 return;
504 }
505 FAIL() << "No RTX codec found among default codecs.";
506}
507
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000508TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
509 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
510 ASSERT_FALSE(extensions.empty());
511 for (size_t i = 0; i < extensions.size(); ++i) {
512 if (extensions[i].uri == kRtpTimestampOffsetHeaderExtension) {
513 EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extensions[i].id);
514 return;
515 }
516 }
517 FAIL() << "Timestamp offset extension not in header-extension list.";
518}
519
520TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
521 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
522 ASSERT_FALSE(extensions.empty());
523 for (size_t i = 0; i < extensions.size(); ++i) {
524 if (extensions[i].uri == kRtpAbsoluteSenderTimeHeaderExtension) {
525 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId,
526 extensions[i].id);
527 return;
528 }
529 }
530 FAIL() << "Absolute Sender Time extension not in header-extension list.";
531}
532
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000533TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000534 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000535 rtc::scoped_ptr<VideoMediaChannel> channel(
536 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000537
538 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
539
540 EXPECT_FALSE(channel->SetSend(true))
541 << "Channel should not start without codecs.";
542 EXPECT_TRUE(channel->SetSend(false))
543 << "Channel should be stoppable even without set codecs.";
544}
545
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000546TEST_F(WebRtcVideoEngine2Test, GetStatsWithoutSendCodecsSetDoesNotCrash) {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000547 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000548 rtc::scoped_ptr<VideoMediaChannel> channel(
549 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000550 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
551 VideoMediaInfo info;
552 channel->GetStats(&info);
553}
554
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000555TEST_F(WebRtcVideoEngine2Test, UseExternalFactoryForVp8WhenSupported) {
556 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
557 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
558 std::vector<cricket::VideoCodec> codecs;
559 codecs.push_back(kVp8Codec);
560
561 rtc::scoped_ptr<VideoMediaChannel> channel(
562 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
563
564 EXPECT_TRUE(
565 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
566 ASSERT_EQ(1u, encoder_factory.encoders().size());
567 EXPECT_TRUE(channel->SetSend(true));
568
569 cricket::FakeVideoCapturer capturer;
570 EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer));
571 EXPECT_EQ(cricket::CS_RUNNING,
572 capturer.Start(capturer.GetSupportedFormats()->front()));
573 EXPECT_TRUE(capturer.CaptureFrame());
574
575 EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0,
576 kTimeout);
577
578 // Setting codecs of the same type should not reallocate the encoder.
579 EXPECT_TRUE(channel->SetSendCodecs(codecs));
580 EXPECT_EQ(1, encoder_factory.GetNumCreatedEncoders());
581
582 // Remove stream previously added to free the external encoder instance.
583 EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
584 EXPECT_EQ(0u, encoder_factory.encoders().size());
585}
586
587VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalEncoderFactory(
588 cricket::WebRtcVideoEncoderFactory* encoder_factory,
589 const std::vector<VideoCodec>& codecs) {
590 engine_.SetExternalEncoderFactory(encoder_factory);
591 engine_.Init(rtc::Thread::Current());
592
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000593 VideoMediaChannel* channel =
594 engine_.CreateChannel(cricket::VideoOptions(), NULL);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000595 EXPECT_TRUE(channel->SetSendCodecs(codecs));
596
597 return channel;
598}
599
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000600VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalDecoderFactory(
601 cricket::WebRtcVideoDecoderFactory* decoder_factory,
602 const std::vector<VideoCodec>& codecs) {
603 engine_.SetExternalDecoderFactory(decoder_factory);
604 engine_.Init(rtc::Thread::Current());
605
606 VideoMediaChannel* channel =
607 engine_.CreateChannel(cricket::VideoOptions(), NULL);
608 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
609
610 return channel;
611}
612
pbos@webrtc.orgf18fba22015-01-14 16:26:23 +0000613TEST_F(WebRtcVideoEngine2Test, UsesSimulcastAdapterForVp8Factories) {
614 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
615 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
616 std::vector<cricket::VideoCodec> codecs;
617 codecs.push_back(kVp8Codec);
618
619 rtc::scoped_ptr<VideoMediaChannel> channel(
620 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
621
622 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
623
624 EXPECT_TRUE(
625 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
626 EXPECT_TRUE(channel->SetSend(true));
627
628 EXPECT_GT(encoder_factory.encoders().size(), 1u);
629
630 // Verify that encoders are configured for simulcast through adapter
631 // (increasing resolution and only configured to send one stream each).
632 int prev_width = -1;
633 for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) {
634 webrtc::VideoCodec codec_settings =
635 encoder_factory.encoders()[i]->GetCodecSettings();
636 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams);
637 EXPECT_GT(codec_settings.width, prev_width);
638 prev_width = codec_settings.width;
639 }
640}
641
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000642TEST_F(WebRtcVideoEngine2Test, ChannelWithExternalH264CanChangeToInternalVp8) {
643 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
644 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
645 std::vector<cricket::VideoCodec> codecs;
646 codecs.push_back(kH264Codec);
647
648 rtc::scoped_ptr<VideoMediaChannel> channel(
649 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
650
651 EXPECT_TRUE(
652 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
653 ASSERT_EQ(1u, encoder_factory.encoders().size());
654
655 codecs.clear();
656 codecs.push_back(kVp8Codec);
657 EXPECT_TRUE(channel->SetSendCodecs(codecs));
658
659 ASSERT_EQ(0u, encoder_factory.encoders().size());
660}
661
662TEST_F(WebRtcVideoEngine2Test,
663 DontUseExternalEncoderFactoryForUnsupportedCodecs) {
664 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
665 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
666 std::vector<cricket::VideoCodec> codecs;
667 codecs.push_back(kVp8Codec);
668
669 rtc::scoped_ptr<VideoMediaChannel> channel(
670 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
671
672 EXPECT_TRUE(
673 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
674 ASSERT_EQ(0u, encoder_factory.encoders().size());
675}
676
677// Test external codec with be added to the end of the supported codec list.
678TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) {
679 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
680 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
681 engine_.SetExternalEncoderFactory(&encoder_factory);
682
683 engine_.Init(rtc::Thread::Current());
684
685 std::vector<cricket::VideoCodec> codecs(engine_.codecs());
686 ASSERT_GE(codecs.size(), 2u);
687 cricket::VideoCodec internal_codec = codecs.front();
688 cricket::VideoCodec external_codec = codecs.back();
689
690 // The external codec will appear at last.
691 EXPECT_EQ("VP8", internal_codec.name);
692 EXPECT_EQ("H264", external_codec.name);
693}
694
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000695TEST_F(WebRtcVideoEngine2Test, RegisterExternalDecodersIfSupported) {
696 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
697 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
698 std::vector<cricket::VideoCodec> codecs;
699 codecs.push_back(kVp8Codec);
700
701 rtc::scoped_ptr<VideoMediaChannel> channel(
702 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
703
704 EXPECT_TRUE(
705 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
706 ASSERT_EQ(1u, decoder_factory.decoders().size());
707
708 // Setting codecs of the same type should not reallocate the decoder.
709 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
710 EXPECT_EQ(1, decoder_factory.GetNumCreatedDecoders());
711
712 // Remove stream previously added to free the external decoder instance.
713 EXPECT_TRUE(channel->RemoveRecvStream(kSsrc));
714 EXPECT_EQ(0u, decoder_factory.decoders().size());
715}
716
717// Verifies that we can set up decoders that are not internally supported.
718TEST_F(WebRtcVideoEngine2Test, RegisterExternalH264DecoderIfSupported) {
719 // TODO(pbos): Do not assume that encoder/decoder support is symmetric. We
720 // can't even query the WebRtcVideoDecoderFactory for supported codecs.
721 // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported
722 // codecs.
723 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
724 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
725 engine_.SetExternalEncoderFactory(&encoder_factory);
726 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
727 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
728 std::vector<cricket::VideoCodec> codecs;
729 codecs.push_back(kH264Codec);
730
731 rtc::scoped_ptr<VideoMediaChannel> channel(
732 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
733
734 EXPECT_TRUE(
735 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
736 ASSERT_EQ(1u, decoder_factory.decoders().size());
737}
738
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000739class WebRtcVideoEngine2BaseTest
740 : public VideoEngineTest<cricket::WebRtcVideoEngine2> {
741 protected:
742 typedef VideoEngineTest<cricket::WebRtcVideoEngine2> Base;
743};
744
745#define WEBRTC_ENGINE_BASE_TEST(test) \
746 TEST_F(WebRtcVideoEngine2BaseTest, test) { Base::test##Body(); }
747
748WEBRTC_ENGINE_BASE_TEST(ConstrainNewCodec2);
749
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000750class WebRtcVideoChannel2BaseTest
751 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
752 protected:
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000753 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000754
755 virtual cricket::VideoCodec DefaultCodec() OVERRIDE { return kVp8Codec; }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000756};
757
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000758#define WEBRTC_BASE_TEST(test) \
759 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); }
760
761#define WEBRTC_DISABLED_BASE_TEST(test) \
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000762 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_##test) { Base::test(); }
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000763
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000764// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
765#if 0
766// TODO(juberti): Figure out why ViE is munging the COM refcount.
767#ifdef WIN32
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000768WEBRTC_DISABLED_BASE_TEST(CheckCoInitialize) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000769 Base::CheckCoInitialize();
770}
771#endif
772#endif
773
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000774WEBRTC_BASE_TEST(SetSend);
775WEBRTC_BASE_TEST(SetSendWithoutCodecs);
776WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000777
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000778WEBRTC_BASE_TEST(GetStats);
779WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
780WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000781
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000782WEBRTC_BASE_TEST(SetSendBandwidth);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000783
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000784WEBRTC_BASE_TEST(SetSendSsrc);
785WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000786
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000787WEBRTC_BASE_TEST(SetRenderer);
788WEBRTC_BASE_TEST(AddRemoveRecvStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000789
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000790WEBRTC_DISABLED_BASE_TEST(AddRemoveRecvStreamAndRender);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000791
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000792WEBRTC_BASE_TEST(AddRemoveRecvStreamsNoConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000793
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000794WEBRTC_BASE_TEST(AddRemoveSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000795
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000796WEBRTC_BASE_TEST(SimulateConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000797
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000798WEBRTC_BASE_TEST(AddRemoveCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000799
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000800WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000801
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000802WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000803
804// TODO(pbos): Figure out why this fails so often.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000805WEBRTC_DISABLED_BASE_TEST(HighAspectHighHeightCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000806
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000807WEBRTC_BASE_TEST(RejectEmptyStreamParams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000808
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000809WEBRTC_BASE_TEST(AdaptResolution16x10);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000810
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000811WEBRTC_BASE_TEST(AdaptResolution4x3);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000812
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000813// TODO(juberti): Restore this test once we support sending 0 fps.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000814WEBRTC_DISABLED_BASE_TEST(AdaptDropAllFrames);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000815// TODO(juberti): Understand why we get decode errors on this test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000816WEBRTC_DISABLED_BASE_TEST(AdaptFramerate);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000817
pbos@webrtc.orgc4175b92014-09-03 15:25:49 +0000818WEBRTC_BASE_TEST(SendsLowerResolutionOnSmallerFrames);
819
820WEBRTC_BASE_TEST(MuteStream);
821
822WEBRTC_BASE_TEST(MultipleSendStreams);
823
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000824WEBRTC_BASE_TEST(SetSendStreamFormat0x0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000825
826// TODO(zhurunz): Fix the flakey test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000827WEBRTC_DISABLED_BASE_TEST(SetSendStreamFormat);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000828
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000829TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Vga) {
830 SendAndReceive(cricket::VideoCodec(100, "VP8", 640, 400, 30, 0));
831}
832
833TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Qvga) {
834 SendAndReceive(cricket::VideoCodec(100, "VP8", 320, 200, 30, 0));
835}
836
837TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8SvcQqvga) {
838 SendAndReceive(cricket::VideoCodec(100, "VP8", 160, 100, 30, 0));
839}
840
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000841TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
842 Base::TwoStreamsSendAndReceive(kVp8Codec);
843}
844
845TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
846 Base::TwoStreamsReUseFirstStream(kVp8Codec);
847}
848
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000849WEBRTC_BASE_TEST(SendManyResizeOnce);
850
851// TODO(pbos): Enable and figure out why this fails (or should work).
852TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
853 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL));
854 EXPECT_TRUE(channel_->SetRenderer(kDefaultReceiveSsrc, &renderer_));
855 channel_->UpdateAspectRatio(1280, 720);
856 video_capturer_.reset(new cricket::FakeVideoCapturer);
857 const std::vector<cricket::VideoFormat>* formats =
858 video_capturer_->GetSupportedFormats();
859 cricket::VideoFormat capture_format_hd = (*formats)[0];
860 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(capture_format_hd));
861 EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get()));
862
863 // Capture format HD -> adapt (OnOutputFormatRequest VGA) -> VGA.
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000864 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000865 EXPECT_TRUE(SetOneCodec(codec));
866 codec.width /= 2;
867 codec.height /= 2;
868 EXPECT_TRUE(SetSend(true));
869 EXPECT_TRUE(channel_->SetRender(true));
870 EXPECT_EQ(0, renderer_.num_rendered_frames());
871 EXPECT_TRUE(SendFrame());
872 EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout);
873}
874
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000875class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test,
876 public WebRtcCallFactory {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000877 public:
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000878 WebRtcVideoChannel2Test() : fake_call_(NULL) {}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000879 virtual void SetUp() OVERRIDE {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000880 engine_.SetCallFactory(this);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000881 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000882 channel_.reset(engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000883 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000884 last_ssrc_ = 123;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000885 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000886 }
887
888 protected:
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000889 virtual webrtc::Call* CreateCall(
890 const webrtc::Call::Config& config) OVERRIDE {
891 assert(fake_call_ == NULL);
892 fake_call_ = new FakeCall(config);
893 return fake_call_;
894 }
895
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000896 FakeVideoSendStream* AddSendStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000897 return AddSendStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000898 }
899
900 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000901 size_t num_streams = fake_call_->GetVideoSendStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000902 EXPECT_TRUE(channel_->AddSendStream(sp));
903 std::vector<FakeVideoSendStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000904 fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000905 EXPECT_EQ(num_streams + 1, streams.size());
906 return streams[streams.size() - 1];
907 }
908
909 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000910 return fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000911 }
912
913 FakeVideoReceiveStream* AddRecvStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000914 return AddRecvStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000915 }
916
917 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000918 size_t num_streams = fake_call_->GetVideoReceiveStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000919 EXPECT_TRUE(channel_->AddRecvStream(sp));
920 std::vector<FakeVideoReceiveStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000921 fake_call_->GetVideoReceiveStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000922 EXPECT_EQ(num_streams + 1, streams.size());
923 return streams[streams.size() - 1];
924 }
925
pbos@webrtc.org00873182014-11-25 14:03:34 +0000926 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
927 int expected_min_bitrate_bps,
928 const char* start_bitrate_kbps,
929 int expected_start_bitrate_bps,
930 const char* max_bitrate_kbps,
931 int expected_max_bitrate_bps) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000932 std::vector<VideoCodec> codecs;
933 codecs.push_back(kVp8Codec);
pbos@webrtc.org00873182014-11-25 14:03:34 +0000934 codecs[0].params[kCodecParamMinBitrate] = min_bitrate_kbps;
935 codecs[0].params[kCodecParamStartBitrate] = start_bitrate_kbps;
936 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate_kbps;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000937 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
938
pbos@webrtc.org00873182014-11-25 14:03:34 +0000939 EXPECT_EQ(expected_min_bitrate_bps,
940 fake_call_->GetConfig().stream_bitrates.min_bitrate_bps);
941 EXPECT_EQ(expected_start_bitrate_bps,
942 fake_call_->GetConfig().stream_bitrates.start_bitrate_bps);
943 EXPECT_EQ(expected_max_bitrate_bps,
944 fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000945 }
946
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000947 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
948 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000949 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000950 // Enable extension.
951 const int id = 1;
952 std::vector<cricket::RtpHeaderExtension> extensions;
953 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
954 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
955
956 FakeVideoSendStream* send_stream =
957 AddSendStream(cricket::StreamParams::CreateLegacy(123));
958
959 // Verify the send extension id.
960 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
961 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
962 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
963 // Verify call with same set of extensions returns true.
964 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
965 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
966 // receivers.
967 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
968 ->GetConfig()
969 .rtp.extensions.empty());
970
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000971 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000972 std::vector<cricket::RtpHeaderExtension> empty_extensions;
973 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000974 ASSERT_EQ(1u, call->GetVideoSendStreams().size());
975 send_stream = call->GetVideoSendStreams()[0];
976 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
977
978 // Verify that adding receive RTP header extensions adds them for existing
979 // streams.
980 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
981 send_stream = call->GetVideoSendStreams()[0];
982 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
983 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
984 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000985 }
986
987 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
988 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000989 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000990 // Enable extension.
991 const int id = 1;
992 std::vector<cricket::RtpHeaderExtension> extensions;
993 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
994 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
995
996 FakeVideoReceiveStream* recv_stream =
997 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
998
999 // Verify the recv extension id.
1000 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1001 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
1002 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
1003 // Verify call with same set of extensions returns true.
1004 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001005
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001006 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
1007 // senders.
1008 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
1009 ->GetConfig()
1010 .rtp.extensions.empty());
1011
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001012 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001013 std::vector<cricket::RtpHeaderExtension> empty_extensions;
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001014 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(empty_extensions));
1015 ASSERT_EQ(1u, call->GetVideoReceiveStreams().size());
1016 recv_stream = call->GetVideoReceiveStreams()[0];
1017 EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
1018
1019 // Verify that adding receive RTP header extensions adds them for existing
1020 // streams.
1021 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1022 recv_stream = call->GetVideoReceiveStreams()[0];
1023 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1024 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
1025 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001026 }
1027
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001028 void TestCpuAdaptation(bool enable_overuse);
1029
1030 FakeCall* fake_call_;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001031 rtc::scoped_ptr<VideoMediaChannel> channel_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001032 uint32 last_ssrc_;
1033};
1034
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001035TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001036 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1037 EXPECT_TRUE(channel_->SetSend(true));
1038 cricket::VideoOptions options;
1039 options.conference_mode.Set(true);
1040 EXPECT_TRUE(channel_->SetOptions(options));
1041
1042 // Send side.
1043 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1044 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1045 FakeVideoSendStream* send_stream = AddSendStream(
1046 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1047
1048 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
1049 for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
1050 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
1051
1052 // Receiver side.
1053 FakeVideoReceiveStream* recv_stream = AddRecvStream(
1054 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1055 ASSERT_GT(recv_stream->GetConfig().rtp.rtx.size(), 0u)
1056 << "No SSRCs for RTX configured by AddRecvStream.";
1057 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size())
1058 << "This test only works with one receive codec. Please update the test.";
1059 EXPECT_EQ(rtx_ssrcs[0],
1060 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
1061 // TODO(pbos): Make sure we set the RTX for correct payloads etc.
1062}
1063
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001064TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
1065 // Setup one channel with an associated RTX stream.
1066 cricket::StreamParams params =
1067 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
1068 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
1069 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
1070 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
1071 EXPECT_EQ(kRtxSsrcs1[0],
1072 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001073}
1074
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001075TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
1076 // Setup one channel without an associated RTX stream.
1077 cricket::StreamParams params =
1078 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
1079 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
1080 ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001081}
1082
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001083TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
1084 FakeVideoSendStream* send_stream =
1085 AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
1086 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
1087
1088 FakeVideoReceiveStream* recv_stream =
1089 AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
1090 ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001091}
1092
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001093// Test support for RTP timestamp offset header extension.
1094TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
1095 TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
1096 webrtc::RtpExtension::kTOffset);
1097}
1098TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
1099 TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
1100 webrtc::RtpExtension::kTOffset);
1101}
1102
1103// Test support for absolute send time header extension.
1104TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
1105 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
1106 webrtc::RtpExtension::kAbsSendTime);
1107}
1108TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
1109 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
1110 webrtc::RtpExtension::kAbsSendTime);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001111}
1112
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001113TEST_F(WebRtcVideoChannel2Test, IdenticalSendExtensionsDoesntRecreateStream) {
1114 const int kTOffsetId = 1;
1115 const int kAbsSendTimeId = 2;
1116 std::vector<cricket::RtpHeaderExtension> extensions;
1117 extensions.push_back(cricket::RtpHeaderExtension(
1118 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1119 extensions.push_back(cricket::RtpHeaderExtension(
1120 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
1121
1122 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1123 FakeVideoSendStream* send_stream =
1124 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1125
1126 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1127 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
1128
1129 // Setting the same extensions (even if in different order) shouldn't
1130 // reallocate the stream.
1131 std::reverse(extensions.begin(), extensions.end());
1132 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1133
1134 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1135
1136 // Setting different extensions should recreate the stream.
1137 extensions.resize(1);
1138 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1139
1140 EXPECT_EQ(2, fake_call_->GetNumCreatedSendStreams());
1141}
1142
1143TEST_F(WebRtcVideoChannel2Test, IdenticalRecvExtensionsDoesntRecreateStream) {
1144 const int kTOffsetId = 1;
1145 const int kAbsSendTimeId = 2;
1146 std::vector<cricket::RtpHeaderExtension> extensions;
1147 extensions.push_back(cricket::RtpHeaderExtension(
1148 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1149 extensions.push_back(cricket::RtpHeaderExtension(
1150 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
1151
1152 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1153 FakeVideoReceiveStream* send_stream =
1154 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1155
1156 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1157 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
1158
1159 // Setting the same extensions (even if in different order) shouldn't
1160 // reallocate the stream.
1161 std::reverse(extensions.begin(), extensions.end());
1162 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1163
1164 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1165
1166 // Setting different extensions should recreate the stream.
1167 extensions.resize(1);
1168 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1169
1170 EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams());
1171}
1172
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001173TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001174 SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001175 const int kUnsupportedId = 1;
1176 const int kTOffsetId = 2;
1177
1178 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001179 extensions.push_back(
1180 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1181 extensions.push_back(
1182 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001183 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1184 FakeVideoSendStream* send_stream =
1185 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1186
1187 // Only timestamp offset extension is set to send stream,
1188 // unsupported rtp extension is ignored.
1189 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
1190 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001191 send_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001192}
1193
1194TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001195 SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001196 const int kUnsupportedId = 1;
1197 const int kTOffsetId = 2;
1198
1199 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001200 extensions.push_back(
1201 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1202 extensions.push_back(
1203 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001204 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1205 FakeVideoReceiveStream* recv_stream =
1206 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1207
1208 // Only timestamp offset extension is set to receive stream,
1209 // unsupported rtp extension is ignored.
1210 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1211 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001212 recv_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001213}
1214
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001215TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001216 const size_t kNumIncorrectIds = 4;
1217 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
1218 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
1219 std::vector<cricket::RtpHeaderExtension> extensions;
1220 extensions.push_back(cricket::RtpHeaderExtension(
1221 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1222 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions))
1223 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1224 }
1225}
1226
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001227TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001228 const size_t kNumIncorrectIds = 4;
1229 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
1230 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
1231 std::vector<cricket::RtpHeaderExtension> extensions;
1232 extensions.push_back(cricket::RtpHeaderExtension(
1233 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1234 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions))
1235 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1236 }
1237}
1238
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001239TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001240 const int id = 1;
1241 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001242 extensions.push_back(
1243 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1244 extensions.push_back(
1245 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001246 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1247
1248 // Duplicate entries are also not supported.
1249 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001250 extensions.push_back(
1251 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001252 extensions.push_back(extensions.back());
1253 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1254}
1255
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001256TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001257 const int id = 1;
1258 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001259 extensions.push_back(
1260 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1261 extensions.push_back(
1262 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001263 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1264
1265 // Duplicate entries are also not supported.
1266 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001267 extensions.push_back(
1268 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001269 extensions.push_back(extensions.back());
1270 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1271}
1272
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001273TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
1274 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1275}
1276
1277TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
1278 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1279}
1280
1281TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
1282 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1283}
1284
1285TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
1286 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001287 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001288}
1289
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001290TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
1291 FakeVideoReceiveStream* stream = AddRecvStream();
1292 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001293}
1294
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001295TEST_F(WebRtcVideoChannel2Test, RembCanBeEnabledAndDisabled) {
1296 FakeVideoReceiveStream* stream = AddRecvStream();
1297 EXPECT_TRUE(stream->GetConfig().rtp.remb);
1298
1299 // Verify that REMB is turned off when codecs without REMB are set.
1300 std::vector<VideoCodec> codecs;
1301 codecs.push_back(kVp8Codec);
1302 EXPECT_TRUE(codecs[0].feedback_params.params().empty());
1303 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001304 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001305 EXPECT_FALSE(stream->GetConfig().rtp.remb);
1306
1307 // Verify that REMB is turned on when setting default codecs since the
1308 // default codecs have REMB enabled.
1309 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001310 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001311 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001312}
1313
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001314TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
1315 VerifyCodecHasDefaultFeedbackParams(default_codec_);
1316
pbos@webrtc.org19864742014-05-30 07:35:47 +00001317 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1318 EXPECT_TRUE(channel_->SetSend(true));
1319
1320 // Send side.
1321 FakeVideoSendStream* send_stream =
1322 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1323 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1324
1325 // Receiver side.
1326 FakeVideoReceiveStream* recv_stream =
1327 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1328 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1329
1330 // Nack history size should match between sender and receiver.
1331 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
1332 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001333}
1334
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001335TEST_F(WebRtcVideoChannel2Test, NackCanBeDisabled) {
1336 std::vector<VideoCodec> codecs;
1337 codecs.push_back(kVp8Codec);
1338
1339 // Send side.
1340 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1341 FakeVideoSendStream* send_stream =
1342 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1343 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
1344
1345 // Receiver side.
1346 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1347 FakeVideoReceiveStream* recv_stream =
1348 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1349 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
1350}
1351
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001352TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
1353 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1354}
1355
1356TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
1357 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1358}
1359
1360TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
1361 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1362}
1363
1364TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
1365 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1366}
1367
1368TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
1369 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1370}
1371
1372TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
1373 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1374}
1375
1376TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
1377 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1378}
1379
1380TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
1381 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1382}
1383
1384TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
1385 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1386}
1387
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001388TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) {
1389 static const int kScreenshareMinBitrateKbps = 800;
1390 cricket::VideoCodec codec = kVp8Codec360p;
1391 std::vector<cricket::VideoCodec> codecs;
1392 codecs.push_back(codec);
1393 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1394 VideoOptions options;
1395 options.screencast_min_bitrate.Set(kScreenshareMinBitrateKbps);
1396 channel_->SetOptions(options);
1397
1398 AddSendStream();
1399
1400 cricket::FakeVideoCapturer capturer;
1401 capturer.SetScreencast(false);
1402 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1403 cricket::VideoFormat capture_format_hd =
1404 capturer.GetSupportedFormats()->front();
1405 EXPECT_EQ(1280, capture_format_hd.width);
1406 EXPECT_EQ(720, capture_format_hd.height);
1407 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1408
1409 EXPECT_TRUE(channel_->SetSend(true));
1410
1411 EXPECT_TRUE(capturer.CaptureFrame());
1412 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1413 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1414
1415 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1416
1417 // Verify non-screencast settings.
1418 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1419 EXPECT_EQ(webrtc::VideoEncoderConfig::kRealtimeVideo,
1420 encoder_config.content_type);
1421 EXPECT_EQ(codec.width, encoder_config.streams.front().width);
1422 EXPECT_EQ(codec.height, encoder_config.streams.front().height);
1423 EXPECT_EQ(0, encoder_config.min_transmit_bitrate_bps)
1424 << "Non-screenshare shouldn't use min-transmit bitrate.";
1425
1426 capturer.SetScreencast(true);
1427 EXPECT_TRUE(capturer.CaptureFrame());
1428
1429 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1430
1431 // Verify screencast settings.
1432 encoder_config = send_stream->GetEncoderConfig();
1433 EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
1434 encoder_config.content_type);
1435 EXPECT_EQ(kScreenshareMinBitrateKbps * 1000,
1436 encoder_config.min_transmit_bitrate_bps);
1437
1438 EXPECT_EQ(capture_format_hd.width, encoder_config.streams.front().width);
1439 EXPECT_EQ(capture_format_hd.height, encoder_config.streams.front().height);
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +00001440 EXPECT_TRUE(encoder_config.streams[0].temporal_layer_thresholds_bps.empty());
1441
1442 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
1443}
1444
1445TEST_F(WebRtcVideoChannel2Test,
1446 ConferenceModeScreencastConfiguresTemporalLayer) {
1447 static const int kConferenceScreencastTemporalBitrateBps = 100000;
1448 VideoOptions options;
1449 options.conference_mode.Set(true);
1450 channel_->SetOptions(options);
1451
1452 AddSendStream();
1453
1454 cricket::FakeVideoCapturer capturer;
1455 capturer.SetScreencast(true);
1456 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1457 cricket::VideoFormat capture_format_hd =
1458 capturer.GetSupportedFormats()->front();
1459 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1460
1461 EXPECT_TRUE(channel_->SetSend(true));
1462
1463 EXPECT_TRUE(capturer.CaptureFrame());
1464 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1465 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1466
1467 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1468
1469 // Verify screencast settings.
1470 encoder_config = send_stream->GetEncoderConfig();
1471 EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
1472 encoder_config.content_type);
1473 ASSERT_EQ(1u, encoder_config.streams.size());
1474 ASSERT_EQ(1u, encoder_config.streams[0].temporal_layer_thresholds_bps.size());
1475 EXPECT_EQ(kConferenceScreencastTemporalBitrateBps,
1476 encoder_config.streams[0].temporal_layer_thresholds_bps[0]);
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001477
1478 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001479}
1480
1481TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
1482 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1483}
1484
1485TEST_F(WebRtcVideoChannel2Test,
1486 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
1487 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1488}
1489
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001490TEST_F(WebRtcVideoChannel2Test, SuspendBelowMinBitrateDisabledByDefault) {
1491 FakeVideoSendStream* stream = AddSendStream();
1492 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1493}
1494
1495TEST_F(WebRtcVideoChannel2Test, SetOptionsWithSuspendBelowMinBitrate) {
1496 VideoOptions options;
1497 options.suspend_below_min_bitrate.Set(true);
1498 channel_->SetOptions(options);
1499
1500 FakeVideoSendStream* stream = AddSendStream();
1501 EXPECT_TRUE(stream->GetConfig().suspend_below_min_bitrate);
1502
1503 options.suspend_below_min_bitrate.Set(false);
1504 channel_->SetOptions(options);
1505
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001506 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001507 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1508}
1509
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001510TEST_F(WebRtcVideoChannel2Test, Vp8DenoisingEnabledByDefault) {
1511 FakeVideoSendStream* stream = AddSendStream();
1512 webrtc::VideoCodecVP8 vp8_settings;
1513 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1514 EXPECT_TRUE(vp8_settings.denoisingOn);
1515}
1516
1517TEST_F(WebRtcVideoChannel2Test, SetOptionsWithDenoising) {
1518 VideoOptions options;
1519 options.video_noise_reduction.Set(false);
1520 channel_->SetOptions(options);
1521
1522 FakeVideoSendStream* stream = AddSendStream();
1523 webrtc::VideoCodecVP8 vp8_settings;
1524 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1525 EXPECT_FALSE(vp8_settings.denoisingOn);
1526
1527 options.video_noise_reduction.Set(true);
1528 channel_->SetOptions(options);
1529
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001530 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001531 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1532 EXPECT_TRUE(vp8_settings.denoisingOn);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001533}
1534
1535TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
1536 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1537}
1538
pbos@webrtc.org8aed9452014-07-26 10:16:49 +00001539TEST_F(WebRtcVideoChannel2Test, DISABLED_SendReceiveBitratesStats) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001540 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1541}
1542
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001543TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruse) {
1544 TestCpuAdaptation(true);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001545}
1546
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001547TEST_F(WebRtcVideoChannel2Test, DoesNotAdaptOnOveruseWhenDisabled) {
1548 TestCpuAdaptation(false);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001549}
1550
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001551void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse) {
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001552 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001553 std::vector<cricket::VideoCodec> codecs;
1554 codecs.push_back(codec);
1555 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1556
1557 if (enable_overuse) {
1558 VideoOptions options;
1559 options.cpu_overuse_detection.Set(true);
1560 channel_->SetOptions(options);
1561 }
1562
1563 AddSendStream();
1564
1565 cricket::FakeVideoCapturer capturer;
1566 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1567 EXPECT_EQ(cricket::CS_RUNNING,
1568 capturer.Start(capturer.GetSupportedFormats()->front()));
1569
1570 EXPECT_TRUE(channel_->SetSend(true));
1571
1572 // Trigger overuse.
1573 webrtc::LoadObserver* overuse_callback =
1574 fake_call_->GetConfig().overuse_callback;
1575 ASSERT_TRUE(overuse_callback != NULL);
1576 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
1577
1578 EXPECT_TRUE(capturer.CaptureFrame());
1579 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1580 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1581
1582 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1583
1584 if (enable_overuse) {
1585 EXPECT_LT(send_stream->GetLastWidth(), codec.width);
1586 EXPECT_LT(send_stream->GetLastHeight(), codec.height);
1587 } else {
1588 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1589 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1590 }
1591
1592 // Trigger underuse which should go back to normal resolution.
1593 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
1594 EXPECT_TRUE(capturer.CaptureFrame());
1595
1596 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1597
1598 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1599 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1600
1601 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001602}
1603
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001604TEST_F(WebRtcVideoChannel2Test, EstimatesNtpStartTimeAndElapsedTimeCorrectly) {
1605 // Start at last timestamp to verify that wraparounds are estimated correctly.
1606 static const uint32_t kInitialTimestamp = 0xFFFFFFFFu;
1607 static const int64_t kInitialNtpTimeMs = 1247891230;
1608 static const int kFrameOffsetMs = 20;
1609 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001610
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001611 FakeVideoReceiveStream* stream = AddRecvStream();
1612 cricket::FakeVideoRenderer renderer;
1613 EXPECT_TRUE(channel_->SetRenderer(last_ssrc_, &renderer));
1614 EXPECT_TRUE(channel_->SetRender(true));
1615
1616 webrtc::I420VideoFrame video_frame;
1617 CreateBlackFrame(&video_frame, 4, 4);
1618 video_frame.set_timestamp(kInitialTimestamp);
1619 // Initial NTP time is not available on the first frame, but should still be
1620 // able to be estimated.
1621 stream->InjectFrame(video_frame, 0);
1622
1623 EXPECT_EQ(1, renderer.num_rendered_frames());
1624 EXPECT_EQ(0, renderer.last_frame_elapsed_time_ns());
1625
1626 // This timestamp is kInitialTimestamp (-1) + kFrameOffsetMs * 90, which
1627 // triggers a constant-overflow warning, hence we're calculating it explicitly
1628 // here.
1629 video_frame.set_timestamp(kFrameOffsetMs * 90 - 1);
1630 video_frame.set_ntp_time_ms(kInitialNtpTimeMs + kFrameOffsetMs);
1631 stream->InjectFrame(video_frame, 0);
1632
1633 EXPECT_EQ(2, renderer.num_rendered_frames());
1634 EXPECT_EQ(kFrameOffsetMs * rtc::kNumNanosecsPerMillisec,
1635 renderer.last_frame_elapsed_time_ns());
1636
1637 // Verify that NTP time has been correctly deduced.
1638 cricket::VideoMediaInfo info;
1639 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
1640 ASSERT_EQ(1u, info.receivers.size());
1641 EXPECT_EQ(kInitialNtpTimeMs, info.receivers[0].capture_start_ntp_time_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001642}
1643
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001644TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001645 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001646
1647 VideoCodec codec;
1648 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001649 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001650
1651 // Using a RTX setup to verify that the default RTX payload type is good.
1652 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1653 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1654 FakeVideoSendStream* stream = AddSendStream(
1655 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1656 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001657
1658 // Make sure NACK and FEC are enabled on the correct payload types.
1659 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
1660 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
1661 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001662
1663 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
1664 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +00001665 EXPECT_EQ(static_cast<int>(default_rtx_codec_.id),
1666 config.rtp.rtx.payload_type);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001667 // TODO(juberti): Check RTCP, PLI, TMMBR.
1668}
1669
1670TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
1671 std::vector<VideoCodec> codecs;
1672 codecs.push_back(kVp8Codec);
1673 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1674
1675 FakeVideoSendStream* stream = AddSendStream();
1676 webrtc::VideoSendStream::Config config = stream->GetConfig();
1677
1678 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1679 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1680}
1681
1682TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001683 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1684 std::vector<VideoCodec> codecs;
1685 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1686 codecs.push_back(rtx_codec);
1687 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1688 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001689}
1690
1691TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001692 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1693 std::vector<VideoCodec> codecs;
1694 cricket::VideoCodec rtx_codec =
1695 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1696 codecs.push_back(kVp8Codec);
1697 codecs.push_back(rtx_codec);
1698 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1699
1700 cricket::VideoCodec rtx_codec2 =
1701 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1702 codecs.pop_back();
1703 codecs.push_back(rtx_codec2);
1704 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1705 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001706}
1707
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001708TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1709 std::vector<VideoCodec> codecs;
1710 codecs.push_back(kVp8Codec);
1711 codecs.push_back(kUlpfecCodec);
1712 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1713
1714 FakeVideoSendStream* stream = AddSendStream();
1715 webrtc::VideoSendStream::Config config = stream->GetConfig();
1716
1717 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1718
1719 codecs.pop_back();
1720 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001721 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001722 ASSERT_TRUE(stream != NULL);
1723 config = stream->GetConfig();
1724 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1725 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001726}
1727
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001728TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1729 std::vector<VideoCodec> codecs;
1730 codecs.push_back(kVp8Codec720p);
1731 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1732
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001733 std::vector<webrtc::VideoStream> streams = AddSendStream()->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001734 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1735 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1736
1737 codecs.clear();
1738 codecs.push_back(kVp8Codec360p);
1739 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001740 streams = fake_call_->GetVideoSendStreams()[0]->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001741 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1742 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001743}
1744
pbos@webrtc.org00873182014-11-25 14:03:34 +00001745TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithBitrates) {
1746 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1747 200000);
1748}
1749
1750TEST_F(WebRtcVideoChannel2Test,
1751 SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1752 SetSendCodecsShouldWorkForBitrates(
1753 "", 0, "", -1, "", -1);
1754}
1755
1756TEST_F(WebRtcVideoChannel2Test, SetSendCodecsCapsMinAndStartBitrate) {
1757 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001758}
1759
1760TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001761 std::vector<VideoCodec> video_codecs = engine_.codecs();
pbos@webrtc.org88ef6322014-11-04 15:29:29 +00001762 video_codecs[0].params[kCodecParamMinBitrate] = "300";
1763 video_codecs[0].params[kCodecParamMaxBitrate] = "200";
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001764 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001765}
1766
pbos@webrtc.org00873182014-11-25 14:03:34 +00001767TEST_F(WebRtcVideoChannel2Test,
1768 SetMaxSendBandwidthShouldPreserveOtherBitrates) {
1769 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1770 200000);
1771 channel_->SetMaxSendBandwidth(300000);
1772 EXPECT_EQ(100000, fake_call_->GetConfig().stream_bitrates.min_bitrate_bps)
1773 << "Setting max bitrate should keep previous min bitrate.";
1774 EXPECT_EQ(-1, fake_call_->GetConfig().stream_bitrates.start_bitrate_bps)
1775 << "Setting max bitrate should not reset start bitrate.";
1776 EXPECT_EQ(300000, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
1777}
1778
1779TEST_F(WebRtcVideoChannel2Test, SetMaxSendBandwidthShouldBeRemovable) {
1780 channel_->SetMaxSendBandwidth(300000);
1781 EXPECT_EQ(300000, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
1782 // <= 0 means disable (infinite) max bitrate.
1783 channel_->SetMaxSendBandwidth(0);
1784 EXPECT_EQ(-1, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps)
1785 << "Setting zero max bitrate did not reset start bitrate.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001786}
1787
1788TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1789 static const char* kMaxQuantization = "21";
1790 std::vector<VideoCodec> codecs;
1791 codecs.push_back(kVp8Codec);
1792 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1793 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001794 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1795 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001796
1797 VideoCodec codec;
1798 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1799 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1800}
1801
1802TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1803 std::vector<cricket::VideoCodec> codecs;
1804 codecs.push_back(kVp8Codec);
1805
1806 codecs[0].width = 0;
1807 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1808 << "Codec set though codec width is zero.";
1809
1810 codecs[0].width = kVp8Codec.width;
1811 codecs[0].height = 0;
1812 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1813 << "Codec set though codec height is zero.";
1814}
1815
1816TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
1817 // TODO(pbos): Should we only allow the dynamic range?
1818 static const size_t kNumIncorrectPayloads = 4;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001819 static const int kIncorrectPayloads[kNumIncorrectPayloads] = {
1820 -2, -1, 128, 129};
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001821 std::vector<cricket::VideoCodec> codecs;
1822 codecs.push_back(kVp8Codec);
1823 for (size_t i = 0; i < kNumIncorrectPayloads; ++i) {
1824 int payload_type = kIncorrectPayloads[i];
1825 codecs[0].id = payload_type;
1826 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1827 << "Bad payload type '" << payload_type << "' accepted.";
1828 }
1829}
1830
1831TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
1832 std::vector<cricket::VideoCodec> codecs;
1833 codecs.push_back(kVp8Codec);
1834 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
1835 codecs[0].id = payload_type;
1836 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
1837 << "Payload type '" << payload_type << "' rejected.";
1838 }
1839}
1840
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001841TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
1842 std::vector<cricket::VideoCodec> codecs;
1843 codecs.push_back(kVp8Codec);
1844 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1845}
1846
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001847// Test that we set our inbound RTX codecs properly.
1848TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
1849 std::vector<cricket::VideoCodec> codecs;
1850 codecs.push_back(kVp8Codec);
1851 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1852 codecs.push_back(rtx_codec);
1853 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1854 << "RTX codec without associated payload should be rejected.";
1855
1856 codecs[1].SetParam("apt", kVp8Codec.id + 1);
1857 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1858 << "RTX codec with invalid associated payload type should be rejected.";
1859
1860 codecs[1].SetParam("apt", kVp8Codec.id);
1861 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1862
1863 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
1864 rtx_codec2.SetParam("apt", rtx_codec.id);
1865 codecs.push_back(rtx_codec2);
1866
1867 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
1868 "as associated payload type "
1869 "should be rejected.";
1870}
1871
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001872TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
1873 std::vector<cricket::VideoCodec> codecs;
1874 codecs.push_back(kVp8Codec);
1875 codecs[0].id = 99;
1876 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1877}
1878
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001879TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001880 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001881
1882 FakeVideoReceiveStream* stream = AddRecvStream();
1883 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
pbos@webrtc.org776e6f22014-10-29 15:28:39 +00001884 EXPECT_EQ(engine_.codecs()[0].name, config.decoders[0].payload_name);
1885 EXPECT_EQ(engine_.codecs()[0].id, config.decoders[0].payload_type);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001886}
1887
1888TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
1889 std::vector<VideoCodec> codecs;
1890 codecs.push_back(kVp8Codec);
1891 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
1892 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1893}
1894
1895// TODO(pbos): Enable VP9 through external codec support
1896TEST_F(WebRtcVideoChannel2Test,
1897 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
1898 std::vector<VideoCodec> codecs;
1899 codecs.push_back(kVp8Codec);
1900 codecs.push_back(kVp9Codec);
1901 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1902}
1903
1904TEST_F(WebRtcVideoChannel2Test,
1905 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
1906 std::vector<VideoCodec> codecs;
1907 codecs.push_back(kVp8Codec);
1908 codecs.push_back(kVp9Codec);
1909 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1910 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
1911}
1912
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001913TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
1914 std::vector<VideoCodec> codecs;
1915 codecs.push_back(kVp8Codec);
1916 codecs.push_back(kUlpfecCodec);
1917 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1918
1919 FakeVideoReceiveStream* stream = AddRecvStream();
1920 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1921
1922 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1923
1924 codecs.pop_back();
1925 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001926 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001927 ASSERT_TRUE(stream != NULL);
1928 config = stream->GetConfig();
1929 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1930 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001931}
1932
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001933TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
1934 std::vector<VideoCodec> codecs;
1935 codecs.push_back(kVp8Codec);
1936 codecs.push_back(kRedCodec);
1937 codecs[1].id = codecs[0].id;
1938 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1939}
1940
1941TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
1942 std::vector<VideoCodec> codecs;
1943 codecs.push_back(kVp8Codec);
1944 codecs.push_back(kVp9Codec);
1945 codecs[1].id = codecs[0].id;
1946 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1947}
1948
1949TEST_F(WebRtcVideoChannel2Test,
1950 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
1951 std::vector<VideoCodec> codecs;
1952 codecs.push_back(kVp8Codec);
1953 codecs.push_back(kVp8Codec);
1954 codecs[1].id += 1;
1955 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1956}
1957
1958TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
1959 EXPECT_FALSE(AddSendStream()->IsSending());
1960}
1961
pbos@webrtc.org85f42942014-07-22 09:14:58 +00001962TEST_F(WebRtcVideoChannel2Test, ReceiveStreamReceivingByDefault) {
1963 EXPECT_TRUE(AddRecvStream()->IsReceiving());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001964}
1965
1966TEST_F(WebRtcVideoChannel2Test, SetSend) {
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +00001967 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001968 EXPECT_FALSE(stream->IsSending());
1969
1970 // false->true
1971 EXPECT_TRUE(channel_->SetSend(true));
1972 EXPECT_TRUE(stream->IsSending());
1973 // true->true
1974 EXPECT_TRUE(channel_->SetSend(true));
1975 EXPECT_TRUE(stream->IsSending());
1976 // true->false
1977 EXPECT_TRUE(channel_->SetSend(false));
1978 EXPECT_FALSE(stream->IsSending());
1979 // false->false
1980 EXPECT_TRUE(channel_->SetSend(false));
1981 EXPECT_FALSE(stream->IsSending());
1982
1983 EXPECT_TRUE(channel_->SetSend(true));
1984 FakeVideoSendStream* new_stream = AddSendStream();
1985 EXPECT_TRUE(new_stream->IsSending())
1986 << "Send stream created after SetSend(true) not sending initially.";
1987}
1988
pbos@webrtc.orgd8198032014-11-10 14:41:43 +00001989// This test verifies DSCP settings are properly applied on video media channel.
1990TEST_F(WebRtcVideoChannel2Test, TestSetDscpOptions) {
1991 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
1992 new cricket::FakeNetworkInterface);
1993 channel_->SetInterface(network_interface.get());
1994 cricket::VideoOptions options;
1995 options.dscp.Set(true);
1996 EXPECT_TRUE(channel_->SetOptions(options));
1997 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
1998 // Verify previous value is not modified if dscp option is not set.
1999 cricket::VideoOptions options1;
2000 EXPECT_TRUE(channel_->SetOptions(options1));
2001 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
2002 options.dscp.Set(false);
2003 EXPECT_TRUE(channel_->SetOptions(options));
2004 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
2005 channel_->SetInterface(NULL);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002006}
2007
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002008TEST_F(WebRtcVideoChannel2Test, OnReadyToSendSignalsNetworkState) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002009 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002010
2011 channel_->OnReadyToSend(false);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002012 EXPECT_EQ(webrtc::Call::kNetworkDown, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002013
2014 channel_->OnReadyToSend(true);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002015 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002016}
2017
pbos@webrtc.org273a4142014-12-01 15:23:21 +00002018TEST_F(WebRtcVideoChannel2Test, GetStatsReportsUpperResolution) {
2019 FakeVideoSendStream* stream = AddSendStream();
2020 webrtc::VideoSendStream::Stats stats;
2021 stats.substreams[17].sent_width = 123;
2022 stats.substreams[17].sent_height = 40;
2023 stats.substreams[42].sent_width = 80;
2024 stats.substreams[42].sent_height = 31;
2025 stats.substreams[11].sent_width = 20;
2026 stats.substreams[11].sent_height = 90;
2027 stream->SetStats(stats);
2028
2029 cricket::VideoMediaInfo info;
2030 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
2031 ASSERT_EQ(1u, info.senders.size());
2032 EXPECT_EQ(123, info.senders[0].send_frame_width);
2033 EXPECT_EQ(90, info.senders[0].send_frame_height);
2034}
2035
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002036TEST_F(WebRtcVideoChannel2Test, TranslatesCallStatsCorrectly) {
2037 AddSendStream();
2038 AddSendStream();
2039 webrtc::Call::Stats stats;
2040 stats.rtt_ms = 123;
2041 fake_call_->SetStats(stats);
2042
2043 cricket::VideoMediaInfo info;
2044 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
2045 ASSERT_EQ(2u, info.senders.size());
2046 EXPECT_EQ(stats.rtt_ms, info.senders[0].rtt_ms);
2047 EXPECT_EQ(stats.rtt_ms, info.senders[1].rtt_ms);
2048}
2049
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002050class WebRtcVideoEngine2SimulcastTest : public testing::Test {
2051 public:
2052 WebRtcVideoEngine2SimulcastTest()
2053 : engine_codecs_(engine_.codecs()) {
2054 assert(!engine_codecs_.empty());
2055
2056 bool codec_set = false;
2057 for (size_t i = 0; i < engine_codecs_.size(); ++i) {
2058 if (engine_codecs_[i].name == "red") {
2059 default_red_codec_ = engine_codecs_[i];
2060 } else if (engine_codecs_[i].name == "ulpfec") {
2061 default_ulpfec_codec_ = engine_codecs_[i];
2062 } else if (engine_codecs_[i].name == "rtx") {
2063 default_rtx_codec_ = engine_codecs_[i];
2064 } else if (!codec_set) {
2065 default_codec_ = engine_codecs_[i];
2066 codec_set = true;
2067 }
2068 }
2069
2070 assert(codec_set);
2071 }
2072
2073 protected:
2074 WebRtcVideoEngine2 engine_;
2075 VideoCodec default_codec_;
2076 VideoCodec default_red_codec_;
2077 VideoCodec default_ulpfec_codec_;
2078 VideoCodec default_rtx_codec_;
2079 // TODO(pbos): Remove engine_codecs_ unless used a lot.
2080 std::vector<VideoCodec> engine_codecs_;
2081};
2082
2083class WebRtcVideoChannel2SimulcastTest : public WebRtcVideoEngine2SimulcastTest,
2084 public WebRtcCallFactory {
2085 public:
2086 WebRtcVideoChannel2SimulcastTest() : fake_call_(NULL) {}
2087
2088 virtual void SetUp() OVERRIDE {
2089 engine_.SetCallFactory(this);
2090 engine_.Init(rtc::Thread::Current());
2091 channel_.reset(engine_.CreateChannel(VideoOptions(), NULL));
2092 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
2093 last_ssrc_ = 123;
2094 }
2095
2096 protected:
2097 virtual webrtc::Call* CreateCall(
2098 const webrtc::Call::Config& config) OVERRIDE {
2099 assert(fake_call_ == NULL);
2100 fake_call_ = new FakeCall(config);
2101 return fake_call_;
2102 }
2103
2104 void VerifySimulcastSettings(const VideoCodec& codec,
2105 VideoOptions::HighestBitrate bitrate_mode,
2106 size_t num_configured_streams,
2107 size_t expected_num_streams,
2108 SimulcastBitrateMode simulcast_bitrate_mode) {
2109 cricket::VideoOptions options;
2110 options.video_highest_bitrate.Set(bitrate_mode);
2111 EXPECT_TRUE(channel_->SetOptions(options));
2112
2113 std::vector<VideoCodec> codecs;
2114 codecs.push_back(codec);
2115 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
2116
2117 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
2118 assert(num_configured_streams <= ssrcs.size());
2119 ssrcs.resize(num_configured_streams);
2120
2121 FakeVideoSendStream* stream =
2122 AddSendStream(CreateSimStreamParams("cname", ssrcs));
2123
2124 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
2125 ASSERT_EQ(expected_num_streams, video_streams.size());
2126
2127 std::vector<webrtc::VideoStream> expected_streams = GetSimulcastConfig(
2128 num_configured_streams,
2129 simulcast_bitrate_mode,
2130 codec.width,
2131 codec.height,
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002132 0,
2133 kDefaultQpMax,
2134 codec.framerate != 0 ? codec.framerate : kDefaultFramerate);
2135
2136 ASSERT_EQ(expected_streams.size(), video_streams.size());
2137
2138 size_t num_streams = video_streams.size();
2139 for (size_t i = 0; i < num_streams; ++i) {
2140 EXPECT_EQ(expected_streams[i].width, video_streams[i].width);
2141 EXPECT_EQ(expected_streams[i].height, video_streams[i].height);
2142
2143 EXPECT_GT(video_streams[i].max_framerate, 0);
2144 EXPECT_EQ(expected_streams[i].max_framerate,
2145 video_streams[i].max_framerate);
2146
2147 EXPECT_GT(video_streams[i].min_bitrate_bps, 0);
2148 EXPECT_EQ(expected_streams[i].min_bitrate_bps,
2149 video_streams[i].min_bitrate_bps);
2150
2151 EXPECT_GT(video_streams[i].target_bitrate_bps, 0);
2152 EXPECT_EQ(expected_streams[i].target_bitrate_bps,
2153 video_streams[i].target_bitrate_bps);
2154
2155 EXPECT_GT(video_streams[i].max_bitrate_bps, 0);
2156 EXPECT_EQ(expected_streams[i].max_bitrate_bps,
2157 video_streams[i].max_bitrate_bps);
2158
2159 EXPECT_GT(video_streams[i].max_qp, 0);
2160 EXPECT_EQ(expected_streams[i].max_qp, video_streams[i].max_qp);
2161
2162 EXPECT_FALSE(expected_streams[i].temporal_layer_thresholds_bps.empty());
2163 EXPECT_EQ(expected_streams[i].temporal_layer_thresholds_bps,
2164 video_streams[i].temporal_layer_thresholds_bps);
2165 }
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002166 }
2167
2168 FakeVideoSendStream* AddSendStream() {
2169 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
2170 }
2171
2172 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
2173 size_t num_streams =
2174 fake_call_->GetVideoSendStreams().size();
2175 EXPECT_TRUE(channel_->AddSendStream(sp));
2176 std::vector<FakeVideoSendStream*> streams =
2177 fake_call_->GetVideoSendStreams();
2178 EXPECT_EQ(num_streams + 1, streams.size());
2179 return streams[streams.size() - 1];
2180 }
2181
2182 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
2183 return fake_call_->GetVideoSendStreams();
2184 }
2185
2186 FakeVideoReceiveStream* AddRecvStream() {
2187 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
2188 }
2189
2190 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
2191 size_t num_streams =
2192 fake_call_->GetVideoReceiveStreams().size();
2193 EXPECT_TRUE(channel_->AddRecvStream(sp));
2194 std::vector<FakeVideoReceiveStream*> streams =
2195 fake_call_->GetVideoReceiveStreams();
2196 EXPECT_EQ(num_streams + 1, streams.size());
2197 return streams[streams.size() - 1];
2198 }
2199
2200 FakeCall* fake_call_;
2201 rtc::scoped_ptr<VideoMediaChannel> channel_;
2202 uint32 last_ssrc_;
2203};
2204
2205TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith2SimulcastStreams) {
2206 VerifySimulcastSettings(kVp8Codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2207}
2208
2209TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith3SimulcastStreams) {
2210 VerifySimulcastSettings(
2211 kVp8Codec720p, VideoOptions::NORMAL, 3, 3, SBM_NORMAL);
2212}
2213
2214TEST_F(WebRtcVideoChannel2SimulcastTest,
2215 SetSendCodecsWith2SimulcastStreamsHighBitrateMode) {
2216 VerifySimulcastSettings(kVp8Codec, VideoOptions::HIGH, 2, 2, SBM_HIGH);
2217}
2218
2219TEST_F(WebRtcVideoChannel2SimulcastTest,
2220 SetSendCodecsWith3SimulcastStreamsHighBitrateMode) {
2221 VerifySimulcastSettings(kVp8Codec720p, VideoOptions::HIGH, 3, 3, SBM_HIGH);
2222}
2223
2224TEST_F(WebRtcVideoChannel2SimulcastTest,
2225 SetSendCodecsWith2SimulcastStreamsVeryHighBitrateMode) {
2226 VerifySimulcastSettings(
2227 kVp8Codec, VideoOptions::VERY_HIGH, 2, 2, SBM_VERY_HIGH);
2228}
2229
2230TEST_F(WebRtcVideoChannel2SimulcastTest,
2231 SetSendCodecsWith3SimulcastStreamsVeryHighBitrateMode) {
2232 VerifySimulcastSettings(
2233 kVp8Codec720p, VideoOptions::VERY_HIGH, 3, 3, SBM_VERY_HIGH);
2234}
2235
2236// Test that we normalize send codec format size in simulcast.
2237TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) {
2238 cricket::VideoCodec codec(kVp8Codec270p);
2239 codec.width += 1;
2240 codec.height += 1;
2241 VerifySimulcastSettings(codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2242}
2243
2244// Test that if we add a stream with RTX SSRC's, SSRC's get set correctly.
2245TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestStreamWithRtx) {
2246 // TODO(pbos): Implement.
2247 FAIL() << "Not implemented.";
2248}
2249
2250// Test that if we get too few ssrcs are given in AddSendStream(),
2251// only supported sub-streams will be added.
2252TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TooFewSimulcastSsrcs) {
2253 // TODO(pbos): Implement.
2254 FAIL() << "Not implemented.";
2255}
2256
2257// Test that even more than enough ssrcs are given in AddSendStream(),
2258// only supported sub-streams will be added.
2259TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_MoreThanEnoughSimulcastSscrs) {
2260 // TODO(pbos): Implement.
2261 FAIL() << "Not implemented.";
2262}
2263
2264// Test that SetSendStreamFormat works well with simulcast.
2265TEST_F(WebRtcVideoEngine2SimulcastTest,
2266 DISABLED_SetSendStreamFormatWithSimulcast) {
2267 // TODO(pbos): Implement.
2268 FAIL() << "Not implemented.";
2269}
2270
2271// Test that simulcast send codec is reset on new video frame size.
2272TEST_F(WebRtcVideoEngine2SimulcastTest,
2273 DISABLED_ResetSimulcastSendCodecOnNewFrameSize) {
2274 // TODO(pbos): Implement.
2275 FAIL() << "Not implemented.";
2276}
2277
2278// Test that simulcast send codec is reset on new portait mode video frame.
2279TEST_F(WebRtcVideoEngine2SimulcastTest,
2280 DISABLED_ResetSimulcastSendCodecOnNewPortaitFrame) {
2281 // TODO(pbos): Implement.
2282 FAIL() << "Not implemented.";
2283}
2284
2285TEST_F(WebRtcVideoEngine2SimulcastTest,
2286 DISABLED_SetBandwidthInConferenceWithSimulcast) {
2287 // TODO(pbos): Implement.
2288 FAIL() << "Not implemented.";
2289}
2290
2291// Test that sending screencast frames in conference mode changes
2292// bitrate.
2293TEST_F(WebRtcVideoEngine2SimulcastTest,
2294 DISABLED_SetBandwidthScreencastInConference) {
2295 // TODO(pbos): Implement.
2296 FAIL() << "Not implemented.";
2297}
2298
2299// Test AddSendStream with simulcast rejects bad StreamParams.
2300TEST_F(WebRtcVideoEngine2SimulcastTest,
2301 DISABLED_AddSendStreamWithBadStreamParams) {
2302 // TODO(pbos): Implement.
2303 FAIL() << "Not implemented.";
2304}
2305
2306// Test AddSendStream with simulcast sets ssrc and cname correctly.
2307TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_AddSendStreamWithSimulcast) {
2308 // TODO(pbos): Implement.
2309 FAIL() << "Not implemented.";
2310}
2311
2312// Test RemoveSendStream with simulcast.
2313TEST_F(WebRtcVideoEngine2SimulcastTest,
2314 DISABLED_RemoveSendStreamWithSimulcast) {
2315 // TODO(pbos): Implement.
2316 FAIL() << "Not implemented.";
2317}
2318
2319// Test AddSendStream after send codec has already been set will reset
2320// send codec with simulcast settings.
2321TEST_F(WebRtcVideoEngine2SimulcastTest,
2322 DISABLED_AddSimulcastStreamAfterSetSendCodec) {
2323 // TODO(pbos): Implement.
2324 FAIL() << "Not implemented.";
2325}
2326
2327TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_GetStatsWithMultipleSsrcs) {
2328 // TODO(pbos): Implement.
2329 FAIL() << "Not implemented.";
2330}
2331
2332// Test receiving channel(s) local ssrc is set to the same as the first
2333// simulcast sending ssrc.
2334TEST_F(WebRtcVideoEngine2SimulcastTest,
2335 DISABLED_AddSimulcastStreamAfterCreatingRecvChannels) {
2336 // TODO(pbos): Implement.
2337 FAIL() << "Not implemented.";
2338}
2339
2340// Test 1:1 call never turn on simulcast.
2341TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_NoSimulcastWith1on1) {
2342 // TODO(pbos): Implement.
2343 FAIL() << "Not implemented.";
2344}
2345
2346// Test SetOptions with OPT_CONFERENCE flag.
2347TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_SetOptionsWithConferenceMode) {
2348 // TODO(pbos): Implement.
2349 FAIL() << "Not implemented.";
2350}
2351
2352// Test that two different streams can have different formats.
2353TEST_F(WebRtcVideoEngine2SimulcastTest,
2354 DISABLED_MultipleSendStreamsDifferentFormats) {
2355 // TODO(pbos): Implement.
2356 FAIL() << "Not implemented.";
2357}
2358
2359TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToOutputFormat) {
2360 // TODO(pbos): Implement.
2361 FAIL() << "Not implemented.";
2362}
2363
2364TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToCpuLoad) {
2365 // TODO(pbos): Implement.
2366 FAIL() << "Not implemented.";
2367}
2368
2369TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToCpuLoadDisabled) {
2370 // TODO(pbos): Implement.
2371 FAIL() << "Not implemented.";
2372}
2373
2374TEST_F(WebRtcVideoEngine2SimulcastTest,
2375 DISABLED_TestAdaptWithCpuOveruseObserver) {
2376 // TODO(pbos): Implement.
2377 FAIL() << "Not implemented.";
2378}
2379
2380// Test that codec is not reset for every frame sent in non-conference and
2381// non-screencast mode.
2382TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_DontResetCodecOnSendFrame) {
2383 // TODO(pbos): Implement.
2384 FAIL() << "Not implemented.";
2385}
2386
2387TEST_F(WebRtcVideoEngine2SimulcastTest,
2388 DISABLED_UseSimulcastAdapterOnVp8OnlyFactory) {
2389 // TODO(pbos): Implement.
2390 FAIL() << "Not implemented.";
2391}
2392
2393TEST_F(WebRtcVideoEngine2SimulcastTest,
2394 DISABLED_DontUseSimulcastAdapterOnNoneVp8Factory) {
2395 // TODO(pbos): Implement.
2396 FAIL() << "Not implemented.";
2397}
2398
2399TEST_F(WebRtcVideoEngine2SimulcastTest,
2400 DISABLED_DontUseSimulcastAdapterOnMultipleCodecsFactory) {
2401 // TODO(pbos): Implement.
2402 FAIL() << "Not implemented.";
2403}
2404
2405TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x800) {
2406 // TODO(pbos): Implement.
2407 FAIL() << "Not implemented.";
2408}
2409
2410TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x720) {
2411 // TODO(pbos): Implement.
2412 FAIL() << "Not implemented.";
2413}
2414
2415TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x540) {
2416 // TODO(pbos): Implement.
2417 FAIL() << "Not implemented.";
2418}
2419
2420TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x600) {
2421 // TODO(pbos): Implement.
2422 FAIL() << "Not implemented.";
2423}
2424
2425TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x400) {
2426 // TODO(pbos): Implement.
2427 FAIL() << "Not implemented.";
2428}
2429
2430TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x360) {
2431 // TODO(pbos): Implement.
2432 FAIL() << "Not implemented.";
2433}
2434
2435TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_480x300) {
2436 // TODO(pbos): Implement.
2437 FAIL() << "Not implemented.";
2438}
2439
2440TEST_F(WebRtcVideoChannel2SimulcastTest,
2441 DISABLED_DISABLED_SimulcastSend_480x270) {
2442 // TODO(pbos): Implement.
2443 FAIL() << "Not implemented.";
2444}
2445
2446TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x200) {
2447 // TODO(pbos): Implement.
2448 FAIL() << "Not implemented.";
2449}
2450
2451TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x180) {
2452 // TODO(pbos): Implement.
2453 FAIL() << "Not implemented.";
2454}
2455
2456// Test reset send codec with simulcast.
2457// Disabled per b/6773425
2458TEST_F(WebRtcVideoChannel2SimulcastTest,
2459 DISABLED_DISABLED_SimulcastResetSendCodec) {
2460 // TODO(pbos): Implement.
2461 FAIL() << "Not implemented.";
2462}
2463
2464// Test simulcast streams are decodeable with expected sizes.
2465TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastStreams) {
2466 // TODO(pbos): Implement.
2467 FAIL() << "Not implemented.";
2468}
2469
2470// Simulcast and resolution resizing should be turned off when screencasting
2471// but not otherwise.
2472TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_ScreencastRendering) {
2473 // TODO(pbos): Implement.
2474 FAIL() << "Not implemented.";
2475}
2476
2477// Ensures that the correct settings are applied to the codec when single
2478// temporal layer screencasting is enabled, and that the correct simulcast
2479// settings are reapplied when disabling screencasting.
2480TEST_F(WebRtcVideoChannel2SimulcastTest,
2481 DISABLED_OneTemporalLayerScreencastSettings) {
2482 // TODO(pbos): Implement.
2483 FAIL() << "Not implemented.";
2484}
2485
2486// Ensures that the correct settings are applied to the codec when two temporal
2487// layer screencasting is enabled, and that the correct simulcast settings are
2488// reapplied when disabling screencasting.
2489TEST_F(WebRtcVideoChannel2SimulcastTest,
2490 DISABLED_TwoTemporalLayerScreencastSettings) {
2491 // TODO(pbos): Implement.
2492 FAIL() << "Not implemented.";
2493}
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002494
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002495} // namespace cricket