blob: 061126da0e20a5c05a459126bc33cd888dade3dc [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"
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +000040#include "webrtc/base/arraysize.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000041#include "webrtc/base/gunit.h"
42#include "webrtc/base/stringutils.h"
pbos@webrtc.org42684be2014-10-03 11:25:45 +000043#include "webrtc/video_encoder.h"
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000044
45namespace {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000046static const int kDefaultQpMax = 56;
47static const int kDefaultFramerate = 30;
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000048
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000049static const cricket::VideoCodec kVp8Codec720p(100, "VP8", 1280, 720, 30, 0);
50static const cricket::VideoCodec kVp8Codec360p(100, "VP8", 640, 360, 30, 0);
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000051static const cricket::VideoCodec kVp8Codec270p(100, "VP8", 480, 270, 30, 0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000052
53static const cricket::VideoCodec kVp8Codec(100, "VP8", 640, 400, 30, 0);
54static const cricket::VideoCodec kVp9Codec(101, "VP9", 640, 400, 30, 0);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +000055static const cricket::VideoCodec kH264Codec(102, "H264", 640, 400, 30, 0);
56
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000057static const cricket::VideoCodec kRedCodec(116, "red", 0, 0, 0, 0);
58static const cricket::VideoCodec kUlpfecCodec(117, "ulpfec", 0, 0, 0, 0);
59
60static const uint32 kSsrcs1[] = {1};
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000061static const uint32 kSsrcs3[] = {1, 2, 3};
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000062static const uint32 kRtxSsrcs1[] = {4};
pbos@webrtc.org3c107582014-07-20 15:27:35 +000063static const char kUnsupportedExtensionName[] =
64 "urn:ietf:params:rtp-hdrext:unsupported";
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +000065
66void VerifyCodecHasDefaultFeedbackParams(const cricket::VideoCodec& codec) {
67 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
68 cricket::kRtcpFbParamNack, cricket::kParamValueEmpty)));
69 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
70 cricket::kRtcpFbParamNack, cricket::kRtcpFbNackParamPli)));
71 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
72 cricket::kRtcpFbParamRemb, cricket::kParamValueEmpty)));
73 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
74 cricket::kRtcpFbParamCcm, cricket::kRtcpFbCcmParamFir)));
75}
76
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +000077static void CreateBlackFrame(webrtc::I420VideoFrame* video_frame,
78 int width,
79 int height) {
80 video_frame->CreateEmptyFrame(
81 width, height, width, (width + 1) / 2, (width + 1) / 2);
82 memset(video_frame->buffer(webrtc::kYPlane), 16,
83 video_frame->allocated_size(webrtc::kYPlane));
84 memset(video_frame->buffer(webrtc::kUPlane), 128,
85 video_frame->allocated_size(webrtc::kUPlane));
86 memset(video_frame->buffer(webrtc::kVPlane), 128,
87 video_frame->allocated_size(webrtc::kVPlane));
88}
89
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000090} // namespace
91
92namespace cricket {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000093FakeVideoSendStream::FakeVideoSendStream(
94 const webrtc::VideoSendStream::Config& config,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +000095 const webrtc::VideoEncoderConfig& encoder_config)
pbos@webrtc.org42684be2014-10-03 11:25:45 +000096 : sending_(false),
97 config_(config),
98 codec_settings_set_(false),
99 num_swapped_frames_(0) {
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000100 assert(config.encoder_settings.encoder != NULL);
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000101 ReconfigureVideoEncoder(encoder_config);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000102}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000103
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000104webrtc::VideoSendStream::Config FakeVideoSendStream::GetConfig() const {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000105 return config_;
106}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000107
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000108webrtc::VideoEncoderConfig FakeVideoSendStream::GetEncoderConfig() const {
109 return encoder_config_;
110}
111
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000112std::vector<webrtc::VideoStream> FakeVideoSendStream::GetVideoStreams() {
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000113 return encoder_config_.streams;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000114}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000115
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000116bool FakeVideoSendStream::IsSending() const {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000117 return sending_;
118}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000119
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000120bool FakeVideoSendStream::GetVp8Settings(
121 webrtc::VideoCodecVP8* settings) const {
122 if (!codec_settings_set_) {
123 return false;
124 }
125
126 *settings = vp8_settings_;
127 return true;
128}
129
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000130int FakeVideoSendStream::GetNumberOfSwappedFrames() const {
131 return num_swapped_frames_;
132}
133
134int FakeVideoSendStream::GetLastWidth() const {
135 return last_frame_.width();
136}
137
138int FakeVideoSendStream::GetLastHeight() const {
139 return last_frame_.height();
140}
141
142void FakeVideoSendStream::SwapFrame(webrtc::I420VideoFrame* frame) {
143 ++num_swapped_frames_;
144 last_frame_.SwapFrame(frame);
145}
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000146
147void FakeVideoSendStream::SetStats(
148 const webrtc::VideoSendStream::Stats& stats) {
149 stats_ = stats;
150}
151
152webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() {
153 return stats_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000154}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000155
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000156bool FakeVideoSendStream::ReconfigureVideoEncoder(
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000157 const webrtc::VideoEncoderConfig& config) {
158 encoder_config_ = config;
159 if (config.encoder_specific_settings != NULL) {
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000160 assert(config_.encoder_settings.payload_name == "VP8");
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000161 vp8_settings_ = *reinterpret_cast<const webrtc::VideoCodecVP8*>(
162 config.encoder_specific_settings);
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000163 }
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000164 codec_settings_set_ = config.encoder_specific_settings != NULL;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000165 return true;
166}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000167
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000168webrtc::VideoSendStreamInput* FakeVideoSendStream::Input() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000169 return this;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000170}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000171
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000172void FakeVideoSendStream::Start() {
173 sending_ = true;
174}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000175
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000176void FakeVideoSendStream::Stop() {
177 sending_ = false;
178}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000179
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000180FakeVideoReceiveStream::FakeVideoReceiveStream(
181 const webrtc::VideoReceiveStream::Config& config)
182 : config_(config), receiving_(false) {
183}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000184
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000185webrtc::VideoReceiveStream::Config FakeVideoReceiveStream::GetConfig() {
186 return config_;
187}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000188
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000189bool FakeVideoReceiveStream::IsReceiving() const {
190 return receiving_;
191}
192
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +0000193void FakeVideoReceiveStream::InjectFrame(const webrtc::I420VideoFrame& frame,
194 int time_to_render_ms) {
195 config_.renderer->RenderFrame(frame, time_to_render_ms);
196}
197
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000198webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const {
199 return webrtc::VideoReceiveStream::Stats();
200}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000201
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000202void FakeVideoReceiveStream::Start() {
203 receiving_ = true;
204}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000205
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000206void FakeVideoReceiveStream::Stop() {
207 receiving_ = false;
208}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000209
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000210FakeCall::FakeCall(const webrtc::Call::Config& config)
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000211 : config_(config),
212 network_state_(kNetworkUp),
213 num_created_send_streams_(0),
214 num_created_receive_streams_(0) {
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000215 SetVideoCodecs(GetDefaultVideoCodecs());
216}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000217
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000218FakeCall::~FakeCall() {
219 EXPECT_EQ(0u, video_send_streams_.size());
220 EXPECT_EQ(0u, video_receive_streams_.size());
221}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000222
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000223void FakeCall::SetVideoCodecs(const std::vector<webrtc::VideoCodec> codecs) {
224 codecs_ = codecs;
225}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000226
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000227webrtc::Call::Config FakeCall::GetConfig() const {
228 return config_;
229}
230
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000231std::vector<FakeVideoSendStream*> FakeCall::GetVideoSendStreams() {
232 return video_send_streams_;
233}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000234
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000235std::vector<FakeVideoReceiveStream*> FakeCall::GetVideoReceiveStreams() {
236 return video_receive_streams_;
237}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000238
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000239webrtc::VideoCodec FakeCall::GetEmptyVideoCodec() {
240 webrtc::VideoCodec codec;
241 codec.minBitrate = 300;
242 codec.startBitrate = 800;
243 codec.maxBitrate = 1500;
244 codec.maxFramerate = 10;
245 codec.width = 640;
246 codec.height = 480;
247 codec.qpMax = 56;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000248
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000249 return codec;
250}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000251
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000252webrtc::VideoCodec FakeCall::GetVideoCodecVp8() {
253 webrtc::VideoCodec vp8_codec = GetEmptyVideoCodec();
254 vp8_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000255 rtc::strcpyn(
256 vp8_codec.plName, ARRAY_SIZE(vp8_codec.plName), kVp8Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000257 vp8_codec.plType = kVp8Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000258
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000259 return vp8_codec;
260}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000261
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000262webrtc::VideoCodec FakeCall::GetVideoCodecVp9() {
263 webrtc::VideoCodec vp9_codec = GetEmptyVideoCodec();
264 // TODO(pbos): Add a correct codecType when webrtc has one.
265 vp9_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000266 rtc::strcpyn(
267 vp9_codec.plName, ARRAY_SIZE(vp9_codec.plName), kVp9Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000268 vp9_codec.plType = kVp9Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000269
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000270 return vp9_codec;
271}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000272
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000273std::vector<webrtc::VideoCodec> FakeCall::GetDefaultVideoCodecs() {
274 std::vector<webrtc::VideoCodec> codecs;
275 codecs.push_back(GetVideoCodecVp8());
276 // codecs.push_back(GetVideoCodecVp9());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000277
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000278 return codecs;
279}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000280
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000281webrtc::Call::NetworkState FakeCall::GetNetworkState() const {
282 return network_state_;
283}
284
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000285webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
286 const webrtc::VideoSendStream::Config& config,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000287 const webrtc::VideoEncoderConfig& encoder_config) {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000288 FakeVideoSendStream* fake_stream =
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000289 new FakeVideoSendStream(config, encoder_config);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000290 video_send_streams_.push_back(fake_stream);
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000291 ++num_created_send_streams_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000292 return fake_stream;
293}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000294
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000295void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
296 FakeVideoSendStream* fake_stream =
297 static_cast<FakeVideoSendStream*>(send_stream);
298 for (size_t i = 0; i < video_send_streams_.size(); ++i) {
299 if (video_send_streams_[i] == fake_stream) {
300 delete video_send_streams_[i];
301 video_send_streams_.erase(video_send_streams_.begin() + i);
302 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000303 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000304 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000305 ADD_FAILURE() << "DestroyVideoSendStream called with unknown paramter.";
306}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000307
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000308webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
309 const webrtc::VideoReceiveStream::Config& config) {
310 video_receive_streams_.push_back(new FakeVideoReceiveStream(config));
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000311 ++num_created_receive_streams_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000312 return video_receive_streams_[video_receive_streams_.size() - 1];
313}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000314
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000315void FakeCall::DestroyVideoReceiveStream(
316 webrtc::VideoReceiveStream* receive_stream) {
317 FakeVideoReceiveStream* fake_stream =
318 static_cast<FakeVideoReceiveStream*>(receive_stream);
319 for (size_t i = 0; i < video_receive_streams_.size(); ++i) {
320 if (video_receive_streams_[i] == fake_stream) {
321 delete video_receive_streams_[i];
322 video_receive_streams_.erase(video_receive_streams_.begin() + i);
323 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000324 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000325 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000326 ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown paramter.";
327}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000328
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000329webrtc::PacketReceiver* FakeCall::Receiver() {
330 // TODO(pbos): Fix this.
331 return NULL;
332}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000333
pbos@webrtc.org2b19f062014-12-11 13:26:09 +0000334void FakeCall::SetStats(const webrtc::Call::Stats& stats) {
335 stats_ = stats;
336}
337
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000338int FakeCall::GetNumCreatedSendStreams() const {
339 return num_created_send_streams_;
340}
341
342int FakeCall::GetNumCreatedReceiveStreams() const {
343 return num_created_receive_streams_;
344}
345
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000346webrtc::Call::Stats FakeCall::GetStats() const {
pbos@webrtc.org2b19f062014-12-11 13:26:09 +0000347 return stats_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000348}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000349
pbos@webrtc.org00873182014-11-25 14:03:34 +0000350void FakeCall::SetBitrateConfig(
351 const webrtc::Call::Config::BitrateConfig& bitrate_config) {
352 config_.stream_bitrates = bitrate_config;
353}
354
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000355void FakeCall::SignalNetworkState(webrtc::Call::NetworkState state) {
356 network_state_ = state;
357}
358
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000359class WebRtcVideoEngine2Test : public ::testing::Test {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000360 public:
pbos@webrtc.orgb648b9d2014-08-26 11:08:06 +0000361 WebRtcVideoEngine2Test() {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000362 std::vector<VideoCodec> engine_codecs = engine_.codecs();
363 assert(!engine_codecs.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000364 bool codec_set = false;
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000365 for (size_t i = 0; i < engine_codecs.size(); ++i) {
366 if (engine_codecs[i].name == "red") {
367 default_red_codec_ = engine_codecs[i];
368 } else if (engine_codecs[i].name == "ulpfec") {
369 default_ulpfec_codec_ = engine_codecs[i];
370 } else if (engine_codecs[i].name == "rtx") {
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000371 default_rtx_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000372 } else if (!codec_set) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000373 default_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000374 codec_set = true;
375 }
376 }
377
378 assert(codec_set);
379 }
380
381 protected:
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000382 class FakeCallFactory : public WebRtcCallFactory {
383 public:
384 FakeCallFactory() : fake_call_(NULL) {}
385 FakeCall* GetCall() { return fake_call_; }
386
387 private:
388 virtual webrtc::Call* CreateCall(
389 const webrtc::Call::Config& config) OVERRIDE {
390 assert(fake_call_ == NULL);
391 fake_call_ = new FakeCall(config);
392 return fake_call_;
393 }
394
395 FakeCall* fake_call_;
396 };
397
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000398 VideoMediaChannel* SetUpForExternalEncoderFactory(
399 cricket::WebRtcVideoEncoderFactory* encoder_factory,
400 const std::vector<VideoCodec>& codecs);
pbos@webrtc.orgfa553ef2014-10-20 11:07:07 +0000401
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000402 VideoMediaChannel* SetUpForExternalDecoderFactory(
403 cricket::WebRtcVideoDecoderFactory* decoder_factory,
404 const std::vector<VideoCodec>& codecs);
405
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000406 WebRtcVideoEngine2 engine_;
407 VideoCodec default_codec_;
408 VideoCodec default_red_codec_;
409 VideoCodec default_ulpfec_codec_;
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000410 VideoCodec default_rtx_codec_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000411};
412
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000413TEST_F(WebRtcVideoEngine2Test, ConfiguresAvSyncForFirstReceiveChannel) {
414 FakeCallFactory call_factory;
415 engine_.SetCallFactory(&call_factory);
416
417 WebRtcVoiceEngine voice_engine;
418 engine_.SetVoiceEngine(&voice_engine);
419 voice_engine.Init(rtc::Thread::Current());
420 engine_.Init(rtc::Thread::Current());
421
422 rtc::scoped_ptr<VoiceMediaChannel> voice_channel(
423 voice_engine.CreateChannel());
424 ASSERT_TRUE(voice_channel.get() != NULL);
425 WebRtcVoiceMediaChannel* webrtc_voice_channel =
426 static_cast<WebRtcVoiceMediaChannel*>(voice_channel.get());
427 ASSERT_NE(webrtc_voice_channel->voe_channel(), -1);
428 rtc::scoped_ptr<VideoMediaChannel> channel(
429 engine_.CreateChannel(cricket::VideoOptions(), voice_channel.get()));
430
431 FakeCall* fake_call = call_factory.GetCall();
432 ASSERT_TRUE(fake_call != NULL);
433
434 webrtc::Call::Config call_config = fake_call->GetConfig();
435
436 ASSERT_TRUE(voice_engine.voe()->engine() != NULL);
437 ASSERT_EQ(voice_engine.voe()->engine(), call_config.voice_engine);
438
439 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc)));
440 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc + 1)));
441 std::vector<FakeVideoReceiveStream*> receive_streams =
442 fake_call->GetVideoReceiveStreams();
443
444 ASSERT_EQ(2u, receive_streams.size());
445 EXPECT_EQ(webrtc_voice_channel->voe_channel(),
446 receive_streams[0]->GetConfig().audio_channel_id);
447 EXPECT_EQ(-1, receive_streams[1]->GetConfig().audio_channel_id)
448 << "AV sync should only be set up for the first receive channel.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000449}
450
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000451TEST_F(WebRtcVideoEngine2Test, FindCodec) {
452 const std::vector<cricket::VideoCodec>& c = engine_.codecs();
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000453 EXPECT_EQ(4U, c.size());
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000454
455 cricket::VideoCodec vp8(104, "VP8", 320, 200, 30, 0);
456 EXPECT_TRUE(engine_.FindCodec(vp8));
457
458 cricket::VideoCodec vp8_ci(104, "vp8", 320, 200, 30, 0);
459 EXPECT_TRUE(engine_.FindCodec(vp8));
460
461 cricket::VideoCodec vp8_diff_fr_diff_pref(104, "VP8", 320, 200, 50, 50);
462 EXPECT_TRUE(engine_.FindCodec(vp8_diff_fr_diff_pref));
463
464 cricket::VideoCodec vp8_diff_id(95, "VP8", 320, 200, 30, 0);
465 EXPECT_FALSE(engine_.FindCodec(vp8_diff_id));
466 vp8_diff_id.id = 97;
467 EXPECT_TRUE(engine_.FindCodec(vp8_diff_id));
468
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000469 // FindCodec ignores the codec size.
470 // Test that FindCodec can accept uncommon codec size.
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000471 cricket::VideoCodec vp8_diff_res(104, "VP8", 320, 111, 30, 0);
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000472 EXPECT_TRUE(engine_.FindCodec(vp8_diff_res));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000473
474 // PeerConnection doesn't negotiate the resolution at this point.
475 // Test that FindCodec can handle the case when width/height is 0.
476 cricket::VideoCodec vp8_zero_res(104, "VP8", 0, 0, 30, 0);
477 EXPECT_TRUE(engine_.FindCodec(vp8_zero_res));
478
479 cricket::VideoCodec red(101, "RED", 0, 0, 30, 0);
480 EXPECT_TRUE(engine_.FindCodec(red));
481
482 cricket::VideoCodec red_ci(101, "red", 0, 0, 30, 0);
483 EXPECT_TRUE(engine_.FindCodec(red));
484
485 cricket::VideoCodec fec(102, "ULPFEC", 0, 0, 30, 0);
486 EXPECT_TRUE(engine_.FindCodec(fec));
487
488 cricket::VideoCodec fec_ci(102, "ulpfec", 0, 0, 30, 0);
489 EXPECT_TRUE(engine_.FindCodec(fec));
490
491 cricket::VideoCodec rtx(96, "rtx", 0, 0, 30, 0);
492 EXPECT_TRUE(engine_.FindCodec(rtx));
493}
494
495TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
496 std::vector<VideoCodec> engine_codecs = engine_.codecs();
497 for (size_t i = 0; i < engine_codecs.size(); ++i) {
498 if (engine_codecs[i].name != kRtxCodecName)
499 continue;
500 int associated_payload_type;
501 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000502 &associated_payload_type));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000503 EXPECT_EQ(default_codec_.id, associated_payload_type);
504 return;
505 }
506 FAIL() << "No RTX codec found among default codecs.";
507}
508
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000509TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
510 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
511 ASSERT_FALSE(extensions.empty());
512 for (size_t i = 0; i < extensions.size(); ++i) {
513 if (extensions[i].uri == kRtpTimestampOffsetHeaderExtension) {
514 EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extensions[i].id);
515 return;
516 }
517 }
518 FAIL() << "Timestamp offset extension not in header-extension list.";
519}
520
521TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
522 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
523 ASSERT_FALSE(extensions.empty());
524 for (size_t i = 0; i < extensions.size(); ++i) {
525 if (extensions[i].uri == kRtpAbsoluteSenderTimeHeaderExtension) {
526 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId,
527 extensions[i].id);
528 return;
529 }
530 }
531 FAIL() << "Absolute Sender Time extension not in header-extension list.";
532}
533
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000534TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000535 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000536 rtc::scoped_ptr<VideoMediaChannel> channel(
537 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000538
539 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
540
541 EXPECT_FALSE(channel->SetSend(true))
542 << "Channel should not start without codecs.";
543 EXPECT_TRUE(channel->SetSend(false))
544 << "Channel should be stoppable even without set codecs.";
545}
546
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000547TEST_F(WebRtcVideoEngine2Test, GetStatsWithoutSendCodecsSetDoesNotCrash) {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000548 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000549 rtc::scoped_ptr<VideoMediaChannel> channel(
550 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000551 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
552 VideoMediaInfo info;
553 channel->GetStats(&info);
554}
555
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000556TEST_F(WebRtcVideoEngine2Test, UseExternalFactoryForVp8WhenSupported) {
557 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
558 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
559 std::vector<cricket::VideoCodec> codecs;
560 codecs.push_back(kVp8Codec);
561
562 rtc::scoped_ptr<VideoMediaChannel> channel(
563 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
564
565 EXPECT_TRUE(
566 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
567 ASSERT_EQ(1u, encoder_factory.encoders().size());
568 EXPECT_TRUE(channel->SetSend(true));
569
570 cricket::FakeVideoCapturer capturer;
571 EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer));
572 EXPECT_EQ(cricket::CS_RUNNING,
573 capturer.Start(capturer.GetSupportedFormats()->front()));
574 EXPECT_TRUE(capturer.CaptureFrame());
575
576 EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0,
577 kTimeout);
578
579 // Setting codecs of the same type should not reallocate the encoder.
580 EXPECT_TRUE(channel->SetSendCodecs(codecs));
581 EXPECT_EQ(1, encoder_factory.GetNumCreatedEncoders());
582
583 // Remove stream previously added to free the external encoder instance.
584 EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
585 EXPECT_EQ(0u, encoder_factory.encoders().size());
586}
587
588VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalEncoderFactory(
589 cricket::WebRtcVideoEncoderFactory* encoder_factory,
590 const std::vector<VideoCodec>& codecs) {
591 engine_.SetExternalEncoderFactory(encoder_factory);
592 engine_.Init(rtc::Thread::Current());
593
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000594 VideoMediaChannel* channel =
595 engine_.CreateChannel(cricket::VideoOptions(), NULL);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000596 EXPECT_TRUE(channel->SetSendCodecs(codecs));
597
598 return channel;
599}
600
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000601VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalDecoderFactory(
602 cricket::WebRtcVideoDecoderFactory* decoder_factory,
603 const std::vector<VideoCodec>& codecs) {
604 engine_.SetExternalDecoderFactory(decoder_factory);
605 engine_.Init(rtc::Thread::Current());
606
607 VideoMediaChannel* channel =
608 engine_.CreateChannel(cricket::VideoOptions(), NULL);
609 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
610
611 return channel;
612}
613
pbos@webrtc.orgf18fba22015-01-14 16:26:23 +0000614TEST_F(WebRtcVideoEngine2Test, UsesSimulcastAdapterForVp8Factories) {
615 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
616 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
617 std::vector<cricket::VideoCodec> codecs;
618 codecs.push_back(kVp8Codec);
619
620 rtc::scoped_ptr<VideoMediaChannel> channel(
621 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
622
623 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
624
625 EXPECT_TRUE(
626 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
627 EXPECT_TRUE(channel->SetSend(true));
628
629 EXPECT_GT(encoder_factory.encoders().size(), 1u);
630
631 // Verify that encoders are configured for simulcast through adapter
632 // (increasing resolution and only configured to send one stream each).
633 int prev_width = -1;
634 for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) {
635 webrtc::VideoCodec codec_settings =
636 encoder_factory.encoders()[i]->GetCodecSettings();
637 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams);
638 EXPECT_GT(codec_settings.width, prev_width);
639 prev_width = codec_settings.width;
640 }
641}
642
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000643TEST_F(WebRtcVideoEngine2Test, ChannelWithExternalH264CanChangeToInternalVp8) {
644 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
645 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
646 std::vector<cricket::VideoCodec> codecs;
647 codecs.push_back(kH264Codec);
648
649 rtc::scoped_ptr<VideoMediaChannel> channel(
650 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
651
652 EXPECT_TRUE(
653 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
654 ASSERT_EQ(1u, encoder_factory.encoders().size());
655
656 codecs.clear();
657 codecs.push_back(kVp8Codec);
658 EXPECT_TRUE(channel->SetSendCodecs(codecs));
659
660 ASSERT_EQ(0u, encoder_factory.encoders().size());
661}
662
663TEST_F(WebRtcVideoEngine2Test,
664 DontUseExternalEncoderFactoryForUnsupportedCodecs) {
665 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
666 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
667 std::vector<cricket::VideoCodec> codecs;
668 codecs.push_back(kVp8Codec);
669
670 rtc::scoped_ptr<VideoMediaChannel> channel(
671 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
672
673 EXPECT_TRUE(
674 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
675 ASSERT_EQ(0u, encoder_factory.encoders().size());
676}
677
678// Test external codec with be added to the end of the supported codec list.
679TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) {
680 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
681 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
682 engine_.SetExternalEncoderFactory(&encoder_factory);
683
684 engine_.Init(rtc::Thread::Current());
685
686 std::vector<cricket::VideoCodec> codecs(engine_.codecs());
687 ASSERT_GE(codecs.size(), 2u);
688 cricket::VideoCodec internal_codec = codecs.front();
689 cricket::VideoCodec external_codec = codecs.back();
690
691 // The external codec will appear at last.
692 EXPECT_EQ("VP8", internal_codec.name);
693 EXPECT_EQ("H264", external_codec.name);
694}
695
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000696TEST_F(WebRtcVideoEngine2Test, RegisterExternalDecodersIfSupported) {
697 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
698 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
699 std::vector<cricket::VideoCodec> codecs;
700 codecs.push_back(kVp8Codec);
701
702 rtc::scoped_ptr<VideoMediaChannel> channel(
703 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
704
705 EXPECT_TRUE(
706 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
707 ASSERT_EQ(1u, decoder_factory.decoders().size());
708
709 // Setting codecs of the same type should not reallocate the decoder.
710 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
711 EXPECT_EQ(1, decoder_factory.GetNumCreatedDecoders());
712
713 // Remove stream previously added to free the external decoder instance.
714 EXPECT_TRUE(channel->RemoveRecvStream(kSsrc));
715 EXPECT_EQ(0u, decoder_factory.decoders().size());
716}
717
718// Verifies that we can set up decoders that are not internally supported.
719TEST_F(WebRtcVideoEngine2Test, RegisterExternalH264DecoderIfSupported) {
720 // TODO(pbos): Do not assume that encoder/decoder support is symmetric. We
721 // can't even query the WebRtcVideoDecoderFactory for supported codecs.
722 // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported
723 // codecs.
724 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
725 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
726 engine_.SetExternalEncoderFactory(&encoder_factory);
727 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
728 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
729 std::vector<cricket::VideoCodec> codecs;
730 codecs.push_back(kH264Codec);
731
732 rtc::scoped_ptr<VideoMediaChannel> channel(
733 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
734
735 EXPECT_TRUE(
736 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
737 ASSERT_EQ(1u, decoder_factory.decoders().size());
738}
739
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000740class WebRtcVideoEngine2BaseTest
741 : public VideoEngineTest<cricket::WebRtcVideoEngine2> {
742 protected:
743 typedef VideoEngineTest<cricket::WebRtcVideoEngine2> Base;
744};
745
746#define WEBRTC_ENGINE_BASE_TEST(test) \
747 TEST_F(WebRtcVideoEngine2BaseTest, test) { Base::test##Body(); }
748
749WEBRTC_ENGINE_BASE_TEST(ConstrainNewCodec2);
750
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000751class WebRtcVideoChannel2BaseTest
752 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
753 protected:
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000754 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000755
756 virtual cricket::VideoCodec DefaultCodec() OVERRIDE { return kVp8Codec; }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000757};
758
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000759#define WEBRTC_BASE_TEST(test) \
760 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); }
761
762#define WEBRTC_DISABLED_BASE_TEST(test) \
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000763 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_##test) { Base::test(); }
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000764
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000765// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
766#if 0
767// TODO(juberti): Figure out why ViE is munging the COM refcount.
768#ifdef WIN32
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000769WEBRTC_DISABLED_BASE_TEST(CheckCoInitialize) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000770 Base::CheckCoInitialize();
771}
772#endif
773#endif
774
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000775WEBRTC_BASE_TEST(SetSend);
776WEBRTC_BASE_TEST(SetSendWithoutCodecs);
777WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000778
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000779WEBRTC_BASE_TEST(GetStats);
780WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
781WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000782
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000783WEBRTC_BASE_TEST(SetSendBandwidth);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000784
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000785WEBRTC_BASE_TEST(SetSendSsrc);
786WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000787
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000788WEBRTC_BASE_TEST(SetRenderer);
789WEBRTC_BASE_TEST(AddRemoveRecvStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000790
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000791WEBRTC_DISABLED_BASE_TEST(AddRemoveRecvStreamAndRender);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000792
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000793WEBRTC_BASE_TEST(AddRemoveRecvStreamsNoConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000794
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000795WEBRTC_BASE_TEST(AddRemoveSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000796
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000797WEBRTC_BASE_TEST(SimulateConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000798
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000799WEBRTC_BASE_TEST(AddRemoveCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000800
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000801WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000802
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000803WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000804
805// TODO(pbos): Figure out why this fails so often.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000806WEBRTC_DISABLED_BASE_TEST(HighAspectHighHeightCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000807
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000808WEBRTC_BASE_TEST(RejectEmptyStreamParams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000809
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000810WEBRTC_BASE_TEST(AdaptResolution16x10);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000811
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000812WEBRTC_BASE_TEST(AdaptResolution4x3);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000813
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000814// TODO(juberti): Restore this test once we support sending 0 fps.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000815WEBRTC_DISABLED_BASE_TEST(AdaptDropAllFrames);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000816// TODO(juberti): Understand why we get decode errors on this test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000817WEBRTC_DISABLED_BASE_TEST(AdaptFramerate);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000818
pbos@webrtc.orgc4175b92014-09-03 15:25:49 +0000819WEBRTC_BASE_TEST(SendsLowerResolutionOnSmallerFrames);
820
821WEBRTC_BASE_TEST(MuteStream);
822
823WEBRTC_BASE_TEST(MultipleSendStreams);
824
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000825WEBRTC_BASE_TEST(SetSendStreamFormat0x0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000826
827// TODO(zhurunz): Fix the flakey test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000828WEBRTC_DISABLED_BASE_TEST(SetSendStreamFormat);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000829
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000830TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Vga) {
831 SendAndReceive(cricket::VideoCodec(100, "VP8", 640, 400, 30, 0));
832}
833
834TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Qvga) {
835 SendAndReceive(cricket::VideoCodec(100, "VP8", 320, 200, 30, 0));
836}
837
838TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8SvcQqvga) {
839 SendAndReceive(cricket::VideoCodec(100, "VP8", 160, 100, 30, 0));
840}
841
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000842TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
843 Base::TwoStreamsSendAndReceive(kVp8Codec);
844}
845
846TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
847 Base::TwoStreamsReUseFirstStream(kVp8Codec);
848}
849
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000850WEBRTC_BASE_TEST(SendManyResizeOnce);
851
852// TODO(pbos): Enable and figure out why this fails (or should work).
853TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
854 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL));
855 EXPECT_TRUE(channel_->SetRenderer(kDefaultReceiveSsrc, &renderer_));
856 channel_->UpdateAspectRatio(1280, 720);
857 video_capturer_.reset(new cricket::FakeVideoCapturer);
858 const std::vector<cricket::VideoFormat>* formats =
859 video_capturer_->GetSupportedFormats();
860 cricket::VideoFormat capture_format_hd = (*formats)[0];
861 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(capture_format_hd));
862 EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get()));
863
864 // Capture format HD -> adapt (OnOutputFormatRequest VGA) -> VGA.
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000865 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000866 EXPECT_TRUE(SetOneCodec(codec));
867 codec.width /= 2;
868 codec.height /= 2;
869 EXPECT_TRUE(SetSend(true));
870 EXPECT_TRUE(channel_->SetRender(true));
871 EXPECT_EQ(0, renderer_.num_rendered_frames());
872 EXPECT_TRUE(SendFrame());
873 EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout);
874}
875
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000876class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test,
877 public WebRtcCallFactory {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000878 public:
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000879 WebRtcVideoChannel2Test() : fake_call_(NULL) {}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000880 virtual void SetUp() OVERRIDE {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000881 engine_.SetCallFactory(this);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000882 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000883 channel_.reset(engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000884 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000885 last_ssrc_ = 123;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000886 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000887 }
888
889 protected:
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000890 virtual webrtc::Call* CreateCall(
891 const webrtc::Call::Config& config) OVERRIDE {
892 assert(fake_call_ == NULL);
893 fake_call_ = new FakeCall(config);
894 return fake_call_;
895 }
896
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000897 FakeVideoSendStream* AddSendStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000898 return AddSendStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000899 }
900
901 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000902 size_t num_streams = fake_call_->GetVideoSendStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000903 EXPECT_TRUE(channel_->AddSendStream(sp));
904 std::vector<FakeVideoSendStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000905 fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000906 EXPECT_EQ(num_streams + 1, streams.size());
907 return streams[streams.size() - 1];
908 }
909
910 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000911 return fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000912 }
913
914 FakeVideoReceiveStream* AddRecvStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000915 return AddRecvStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000916 }
917
918 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000919 size_t num_streams = fake_call_->GetVideoReceiveStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000920 EXPECT_TRUE(channel_->AddRecvStream(sp));
921 std::vector<FakeVideoReceiveStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000922 fake_call_->GetVideoReceiveStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000923 EXPECT_EQ(num_streams + 1, streams.size());
924 return streams[streams.size() - 1];
925 }
926
pbos@webrtc.org00873182014-11-25 14:03:34 +0000927 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
928 int expected_min_bitrate_bps,
929 const char* start_bitrate_kbps,
930 int expected_start_bitrate_bps,
931 const char* max_bitrate_kbps,
932 int expected_max_bitrate_bps) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000933 std::vector<VideoCodec> codecs;
934 codecs.push_back(kVp8Codec);
pbos@webrtc.org00873182014-11-25 14:03:34 +0000935 codecs[0].params[kCodecParamMinBitrate] = min_bitrate_kbps;
936 codecs[0].params[kCodecParamStartBitrate] = start_bitrate_kbps;
937 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate_kbps;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000938 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
939
pbos@webrtc.org00873182014-11-25 14:03:34 +0000940 EXPECT_EQ(expected_min_bitrate_bps,
941 fake_call_->GetConfig().stream_bitrates.min_bitrate_bps);
942 EXPECT_EQ(expected_start_bitrate_bps,
943 fake_call_->GetConfig().stream_bitrates.start_bitrate_bps);
944 EXPECT_EQ(expected_max_bitrate_bps,
945 fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000946 }
947
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000948 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
949 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000950 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000951 // Enable extension.
952 const int id = 1;
953 std::vector<cricket::RtpHeaderExtension> extensions;
954 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
955 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
956
957 FakeVideoSendStream* send_stream =
958 AddSendStream(cricket::StreamParams::CreateLegacy(123));
959
960 // Verify the send extension id.
961 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
962 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
963 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
964 // Verify call with same set of extensions returns true.
965 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
966 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
967 // receivers.
968 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
969 ->GetConfig()
970 .rtp.extensions.empty());
971
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000972 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000973 std::vector<cricket::RtpHeaderExtension> empty_extensions;
974 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000975 ASSERT_EQ(1u, call->GetVideoSendStreams().size());
976 send_stream = call->GetVideoSendStreams()[0];
977 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
978
979 // Verify that adding receive RTP header extensions adds them for existing
980 // streams.
981 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
982 send_stream = call->GetVideoSendStreams()[0];
983 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
984 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
985 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000986 }
987
988 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
989 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000990 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000991 // Enable extension.
992 const int id = 1;
993 std::vector<cricket::RtpHeaderExtension> extensions;
994 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
995 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
996
997 FakeVideoReceiveStream* recv_stream =
998 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
999
1000 // Verify the recv extension id.
1001 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1002 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
1003 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
1004 // Verify call with same set of extensions returns true.
1005 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001006
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001007 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
1008 // senders.
1009 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
1010 ->GetConfig()
1011 .rtp.extensions.empty());
1012
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001013 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001014 std::vector<cricket::RtpHeaderExtension> empty_extensions;
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001015 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(empty_extensions));
1016 ASSERT_EQ(1u, call->GetVideoReceiveStreams().size());
1017 recv_stream = call->GetVideoReceiveStreams()[0];
1018 EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
1019
1020 // Verify that adding receive RTP header extensions adds them for existing
1021 // streams.
1022 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1023 recv_stream = call->GetVideoReceiveStreams()[0];
1024 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1025 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
1026 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001027 }
1028
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001029 void TestCpuAdaptation(bool enable_overuse);
1030
1031 FakeCall* fake_call_;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001032 rtc::scoped_ptr<VideoMediaChannel> channel_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001033 uint32 last_ssrc_;
1034};
1035
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001036TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001037 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1038 EXPECT_TRUE(channel_->SetSend(true));
1039 cricket::VideoOptions options;
1040 options.conference_mode.Set(true);
1041 EXPECT_TRUE(channel_->SetOptions(options));
1042
1043 // Send side.
1044 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1045 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1046 FakeVideoSendStream* send_stream = AddSendStream(
1047 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1048
1049 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
1050 for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
1051 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
1052
1053 // Receiver side.
1054 FakeVideoReceiveStream* recv_stream = AddRecvStream(
1055 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1056 ASSERT_GT(recv_stream->GetConfig().rtp.rtx.size(), 0u)
1057 << "No SSRCs for RTX configured by AddRecvStream.";
1058 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size())
1059 << "This test only works with one receive codec. Please update the test.";
1060 EXPECT_EQ(rtx_ssrcs[0],
1061 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
1062 // TODO(pbos): Make sure we set the RTX for correct payloads etc.
1063}
1064
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001065TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
1066 // Setup one channel with an associated RTX stream.
1067 cricket::StreamParams params =
1068 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
1069 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
1070 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
1071 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
1072 EXPECT_EQ(kRtxSsrcs1[0],
1073 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001074}
1075
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001076TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
1077 // Setup one channel without an associated RTX stream.
1078 cricket::StreamParams params =
1079 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
1080 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
1081 ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001082}
1083
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001084TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
1085 FakeVideoSendStream* send_stream =
1086 AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
1087 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
1088
1089 FakeVideoReceiveStream* recv_stream =
1090 AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
1091 ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001092}
1093
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001094// Test support for RTP timestamp offset header extension.
1095TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
1096 TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
1097 webrtc::RtpExtension::kTOffset);
1098}
1099TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
1100 TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
1101 webrtc::RtpExtension::kTOffset);
1102}
1103
1104// Test support for absolute send time header extension.
1105TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
1106 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
1107 webrtc::RtpExtension::kAbsSendTime);
1108}
1109TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
1110 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
1111 webrtc::RtpExtension::kAbsSendTime);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001112}
1113
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001114TEST_F(WebRtcVideoChannel2Test, IdenticalSendExtensionsDoesntRecreateStream) {
1115 const int kTOffsetId = 1;
1116 const int kAbsSendTimeId = 2;
1117 std::vector<cricket::RtpHeaderExtension> extensions;
1118 extensions.push_back(cricket::RtpHeaderExtension(
1119 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1120 extensions.push_back(cricket::RtpHeaderExtension(
1121 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
1122
1123 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1124 FakeVideoSendStream* send_stream =
1125 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1126
1127 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1128 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
1129
1130 // Setting the same extensions (even if in different order) shouldn't
1131 // reallocate the stream.
1132 std::reverse(extensions.begin(), extensions.end());
1133 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1134
1135 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1136
1137 // Setting different extensions should recreate the stream.
1138 extensions.resize(1);
1139 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1140
1141 EXPECT_EQ(2, fake_call_->GetNumCreatedSendStreams());
1142}
1143
1144TEST_F(WebRtcVideoChannel2Test, IdenticalRecvExtensionsDoesntRecreateStream) {
1145 const int kTOffsetId = 1;
1146 const int kAbsSendTimeId = 2;
1147 std::vector<cricket::RtpHeaderExtension> extensions;
1148 extensions.push_back(cricket::RtpHeaderExtension(
1149 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1150 extensions.push_back(cricket::RtpHeaderExtension(
1151 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
1152
1153 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1154 FakeVideoReceiveStream* send_stream =
1155 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1156
1157 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1158 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
1159
1160 // Setting the same extensions (even if in different order) shouldn't
1161 // reallocate the stream.
1162 std::reverse(extensions.begin(), extensions.end());
1163 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1164
1165 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1166
1167 // Setting different extensions should recreate the stream.
1168 extensions.resize(1);
1169 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1170
1171 EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams());
1172}
1173
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001174TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001175 SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001176 const int kUnsupportedId = 1;
1177 const int kTOffsetId = 2;
1178
1179 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001180 extensions.push_back(
1181 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1182 extensions.push_back(
1183 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001184 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1185 FakeVideoSendStream* send_stream =
1186 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1187
1188 // Only timestamp offset extension is set to send stream,
1189 // unsupported rtp extension is ignored.
1190 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
1191 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001192 send_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001193}
1194
1195TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001196 SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001197 const int kUnsupportedId = 1;
1198 const int kTOffsetId = 2;
1199
1200 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001201 extensions.push_back(
1202 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1203 extensions.push_back(
1204 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001205 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1206 FakeVideoReceiveStream* recv_stream =
1207 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1208
1209 // Only timestamp offset extension is set to receive stream,
1210 // unsupported rtp extension is ignored.
1211 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1212 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001213 recv_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001214}
1215
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001216TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001217 const int kIncorrectIds[] = {-2, -1, 15, 16};
1218 for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001219 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) {
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001228 const int kIncorrectIds[] = {-2, -1, 15, 16};
1229 for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001230 std::vector<cricket::RtpHeaderExtension> extensions;
1231 extensions.push_back(cricket::RtpHeaderExtension(
1232 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1233 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions))
1234 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1235 }
1236}
1237
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001238TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001239 const int id = 1;
1240 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001241 extensions.push_back(
1242 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1243 extensions.push_back(
1244 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001245 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1246
1247 // Duplicate entries are also not supported.
1248 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001249 extensions.push_back(
1250 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001251 extensions.push_back(extensions.back());
1252 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1253}
1254
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001255TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001256 const int id = 1;
1257 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001258 extensions.push_back(
1259 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1260 extensions.push_back(
1261 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001262 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1263
1264 // Duplicate entries are also not supported.
1265 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001266 extensions.push_back(
1267 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001268 extensions.push_back(extensions.back());
1269 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1270}
1271
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001272TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
1273 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1274}
1275
1276TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
1277 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1278}
1279
1280TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
1281 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1282}
1283
1284TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
1285 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001286 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001287}
1288
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001289TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
1290 FakeVideoReceiveStream* stream = AddRecvStream();
1291 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001292}
1293
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001294TEST_F(WebRtcVideoChannel2Test, RembCanBeEnabledAndDisabled) {
1295 FakeVideoReceiveStream* stream = AddRecvStream();
1296 EXPECT_TRUE(stream->GetConfig().rtp.remb);
1297
1298 // Verify that REMB is turned off when codecs without REMB are set.
1299 std::vector<VideoCodec> codecs;
1300 codecs.push_back(kVp8Codec);
1301 EXPECT_TRUE(codecs[0].feedback_params.params().empty());
1302 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001303 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001304 EXPECT_FALSE(stream->GetConfig().rtp.remb);
1305
1306 // Verify that REMB is turned on when setting default codecs since the
1307 // default codecs have REMB enabled.
1308 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001309 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001310 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001311}
1312
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001313TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
1314 VerifyCodecHasDefaultFeedbackParams(default_codec_);
1315
pbos@webrtc.org19864742014-05-30 07:35:47 +00001316 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1317 EXPECT_TRUE(channel_->SetSend(true));
1318
1319 // Send side.
1320 FakeVideoSendStream* send_stream =
1321 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1322 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1323
1324 // Receiver side.
1325 FakeVideoReceiveStream* recv_stream =
1326 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1327 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1328
1329 // Nack history size should match between sender and receiver.
1330 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
1331 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001332}
1333
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001334TEST_F(WebRtcVideoChannel2Test, NackCanBeDisabled) {
1335 std::vector<VideoCodec> codecs;
1336 codecs.push_back(kVp8Codec);
1337
1338 // Send side.
1339 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1340 FakeVideoSendStream* send_stream =
1341 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1342 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
1343
1344 // Receiver side.
1345 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1346 FakeVideoReceiveStream* recv_stream =
1347 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1348 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
1349}
1350
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001351TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
1352 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1353}
1354
1355TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
1356 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1357}
1358
1359TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
1360 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1361}
1362
1363TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
1364 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1365}
1366
1367TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
1368 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1369}
1370
1371TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
1372 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1373}
1374
1375TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
1376 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1377}
1378
1379TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
1380 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1381}
1382
1383TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
1384 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1385}
1386
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001387TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) {
1388 static const int kScreenshareMinBitrateKbps = 800;
1389 cricket::VideoCodec codec = kVp8Codec360p;
1390 std::vector<cricket::VideoCodec> codecs;
1391 codecs.push_back(codec);
1392 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1393 VideoOptions options;
1394 options.screencast_min_bitrate.Set(kScreenshareMinBitrateKbps);
1395 channel_->SetOptions(options);
1396
1397 AddSendStream();
1398
1399 cricket::FakeVideoCapturer capturer;
1400 capturer.SetScreencast(false);
1401 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1402 cricket::VideoFormat capture_format_hd =
1403 capturer.GetSupportedFormats()->front();
1404 EXPECT_EQ(1280, capture_format_hd.width);
1405 EXPECT_EQ(720, capture_format_hd.height);
1406 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1407
1408 EXPECT_TRUE(channel_->SetSend(true));
1409
1410 EXPECT_TRUE(capturer.CaptureFrame());
1411 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1412 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1413
1414 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1415
1416 // Verify non-screencast settings.
1417 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1418 EXPECT_EQ(webrtc::VideoEncoderConfig::kRealtimeVideo,
1419 encoder_config.content_type);
1420 EXPECT_EQ(codec.width, encoder_config.streams.front().width);
1421 EXPECT_EQ(codec.height, encoder_config.streams.front().height);
1422 EXPECT_EQ(0, encoder_config.min_transmit_bitrate_bps)
1423 << "Non-screenshare shouldn't use min-transmit bitrate.";
1424
1425 capturer.SetScreencast(true);
1426 EXPECT_TRUE(capturer.CaptureFrame());
1427
1428 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1429
1430 // Verify screencast settings.
1431 encoder_config = send_stream->GetEncoderConfig();
1432 EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
1433 encoder_config.content_type);
1434 EXPECT_EQ(kScreenshareMinBitrateKbps * 1000,
1435 encoder_config.min_transmit_bitrate_bps);
1436
1437 EXPECT_EQ(capture_format_hd.width, encoder_config.streams.front().width);
1438 EXPECT_EQ(capture_format_hd.height, encoder_config.streams.front().height);
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +00001439 EXPECT_TRUE(encoder_config.streams[0].temporal_layer_thresholds_bps.empty());
1440
1441 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
1442}
1443
1444TEST_F(WebRtcVideoChannel2Test,
1445 ConferenceModeScreencastConfiguresTemporalLayer) {
1446 static const int kConferenceScreencastTemporalBitrateBps = 100000;
1447 VideoOptions options;
1448 options.conference_mode.Set(true);
1449 channel_->SetOptions(options);
1450
1451 AddSendStream();
1452
1453 cricket::FakeVideoCapturer capturer;
1454 capturer.SetScreencast(true);
1455 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1456 cricket::VideoFormat capture_format_hd =
1457 capturer.GetSupportedFormats()->front();
1458 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1459
1460 EXPECT_TRUE(channel_->SetSend(true));
1461
1462 EXPECT_TRUE(capturer.CaptureFrame());
1463 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1464 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1465
1466 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1467
1468 // Verify screencast settings.
1469 encoder_config = send_stream->GetEncoderConfig();
1470 EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
1471 encoder_config.content_type);
1472 ASSERT_EQ(1u, encoder_config.streams.size());
1473 ASSERT_EQ(1u, encoder_config.streams[0].temporal_layer_thresholds_bps.size());
1474 EXPECT_EQ(kConferenceScreencastTemporalBitrateBps,
1475 encoder_config.streams[0].temporal_layer_thresholds_bps[0]);
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001476
1477 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001478}
1479
1480TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
1481 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1482}
1483
1484TEST_F(WebRtcVideoChannel2Test,
1485 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
1486 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1487}
1488
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001489TEST_F(WebRtcVideoChannel2Test, SuspendBelowMinBitrateDisabledByDefault) {
1490 FakeVideoSendStream* stream = AddSendStream();
1491 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1492}
1493
1494TEST_F(WebRtcVideoChannel2Test, SetOptionsWithSuspendBelowMinBitrate) {
1495 VideoOptions options;
1496 options.suspend_below_min_bitrate.Set(true);
1497 channel_->SetOptions(options);
1498
1499 FakeVideoSendStream* stream = AddSendStream();
1500 EXPECT_TRUE(stream->GetConfig().suspend_below_min_bitrate);
1501
1502 options.suspend_below_min_bitrate.Set(false);
1503 channel_->SetOptions(options);
1504
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001505 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001506 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1507}
1508
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001509TEST_F(WebRtcVideoChannel2Test, Vp8DenoisingEnabledByDefault) {
1510 FakeVideoSendStream* stream = AddSendStream();
1511 webrtc::VideoCodecVP8 vp8_settings;
1512 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1513 EXPECT_TRUE(vp8_settings.denoisingOn);
1514}
1515
1516TEST_F(WebRtcVideoChannel2Test, SetOptionsWithDenoising) {
1517 VideoOptions options;
1518 options.video_noise_reduction.Set(false);
1519 channel_->SetOptions(options);
1520
1521 FakeVideoSendStream* stream = AddSendStream();
1522 webrtc::VideoCodecVP8 vp8_settings;
1523 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1524 EXPECT_FALSE(vp8_settings.denoisingOn);
1525
1526 options.video_noise_reduction.Set(true);
1527 channel_->SetOptions(options);
1528
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001529 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001530 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1531 EXPECT_TRUE(vp8_settings.denoisingOn);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001532}
1533
1534TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
1535 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1536}
1537
pbos@webrtc.org8aed9452014-07-26 10:16:49 +00001538TEST_F(WebRtcVideoChannel2Test, DISABLED_SendReceiveBitratesStats) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001539 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1540}
1541
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001542TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruse) {
1543 TestCpuAdaptation(true);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001544}
1545
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001546TEST_F(WebRtcVideoChannel2Test, DoesNotAdaptOnOveruseWhenDisabled) {
1547 TestCpuAdaptation(false);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001548}
1549
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001550void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse) {
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001551 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001552 std::vector<cricket::VideoCodec> codecs;
1553 codecs.push_back(codec);
1554 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1555
1556 if (enable_overuse) {
1557 VideoOptions options;
1558 options.cpu_overuse_detection.Set(true);
1559 channel_->SetOptions(options);
1560 }
1561
1562 AddSendStream();
1563
1564 cricket::FakeVideoCapturer capturer;
1565 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1566 EXPECT_EQ(cricket::CS_RUNNING,
1567 capturer.Start(capturer.GetSupportedFormats()->front()));
1568
1569 EXPECT_TRUE(channel_->SetSend(true));
1570
1571 // Trigger overuse.
1572 webrtc::LoadObserver* overuse_callback =
1573 fake_call_->GetConfig().overuse_callback;
1574 ASSERT_TRUE(overuse_callback != NULL);
1575 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
1576
1577 EXPECT_TRUE(capturer.CaptureFrame());
1578 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1579 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1580
1581 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1582
1583 if (enable_overuse) {
1584 EXPECT_LT(send_stream->GetLastWidth(), codec.width);
1585 EXPECT_LT(send_stream->GetLastHeight(), codec.height);
1586 } else {
1587 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1588 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1589 }
1590
1591 // Trigger underuse which should go back to normal resolution.
1592 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
1593 EXPECT_TRUE(capturer.CaptureFrame());
1594
1595 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1596
1597 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1598 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1599
1600 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001601}
1602
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001603TEST_F(WebRtcVideoChannel2Test, EstimatesNtpStartTimeAndElapsedTimeCorrectly) {
1604 // Start at last timestamp to verify that wraparounds are estimated correctly.
1605 static const uint32_t kInitialTimestamp = 0xFFFFFFFFu;
1606 static const int64_t kInitialNtpTimeMs = 1247891230;
1607 static const int kFrameOffsetMs = 20;
1608 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001609
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001610 FakeVideoReceiveStream* stream = AddRecvStream();
1611 cricket::FakeVideoRenderer renderer;
1612 EXPECT_TRUE(channel_->SetRenderer(last_ssrc_, &renderer));
1613 EXPECT_TRUE(channel_->SetRender(true));
1614
1615 webrtc::I420VideoFrame video_frame;
1616 CreateBlackFrame(&video_frame, 4, 4);
1617 video_frame.set_timestamp(kInitialTimestamp);
1618 // Initial NTP time is not available on the first frame, but should still be
1619 // able to be estimated.
1620 stream->InjectFrame(video_frame, 0);
1621
1622 EXPECT_EQ(1, renderer.num_rendered_frames());
1623 EXPECT_EQ(0, renderer.last_frame_elapsed_time_ns());
1624
1625 // This timestamp is kInitialTimestamp (-1) + kFrameOffsetMs * 90, which
1626 // triggers a constant-overflow warning, hence we're calculating it explicitly
1627 // here.
1628 video_frame.set_timestamp(kFrameOffsetMs * 90 - 1);
1629 video_frame.set_ntp_time_ms(kInitialNtpTimeMs + kFrameOffsetMs);
1630 stream->InjectFrame(video_frame, 0);
1631
1632 EXPECT_EQ(2, renderer.num_rendered_frames());
1633 EXPECT_EQ(kFrameOffsetMs * rtc::kNumNanosecsPerMillisec,
1634 renderer.last_frame_elapsed_time_ns());
1635
1636 // Verify that NTP time has been correctly deduced.
1637 cricket::VideoMediaInfo info;
1638 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
1639 ASSERT_EQ(1u, info.receivers.size());
1640 EXPECT_EQ(kInitialNtpTimeMs, info.receivers[0].capture_start_ntp_time_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001641}
1642
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001643TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001644 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001645
1646 VideoCodec codec;
1647 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001648 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001649
1650 // Using a RTX setup to verify that the default RTX payload type is good.
1651 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1652 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1653 FakeVideoSendStream* stream = AddSendStream(
1654 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1655 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001656
1657 // Make sure NACK and FEC are enabled on the correct payload types.
1658 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
1659 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
1660 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001661
1662 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
1663 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +00001664 EXPECT_EQ(static_cast<int>(default_rtx_codec_.id),
1665 config.rtp.rtx.payload_type);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001666 // TODO(juberti): Check RTCP, PLI, TMMBR.
1667}
1668
1669TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
1670 std::vector<VideoCodec> codecs;
1671 codecs.push_back(kVp8Codec);
1672 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1673
1674 FakeVideoSendStream* stream = AddSendStream();
1675 webrtc::VideoSendStream::Config config = stream->GetConfig();
1676
1677 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1678 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1679}
1680
1681TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001682 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1683 std::vector<VideoCodec> codecs;
1684 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1685 codecs.push_back(rtx_codec);
1686 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1687 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001688}
1689
1690TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001691 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1692 std::vector<VideoCodec> codecs;
1693 cricket::VideoCodec rtx_codec =
1694 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1695 codecs.push_back(kVp8Codec);
1696 codecs.push_back(rtx_codec);
1697 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1698
1699 cricket::VideoCodec rtx_codec2 =
1700 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1701 codecs.pop_back();
1702 codecs.push_back(rtx_codec2);
1703 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1704 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001705}
1706
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001707TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1708 std::vector<VideoCodec> codecs;
1709 codecs.push_back(kVp8Codec);
1710 codecs.push_back(kUlpfecCodec);
1711 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1712
1713 FakeVideoSendStream* stream = AddSendStream();
1714 webrtc::VideoSendStream::Config config = stream->GetConfig();
1715
1716 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1717
1718 codecs.pop_back();
1719 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001720 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001721 ASSERT_TRUE(stream != NULL);
1722 config = stream->GetConfig();
1723 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1724 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001725}
1726
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001727TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1728 std::vector<VideoCodec> codecs;
1729 codecs.push_back(kVp8Codec720p);
1730 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1731
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001732 std::vector<webrtc::VideoStream> streams = AddSendStream()->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001733 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1734 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1735
1736 codecs.clear();
1737 codecs.push_back(kVp8Codec360p);
1738 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001739 streams = fake_call_->GetVideoSendStreams()[0]->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001740 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1741 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001742}
1743
pbos@webrtc.org00873182014-11-25 14:03:34 +00001744TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithBitrates) {
1745 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1746 200000);
1747}
1748
1749TEST_F(WebRtcVideoChannel2Test,
1750 SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1751 SetSendCodecsShouldWorkForBitrates(
1752 "", 0, "", -1, "", -1);
1753}
1754
1755TEST_F(WebRtcVideoChannel2Test, SetSendCodecsCapsMinAndStartBitrate) {
1756 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001757}
1758
1759TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001760 std::vector<VideoCodec> video_codecs = engine_.codecs();
pbos@webrtc.org88ef6322014-11-04 15:29:29 +00001761 video_codecs[0].params[kCodecParamMinBitrate] = "300";
1762 video_codecs[0].params[kCodecParamMaxBitrate] = "200";
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001763 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001764}
1765
pbos@webrtc.org00873182014-11-25 14:03:34 +00001766TEST_F(WebRtcVideoChannel2Test,
1767 SetMaxSendBandwidthShouldPreserveOtherBitrates) {
1768 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1769 200000);
1770 channel_->SetMaxSendBandwidth(300000);
1771 EXPECT_EQ(100000, fake_call_->GetConfig().stream_bitrates.min_bitrate_bps)
1772 << "Setting max bitrate should keep previous min bitrate.";
1773 EXPECT_EQ(-1, fake_call_->GetConfig().stream_bitrates.start_bitrate_bps)
1774 << "Setting max bitrate should not reset start bitrate.";
1775 EXPECT_EQ(300000, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
1776}
1777
1778TEST_F(WebRtcVideoChannel2Test, SetMaxSendBandwidthShouldBeRemovable) {
1779 channel_->SetMaxSendBandwidth(300000);
1780 EXPECT_EQ(300000, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
1781 // <= 0 means disable (infinite) max bitrate.
1782 channel_->SetMaxSendBandwidth(0);
1783 EXPECT_EQ(-1, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps)
1784 << "Setting zero max bitrate did not reset start bitrate.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001785}
1786
1787TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1788 static const char* kMaxQuantization = "21";
1789 std::vector<VideoCodec> codecs;
1790 codecs.push_back(kVp8Codec);
1791 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1792 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001793 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1794 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001795
1796 VideoCodec codec;
1797 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1798 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1799}
1800
1801TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1802 std::vector<cricket::VideoCodec> codecs;
1803 codecs.push_back(kVp8Codec);
1804
1805 codecs[0].width = 0;
1806 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1807 << "Codec set though codec width is zero.";
1808
1809 codecs[0].width = kVp8Codec.width;
1810 codecs[0].height = 0;
1811 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1812 << "Codec set though codec height is zero.";
1813}
1814
1815TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
1816 // TODO(pbos): Should we only allow the dynamic range?
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001817 static const int kIncorrectPayloads[] = {-2, -1, 128, 129};
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001818 std::vector<cricket::VideoCodec> codecs;
1819 codecs.push_back(kVp8Codec);
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001820 for (size_t i = 0; i < arraysize(kIncorrectPayloads); ++i) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001821 int payload_type = kIncorrectPayloads[i];
1822 codecs[0].id = payload_type;
1823 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1824 << "Bad payload type '" << payload_type << "' accepted.";
1825 }
1826}
1827
1828TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
1829 std::vector<cricket::VideoCodec> codecs;
1830 codecs.push_back(kVp8Codec);
1831 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
1832 codecs[0].id = payload_type;
1833 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
1834 << "Payload type '" << payload_type << "' rejected.";
1835 }
1836}
1837
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001838TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
1839 std::vector<cricket::VideoCodec> codecs;
1840 codecs.push_back(kVp8Codec);
1841 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1842}
1843
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001844// Test that we set our inbound RTX codecs properly.
1845TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
1846 std::vector<cricket::VideoCodec> codecs;
1847 codecs.push_back(kVp8Codec);
1848 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1849 codecs.push_back(rtx_codec);
1850 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1851 << "RTX codec without associated payload should be rejected.";
1852
1853 codecs[1].SetParam("apt", kVp8Codec.id + 1);
1854 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1855 << "RTX codec with invalid associated payload type should be rejected.";
1856
1857 codecs[1].SetParam("apt", kVp8Codec.id);
1858 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1859
1860 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
1861 rtx_codec2.SetParam("apt", rtx_codec.id);
1862 codecs.push_back(rtx_codec2);
1863
1864 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
1865 "as associated payload type "
1866 "should be rejected.";
1867}
1868
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001869TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
1870 std::vector<cricket::VideoCodec> codecs;
1871 codecs.push_back(kVp8Codec);
1872 codecs[0].id = 99;
1873 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1874}
1875
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001876TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001877 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001878
1879 FakeVideoReceiveStream* stream = AddRecvStream();
1880 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
pbos@webrtc.org776e6f22014-10-29 15:28:39 +00001881 EXPECT_EQ(engine_.codecs()[0].name, config.decoders[0].payload_name);
1882 EXPECT_EQ(engine_.codecs()[0].id, config.decoders[0].payload_type);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001883}
1884
1885TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
1886 std::vector<VideoCodec> codecs;
1887 codecs.push_back(kVp8Codec);
1888 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
1889 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1890}
1891
1892// TODO(pbos): Enable VP9 through external codec support
1893TEST_F(WebRtcVideoChannel2Test,
1894 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
1895 std::vector<VideoCodec> codecs;
1896 codecs.push_back(kVp8Codec);
1897 codecs.push_back(kVp9Codec);
1898 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1899}
1900
1901TEST_F(WebRtcVideoChannel2Test,
1902 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
1903 std::vector<VideoCodec> codecs;
1904 codecs.push_back(kVp8Codec);
1905 codecs.push_back(kVp9Codec);
1906 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1907 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
1908}
1909
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001910TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
1911 std::vector<VideoCodec> codecs;
1912 codecs.push_back(kVp8Codec);
1913 codecs.push_back(kUlpfecCodec);
1914 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1915
1916 FakeVideoReceiveStream* stream = AddRecvStream();
1917 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1918
1919 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1920
1921 codecs.pop_back();
1922 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001923 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001924 ASSERT_TRUE(stream != NULL);
1925 config = stream->GetConfig();
1926 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1927 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001928}
1929
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001930TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
1931 std::vector<VideoCodec> codecs;
1932 codecs.push_back(kVp8Codec);
1933 codecs.push_back(kRedCodec);
1934 codecs[1].id = codecs[0].id;
1935 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1936}
1937
1938TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
1939 std::vector<VideoCodec> codecs;
1940 codecs.push_back(kVp8Codec);
1941 codecs.push_back(kVp9Codec);
1942 codecs[1].id = codecs[0].id;
1943 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1944}
1945
1946TEST_F(WebRtcVideoChannel2Test,
1947 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
1948 std::vector<VideoCodec> codecs;
1949 codecs.push_back(kVp8Codec);
1950 codecs.push_back(kVp8Codec);
1951 codecs[1].id += 1;
1952 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1953}
1954
1955TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
1956 EXPECT_FALSE(AddSendStream()->IsSending());
1957}
1958
pbos@webrtc.org85f42942014-07-22 09:14:58 +00001959TEST_F(WebRtcVideoChannel2Test, ReceiveStreamReceivingByDefault) {
1960 EXPECT_TRUE(AddRecvStream()->IsReceiving());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001961}
1962
1963TEST_F(WebRtcVideoChannel2Test, SetSend) {
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +00001964 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001965 EXPECT_FALSE(stream->IsSending());
1966
1967 // false->true
1968 EXPECT_TRUE(channel_->SetSend(true));
1969 EXPECT_TRUE(stream->IsSending());
1970 // true->true
1971 EXPECT_TRUE(channel_->SetSend(true));
1972 EXPECT_TRUE(stream->IsSending());
1973 // true->false
1974 EXPECT_TRUE(channel_->SetSend(false));
1975 EXPECT_FALSE(stream->IsSending());
1976 // false->false
1977 EXPECT_TRUE(channel_->SetSend(false));
1978 EXPECT_FALSE(stream->IsSending());
1979
1980 EXPECT_TRUE(channel_->SetSend(true));
1981 FakeVideoSendStream* new_stream = AddSendStream();
1982 EXPECT_TRUE(new_stream->IsSending())
1983 << "Send stream created after SetSend(true) not sending initially.";
1984}
1985
pbos@webrtc.orgd8198032014-11-10 14:41:43 +00001986// This test verifies DSCP settings are properly applied on video media channel.
1987TEST_F(WebRtcVideoChannel2Test, TestSetDscpOptions) {
1988 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
1989 new cricket::FakeNetworkInterface);
1990 channel_->SetInterface(network_interface.get());
1991 cricket::VideoOptions options;
1992 options.dscp.Set(true);
1993 EXPECT_TRUE(channel_->SetOptions(options));
1994 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
1995 // Verify previous value is not modified if dscp option is not set.
1996 cricket::VideoOptions options1;
1997 EXPECT_TRUE(channel_->SetOptions(options1));
1998 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
1999 options.dscp.Set(false);
2000 EXPECT_TRUE(channel_->SetOptions(options));
2001 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
2002 channel_->SetInterface(NULL);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002003}
2004
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002005TEST_F(WebRtcVideoChannel2Test, OnReadyToSendSignalsNetworkState) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002006 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002007
2008 channel_->OnReadyToSend(false);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002009 EXPECT_EQ(webrtc::Call::kNetworkDown, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002010
2011 channel_->OnReadyToSend(true);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002012 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002013}
2014
pbos@webrtc.org273a4142014-12-01 15:23:21 +00002015TEST_F(WebRtcVideoChannel2Test, GetStatsReportsUpperResolution) {
2016 FakeVideoSendStream* stream = AddSendStream();
2017 webrtc::VideoSendStream::Stats stats;
2018 stats.substreams[17].sent_width = 123;
2019 stats.substreams[17].sent_height = 40;
2020 stats.substreams[42].sent_width = 80;
2021 stats.substreams[42].sent_height = 31;
2022 stats.substreams[11].sent_width = 20;
2023 stats.substreams[11].sent_height = 90;
2024 stream->SetStats(stats);
2025
2026 cricket::VideoMediaInfo info;
2027 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
2028 ASSERT_EQ(1u, info.senders.size());
2029 EXPECT_EQ(123, info.senders[0].send_frame_width);
2030 EXPECT_EQ(90, info.senders[0].send_frame_height);
2031}
2032
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002033TEST_F(WebRtcVideoChannel2Test, TranslatesCallStatsCorrectly) {
2034 AddSendStream();
2035 AddSendStream();
2036 webrtc::Call::Stats stats;
2037 stats.rtt_ms = 123;
2038 fake_call_->SetStats(stats);
2039
2040 cricket::VideoMediaInfo info;
2041 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
2042 ASSERT_EQ(2u, info.senders.size());
2043 EXPECT_EQ(stats.rtt_ms, info.senders[0].rtt_ms);
2044 EXPECT_EQ(stats.rtt_ms, info.senders[1].rtt_ms);
2045}
2046
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002047class WebRtcVideoEngine2SimulcastTest : public testing::Test {
2048 public:
2049 WebRtcVideoEngine2SimulcastTest()
2050 : engine_codecs_(engine_.codecs()) {
2051 assert(!engine_codecs_.empty());
2052
2053 bool codec_set = false;
2054 for (size_t i = 0; i < engine_codecs_.size(); ++i) {
2055 if (engine_codecs_[i].name == "red") {
2056 default_red_codec_ = engine_codecs_[i];
2057 } else if (engine_codecs_[i].name == "ulpfec") {
2058 default_ulpfec_codec_ = engine_codecs_[i];
2059 } else if (engine_codecs_[i].name == "rtx") {
2060 default_rtx_codec_ = engine_codecs_[i];
2061 } else if (!codec_set) {
2062 default_codec_ = engine_codecs_[i];
2063 codec_set = true;
2064 }
2065 }
2066
2067 assert(codec_set);
2068 }
2069
2070 protected:
2071 WebRtcVideoEngine2 engine_;
2072 VideoCodec default_codec_;
2073 VideoCodec default_red_codec_;
2074 VideoCodec default_ulpfec_codec_;
2075 VideoCodec default_rtx_codec_;
2076 // TODO(pbos): Remove engine_codecs_ unless used a lot.
2077 std::vector<VideoCodec> engine_codecs_;
2078};
2079
2080class WebRtcVideoChannel2SimulcastTest : public WebRtcVideoEngine2SimulcastTest,
2081 public WebRtcCallFactory {
2082 public:
2083 WebRtcVideoChannel2SimulcastTest() : fake_call_(NULL) {}
2084
2085 virtual void SetUp() OVERRIDE {
2086 engine_.SetCallFactory(this);
2087 engine_.Init(rtc::Thread::Current());
2088 channel_.reset(engine_.CreateChannel(VideoOptions(), NULL));
2089 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
2090 last_ssrc_ = 123;
2091 }
2092
2093 protected:
2094 virtual webrtc::Call* CreateCall(
2095 const webrtc::Call::Config& config) OVERRIDE {
2096 assert(fake_call_ == NULL);
2097 fake_call_ = new FakeCall(config);
2098 return fake_call_;
2099 }
2100
2101 void VerifySimulcastSettings(const VideoCodec& codec,
2102 VideoOptions::HighestBitrate bitrate_mode,
2103 size_t num_configured_streams,
2104 size_t expected_num_streams,
2105 SimulcastBitrateMode simulcast_bitrate_mode) {
2106 cricket::VideoOptions options;
2107 options.video_highest_bitrate.Set(bitrate_mode);
2108 EXPECT_TRUE(channel_->SetOptions(options));
2109
2110 std::vector<VideoCodec> codecs;
2111 codecs.push_back(codec);
2112 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
2113
2114 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
2115 assert(num_configured_streams <= ssrcs.size());
2116 ssrcs.resize(num_configured_streams);
2117
2118 FakeVideoSendStream* stream =
2119 AddSendStream(CreateSimStreamParams("cname", ssrcs));
2120
2121 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
2122 ASSERT_EQ(expected_num_streams, video_streams.size());
2123
2124 std::vector<webrtc::VideoStream> expected_streams = GetSimulcastConfig(
2125 num_configured_streams,
2126 simulcast_bitrate_mode,
2127 codec.width,
2128 codec.height,
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002129 0,
2130 kDefaultQpMax,
2131 codec.framerate != 0 ? codec.framerate : kDefaultFramerate);
2132
2133 ASSERT_EQ(expected_streams.size(), video_streams.size());
2134
2135 size_t num_streams = video_streams.size();
2136 for (size_t i = 0; i < num_streams; ++i) {
2137 EXPECT_EQ(expected_streams[i].width, video_streams[i].width);
2138 EXPECT_EQ(expected_streams[i].height, video_streams[i].height);
2139
2140 EXPECT_GT(video_streams[i].max_framerate, 0);
2141 EXPECT_EQ(expected_streams[i].max_framerate,
2142 video_streams[i].max_framerate);
2143
2144 EXPECT_GT(video_streams[i].min_bitrate_bps, 0);
2145 EXPECT_EQ(expected_streams[i].min_bitrate_bps,
2146 video_streams[i].min_bitrate_bps);
2147
2148 EXPECT_GT(video_streams[i].target_bitrate_bps, 0);
2149 EXPECT_EQ(expected_streams[i].target_bitrate_bps,
2150 video_streams[i].target_bitrate_bps);
2151
2152 EXPECT_GT(video_streams[i].max_bitrate_bps, 0);
2153 EXPECT_EQ(expected_streams[i].max_bitrate_bps,
2154 video_streams[i].max_bitrate_bps);
2155
2156 EXPECT_GT(video_streams[i].max_qp, 0);
2157 EXPECT_EQ(expected_streams[i].max_qp, video_streams[i].max_qp);
2158
2159 EXPECT_FALSE(expected_streams[i].temporal_layer_thresholds_bps.empty());
2160 EXPECT_EQ(expected_streams[i].temporal_layer_thresholds_bps,
2161 video_streams[i].temporal_layer_thresholds_bps);
2162 }
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002163 }
2164
2165 FakeVideoSendStream* AddSendStream() {
2166 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
2167 }
2168
2169 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
2170 size_t num_streams =
2171 fake_call_->GetVideoSendStreams().size();
2172 EXPECT_TRUE(channel_->AddSendStream(sp));
2173 std::vector<FakeVideoSendStream*> streams =
2174 fake_call_->GetVideoSendStreams();
2175 EXPECT_EQ(num_streams + 1, streams.size());
2176 return streams[streams.size() - 1];
2177 }
2178
2179 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
2180 return fake_call_->GetVideoSendStreams();
2181 }
2182
2183 FakeVideoReceiveStream* AddRecvStream() {
2184 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
2185 }
2186
2187 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
2188 size_t num_streams =
2189 fake_call_->GetVideoReceiveStreams().size();
2190 EXPECT_TRUE(channel_->AddRecvStream(sp));
2191 std::vector<FakeVideoReceiveStream*> streams =
2192 fake_call_->GetVideoReceiveStreams();
2193 EXPECT_EQ(num_streams + 1, streams.size());
2194 return streams[streams.size() - 1];
2195 }
2196
2197 FakeCall* fake_call_;
2198 rtc::scoped_ptr<VideoMediaChannel> channel_;
2199 uint32 last_ssrc_;
2200};
2201
2202TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith2SimulcastStreams) {
2203 VerifySimulcastSettings(kVp8Codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2204}
2205
2206TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith3SimulcastStreams) {
2207 VerifySimulcastSettings(
2208 kVp8Codec720p, VideoOptions::NORMAL, 3, 3, SBM_NORMAL);
2209}
2210
2211TEST_F(WebRtcVideoChannel2SimulcastTest,
2212 SetSendCodecsWith2SimulcastStreamsHighBitrateMode) {
2213 VerifySimulcastSettings(kVp8Codec, VideoOptions::HIGH, 2, 2, SBM_HIGH);
2214}
2215
2216TEST_F(WebRtcVideoChannel2SimulcastTest,
2217 SetSendCodecsWith3SimulcastStreamsHighBitrateMode) {
2218 VerifySimulcastSettings(kVp8Codec720p, VideoOptions::HIGH, 3, 3, SBM_HIGH);
2219}
2220
2221TEST_F(WebRtcVideoChannel2SimulcastTest,
2222 SetSendCodecsWith2SimulcastStreamsVeryHighBitrateMode) {
2223 VerifySimulcastSettings(
2224 kVp8Codec, VideoOptions::VERY_HIGH, 2, 2, SBM_VERY_HIGH);
2225}
2226
2227TEST_F(WebRtcVideoChannel2SimulcastTest,
2228 SetSendCodecsWith3SimulcastStreamsVeryHighBitrateMode) {
2229 VerifySimulcastSettings(
2230 kVp8Codec720p, VideoOptions::VERY_HIGH, 3, 3, SBM_VERY_HIGH);
2231}
2232
2233// Test that we normalize send codec format size in simulcast.
2234TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) {
2235 cricket::VideoCodec codec(kVp8Codec270p);
2236 codec.width += 1;
2237 codec.height += 1;
2238 VerifySimulcastSettings(codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2239}
2240
2241// Test that if we add a stream with RTX SSRC's, SSRC's get set correctly.
2242TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestStreamWithRtx) {
2243 // TODO(pbos): Implement.
2244 FAIL() << "Not implemented.";
2245}
2246
2247// Test that if we get too few ssrcs are given in AddSendStream(),
2248// only supported sub-streams will be added.
2249TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TooFewSimulcastSsrcs) {
2250 // TODO(pbos): Implement.
2251 FAIL() << "Not implemented.";
2252}
2253
2254// Test that even more than enough ssrcs are given in AddSendStream(),
2255// only supported sub-streams will be added.
2256TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_MoreThanEnoughSimulcastSscrs) {
2257 // TODO(pbos): Implement.
2258 FAIL() << "Not implemented.";
2259}
2260
2261// Test that SetSendStreamFormat works well with simulcast.
2262TEST_F(WebRtcVideoEngine2SimulcastTest,
2263 DISABLED_SetSendStreamFormatWithSimulcast) {
2264 // TODO(pbos): Implement.
2265 FAIL() << "Not implemented.";
2266}
2267
2268// Test that simulcast send codec is reset on new video frame size.
2269TEST_F(WebRtcVideoEngine2SimulcastTest,
2270 DISABLED_ResetSimulcastSendCodecOnNewFrameSize) {
2271 // TODO(pbos): Implement.
2272 FAIL() << "Not implemented.";
2273}
2274
2275// Test that simulcast send codec is reset on new portait mode video frame.
2276TEST_F(WebRtcVideoEngine2SimulcastTest,
2277 DISABLED_ResetSimulcastSendCodecOnNewPortaitFrame) {
2278 // TODO(pbos): Implement.
2279 FAIL() << "Not implemented.";
2280}
2281
2282TEST_F(WebRtcVideoEngine2SimulcastTest,
2283 DISABLED_SetBandwidthInConferenceWithSimulcast) {
2284 // TODO(pbos): Implement.
2285 FAIL() << "Not implemented.";
2286}
2287
2288// Test that sending screencast frames in conference mode changes
2289// bitrate.
2290TEST_F(WebRtcVideoEngine2SimulcastTest,
2291 DISABLED_SetBandwidthScreencastInConference) {
2292 // TODO(pbos): Implement.
2293 FAIL() << "Not implemented.";
2294}
2295
2296// Test AddSendStream with simulcast rejects bad StreamParams.
2297TEST_F(WebRtcVideoEngine2SimulcastTest,
2298 DISABLED_AddSendStreamWithBadStreamParams) {
2299 // TODO(pbos): Implement.
2300 FAIL() << "Not implemented.";
2301}
2302
2303// Test AddSendStream with simulcast sets ssrc and cname correctly.
2304TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_AddSendStreamWithSimulcast) {
2305 // TODO(pbos): Implement.
2306 FAIL() << "Not implemented.";
2307}
2308
2309// Test RemoveSendStream with simulcast.
2310TEST_F(WebRtcVideoEngine2SimulcastTest,
2311 DISABLED_RemoveSendStreamWithSimulcast) {
2312 // TODO(pbos): Implement.
2313 FAIL() << "Not implemented.";
2314}
2315
2316// Test AddSendStream after send codec has already been set will reset
2317// send codec with simulcast settings.
2318TEST_F(WebRtcVideoEngine2SimulcastTest,
2319 DISABLED_AddSimulcastStreamAfterSetSendCodec) {
2320 // TODO(pbos): Implement.
2321 FAIL() << "Not implemented.";
2322}
2323
2324TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_GetStatsWithMultipleSsrcs) {
2325 // TODO(pbos): Implement.
2326 FAIL() << "Not implemented.";
2327}
2328
2329// Test receiving channel(s) local ssrc is set to the same as the first
2330// simulcast sending ssrc.
2331TEST_F(WebRtcVideoEngine2SimulcastTest,
2332 DISABLED_AddSimulcastStreamAfterCreatingRecvChannels) {
2333 // TODO(pbos): Implement.
2334 FAIL() << "Not implemented.";
2335}
2336
2337// Test 1:1 call never turn on simulcast.
2338TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_NoSimulcastWith1on1) {
2339 // TODO(pbos): Implement.
2340 FAIL() << "Not implemented.";
2341}
2342
2343// Test SetOptions with OPT_CONFERENCE flag.
2344TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_SetOptionsWithConferenceMode) {
2345 // TODO(pbos): Implement.
2346 FAIL() << "Not implemented.";
2347}
2348
2349// Test that two different streams can have different formats.
2350TEST_F(WebRtcVideoEngine2SimulcastTest,
2351 DISABLED_MultipleSendStreamsDifferentFormats) {
2352 // TODO(pbos): Implement.
2353 FAIL() << "Not implemented.";
2354}
2355
2356TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToOutputFormat) {
2357 // TODO(pbos): Implement.
2358 FAIL() << "Not implemented.";
2359}
2360
2361TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToCpuLoad) {
2362 // TODO(pbos): Implement.
2363 FAIL() << "Not implemented.";
2364}
2365
2366TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToCpuLoadDisabled) {
2367 // TODO(pbos): Implement.
2368 FAIL() << "Not implemented.";
2369}
2370
2371TEST_F(WebRtcVideoEngine2SimulcastTest,
2372 DISABLED_TestAdaptWithCpuOveruseObserver) {
2373 // TODO(pbos): Implement.
2374 FAIL() << "Not implemented.";
2375}
2376
2377// Test that codec is not reset for every frame sent in non-conference and
2378// non-screencast mode.
2379TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_DontResetCodecOnSendFrame) {
2380 // TODO(pbos): Implement.
2381 FAIL() << "Not implemented.";
2382}
2383
2384TEST_F(WebRtcVideoEngine2SimulcastTest,
2385 DISABLED_UseSimulcastAdapterOnVp8OnlyFactory) {
2386 // TODO(pbos): Implement.
2387 FAIL() << "Not implemented.";
2388}
2389
2390TEST_F(WebRtcVideoEngine2SimulcastTest,
2391 DISABLED_DontUseSimulcastAdapterOnNoneVp8Factory) {
2392 // TODO(pbos): Implement.
2393 FAIL() << "Not implemented.";
2394}
2395
2396TEST_F(WebRtcVideoEngine2SimulcastTest,
2397 DISABLED_DontUseSimulcastAdapterOnMultipleCodecsFactory) {
2398 // TODO(pbos): Implement.
2399 FAIL() << "Not implemented.";
2400}
2401
2402TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x800) {
2403 // TODO(pbos): Implement.
2404 FAIL() << "Not implemented.";
2405}
2406
2407TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x720) {
2408 // TODO(pbos): Implement.
2409 FAIL() << "Not implemented.";
2410}
2411
2412TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x540) {
2413 // TODO(pbos): Implement.
2414 FAIL() << "Not implemented.";
2415}
2416
2417TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x600) {
2418 // TODO(pbos): Implement.
2419 FAIL() << "Not implemented.";
2420}
2421
2422TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x400) {
2423 // TODO(pbos): Implement.
2424 FAIL() << "Not implemented.";
2425}
2426
2427TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x360) {
2428 // TODO(pbos): Implement.
2429 FAIL() << "Not implemented.";
2430}
2431
2432TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_480x300) {
2433 // TODO(pbos): Implement.
2434 FAIL() << "Not implemented.";
2435}
2436
2437TEST_F(WebRtcVideoChannel2SimulcastTest,
2438 DISABLED_DISABLED_SimulcastSend_480x270) {
2439 // TODO(pbos): Implement.
2440 FAIL() << "Not implemented.";
2441}
2442
2443TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x200) {
2444 // TODO(pbos): Implement.
2445 FAIL() << "Not implemented.";
2446}
2447
2448TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x180) {
2449 // TODO(pbos): Implement.
2450 FAIL() << "Not implemented.";
2451}
2452
2453// Test reset send codec with simulcast.
2454// Disabled per b/6773425
2455TEST_F(WebRtcVideoChannel2SimulcastTest,
2456 DISABLED_DISABLED_SimulcastResetSendCodec) {
2457 // TODO(pbos): Implement.
2458 FAIL() << "Not implemented.";
2459}
2460
2461// Test simulcast streams are decodeable with expected sizes.
2462TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastStreams) {
2463 // TODO(pbos): Implement.
2464 FAIL() << "Not implemented.";
2465}
2466
2467// Simulcast and resolution resizing should be turned off when screencasting
2468// but not otherwise.
2469TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_ScreencastRendering) {
2470 // TODO(pbos): Implement.
2471 FAIL() << "Not implemented.";
2472}
2473
2474// Ensures that the correct settings are applied to the codec when single
2475// temporal layer screencasting is enabled, and that the correct simulcast
2476// settings are reapplied when disabling screencasting.
2477TEST_F(WebRtcVideoChannel2SimulcastTest,
2478 DISABLED_OneTemporalLayerScreencastSettings) {
2479 // TODO(pbos): Implement.
2480 FAIL() << "Not implemented.";
2481}
2482
2483// Ensures that the correct settings are applied to the codec when two temporal
2484// layer screencasting is enabled, and that the correct simulcast settings are
2485// reapplied when disabling screencasting.
2486TEST_F(WebRtcVideoChannel2SimulcastTest,
2487 DISABLED_TwoTemporalLayerScreencastSettings) {
2488 // TODO(pbos): Implement.
2489 FAIL() << "Not implemented.";
2490}
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002491
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002492} // namespace cricket