blob: 174c3e9988ab639f72d4d36f6471ea09931fc5a8 [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 {
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00 +0000199 return stats_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000200}
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.org1d0fa5d2015-02-19 12:47:00 +0000210void FakeVideoReceiveStream::SetStats(
211 const webrtc::VideoReceiveStream::Stats& stats) {
212 stats_ = stats;
213}
214
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000215FakeCall::FakeCall(const webrtc::Call::Config& config)
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000216 : config_(config),
217 network_state_(kNetworkUp),
218 num_created_send_streams_(0),
219 num_created_receive_streams_(0) {
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000220 SetVideoCodecs(GetDefaultVideoCodecs());
221}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000222
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000223FakeCall::~FakeCall() {
224 EXPECT_EQ(0u, video_send_streams_.size());
225 EXPECT_EQ(0u, video_receive_streams_.size());
226}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000227
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000228void FakeCall::SetVideoCodecs(const std::vector<webrtc::VideoCodec> codecs) {
229 codecs_ = codecs;
230}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000231
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000232webrtc::Call::Config FakeCall::GetConfig() const {
233 return config_;
234}
235
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000236std::vector<FakeVideoSendStream*> FakeCall::GetVideoSendStreams() {
237 return video_send_streams_;
238}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000239
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000240std::vector<FakeVideoReceiveStream*> FakeCall::GetVideoReceiveStreams() {
241 return video_receive_streams_;
242}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000243
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000244webrtc::VideoCodec FakeCall::GetEmptyVideoCodec() {
245 webrtc::VideoCodec codec;
246 codec.minBitrate = 300;
247 codec.startBitrate = 800;
248 codec.maxBitrate = 1500;
249 codec.maxFramerate = 10;
250 codec.width = 640;
251 codec.height = 480;
252 codec.qpMax = 56;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000253
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000254 return codec;
255}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000256
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000257webrtc::VideoCodec FakeCall::GetVideoCodecVp8() {
258 webrtc::VideoCodec vp8_codec = GetEmptyVideoCodec();
259 vp8_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000260 rtc::strcpyn(
261 vp8_codec.plName, ARRAY_SIZE(vp8_codec.plName), kVp8Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000262 vp8_codec.plType = kVp8Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000263
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000264 return vp8_codec;
265}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000266
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000267webrtc::VideoCodec FakeCall::GetVideoCodecVp9() {
268 webrtc::VideoCodec vp9_codec = GetEmptyVideoCodec();
269 // TODO(pbos): Add a correct codecType when webrtc has one.
270 vp9_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000271 rtc::strcpyn(
272 vp9_codec.plName, ARRAY_SIZE(vp9_codec.plName), kVp9Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000273 vp9_codec.plType = kVp9Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000274
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000275 return vp9_codec;
276}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000277
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000278std::vector<webrtc::VideoCodec> FakeCall::GetDefaultVideoCodecs() {
279 std::vector<webrtc::VideoCodec> codecs;
280 codecs.push_back(GetVideoCodecVp8());
281 // codecs.push_back(GetVideoCodecVp9());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000282
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000283 return codecs;
284}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000285
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000286webrtc::Call::NetworkState FakeCall::GetNetworkState() const {
287 return network_state_;
288}
289
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000290webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
291 const webrtc::VideoSendStream::Config& config,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000292 const webrtc::VideoEncoderConfig& encoder_config) {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000293 FakeVideoSendStream* fake_stream =
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000294 new FakeVideoSendStream(config, encoder_config);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000295 video_send_streams_.push_back(fake_stream);
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000296 ++num_created_send_streams_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000297 return fake_stream;
298}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000299
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000300void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
301 FakeVideoSendStream* fake_stream =
302 static_cast<FakeVideoSendStream*>(send_stream);
303 for (size_t i = 0; i < video_send_streams_.size(); ++i) {
304 if (video_send_streams_[i] == fake_stream) {
305 delete video_send_streams_[i];
306 video_send_streams_.erase(video_send_streams_.begin() + i);
307 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000308 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000309 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000310 ADD_FAILURE() << "DestroyVideoSendStream called with unknown paramter.";
311}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000312
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000313webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
314 const webrtc::VideoReceiveStream::Config& config) {
315 video_receive_streams_.push_back(new FakeVideoReceiveStream(config));
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000316 ++num_created_receive_streams_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000317 return video_receive_streams_[video_receive_streams_.size() - 1];
318}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000319
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000320void FakeCall::DestroyVideoReceiveStream(
321 webrtc::VideoReceiveStream* receive_stream) {
322 FakeVideoReceiveStream* fake_stream =
323 static_cast<FakeVideoReceiveStream*>(receive_stream);
324 for (size_t i = 0; i < video_receive_streams_.size(); ++i) {
325 if (video_receive_streams_[i] == fake_stream) {
326 delete video_receive_streams_[i];
327 video_receive_streams_.erase(video_receive_streams_.begin() + i);
328 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000329 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000330 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000331 ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown paramter.";
332}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000333
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000334webrtc::PacketReceiver* FakeCall::Receiver() {
335 // TODO(pbos): Fix this.
336 return NULL;
337}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000338
pbos@webrtc.org2b19f062014-12-11 13:26:09 +0000339void FakeCall::SetStats(const webrtc::Call::Stats& stats) {
340 stats_ = stats;
341}
342
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000343int FakeCall::GetNumCreatedSendStreams() const {
344 return num_created_send_streams_;
345}
346
347int FakeCall::GetNumCreatedReceiveStreams() const {
348 return num_created_receive_streams_;
349}
350
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000351webrtc::Call::Stats FakeCall::GetStats() const {
pbos@webrtc.org2b19f062014-12-11 13:26:09 +0000352 return stats_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000353}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000354
pbos@webrtc.org00873182014-11-25 14:03:34 +0000355void FakeCall::SetBitrateConfig(
356 const webrtc::Call::Config::BitrateConfig& bitrate_config) {
357 config_.stream_bitrates = bitrate_config;
358}
359
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000360void FakeCall::SignalNetworkState(webrtc::Call::NetworkState state) {
361 network_state_ = state;
362}
363
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000364class WebRtcVideoEngine2Test : public ::testing::Test {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000365 public:
pbos@webrtc.orgf1f0d9a2015-03-02 13:30:15 +0000366 WebRtcVideoEngine2Test() : WebRtcVideoEngine2Test(nullptr) {}
367 WebRtcVideoEngine2Test(WebRtcVoiceEngine* voice_engine)
368 : engine_(voice_engine) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000369 std::vector<VideoCodec> engine_codecs = engine_.codecs();
370 assert(!engine_codecs.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000371 bool codec_set = false;
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000372 for (size_t i = 0; i < engine_codecs.size(); ++i) {
373 if (engine_codecs[i].name == "red") {
374 default_red_codec_ = engine_codecs[i];
375 } else if (engine_codecs[i].name == "ulpfec") {
376 default_ulpfec_codec_ = engine_codecs[i];
377 } else if (engine_codecs[i].name == "rtx") {
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000378 default_rtx_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000379 } else if (!codec_set) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000380 default_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000381 codec_set = true;
382 }
383 }
384
385 assert(codec_set);
386 }
387
388 protected:
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000389 class FakeCallFactory : public WebRtcCallFactory {
390 public:
391 FakeCallFactory() : fake_call_(NULL) {}
392 FakeCall* GetCall() { return fake_call_; }
393
394 private:
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000395 webrtc::Call* CreateCall(const webrtc::Call::Config& config) override {
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000396 assert(fake_call_ == NULL);
397 fake_call_ = new FakeCall(config);
398 return fake_call_;
399 }
400
401 FakeCall* fake_call_;
402 };
403
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000404 VideoMediaChannel* SetUpForExternalEncoderFactory(
405 cricket::WebRtcVideoEncoderFactory* encoder_factory,
406 const std::vector<VideoCodec>& codecs);
pbos@webrtc.orgfa553ef2014-10-20 11:07:07 +0000407
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000408 VideoMediaChannel* SetUpForExternalDecoderFactory(
409 cricket::WebRtcVideoDecoderFactory* decoder_factory,
410 const std::vector<VideoCodec>& codecs);
411
pbos@webrtc.orgf1f0d9a2015-03-02 13:30:15 +0000412 // Used in WebRtcVideoEngine2VoiceTest, but defined here so it's properly
413 // initialized when the constructor is called.
414 WebRtcVoiceEngine voice_engine_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000415 WebRtcVideoEngine2 engine_;
416 VideoCodec default_codec_;
417 VideoCodec default_red_codec_;
418 VideoCodec default_ulpfec_codec_;
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000419 VideoCodec default_rtx_codec_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000420};
421
pbos@webrtc.orgf1f0d9a2015-03-02 13:30:15 +0000422class WebRtcVideoEngine2VoiceTest : public WebRtcVideoEngine2Test {
423 public:
424 WebRtcVideoEngine2VoiceTest() : WebRtcVideoEngine2Test(&voice_engine_) {}
425};
426
427TEST_F(WebRtcVideoEngine2VoiceTest, ConfiguresAvSyncForFirstReceiveChannel) {
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000428 FakeCallFactory call_factory;
429 engine_.SetCallFactory(&call_factory);
430
pbos@webrtc.orgf1f0d9a2015-03-02 13:30:15 +0000431 voice_engine_.Init(rtc::Thread::Current());
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000432 engine_.Init(rtc::Thread::Current());
433
434 rtc::scoped_ptr<VoiceMediaChannel> voice_channel(
pbos@webrtc.orgf1f0d9a2015-03-02 13:30:15 +0000435 voice_engine_.CreateChannel());
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000436 ASSERT_TRUE(voice_channel.get() != NULL);
437 WebRtcVoiceMediaChannel* webrtc_voice_channel =
438 static_cast<WebRtcVoiceMediaChannel*>(voice_channel.get());
439 ASSERT_NE(webrtc_voice_channel->voe_channel(), -1);
440 rtc::scoped_ptr<VideoMediaChannel> channel(
441 engine_.CreateChannel(cricket::VideoOptions(), voice_channel.get()));
442
443 FakeCall* fake_call = call_factory.GetCall();
444 ASSERT_TRUE(fake_call != NULL);
445
446 webrtc::Call::Config call_config = fake_call->GetConfig();
447
pbos@webrtc.orgf1f0d9a2015-03-02 13:30:15 +0000448 ASSERT_TRUE(voice_engine_.voe()->engine() != NULL);
449 ASSERT_EQ(voice_engine_.voe()->engine(), call_config.voice_engine);
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000450
451 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc)));
452 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc + 1)));
453 std::vector<FakeVideoReceiveStream*> receive_streams =
454 fake_call->GetVideoReceiveStreams();
455
456 ASSERT_EQ(2u, receive_streams.size());
457 EXPECT_EQ(webrtc_voice_channel->voe_channel(),
458 receive_streams[0]->GetConfig().audio_channel_id);
459 EXPECT_EQ(-1, receive_streams[1]->GetConfig().audio_channel_id)
460 << "AV sync should only be set up for the first receive channel.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000461}
462
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000463TEST_F(WebRtcVideoEngine2Test, FindCodec) {
464 const std::vector<cricket::VideoCodec>& c = engine_.codecs();
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000465 EXPECT_EQ(4U, c.size());
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000466
467 cricket::VideoCodec vp8(104, "VP8", 320, 200, 30, 0);
468 EXPECT_TRUE(engine_.FindCodec(vp8));
469
470 cricket::VideoCodec vp8_ci(104, "vp8", 320, 200, 30, 0);
471 EXPECT_TRUE(engine_.FindCodec(vp8));
472
473 cricket::VideoCodec vp8_diff_fr_diff_pref(104, "VP8", 320, 200, 50, 50);
474 EXPECT_TRUE(engine_.FindCodec(vp8_diff_fr_diff_pref));
475
476 cricket::VideoCodec vp8_diff_id(95, "VP8", 320, 200, 30, 0);
477 EXPECT_FALSE(engine_.FindCodec(vp8_diff_id));
478 vp8_diff_id.id = 97;
479 EXPECT_TRUE(engine_.FindCodec(vp8_diff_id));
480
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000481 // FindCodec ignores the codec size.
482 // Test that FindCodec can accept uncommon codec size.
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000483 cricket::VideoCodec vp8_diff_res(104, "VP8", 320, 111, 30, 0);
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000484 EXPECT_TRUE(engine_.FindCodec(vp8_diff_res));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000485
486 // PeerConnection doesn't negotiate the resolution at this point.
487 // Test that FindCodec can handle the case when width/height is 0.
488 cricket::VideoCodec vp8_zero_res(104, "VP8", 0, 0, 30, 0);
489 EXPECT_TRUE(engine_.FindCodec(vp8_zero_res));
490
491 cricket::VideoCodec red(101, "RED", 0, 0, 30, 0);
492 EXPECT_TRUE(engine_.FindCodec(red));
493
494 cricket::VideoCodec red_ci(101, "red", 0, 0, 30, 0);
495 EXPECT_TRUE(engine_.FindCodec(red));
496
497 cricket::VideoCodec fec(102, "ULPFEC", 0, 0, 30, 0);
498 EXPECT_TRUE(engine_.FindCodec(fec));
499
500 cricket::VideoCodec fec_ci(102, "ulpfec", 0, 0, 30, 0);
501 EXPECT_TRUE(engine_.FindCodec(fec));
502
503 cricket::VideoCodec rtx(96, "rtx", 0, 0, 30, 0);
504 EXPECT_TRUE(engine_.FindCodec(rtx));
505}
506
pbos@webrtc.org2a72c652015-02-26 16:01:24 +0000507TEST_F(WebRtcVideoEngine2Test, SetDefaultEncoderConfigPreservesFeedbackParams) {
508 cricket::VideoCodec max_settings(
509 engine_.codecs()[0].id, engine_.codecs()[0].name,
510 engine_.codecs()[0].width / 2, engine_.codecs()[0].height / 2, 30, 0);
511 // This codec shouldn't have NACK by default or the test is pointless.
512 EXPECT_FALSE(max_settings.HasFeedbackParam(
513 FeedbackParam(kRtcpFbParamNack, kParamValueEmpty)));
514 // The engine should by default have it however.
515 EXPECT_TRUE(engine_.codecs()[0].HasFeedbackParam(
516 FeedbackParam(kRtcpFbParamNack, kParamValueEmpty)));
517
518 // Set constrained max codec settings.
519 EXPECT_TRUE(engine_.SetDefaultEncoderConfig(
520 cricket::VideoEncoderConfig(max_settings)));
521
522 // Verify that feedback parameters are retained.
523 EXPECT_TRUE(engine_.codecs()[0].HasFeedbackParam(
524 FeedbackParam(kRtcpFbParamNack, kParamValueEmpty)));
525}
526
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000527TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
528 std::vector<VideoCodec> engine_codecs = engine_.codecs();
529 for (size_t i = 0; i < engine_codecs.size(); ++i) {
530 if (engine_codecs[i].name != kRtxCodecName)
531 continue;
532 int associated_payload_type;
533 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000534 &associated_payload_type));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000535 EXPECT_EQ(default_codec_.id, associated_payload_type);
536 return;
537 }
538 FAIL() << "No RTX codec found among default codecs.";
539}
540
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000541TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
542 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
543 ASSERT_FALSE(extensions.empty());
544 for (size_t i = 0; i < extensions.size(); ++i) {
545 if (extensions[i].uri == kRtpTimestampOffsetHeaderExtension) {
546 EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extensions[i].id);
547 return;
548 }
549 }
550 FAIL() << "Timestamp offset extension not in header-extension list.";
551}
552
553TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
554 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
555 ASSERT_FALSE(extensions.empty());
556 for (size_t i = 0; i < extensions.size(); ++i) {
557 if (extensions[i].uri == kRtpAbsoluteSenderTimeHeaderExtension) {
558 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId,
559 extensions[i].id);
560 return;
561 }
562 }
563 FAIL() << "Absolute Sender Time extension not in header-extension list.";
564}
565
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000566TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000567 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000568 rtc::scoped_ptr<VideoMediaChannel> channel(
569 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000570
571 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
572
573 EXPECT_FALSE(channel->SetSend(true))
574 << "Channel should not start without codecs.";
575 EXPECT_TRUE(channel->SetSend(false))
576 << "Channel should be stoppable even without set codecs.";
577}
578
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000579TEST_F(WebRtcVideoEngine2Test, GetStatsWithoutSendCodecsSetDoesNotCrash) {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000580 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000581 rtc::scoped_ptr<VideoMediaChannel> channel(
582 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000583 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
584 VideoMediaInfo info;
585 channel->GetStats(&info);
586}
587
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000588TEST_F(WebRtcVideoEngine2Test, UseExternalFactoryForVp8WhenSupported) {
589 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
590 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
591 std::vector<cricket::VideoCodec> codecs;
592 codecs.push_back(kVp8Codec);
593
594 rtc::scoped_ptr<VideoMediaChannel> channel(
595 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
596
597 EXPECT_TRUE(
598 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
599 ASSERT_EQ(1u, encoder_factory.encoders().size());
600 EXPECT_TRUE(channel->SetSend(true));
601
602 cricket::FakeVideoCapturer capturer;
603 EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer));
604 EXPECT_EQ(cricket::CS_RUNNING,
605 capturer.Start(capturer.GetSupportedFormats()->front()));
606 EXPECT_TRUE(capturer.CaptureFrame());
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000607 EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0,
608 kTimeout);
609
pbos@webrtc.org86196c42015-02-16 21:02:00 +0000610 // Sending one frame will have reallocated the encoder since input size
611 // changes from a small default to the actual frame width/height.
612 int num_created_encoders = encoder_factory.GetNumCreatedEncoders();
613 EXPECT_EQ(num_created_encoders, 2);
614
615 // Setting codecs of the same type should not reallocate any encoders
616 // (expecting a no-op).
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000617 EXPECT_TRUE(channel->SetSendCodecs(codecs));
pbos@webrtc.org86196c42015-02-16 21:02:00 +0000618 EXPECT_EQ(num_created_encoders, encoder_factory.GetNumCreatedEncoders());
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000619
620 // Remove stream previously added to free the external encoder instance.
621 EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
622 EXPECT_EQ(0u, encoder_factory.encoders().size());
623}
624
625VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalEncoderFactory(
626 cricket::WebRtcVideoEncoderFactory* encoder_factory,
627 const std::vector<VideoCodec>& codecs) {
628 engine_.SetExternalEncoderFactory(encoder_factory);
629 engine_.Init(rtc::Thread::Current());
630
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000631 VideoMediaChannel* channel =
632 engine_.CreateChannel(cricket::VideoOptions(), NULL);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000633 EXPECT_TRUE(channel->SetSendCodecs(codecs));
634
635 return channel;
636}
637
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000638VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalDecoderFactory(
639 cricket::WebRtcVideoDecoderFactory* decoder_factory,
640 const std::vector<VideoCodec>& codecs) {
641 engine_.SetExternalDecoderFactory(decoder_factory);
642 engine_.Init(rtc::Thread::Current());
643
644 VideoMediaChannel* channel =
645 engine_.CreateChannel(cricket::VideoOptions(), NULL);
646 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
647
648 return channel;
649}
650
pbos@webrtc.orgf18fba22015-01-14 16:26:23 +0000651TEST_F(WebRtcVideoEngine2Test, UsesSimulcastAdapterForVp8Factories) {
652 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
653 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
654 std::vector<cricket::VideoCodec> codecs;
655 codecs.push_back(kVp8Codec);
656
657 rtc::scoped_ptr<VideoMediaChannel> channel(
658 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
659
660 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
661
662 EXPECT_TRUE(
663 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
664 EXPECT_TRUE(channel->SetSend(true));
665
pbos@webrtc.org86196c42015-02-16 21:02:00 +0000666 cricket::FakeVideoCapturer capturer;
667 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), &capturer));
668 EXPECT_EQ(cricket::CS_RUNNING,
669 capturer.Start(capturer.GetSupportedFormats()->front()));
670 EXPECT_TRUE(capturer.CaptureFrame());
671
pbos@webrtc.orgf18fba22015-01-14 16:26:23 +0000672 EXPECT_GT(encoder_factory.encoders().size(), 1u);
673
674 // Verify that encoders are configured for simulcast through adapter
675 // (increasing resolution and only configured to send one stream each).
676 int prev_width = -1;
677 for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) {
678 webrtc::VideoCodec codec_settings =
679 encoder_factory.encoders()[i]->GetCodecSettings();
680 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams);
681 EXPECT_GT(codec_settings.width, prev_width);
682 prev_width = codec_settings.width;
683 }
pbos@webrtc.org86196c42015-02-16 21:02:00 +0000684
685 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), NULL));
pbos@webrtc.orgf18fba22015-01-14 16:26:23 +0000686}
687
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000688TEST_F(WebRtcVideoEngine2Test, ChannelWithExternalH264CanChangeToInternalVp8) {
689 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
690 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
691 std::vector<cricket::VideoCodec> codecs;
692 codecs.push_back(kH264Codec);
693
694 rtc::scoped_ptr<VideoMediaChannel> channel(
695 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
696
697 EXPECT_TRUE(
698 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
699 ASSERT_EQ(1u, encoder_factory.encoders().size());
700
701 codecs.clear();
702 codecs.push_back(kVp8Codec);
703 EXPECT_TRUE(channel->SetSendCodecs(codecs));
704
705 ASSERT_EQ(0u, encoder_factory.encoders().size());
706}
707
708TEST_F(WebRtcVideoEngine2Test,
709 DontUseExternalEncoderFactoryForUnsupportedCodecs) {
710 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
711 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
712 std::vector<cricket::VideoCodec> codecs;
713 codecs.push_back(kVp8Codec);
714
715 rtc::scoped_ptr<VideoMediaChannel> channel(
716 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
717
718 EXPECT_TRUE(
719 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
720 ASSERT_EQ(0u, encoder_factory.encoders().size());
721}
722
723// Test external codec with be added to the end of the supported codec list.
724TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) {
725 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
726 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
727 engine_.SetExternalEncoderFactory(&encoder_factory);
728
729 engine_.Init(rtc::Thread::Current());
730
731 std::vector<cricket::VideoCodec> codecs(engine_.codecs());
732 ASSERT_GE(codecs.size(), 2u);
733 cricket::VideoCodec internal_codec = codecs.front();
734 cricket::VideoCodec external_codec = codecs.back();
735
736 // The external codec will appear at last.
737 EXPECT_EQ("VP8", internal_codec.name);
738 EXPECT_EQ("H264", external_codec.name);
739}
740
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000741TEST_F(WebRtcVideoEngine2Test, RegisterExternalDecodersIfSupported) {
742 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
743 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
744 std::vector<cricket::VideoCodec> codecs;
745 codecs.push_back(kVp8Codec);
746
747 rtc::scoped_ptr<VideoMediaChannel> channel(
748 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
749
750 EXPECT_TRUE(
751 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
752 ASSERT_EQ(1u, decoder_factory.decoders().size());
753
754 // Setting codecs of the same type should not reallocate the decoder.
755 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
756 EXPECT_EQ(1, decoder_factory.GetNumCreatedDecoders());
757
758 // Remove stream previously added to free the external decoder instance.
759 EXPECT_TRUE(channel->RemoveRecvStream(kSsrc));
760 EXPECT_EQ(0u, decoder_factory.decoders().size());
761}
762
763// Verifies that we can set up decoders that are not internally supported.
764TEST_F(WebRtcVideoEngine2Test, RegisterExternalH264DecoderIfSupported) {
765 // TODO(pbos): Do not assume that encoder/decoder support is symmetric. We
766 // can't even query the WebRtcVideoDecoderFactory for supported codecs.
767 // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported
768 // codecs.
769 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
770 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
771 engine_.SetExternalEncoderFactory(&encoder_factory);
772 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
773 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
774 std::vector<cricket::VideoCodec> codecs;
775 codecs.push_back(kH264Codec);
776
777 rtc::scoped_ptr<VideoMediaChannel> channel(
778 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
779
780 EXPECT_TRUE(
781 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
782 ASSERT_EQ(1u, decoder_factory.decoders().size());
783}
784
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000785class WebRtcVideoEngine2BaseTest
786 : public VideoEngineTest<cricket::WebRtcVideoEngine2> {
787 protected:
788 typedef VideoEngineTest<cricket::WebRtcVideoEngine2> Base;
789};
790
791#define WEBRTC_ENGINE_BASE_TEST(test) \
792 TEST_F(WebRtcVideoEngine2BaseTest, test) { Base::test##Body(); }
793
794WEBRTC_ENGINE_BASE_TEST(ConstrainNewCodec2);
795
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000796class WebRtcVideoChannel2BaseTest
797 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
798 protected:
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000799 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000800
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000801 cricket::VideoCodec DefaultCodec() override { return kVp8Codec; }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000802};
803
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000804#define WEBRTC_BASE_TEST(test) \
805 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); }
806
807#define WEBRTC_DISABLED_BASE_TEST(test) \
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000808 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_##test) { Base::test(); }
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000809
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000810// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
811#if 0
812// TODO(juberti): Figure out why ViE is munging the COM refcount.
813#ifdef WIN32
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000814WEBRTC_DISABLED_BASE_TEST(CheckCoInitialize) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000815 Base::CheckCoInitialize();
816}
817#endif
818#endif
819
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000820WEBRTC_BASE_TEST(SetSend);
821WEBRTC_BASE_TEST(SetSendWithoutCodecs);
822WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000823
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000824WEBRTC_BASE_TEST(GetStats);
825WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
826WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000827
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000828WEBRTC_BASE_TEST(SetSendBandwidth);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000829
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000830WEBRTC_BASE_TEST(SetSendSsrc);
831WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000832
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000833WEBRTC_BASE_TEST(SetRenderer);
834WEBRTC_BASE_TEST(AddRemoveRecvStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000835
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000836WEBRTC_DISABLED_BASE_TEST(AddRemoveRecvStreamAndRender);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000837
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000838WEBRTC_BASE_TEST(AddRemoveRecvStreamsNoConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000839
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000840WEBRTC_BASE_TEST(AddRemoveSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000841
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000842WEBRTC_BASE_TEST(SimulateConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000843
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000844WEBRTC_BASE_TEST(AddRemoveCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000845
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000846WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000847
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000848WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000849
850// TODO(pbos): Figure out why this fails so often.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000851WEBRTC_DISABLED_BASE_TEST(HighAspectHighHeightCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000852
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000853WEBRTC_BASE_TEST(RejectEmptyStreamParams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000854
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000855WEBRTC_BASE_TEST(AdaptResolution16x10);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000856
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000857WEBRTC_BASE_TEST(AdaptResolution4x3);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000858
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000859// TODO(juberti): Restore this test once we support sending 0 fps.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000860WEBRTC_DISABLED_BASE_TEST(AdaptDropAllFrames);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000861// TODO(juberti): Understand why we get decode errors on this test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000862WEBRTC_DISABLED_BASE_TEST(AdaptFramerate);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000863
pbos@webrtc.orgc4175b92014-09-03 15:25:49 +0000864WEBRTC_BASE_TEST(SendsLowerResolutionOnSmallerFrames);
865
866WEBRTC_BASE_TEST(MuteStream);
867
868WEBRTC_BASE_TEST(MultipleSendStreams);
869
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000870WEBRTC_BASE_TEST(SetSendStreamFormat0x0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000871
872// TODO(zhurunz): Fix the flakey test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000873WEBRTC_DISABLED_BASE_TEST(SetSendStreamFormat);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000874
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000875TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Vga) {
876 SendAndReceive(cricket::VideoCodec(100, "VP8", 640, 400, 30, 0));
877}
878
879TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Qvga) {
880 SendAndReceive(cricket::VideoCodec(100, "VP8", 320, 200, 30, 0));
881}
882
883TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8SvcQqvga) {
884 SendAndReceive(cricket::VideoCodec(100, "VP8", 160, 100, 30, 0));
885}
886
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000887TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
888 Base::TwoStreamsSendAndReceive(kVp8Codec);
889}
890
891TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
892 Base::TwoStreamsReUseFirstStream(kVp8Codec);
893}
894
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000895WEBRTC_BASE_TEST(SendManyResizeOnce);
896
897// TODO(pbos): Enable and figure out why this fails (or should work).
898TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
899 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL));
900 EXPECT_TRUE(channel_->SetRenderer(kDefaultReceiveSsrc, &renderer_));
901 channel_->UpdateAspectRatio(1280, 720);
902 video_capturer_.reset(new cricket::FakeVideoCapturer);
903 const std::vector<cricket::VideoFormat>* formats =
904 video_capturer_->GetSupportedFormats();
905 cricket::VideoFormat capture_format_hd = (*formats)[0];
906 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(capture_format_hd));
907 EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get()));
908
909 // Capture format HD -> adapt (OnOutputFormatRequest VGA) -> VGA.
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000910 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000911 EXPECT_TRUE(SetOneCodec(codec));
912 codec.width /= 2;
913 codec.height /= 2;
914 EXPECT_TRUE(SetSend(true));
915 EXPECT_TRUE(channel_->SetRender(true));
916 EXPECT_EQ(0, renderer_.num_rendered_frames());
917 EXPECT_TRUE(SendFrame());
918 EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout);
919}
920
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000921class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test,
922 public WebRtcCallFactory {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000923 public:
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000924 WebRtcVideoChannel2Test() : fake_call_(NULL) {}
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000925 void SetUp() override {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000926 engine_.SetCallFactory(this);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000927 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000928 channel_.reset(engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000929 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000930 last_ssrc_ = 123;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000931 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000932 }
933
934 protected:
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000935 webrtc::Call* CreateCall(const webrtc::Call::Config& config) override {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000936 assert(fake_call_ == NULL);
937 fake_call_ = new FakeCall(config);
938 return fake_call_;
939 }
940
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000941 FakeVideoSendStream* AddSendStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000942 return AddSendStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000943 }
944
945 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000946 size_t num_streams = fake_call_->GetVideoSendStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000947 EXPECT_TRUE(channel_->AddSendStream(sp));
948 std::vector<FakeVideoSendStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000949 fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000950 EXPECT_EQ(num_streams + 1, streams.size());
951 return streams[streams.size() - 1];
952 }
953
954 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000955 return fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000956 }
957
958 FakeVideoReceiveStream* AddRecvStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000959 return AddRecvStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000960 }
961
962 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000963 size_t num_streams = fake_call_->GetVideoReceiveStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000964 EXPECT_TRUE(channel_->AddRecvStream(sp));
965 std::vector<FakeVideoReceiveStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000966 fake_call_->GetVideoReceiveStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000967 EXPECT_EQ(num_streams + 1, streams.size());
968 return streams[streams.size() - 1];
969 }
970
pbos@webrtc.org00873182014-11-25 14:03:34 +0000971 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
972 int expected_min_bitrate_bps,
973 const char* start_bitrate_kbps,
974 int expected_start_bitrate_bps,
975 const char* max_bitrate_kbps,
976 int expected_max_bitrate_bps) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000977 std::vector<VideoCodec> codecs;
978 codecs.push_back(kVp8Codec);
pbos@webrtc.org00873182014-11-25 14:03:34 +0000979 codecs[0].params[kCodecParamMinBitrate] = min_bitrate_kbps;
980 codecs[0].params[kCodecParamStartBitrate] = start_bitrate_kbps;
981 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate_kbps;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000982 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
983
pbos@webrtc.org00873182014-11-25 14:03:34 +0000984 EXPECT_EQ(expected_min_bitrate_bps,
985 fake_call_->GetConfig().stream_bitrates.min_bitrate_bps);
986 EXPECT_EQ(expected_start_bitrate_bps,
987 fake_call_->GetConfig().stream_bitrates.start_bitrate_bps);
988 EXPECT_EQ(expected_max_bitrate_bps,
989 fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000990 }
991
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000992 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
993 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000994 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000995 // Enable extension.
996 const int id = 1;
997 std::vector<cricket::RtpHeaderExtension> extensions;
998 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
999 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1000
1001 FakeVideoSendStream* send_stream =
1002 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1003
1004 // Verify the send extension id.
1005 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
1006 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
1007 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
1008 // Verify call with same set of extensions returns true.
1009 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1010 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
1011 // receivers.
1012 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
1013 ->GetConfig()
1014 .rtp.extensions.empty());
1015
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001016 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001017 std::vector<cricket::RtpHeaderExtension> empty_extensions;
1018 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001019 ASSERT_EQ(1u, call->GetVideoSendStreams().size());
1020 send_stream = call->GetVideoSendStreams()[0];
1021 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
1022
1023 // Verify that adding receive RTP header extensions adds them for existing
1024 // streams.
1025 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1026 send_stream = call->GetVideoSendStreams()[0];
1027 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
1028 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
1029 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001030 }
1031
1032 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
1033 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001034 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001035 // Enable extension.
1036 const int id = 1;
1037 std::vector<cricket::RtpHeaderExtension> extensions;
1038 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
1039 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1040
1041 FakeVideoReceiveStream* recv_stream =
1042 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1043
1044 // Verify the recv extension id.
1045 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1046 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
1047 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
1048 // Verify call with same set of extensions returns true.
1049 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001050
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001051 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
1052 // senders.
1053 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
1054 ->GetConfig()
1055 .rtp.extensions.empty());
1056
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001057 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001058 std::vector<cricket::RtpHeaderExtension> empty_extensions;
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001059 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(empty_extensions));
1060 ASSERT_EQ(1u, call->GetVideoReceiveStreams().size());
1061 recv_stream = call->GetVideoReceiveStreams()[0];
1062 EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
1063
1064 // Verify that adding receive RTP header extensions adds them for existing
1065 // streams.
1066 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1067 recv_stream = call->GetVideoReceiveStreams()[0];
1068 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1069 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
1070 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001071 }
1072
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001073 void TestCpuAdaptation(bool enable_overuse);
1074
1075 FakeCall* fake_call_;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001076 rtc::scoped_ptr<VideoMediaChannel> channel_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001077 uint32 last_ssrc_;
1078};
1079
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001080TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001081 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1082 EXPECT_TRUE(channel_->SetSend(true));
1083 cricket::VideoOptions options;
1084 options.conference_mode.Set(true);
1085 EXPECT_TRUE(channel_->SetOptions(options));
1086
1087 // Send side.
1088 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1089 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1090 FakeVideoSendStream* send_stream = AddSendStream(
1091 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1092
1093 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
1094 for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
1095 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
1096
1097 // Receiver side.
1098 FakeVideoReceiveStream* recv_stream = AddRecvStream(
1099 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1100 ASSERT_GT(recv_stream->GetConfig().rtp.rtx.size(), 0u)
1101 << "No SSRCs for RTX configured by AddRecvStream.";
1102 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size())
1103 << "This test only works with one receive codec. Please update the test.";
1104 EXPECT_EQ(rtx_ssrcs[0],
1105 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
1106 // TODO(pbos): Make sure we set the RTX for correct payloads etc.
1107}
1108
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001109TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
1110 // Setup one channel with an associated RTX stream.
1111 cricket::StreamParams params =
1112 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
1113 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
1114 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
1115 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
1116 EXPECT_EQ(kRtxSsrcs1[0],
1117 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001118}
1119
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001120TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
1121 // Setup one channel without an associated RTX stream.
1122 cricket::StreamParams params =
1123 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
1124 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
1125 ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001126}
1127
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001128TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
1129 FakeVideoSendStream* send_stream =
1130 AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
1131 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
1132
1133 FakeVideoReceiveStream* recv_stream =
1134 AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
1135 ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001136}
1137
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001138// Test support for RTP timestamp offset header extension.
1139TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
1140 TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
1141 webrtc::RtpExtension::kTOffset);
1142}
1143TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
1144 TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
1145 webrtc::RtpExtension::kTOffset);
1146}
1147
1148// Test support for absolute send time header extension.
1149TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
1150 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
1151 webrtc::RtpExtension::kAbsSendTime);
1152}
1153TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
1154 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
1155 webrtc::RtpExtension::kAbsSendTime);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001156}
1157
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001158TEST_F(WebRtcVideoChannel2Test, IdenticalSendExtensionsDoesntRecreateStream) {
1159 const int kTOffsetId = 1;
1160 const int kAbsSendTimeId = 2;
1161 std::vector<cricket::RtpHeaderExtension> extensions;
1162 extensions.push_back(cricket::RtpHeaderExtension(
1163 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1164 extensions.push_back(cricket::RtpHeaderExtension(
1165 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
1166
1167 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1168 FakeVideoSendStream* send_stream =
1169 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1170
1171 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1172 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
1173
1174 // Setting the same extensions (even if in different order) shouldn't
1175 // reallocate the stream.
1176 std::reverse(extensions.begin(), extensions.end());
1177 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1178
1179 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1180
1181 // Setting different extensions should recreate the stream.
1182 extensions.resize(1);
1183 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1184
1185 EXPECT_EQ(2, fake_call_->GetNumCreatedSendStreams());
1186}
1187
1188TEST_F(WebRtcVideoChannel2Test, IdenticalRecvExtensionsDoesntRecreateStream) {
1189 const int kTOffsetId = 1;
1190 const int kAbsSendTimeId = 2;
1191 std::vector<cricket::RtpHeaderExtension> extensions;
1192 extensions.push_back(cricket::RtpHeaderExtension(
1193 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1194 extensions.push_back(cricket::RtpHeaderExtension(
1195 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
1196
1197 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1198 FakeVideoReceiveStream* send_stream =
1199 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1200
1201 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1202 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
1203
1204 // Setting the same extensions (even if in different order) shouldn't
1205 // reallocate the stream.
1206 std::reverse(extensions.begin(), extensions.end());
1207 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1208
1209 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1210
1211 // Setting different extensions should recreate the stream.
1212 extensions.resize(1);
1213 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1214
1215 EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams());
1216}
1217
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001218TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001219 SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001220 const int kUnsupportedId = 1;
1221 const int kTOffsetId = 2;
1222
1223 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001224 extensions.push_back(
1225 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1226 extensions.push_back(
1227 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001228 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1229 FakeVideoSendStream* send_stream =
1230 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1231
1232 // Only timestamp offset extension is set to send stream,
1233 // unsupported rtp extension is ignored.
1234 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
1235 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001236 send_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001237}
1238
1239TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001240 SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001241 const int kUnsupportedId = 1;
1242 const int kTOffsetId = 2;
1243
1244 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001245 extensions.push_back(
1246 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1247 extensions.push_back(
1248 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001249 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1250 FakeVideoReceiveStream* recv_stream =
1251 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1252
1253 // Only timestamp offset extension is set to receive stream,
1254 // unsupported rtp extension is ignored.
1255 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1256 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001257 recv_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001258}
1259
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001260TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001261 const int kIncorrectIds[] = {-2, -1, 15, 16};
1262 for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001263 std::vector<cricket::RtpHeaderExtension> extensions;
1264 extensions.push_back(cricket::RtpHeaderExtension(
1265 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1266 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions))
1267 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1268 }
1269}
1270
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001271TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001272 const int kIncorrectIds[] = {-2, -1, 15, 16};
1273 for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001274 std::vector<cricket::RtpHeaderExtension> extensions;
1275 extensions.push_back(cricket::RtpHeaderExtension(
1276 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1277 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions))
1278 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1279 }
1280}
1281
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001282TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001283 const int id = 1;
1284 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001285 extensions.push_back(
1286 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1287 extensions.push_back(
1288 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001289 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1290
1291 // Duplicate entries are also not supported.
1292 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001293 extensions.push_back(
1294 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001295 extensions.push_back(extensions.back());
1296 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1297}
1298
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001299TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001300 const int id = 1;
1301 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001302 extensions.push_back(
1303 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1304 extensions.push_back(
1305 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001306 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1307
1308 // Duplicate entries are also not supported.
1309 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001310 extensions.push_back(
1311 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001312 extensions.push_back(extensions.back());
1313 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1314}
1315
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001316TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
1317 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1318}
1319
1320TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
1321 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1322}
1323
1324TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
1325 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1326}
1327
1328TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
1329 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001330 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001331}
1332
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001333TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
1334 FakeVideoReceiveStream* stream = AddRecvStream();
1335 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001336}
1337
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001338TEST_F(WebRtcVideoChannel2Test, RembCanBeEnabledAndDisabled) {
1339 FakeVideoReceiveStream* stream = AddRecvStream();
1340 EXPECT_TRUE(stream->GetConfig().rtp.remb);
1341
1342 // Verify that REMB is turned off when codecs without REMB are set.
1343 std::vector<VideoCodec> codecs;
1344 codecs.push_back(kVp8Codec);
1345 EXPECT_TRUE(codecs[0].feedback_params.params().empty());
1346 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001347 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001348 EXPECT_FALSE(stream->GetConfig().rtp.remb);
1349
1350 // Verify that REMB is turned on when setting default codecs since the
1351 // default codecs have REMB enabled.
1352 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001353 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001354 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001355}
1356
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001357TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
1358 VerifyCodecHasDefaultFeedbackParams(default_codec_);
1359
pbos@webrtc.org19864742014-05-30 07:35:47 +00001360 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1361 EXPECT_TRUE(channel_->SetSend(true));
1362
1363 // Send side.
1364 FakeVideoSendStream* send_stream =
1365 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1366 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1367
1368 // Receiver side.
1369 FakeVideoReceiveStream* recv_stream =
1370 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1371 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1372
1373 // Nack history size should match between sender and receiver.
1374 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
1375 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001376}
1377
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001378TEST_F(WebRtcVideoChannel2Test, NackCanBeDisabled) {
1379 std::vector<VideoCodec> codecs;
1380 codecs.push_back(kVp8Codec);
1381
1382 // Send side.
1383 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1384 FakeVideoSendStream* send_stream =
1385 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1386 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
1387
1388 // Receiver side.
1389 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1390 FakeVideoReceiveStream* recv_stream =
1391 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1392 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
1393}
1394
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001395TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
1396 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1397}
1398
1399TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
1400 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1401}
1402
1403TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
1404 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1405}
1406
1407TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
1408 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1409}
1410
1411TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
1412 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1413}
1414
1415TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
1416 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1417}
1418
1419TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
1420 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1421}
1422
1423TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
1424 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1425}
1426
1427TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
1428 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1429}
1430
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001431TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) {
1432 static const int kScreenshareMinBitrateKbps = 800;
1433 cricket::VideoCodec codec = kVp8Codec360p;
1434 std::vector<cricket::VideoCodec> codecs;
1435 codecs.push_back(codec);
1436 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1437 VideoOptions options;
1438 options.screencast_min_bitrate.Set(kScreenshareMinBitrateKbps);
1439 channel_->SetOptions(options);
1440
1441 AddSendStream();
1442
1443 cricket::FakeVideoCapturer capturer;
1444 capturer.SetScreencast(false);
1445 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1446 cricket::VideoFormat capture_format_hd =
1447 capturer.GetSupportedFormats()->front();
1448 EXPECT_EQ(1280, capture_format_hd.width);
1449 EXPECT_EQ(720, capture_format_hd.height);
1450 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1451
1452 EXPECT_TRUE(channel_->SetSend(true));
1453
1454 EXPECT_TRUE(capturer.CaptureFrame());
1455 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1456 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1457
1458 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1459
1460 // Verify non-screencast settings.
1461 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1462 EXPECT_EQ(webrtc::VideoEncoderConfig::kRealtimeVideo,
1463 encoder_config.content_type);
1464 EXPECT_EQ(codec.width, encoder_config.streams.front().width);
1465 EXPECT_EQ(codec.height, encoder_config.streams.front().height);
1466 EXPECT_EQ(0, encoder_config.min_transmit_bitrate_bps)
1467 << "Non-screenshare shouldn't use min-transmit bitrate.";
1468
1469 capturer.SetScreencast(true);
1470 EXPECT_TRUE(capturer.CaptureFrame());
1471
1472 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1473
1474 // Verify screencast settings.
1475 encoder_config = send_stream->GetEncoderConfig();
1476 EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
1477 encoder_config.content_type);
1478 EXPECT_EQ(kScreenshareMinBitrateKbps * 1000,
1479 encoder_config.min_transmit_bitrate_bps);
1480
1481 EXPECT_EQ(capture_format_hd.width, encoder_config.streams.front().width);
1482 EXPECT_EQ(capture_format_hd.height, encoder_config.streams.front().height);
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +00001483 EXPECT_TRUE(encoder_config.streams[0].temporal_layer_thresholds_bps.empty());
1484
1485 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
1486}
1487
1488TEST_F(WebRtcVideoChannel2Test,
1489 ConferenceModeScreencastConfiguresTemporalLayer) {
1490 static const int kConferenceScreencastTemporalBitrateBps = 100000;
1491 VideoOptions options;
1492 options.conference_mode.Set(true);
1493 channel_->SetOptions(options);
1494
1495 AddSendStream();
1496
1497 cricket::FakeVideoCapturer capturer;
1498 capturer.SetScreencast(true);
1499 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1500 cricket::VideoFormat capture_format_hd =
1501 capturer.GetSupportedFormats()->front();
1502 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1503
1504 EXPECT_TRUE(channel_->SetSend(true));
1505
1506 EXPECT_TRUE(capturer.CaptureFrame());
1507 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1508 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1509
1510 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1511
1512 // Verify screencast settings.
1513 encoder_config = send_stream->GetEncoderConfig();
1514 EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
1515 encoder_config.content_type);
1516 ASSERT_EQ(1u, encoder_config.streams.size());
1517 ASSERT_EQ(1u, encoder_config.streams[0].temporal_layer_thresholds_bps.size());
1518 EXPECT_EQ(kConferenceScreencastTemporalBitrateBps,
1519 encoder_config.streams[0].temporal_layer_thresholds_bps[0]);
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001520
1521 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001522}
1523
1524TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
1525 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1526}
1527
1528TEST_F(WebRtcVideoChannel2Test,
1529 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
1530 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1531}
1532
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001533TEST_F(WebRtcVideoChannel2Test, SuspendBelowMinBitrateDisabledByDefault) {
1534 FakeVideoSendStream* stream = AddSendStream();
1535 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1536}
1537
1538TEST_F(WebRtcVideoChannel2Test, SetOptionsWithSuspendBelowMinBitrate) {
1539 VideoOptions options;
1540 options.suspend_below_min_bitrate.Set(true);
1541 channel_->SetOptions(options);
1542
1543 FakeVideoSendStream* stream = AddSendStream();
1544 EXPECT_TRUE(stream->GetConfig().suspend_below_min_bitrate);
1545
1546 options.suspend_below_min_bitrate.Set(false);
1547 channel_->SetOptions(options);
1548
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001549 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001550 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1551}
1552
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001553TEST_F(WebRtcVideoChannel2Test, Vp8DenoisingEnabledByDefault) {
1554 FakeVideoSendStream* stream = AddSendStream();
1555 webrtc::VideoCodecVP8 vp8_settings;
1556 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1557 EXPECT_TRUE(vp8_settings.denoisingOn);
1558}
1559
1560TEST_F(WebRtcVideoChannel2Test, SetOptionsWithDenoising) {
1561 VideoOptions options;
1562 options.video_noise_reduction.Set(false);
1563 channel_->SetOptions(options);
1564
1565 FakeVideoSendStream* stream = AddSendStream();
1566 webrtc::VideoCodecVP8 vp8_settings;
1567 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1568 EXPECT_FALSE(vp8_settings.denoisingOn);
1569
1570 options.video_noise_reduction.Set(true);
1571 channel_->SetOptions(options);
1572
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001573 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001574 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1575 EXPECT_TRUE(vp8_settings.denoisingOn);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001576}
1577
1578TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
1579 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1580}
1581
pbos@webrtc.org8aed9452014-07-26 10:16:49 +00001582TEST_F(WebRtcVideoChannel2Test, DISABLED_SendReceiveBitratesStats) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001583 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1584}
1585
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001586TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruse) {
1587 TestCpuAdaptation(true);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001588}
1589
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001590TEST_F(WebRtcVideoChannel2Test, DoesNotAdaptOnOveruseWhenDisabled) {
1591 TestCpuAdaptation(false);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001592}
1593
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001594void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse) {
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001595 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001596 std::vector<cricket::VideoCodec> codecs;
1597 codecs.push_back(codec);
1598 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1599
1600 if (enable_overuse) {
1601 VideoOptions options;
1602 options.cpu_overuse_detection.Set(true);
1603 channel_->SetOptions(options);
1604 }
1605
1606 AddSendStream();
1607
1608 cricket::FakeVideoCapturer capturer;
1609 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1610 EXPECT_EQ(cricket::CS_RUNNING,
1611 capturer.Start(capturer.GetSupportedFormats()->front()));
1612
1613 EXPECT_TRUE(channel_->SetSend(true));
1614
1615 // Trigger overuse.
1616 webrtc::LoadObserver* overuse_callback =
1617 fake_call_->GetConfig().overuse_callback;
1618 ASSERT_TRUE(overuse_callback != NULL);
1619 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
1620
1621 EXPECT_TRUE(capturer.CaptureFrame());
1622 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1623 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1624
1625 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1626
1627 if (enable_overuse) {
1628 EXPECT_LT(send_stream->GetLastWidth(), codec.width);
1629 EXPECT_LT(send_stream->GetLastHeight(), codec.height);
1630 } else {
1631 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1632 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1633 }
1634
1635 // Trigger underuse which should go back to normal resolution.
1636 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
1637 EXPECT_TRUE(capturer.CaptureFrame());
1638
1639 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1640
1641 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1642 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1643
1644 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001645}
1646
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001647TEST_F(WebRtcVideoChannel2Test, EstimatesNtpStartTimeAndElapsedTimeCorrectly) {
1648 // Start at last timestamp to verify that wraparounds are estimated correctly.
1649 static const uint32_t kInitialTimestamp = 0xFFFFFFFFu;
1650 static const int64_t kInitialNtpTimeMs = 1247891230;
1651 static const int kFrameOffsetMs = 20;
1652 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001653
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001654 FakeVideoReceiveStream* stream = AddRecvStream();
1655 cricket::FakeVideoRenderer renderer;
1656 EXPECT_TRUE(channel_->SetRenderer(last_ssrc_, &renderer));
1657 EXPECT_TRUE(channel_->SetRender(true));
1658
1659 webrtc::I420VideoFrame video_frame;
1660 CreateBlackFrame(&video_frame, 4, 4);
1661 video_frame.set_timestamp(kInitialTimestamp);
1662 // Initial NTP time is not available on the first frame, but should still be
1663 // able to be estimated.
1664 stream->InjectFrame(video_frame, 0);
1665
1666 EXPECT_EQ(1, renderer.num_rendered_frames());
1667 EXPECT_EQ(0, renderer.last_frame_elapsed_time_ns());
1668
1669 // This timestamp is kInitialTimestamp (-1) + kFrameOffsetMs * 90, which
1670 // triggers a constant-overflow warning, hence we're calculating it explicitly
1671 // here.
1672 video_frame.set_timestamp(kFrameOffsetMs * 90 - 1);
1673 video_frame.set_ntp_time_ms(kInitialNtpTimeMs + kFrameOffsetMs);
1674 stream->InjectFrame(video_frame, 0);
1675
1676 EXPECT_EQ(2, renderer.num_rendered_frames());
1677 EXPECT_EQ(kFrameOffsetMs * rtc::kNumNanosecsPerMillisec,
1678 renderer.last_frame_elapsed_time_ns());
1679
1680 // Verify that NTP time has been correctly deduced.
1681 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00001682 ASSERT_TRUE(channel_->GetStats(&info));
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001683 ASSERT_EQ(1u, info.receivers.size());
1684 EXPECT_EQ(kInitialNtpTimeMs, info.receivers[0].capture_start_ntp_time_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001685}
1686
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001687TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001688 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001689
1690 VideoCodec codec;
1691 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001692 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001693
1694 // Using a RTX setup to verify that the default RTX payload type is good.
1695 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1696 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1697 FakeVideoSendStream* stream = AddSendStream(
1698 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1699 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001700
1701 // Make sure NACK and FEC are enabled on the correct payload types.
1702 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
1703 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
1704 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001705
1706 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
1707 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001708 EXPECT_EQ(default_rtx_codec_.id, config.rtp.rtx.payload_type);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001709 // TODO(juberti): Check RTCP, PLI, TMMBR.
1710}
1711
1712TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
1713 std::vector<VideoCodec> codecs;
1714 codecs.push_back(kVp8Codec);
1715 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1716
1717 FakeVideoSendStream* stream = AddSendStream();
1718 webrtc::VideoSendStream::Config config = stream->GetConfig();
1719
1720 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1721 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1722}
1723
1724TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001725 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1726 std::vector<VideoCodec> codecs;
1727 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1728 codecs.push_back(rtx_codec);
1729 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1730 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001731}
1732
1733TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001734 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1735 std::vector<VideoCodec> codecs;
1736 cricket::VideoCodec rtx_codec =
1737 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1738 codecs.push_back(kVp8Codec);
1739 codecs.push_back(rtx_codec);
1740 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1741
1742 cricket::VideoCodec rtx_codec2 =
1743 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1744 codecs.pop_back();
1745 codecs.push_back(rtx_codec2);
1746 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1747 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001748}
1749
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001750TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1751 std::vector<VideoCodec> codecs;
1752 codecs.push_back(kVp8Codec);
1753 codecs.push_back(kUlpfecCodec);
1754 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1755
1756 FakeVideoSendStream* stream = AddSendStream();
1757 webrtc::VideoSendStream::Config config = stream->GetConfig();
1758
1759 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1760
1761 codecs.pop_back();
1762 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001763 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001764 ASSERT_TRUE(stream != NULL);
1765 config = stream->GetConfig();
1766 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1767 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001768}
1769
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001770TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1771 std::vector<VideoCodec> codecs;
1772 codecs.push_back(kVp8Codec720p);
1773 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org86196c42015-02-16 21:02:00 +00001774 channel_->SetSend(true);
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001775
pbos@webrtc.org86196c42015-02-16 21:02:00 +00001776 FakeVideoSendStream* stream = AddSendStream();
1777
1778 cricket::FakeVideoCapturer capturer;
1779 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1780 EXPECT_EQ(cricket::CS_RUNNING,
1781 capturer.Start(capturer.GetSupportedFormats()->front()));
1782 EXPECT_TRUE(capturer.CaptureFrame());
1783
1784 std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001785 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1786 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1787
1788 codecs.clear();
1789 codecs.push_back(kVp8Codec360p);
1790 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001791 streams = fake_call_->GetVideoSendStreams()[0]->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001792 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1793 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.org86196c42015-02-16 21:02:00 +00001794 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001795}
1796
pbos@webrtc.org00873182014-11-25 14:03:34 +00001797TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithBitrates) {
1798 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1799 200000);
1800}
1801
1802TEST_F(WebRtcVideoChannel2Test,
1803 SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1804 SetSendCodecsShouldWorkForBitrates(
1805 "", 0, "", -1, "", -1);
1806}
1807
1808TEST_F(WebRtcVideoChannel2Test, SetSendCodecsCapsMinAndStartBitrate) {
1809 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001810}
1811
1812TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001813 std::vector<VideoCodec> video_codecs = engine_.codecs();
pbos@webrtc.org88ef6322014-11-04 15:29:29 +00001814 video_codecs[0].params[kCodecParamMinBitrate] = "300";
1815 video_codecs[0].params[kCodecParamMaxBitrate] = "200";
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001816 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001817}
1818
pbos@webrtc.org00873182014-11-25 14:03:34 +00001819TEST_F(WebRtcVideoChannel2Test,
1820 SetMaxSendBandwidthShouldPreserveOtherBitrates) {
1821 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1822 200000);
1823 channel_->SetMaxSendBandwidth(300000);
1824 EXPECT_EQ(100000, fake_call_->GetConfig().stream_bitrates.min_bitrate_bps)
1825 << "Setting max bitrate should keep previous min bitrate.";
1826 EXPECT_EQ(-1, fake_call_->GetConfig().stream_bitrates.start_bitrate_bps)
1827 << "Setting max bitrate should not reset start bitrate.";
1828 EXPECT_EQ(300000, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
1829}
1830
1831TEST_F(WebRtcVideoChannel2Test, SetMaxSendBandwidthShouldBeRemovable) {
1832 channel_->SetMaxSendBandwidth(300000);
1833 EXPECT_EQ(300000, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
1834 // <= 0 means disable (infinite) max bitrate.
1835 channel_->SetMaxSendBandwidth(0);
1836 EXPECT_EQ(-1, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps)
1837 << "Setting zero max bitrate did not reset start bitrate.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001838}
1839
1840TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1841 static const char* kMaxQuantization = "21";
1842 std::vector<VideoCodec> codecs;
1843 codecs.push_back(kVp8Codec);
1844 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1845 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001846 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1847 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001848
1849 VideoCodec codec;
1850 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1851 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1852}
1853
1854TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1855 std::vector<cricket::VideoCodec> codecs;
1856 codecs.push_back(kVp8Codec);
1857
1858 codecs[0].width = 0;
1859 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1860 << "Codec set though codec width is zero.";
1861
1862 codecs[0].width = kVp8Codec.width;
1863 codecs[0].height = 0;
1864 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1865 << "Codec set though codec height is zero.";
1866}
1867
1868TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
1869 // TODO(pbos): Should we only allow the dynamic range?
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001870 static const int kIncorrectPayloads[] = {-2, -1, 128, 129};
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001871 std::vector<cricket::VideoCodec> codecs;
1872 codecs.push_back(kVp8Codec);
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001873 for (size_t i = 0; i < arraysize(kIncorrectPayloads); ++i) {
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001874 codecs[0].id = kIncorrectPayloads[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001875 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
pkasting@chromium.orgd3245462015-02-23 21:28:22 +00001876 << "Bad payload type '" << kIncorrectPayloads[i] << "' accepted.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001877 }
1878}
1879
1880TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
1881 std::vector<cricket::VideoCodec> codecs;
1882 codecs.push_back(kVp8Codec);
1883 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
1884 codecs[0].id = payload_type;
1885 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
1886 << "Payload type '" << payload_type << "' rejected.";
1887 }
1888}
1889
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001890TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
1891 std::vector<cricket::VideoCodec> codecs;
1892 codecs.push_back(kVp8Codec);
1893 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1894}
1895
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001896// Test that we set our inbound RTX codecs properly.
1897TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
1898 std::vector<cricket::VideoCodec> codecs;
1899 codecs.push_back(kVp8Codec);
1900 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1901 codecs.push_back(rtx_codec);
1902 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1903 << "RTX codec without associated payload should be rejected.";
1904
1905 codecs[1].SetParam("apt", kVp8Codec.id + 1);
1906 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1907 << "RTX codec with invalid associated payload type should be rejected.";
1908
1909 codecs[1].SetParam("apt", kVp8Codec.id);
1910 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1911
1912 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
1913 rtx_codec2.SetParam("apt", rtx_codec.id);
1914 codecs.push_back(rtx_codec2);
1915
1916 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
1917 "as associated payload type "
1918 "should be rejected.";
1919}
1920
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001921TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
1922 std::vector<cricket::VideoCodec> codecs;
1923 codecs.push_back(kVp8Codec);
1924 codecs[0].id = 99;
1925 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1926}
1927
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001928TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001929 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001930
1931 FakeVideoReceiveStream* stream = AddRecvStream();
1932 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
pbos@webrtc.org776e6f22014-10-29 15:28:39 +00001933 EXPECT_EQ(engine_.codecs()[0].name, config.decoders[0].payload_name);
1934 EXPECT_EQ(engine_.codecs()[0].id, config.decoders[0].payload_type);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001935}
1936
1937TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
1938 std::vector<VideoCodec> codecs;
1939 codecs.push_back(kVp8Codec);
1940 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
1941 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1942}
1943
1944// TODO(pbos): Enable VP9 through external codec support
1945TEST_F(WebRtcVideoChannel2Test,
1946 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
1947 std::vector<VideoCodec> codecs;
1948 codecs.push_back(kVp8Codec);
1949 codecs.push_back(kVp9Codec);
1950 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1951}
1952
1953TEST_F(WebRtcVideoChannel2Test,
1954 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
1955 std::vector<VideoCodec> codecs;
1956 codecs.push_back(kVp8Codec);
1957 codecs.push_back(kVp9Codec);
1958 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1959 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
1960}
1961
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001962TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
1963 std::vector<VideoCodec> codecs;
1964 codecs.push_back(kVp8Codec);
1965 codecs.push_back(kUlpfecCodec);
1966 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1967
1968 FakeVideoReceiveStream* stream = AddRecvStream();
1969 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1970
1971 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1972
1973 codecs.pop_back();
1974 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001975 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001976 ASSERT_TRUE(stream != NULL);
1977 config = stream->GetConfig();
1978 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1979 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001980}
1981
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001982TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
1983 std::vector<VideoCodec> codecs;
1984 codecs.push_back(kVp8Codec);
1985 codecs.push_back(kRedCodec);
1986 codecs[1].id = codecs[0].id;
1987 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1988}
1989
1990TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
1991 std::vector<VideoCodec> codecs;
1992 codecs.push_back(kVp8Codec);
1993 codecs.push_back(kVp9Codec);
1994 codecs[1].id = codecs[0].id;
1995 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1996}
1997
1998TEST_F(WebRtcVideoChannel2Test,
1999 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
2000 std::vector<VideoCodec> codecs;
2001 codecs.push_back(kVp8Codec);
2002 codecs.push_back(kVp8Codec);
2003 codecs[1].id += 1;
2004 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
2005}
2006
2007TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
2008 EXPECT_FALSE(AddSendStream()->IsSending());
2009}
2010
pbos@webrtc.org85f42942014-07-22 09:14:58 +00002011TEST_F(WebRtcVideoChannel2Test, ReceiveStreamReceivingByDefault) {
2012 EXPECT_TRUE(AddRecvStream()->IsReceiving());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002013}
2014
2015TEST_F(WebRtcVideoChannel2Test, SetSend) {
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +00002016 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002017 EXPECT_FALSE(stream->IsSending());
2018
2019 // false->true
2020 EXPECT_TRUE(channel_->SetSend(true));
2021 EXPECT_TRUE(stream->IsSending());
2022 // true->true
2023 EXPECT_TRUE(channel_->SetSend(true));
2024 EXPECT_TRUE(stream->IsSending());
2025 // true->false
2026 EXPECT_TRUE(channel_->SetSend(false));
2027 EXPECT_FALSE(stream->IsSending());
2028 // false->false
2029 EXPECT_TRUE(channel_->SetSend(false));
2030 EXPECT_FALSE(stream->IsSending());
2031
2032 EXPECT_TRUE(channel_->SetSend(true));
2033 FakeVideoSendStream* new_stream = AddSendStream();
2034 EXPECT_TRUE(new_stream->IsSending())
2035 << "Send stream created after SetSend(true) not sending initially.";
2036}
2037
pbos@webrtc.orgd8198032014-11-10 14:41:43 +00002038// This test verifies DSCP settings are properly applied on video media channel.
2039TEST_F(WebRtcVideoChannel2Test, TestSetDscpOptions) {
2040 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
2041 new cricket::FakeNetworkInterface);
2042 channel_->SetInterface(network_interface.get());
2043 cricket::VideoOptions options;
2044 options.dscp.Set(true);
2045 EXPECT_TRUE(channel_->SetOptions(options));
2046 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
2047 // Verify previous value is not modified if dscp option is not set.
2048 cricket::VideoOptions options1;
2049 EXPECT_TRUE(channel_->SetOptions(options1));
2050 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
2051 options.dscp.Set(false);
2052 EXPECT_TRUE(channel_->SetOptions(options));
2053 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
2054 channel_->SetInterface(NULL);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002055}
2056
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002057TEST_F(WebRtcVideoChannel2Test, OnReadyToSendSignalsNetworkState) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002058 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002059
2060 channel_->OnReadyToSend(false);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002061 EXPECT_EQ(webrtc::Call::kNetworkDown, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002062
2063 channel_->OnReadyToSend(true);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002064 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002065}
2066
pbos@webrtc.org3e6e2712015-02-26 12:19:31 +00002067TEST_F(WebRtcVideoChannel2Test, GetStatsReportsCpuOveruseMetrics) {
2068 FakeVideoSendStream* stream = AddSendStream();
2069 webrtc::VideoSendStream::Stats stats;
2070 stats.avg_encode_time_ms = 13;
2071 stats.encode_usage_percent = 42;
2072 stream->SetStats(stats);
2073
2074 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002075 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org3e6e2712015-02-26 12:19:31 +00002076 EXPECT_EQ(stats.avg_encode_time_ms, info.senders[0].avg_encode_ms);
2077 EXPECT_EQ(stats.encode_usage_percent, info.senders[0].encode_usage_percent);
2078}
2079
pbos@webrtc.org273a4142014-12-01 15:23:21 +00002080TEST_F(WebRtcVideoChannel2Test, GetStatsReportsUpperResolution) {
2081 FakeVideoSendStream* stream = AddSendStream();
2082 webrtc::VideoSendStream::Stats stats;
pbos@webrtc.org09c77b92015-02-25 10:42:16 +00002083 stats.substreams[17].width = 123;
2084 stats.substreams[17].height = 40;
2085 stats.substreams[42].width = 80;
2086 stats.substreams[42].height = 31;
2087 stats.substreams[11].width = 20;
2088 stats.substreams[11].height = 90;
pbos@webrtc.org273a4142014-12-01 15:23:21 +00002089 stream->SetStats(stats);
2090
2091 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002092 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org273a4142014-12-01 15:23:21 +00002093 ASSERT_EQ(1u, info.senders.size());
2094 EXPECT_EQ(123, info.senders[0].send_frame_width);
2095 EXPECT_EQ(90, info.senders[0].send_frame_height);
2096}
2097
pbos@webrtc.org9a4410e2015-02-26 10:03:39 +00002098TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationStats) {
2099 AddSendStream(cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3)));
2100
2101 // Capture format VGA.
2102 cricket::FakeVideoCapturer video_capturer_vga;
2103 const std::vector<cricket::VideoFormat>* formats =
2104 video_capturer_vga.GetSupportedFormats();
2105 cricket::VideoFormat capture_format_vga = (*formats)[1];
2106 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_vga.Start(capture_format_vga));
2107 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], &video_capturer_vga));
2108 EXPECT_TRUE(video_capturer_vga.CaptureFrame());
2109
2110 cricket::VideoCodec send_codec(100, "VP8", 640, 480, 30, 0);
2111 std::vector<cricket::VideoCodec> codecs;
2112 codecs.push_back(send_codec);
2113 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
2114 EXPECT_TRUE(channel_->SetSend(true));
2115
2116 // Verify that the CpuOveruseObserver is registered and trigger downgrade.
2117 cricket::VideoOptions options;
2118 options.cpu_overuse_detection.Set(true);
2119 EXPECT_TRUE(channel_->SetOptions(options));
2120 // Trigger overuse.
2121 webrtc::LoadObserver* overuse_callback =
2122 fake_call_->GetConfig().overuse_callback;
2123 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
2124
2125 // Capture format VGA -> adapt (OnCpuResolutionRequest downgrade) -> VGA/2.
2126 EXPECT_TRUE(video_capturer_vga.CaptureFrame());
2127 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002128 EXPECT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org9a4410e2015-02-26 10:03:39 +00002129 ASSERT_EQ(1U, info.senders.size());
2130 EXPECT_EQ(1, info.senders[0].adapt_changes);
2131 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_CPU,
2132 info.senders[0].adapt_reason);
2133
2134 // Trigger upgrade and verify that we adapt back up to VGA.
2135 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
2136 EXPECT_TRUE(video_capturer_vga.CaptureFrame());
2137 info.Clear();
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002138 EXPECT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org9a4410e2015-02-26 10:03:39 +00002139 ASSERT_EQ(1U, info.senders.size());
2140 EXPECT_EQ(2, info.senders[0].adapt_changes);
2141 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_NONE,
2142 info.senders[0].adapt_reason);
2143
2144 // No capturer (no adapter). Adapt changes from old adapter should be kept.
2145 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL));
2146 info.Clear();
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002147 EXPECT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org9a4410e2015-02-26 10:03:39 +00002148 ASSERT_EQ(1U, info.senders.size());
2149 EXPECT_EQ(2, info.senders[0].adapt_changes);
2150 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_NONE,
2151 info.senders[0].adapt_reason);
2152
2153 // Set new capturer, capture format HD.
2154 cricket::FakeVideoCapturer video_capturer_hd;
2155 cricket::VideoFormat capture_format_hd = (*formats)[0];
2156 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_hd.Start(capture_format_hd));
2157 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], &video_capturer_hd));
2158 EXPECT_TRUE(video_capturer_hd.CaptureFrame());
2159
2160 // Trigger overuse, HD -> adapt (OnCpuResolutionRequest downgrade) -> HD/2.
2161 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
2162 EXPECT_TRUE(video_capturer_hd.CaptureFrame());
2163 info.Clear();
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002164 EXPECT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org9a4410e2015-02-26 10:03:39 +00002165 ASSERT_EQ(1U, info.senders.size());
2166 EXPECT_EQ(3, info.senders[0].adapt_changes);
2167 EXPECT_EQ(CoordinatedVideoAdapter::ADAPTREASON_CPU,
2168 info.senders[0].adapt_reason);
2169
2170 EXPECT_TRUE(channel_->SetCapturer(kSsrcs3[0], NULL));
2171}
2172
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00 +00002173TEST_F(WebRtcVideoChannel2Test,
2174 GetStatsTranslatesSendRtcpPacketTypesCorrectly) {
2175 FakeVideoSendStream* stream = AddSendStream();
2176 webrtc::VideoSendStream::Stats stats;
2177 stats.substreams[17].rtcp_packet_type_counts.fir_packets = 2;
2178 stats.substreams[17].rtcp_packet_type_counts.nack_packets = 3;
2179 stats.substreams[17].rtcp_packet_type_counts.pli_packets = 4;
2180
2181 stats.substreams[42].rtcp_packet_type_counts.fir_packets = 5;
2182 stats.substreams[42].rtcp_packet_type_counts.nack_packets = 7;
2183 stats.substreams[42].rtcp_packet_type_counts.pli_packets = 9;
2184
2185 stream->SetStats(stats);
2186
2187 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002188 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00 +00002189 EXPECT_EQ(7, info.senders[0].firs_rcvd);
2190 EXPECT_EQ(10, info.senders[0].nacks_rcvd);
2191 EXPECT_EQ(13, info.senders[0].plis_rcvd);
2192}
2193
2194TEST_F(WebRtcVideoChannel2Test,
2195 GetStatsTranslatesReceiveRtcpPacketTypesCorrectly) {
2196 FakeVideoReceiveStream* stream = AddRecvStream();
2197 webrtc::VideoReceiveStream::Stats stats;
2198 stats.rtcp_packet_type_counts.fir_packets = 2;
2199 stats.rtcp_packet_type_counts.nack_packets = 3;
2200 stats.rtcp_packet_type_counts.pli_packets = 4;
2201 stream->SetStats(stats);
2202
2203 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002204 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org1d0fa5d2015-02-19 12:47:00 +00002205 EXPECT_EQ(stats.rtcp_packet_type_counts.fir_packets,
2206 info.receivers[0].firs_sent);
2207 EXPECT_EQ(stats.rtcp_packet_type_counts.nack_packets,
2208 info.receivers[0].nacks_sent);
2209 EXPECT_EQ(stats.rtcp_packet_type_counts.pli_packets,
2210 info.receivers[0].plis_sent);
2211}
2212
pbos@webrtc.org09c77b92015-02-25 10:42:16 +00002213TEST_F(WebRtcVideoChannel2Test, GetStatsTranslatesDecodeStatsCorrectly) {
2214 FakeVideoReceiveStream* stream = AddRecvStream();
2215 webrtc::VideoReceiveStream::Stats stats;
2216 stats.decode_ms = 2;
2217 stats.max_decode_ms = 3;
2218 stats.current_delay_ms = 4;
2219 stats.target_delay_ms = 5;
2220 stats.jitter_buffer_ms = 6;
2221 stats.min_playout_delay_ms = 7;
2222 stats.render_delay_ms = 8;
2223 stream->SetStats(stats);
2224
2225 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002226 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org09c77b92015-02-25 10:42:16 +00002227 EXPECT_EQ(stats.decode_ms, info.receivers[0].decode_ms);
2228 EXPECT_EQ(stats.max_decode_ms, info.receivers[0].max_decode_ms);
2229 EXPECT_EQ(stats.current_delay_ms, info.receivers[0].current_delay_ms);
2230 EXPECT_EQ(stats.target_delay_ms, info.receivers[0].target_delay_ms);
2231 EXPECT_EQ(stats.jitter_buffer_ms, info.receivers[0].jitter_buffer_ms);
2232 EXPECT_EQ(stats.min_playout_delay_ms, info.receivers[0].min_playout_delay_ms);
2233 EXPECT_EQ(stats.render_delay_ms, info.receivers[0].render_delay_ms);
2234}
2235
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002236TEST_F(WebRtcVideoChannel2Test, TranslatesCallStatsCorrectly) {
2237 AddSendStream();
2238 AddSendStream();
2239 webrtc::Call::Stats stats;
2240 stats.rtt_ms = 123;
2241 fake_call_->SetStats(stats);
2242
2243 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002244 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002245 ASSERT_EQ(2u, info.senders.size());
2246 EXPECT_EQ(stats.rtt_ms, info.senders[0].rtt_ms);
2247 EXPECT_EQ(stats.rtt_ms, info.senders[1].rtt_ms);
2248}
2249
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002250TEST_F(WebRtcVideoChannel2Test, TranslatesSenderBitrateStatsCorrectly) {
2251 FakeVideoSendStream* stream = AddSendStream();
2252 webrtc::VideoSendStream::Stats stats;
pbos@webrtc.org891d4832015-02-26 13:15:22 +00002253 stats.target_media_bitrate_bps = 156;
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002254 stats.media_bitrate_bps = 123;
2255 stats.substreams[17].total_bitrate_bps = 1;
2256 stats.substreams[17].retransmit_bitrate_bps = 2;
2257 stats.substreams[42].total_bitrate_bps = 3;
2258 stats.substreams[42].retransmit_bitrate_bps = 4;
2259 stream->SetStats(stats);
2260
2261 FakeVideoSendStream* stream2 = AddSendStream();
2262 webrtc::VideoSendStream::Stats stats2;
pbos@webrtc.org891d4832015-02-26 13:15:22 +00002263 stats2.target_media_bitrate_bps = 200;
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002264 stats2.media_bitrate_bps = 321;
2265 stats2.substreams[13].total_bitrate_bps = 5;
2266 stats2.substreams[13].retransmit_bitrate_bps = 6;
2267 stats2.substreams[21].total_bitrate_bps = 7;
2268 stats2.substreams[21].retransmit_bitrate_bps = 8;
2269 stream2->SetStats(stats2);
2270
2271 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002272 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002273 ASSERT_EQ(2u, info.senders.size());
2274 // Assuming stream and stream2 corresponds to senders[0] and [1] respectively
2275 // is OK as std::maps are sorted and AddSendStream() gives increasing SSRCs.
2276 EXPECT_EQ(stats.media_bitrate_bps, info.senders[0].nominal_bitrate);
2277 EXPECT_EQ(stats2.media_bitrate_bps, info.senders[1].nominal_bitrate);
pbos@webrtc.org891d4832015-02-26 13:15:22 +00002278 EXPECT_EQ(stats.target_media_bitrate_bps + stats2.target_media_bitrate_bps,
2279 info.bw_estimations[0].target_enc_bitrate);
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002280 EXPECT_EQ(stats.media_bitrate_bps + stats2.media_bitrate_bps,
2281 info.bw_estimations[0].actual_enc_bitrate);
2282 EXPECT_EQ(1 + 3 + 5 + 7, info.bw_estimations[0].transmit_bitrate)
2283 << "Bandwidth stats should take all streams into account.";
2284 EXPECT_EQ(2 + 4 + 6 + 8, info.bw_estimations[0].retransmit_bitrate)
2285 << "Bandwidth stats should take all streams into account.";
2286}
2287
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002288class WebRtcVideoEngine2SimulcastTest : public testing::Test {
2289 public:
2290 WebRtcVideoEngine2SimulcastTest()
pbos@webrtc.orgf1f0d9a2015-03-02 13:30:15 +00002291 : engine_(nullptr), engine_codecs_(engine_.codecs()) {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002292 assert(!engine_codecs_.empty());
2293
2294 bool codec_set = false;
2295 for (size_t i = 0; i < engine_codecs_.size(); ++i) {
2296 if (engine_codecs_[i].name == "red") {
2297 default_red_codec_ = engine_codecs_[i];
2298 } else if (engine_codecs_[i].name == "ulpfec") {
2299 default_ulpfec_codec_ = engine_codecs_[i];
2300 } else if (engine_codecs_[i].name == "rtx") {
2301 default_rtx_codec_ = engine_codecs_[i];
2302 } else if (!codec_set) {
2303 default_codec_ = engine_codecs_[i];
2304 codec_set = true;
2305 }
2306 }
2307
2308 assert(codec_set);
2309 }
2310
2311 protected:
2312 WebRtcVideoEngine2 engine_;
2313 VideoCodec default_codec_;
2314 VideoCodec default_red_codec_;
2315 VideoCodec default_ulpfec_codec_;
2316 VideoCodec default_rtx_codec_;
2317 // TODO(pbos): Remove engine_codecs_ unless used a lot.
2318 std::vector<VideoCodec> engine_codecs_;
2319};
2320
2321class WebRtcVideoChannel2SimulcastTest : public WebRtcVideoEngine2SimulcastTest,
pbos@webrtc.org86196c42015-02-16 21:02:00 +00002322 public WebRtcCallFactory {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002323 public:
2324 WebRtcVideoChannel2SimulcastTest() : fake_call_(NULL) {}
2325
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +00002326 void SetUp() override {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002327 engine_.SetCallFactory(this);
2328 engine_.Init(rtc::Thread::Current());
2329 channel_.reset(engine_.CreateChannel(VideoOptions(), NULL));
2330 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
2331 last_ssrc_ = 123;
2332 }
2333
2334 protected:
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +00002335 webrtc::Call* CreateCall(const webrtc::Call::Config& config) override {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002336 assert(fake_call_ == NULL);
2337 fake_call_ = new FakeCall(config);
2338 return fake_call_;
2339 }
2340
2341 void VerifySimulcastSettings(const VideoCodec& codec,
2342 VideoOptions::HighestBitrate bitrate_mode,
2343 size_t num_configured_streams,
2344 size_t expected_num_streams,
2345 SimulcastBitrateMode simulcast_bitrate_mode) {
2346 cricket::VideoOptions options;
2347 options.video_highest_bitrate.Set(bitrate_mode);
2348 EXPECT_TRUE(channel_->SetOptions(options));
2349
2350 std::vector<VideoCodec> codecs;
2351 codecs.push_back(codec);
2352 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
2353
2354 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
2355 assert(num_configured_streams <= ssrcs.size());
2356 ssrcs.resize(num_configured_streams);
2357
2358 FakeVideoSendStream* stream =
2359 AddSendStream(CreateSimStreamParams("cname", ssrcs));
pbos@webrtc.org86196c42015-02-16 21:02:00 +00002360 // Send a full-size frame to trigger a stream reconfiguration to use all
2361 // expected simulcast layers.
2362 cricket::FakeVideoCapturer capturer;
2363 EXPECT_TRUE(channel_->SetCapturer(ssrcs.front(), &capturer));
2364 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(cricket::VideoFormat(
2365 codec.width, codec.height,
2366 cricket::VideoFormat::FpsToInterval(30),
2367 cricket::FOURCC_I420)));
2368 channel_->SetSend(true);
2369 EXPECT_TRUE(capturer.CaptureFrame());
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002370
2371 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
2372 ASSERT_EQ(expected_num_streams, video_streams.size());
2373
2374 std::vector<webrtc::VideoStream> expected_streams = GetSimulcastConfig(
2375 num_configured_streams,
2376 simulcast_bitrate_mode,
2377 codec.width,
2378 codec.height,
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002379 0,
2380 kDefaultQpMax,
2381 codec.framerate != 0 ? codec.framerate : kDefaultFramerate);
2382
2383 ASSERT_EQ(expected_streams.size(), video_streams.size());
2384
2385 size_t num_streams = video_streams.size();
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002386 int total_max_bitrate_bps = 0;
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002387 for (size_t i = 0; i < num_streams; ++i) {
2388 EXPECT_EQ(expected_streams[i].width, video_streams[i].width);
2389 EXPECT_EQ(expected_streams[i].height, video_streams[i].height);
2390
2391 EXPECT_GT(video_streams[i].max_framerate, 0);
2392 EXPECT_EQ(expected_streams[i].max_framerate,
2393 video_streams[i].max_framerate);
2394
2395 EXPECT_GT(video_streams[i].min_bitrate_bps, 0);
2396 EXPECT_EQ(expected_streams[i].min_bitrate_bps,
2397 video_streams[i].min_bitrate_bps);
2398
2399 EXPECT_GT(video_streams[i].target_bitrate_bps, 0);
2400 EXPECT_EQ(expected_streams[i].target_bitrate_bps,
2401 video_streams[i].target_bitrate_bps);
2402
2403 EXPECT_GT(video_streams[i].max_bitrate_bps, 0);
2404 EXPECT_EQ(expected_streams[i].max_bitrate_bps,
2405 video_streams[i].max_bitrate_bps);
2406
2407 EXPECT_GT(video_streams[i].max_qp, 0);
2408 EXPECT_EQ(expected_streams[i].max_qp, video_streams[i].max_qp);
2409
2410 EXPECT_FALSE(expected_streams[i].temporal_layer_thresholds_bps.empty());
2411 EXPECT_EQ(expected_streams[i].temporal_layer_thresholds_bps,
2412 video_streams[i].temporal_layer_thresholds_bps);
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002413
2414 if (i == num_streams - 1) {
2415 total_max_bitrate_bps += video_streams[i].max_bitrate_bps;
2416 } else {
2417 total_max_bitrate_bps += video_streams[i].target_bitrate_bps;
2418 }
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002419 }
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002420 cricket::VideoMediaInfo info;
pbos@webrtc.org058b1f12015-03-04 08:54:32 +00002421 ASSERT_TRUE(channel_->GetStats(&info));
pbos@webrtc.org77e11bb2015-02-23 16:39:07 +00002422 ASSERT_EQ(1u, info.senders.size());
2423 EXPECT_EQ(total_max_bitrate_bps, info.senders[0].preferred_bitrate);
2424
pbos@webrtc.org86196c42015-02-16 21:02:00 +00002425 EXPECT_TRUE(channel_->SetCapturer(ssrcs.front(), NULL));
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002426 }
2427
2428 FakeVideoSendStream* AddSendStream() {
2429 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
2430 }
2431
2432 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
2433 size_t num_streams =
2434 fake_call_->GetVideoSendStreams().size();
2435 EXPECT_TRUE(channel_->AddSendStream(sp));
2436 std::vector<FakeVideoSendStream*> streams =
2437 fake_call_->GetVideoSendStreams();
2438 EXPECT_EQ(num_streams + 1, streams.size());
2439 return streams[streams.size() - 1];
2440 }
2441
2442 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
2443 return fake_call_->GetVideoSendStreams();
2444 }
2445
2446 FakeVideoReceiveStream* AddRecvStream() {
2447 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
2448 }
2449
2450 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
2451 size_t num_streams =
2452 fake_call_->GetVideoReceiveStreams().size();
2453 EXPECT_TRUE(channel_->AddRecvStream(sp));
2454 std::vector<FakeVideoReceiveStream*> streams =
2455 fake_call_->GetVideoReceiveStreams();
2456 EXPECT_EQ(num_streams + 1, streams.size());
2457 return streams[streams.size() - 1];
2458 }
2459
2460 FakeCall* fake_call_;
2461 rtc::scoped_ptr<VideoMediaChannel> channel_;
2462 uint32 last_ssrc_;
2463};
2464
2465TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith2SimulcastStreams) {
2466 VerifySimulcastSettings(kVp8Codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2467}
2468
2469TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith3SimulcastStreams) {
2470 VerifySimulcastSettings(
2471 kVp8Codec720p, VideoOptions::NORMAL, 3, 3, SBM_NORMAL);
2472}
2473
2474TEST_F(WebRtcVideoChannel2SimulcastTest,
2475 SetSendCodecsWith2SimulcastStreamsHighBitrateMode) {
2476 VerifySimulcastSettings(kVp8Codec, VideoOptions::HIGH, 2, 2, SBM_HIGH);
2477}
2478
2479TEST_F(WebRtcVideoChannel2SimulcastTest,
2480 SetSendCodecsWith3SimulcastStreamsHighBitrateMode) {
2481 VerifySimulcastSettings(kVp8Codec720p, VideoOptions::HIGH, 3, 3, SBM_HIGH);
2482}
2483
2484TEST_F(WebRtcVideoChannel2SimulcastTest,
2485 SetSendCodecsWith2SimulcastStreamsVeryHighBitrateMode) {
2486 VerifySimulcastSettings(
2487 kVp8Codec, VideoOptions::VERY_HIGH, 2, 2, SBM_VERY_HIGH);
2488}
2489
2490TEST_F(WebRtcVideoChannel2SimulcastTest,
2491 SetSendCodecsWith3SimulcastStreamsVeryHighBitrateMode) {
2492 VerifySimulcastSettings(
2493 kVp8Codec720p, VideoOptions::VERY_HIGH, 3, 3, SBM_VERY_HIGH);
2494}
2495
2496// Test that we normalize send codec format size in simulcast.
2497TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) {
2498 cricket::VideoCodec codec(kVp8Codec270p);
2499 codec.width += 1;
2500 codec.height += 1;
2501 VerifySimulcastSettings(codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2502}
2503
2504// Test that if we add a stream with RTX SSRC's, SSRC's get set correctly.
2505TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestStreamWithRtx) {
2506 // TODO(pbos): Implement.
2507 FAIL() << "Not implemented.";
2508}
2509
2510// Test that if we get too few ssrcs are given in AddSendStream(),
2511// only supported sub-streams will be added.
2512TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TooFewSimulcastSsrcs) {
2513 // TODO(pbos): Implement.
2514 FAIL() << "Not implemented.";
2515}
2516
2517// Test that even more than enough ssrcs are given in AddSendStream(),
2518// only supported sub-streams will be added.
2519TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_MoreThanEnoughSimulcastSscrs) {
2520 // TODO(pbos): Implement.
2521 FAIL() << "Not implemented.";
2522}
2523
2524// Test that SetSendStreamFormat works well with simulcast.
2525TEST_F(WebRtcVideoEngine2SimulcastTest,
2526 DISABLED_SetSendStreamFormatWithSimulcast) {
2527 // TODO(pbos): Implement.
2528 FAIL() << "Not implemented.";
2529}
2530
2531// Test that simulcast send codec is reset on new video frame size.
2532TEST_F(WebRtcVideoEngine2SimulcastTest,
2533 DISABLED_ResetSimulcastSendCodecOnNewFrameSize) {
2534 // TODO(pbos): Implement.
2535 FAIL() << "Not implemented.";
2536}
2537
2538// Test that simulcast send codec is reset on new portait mode video frame.
2539TEST_F(WebRtcVideoEngine2SimulcastTest,
2540 DISABLED_ResetSimulcastSendCodecOnNewPortaitFrame) {
2541 // TODO(pbos): Implement.
2542 FAIL() << "Not implemented.";
2543}
2544
2545TEST_F(WebRtcVideoEngine2SimulcastTest,
2546 DISABLED_SetBandwidthInConferenceWithSimulcast) {
2547 // TODO(pbos): Implement.
2548 FAIL() << "Not implemented.";
2549}
2550
2551// Test that sending screencast frames in conference mode changes
2552// bitrate.
2553TEST_F(WebRtcVideoEngine2SimulcastTest,
2554 DISABLED_SetBandwidthScreencastInConference) {
2555 // TODO(pbos): Implement.
2556 FAIL() << "Not implemented.";
2557}
2558
2559// Test AddSendStream with simulcast rejects bad StreamParams.
2560TEST_F(WebRtcVideoEngine2SimulcastTest,
2561 DISABLED_AddSendStreamWithBadStreamParams) {
2562 // TODO(pbos): Implement.
2563 FAIL() << "Not implemented.";
2564}
2565
2566// Test AddSendStream with simulcast sets ssrc and cname correctly.
2567TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_AddSendStreamWithSimulcast) {
2568 // TODO(pbos): Implement.
2569 FAIL() << "Not implemented.";
2570}
2571
2572// Test RemoveSendStream with simulcast.
2573TEST_F(WebRtcVideoEngine2SimulcastTest,
2574 DISABLED_RemoveSendStreamWithSimulcast) {
2575 // TODO(pbos): Implement.
2576 FAIL() << "Not implemented.";
2577}
2578
2579// Test AddSendStream after send codec has already been set will reset
2580// send codec with simulcast settings.
2581TEST_F(WebRtcVideoEngine2SimulcastTest,
2582 DISABLED_AddSimulcastStreamAfterSetSendCodec) {
2583 // TODO(pbos): Implement.
2584 FAIL() << "Not implemented.";
2585}
2586
2587TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_GetStatsWithMultipleSsrcs) {
2588 // TODO(pbos): Implement.
2589 FAIL() << "Not implemented.";
2590}
2591
2592// Test receiving channel(s) local ssrc is set to the same as the first
2593// simulcast sending ssrc.
2594TEST_F(WebRtcVideoEngine2SimulcastTest,
2595 DISABLED_AddSimulcastStreamAfterCreatingRecvChannels) {
2596 // TODO(pbos): Implement.
2597 FAIL() << "Not implemented.";
2598}
2599
2600// Test 1:1 call never turn on simulcast.
2601TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_NoSimulcastWith1on1) {
2602 // TODO(pbos): Implement.
2603 FAIL() << "Not implemented.";
2604}
2605
2606// Test SetOptions with OPT_CONFERENCE flag.
2607TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_SetOptionsWithConferenceMode) {
2608 // TODO(pbos): Implement.
2609 FAIL() << "Not implemented.";
2610}
2611
2612// Test that two different streams can have different formats.
2613TEST_F(WebRtcVideoEngine2SimulcastTest,
2614 DISABLED_MultipleSendStreamsDifferentFormats) {
2615 // TODO(pbos): Implement.
2616 FAIL() << "Not implemented.";
2617}
2618
2619TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToOutputFormat) {
2620 // TODO(pbos): Implement.
2621 FAIL() << "Not implemented.";
2622}
2623
2624TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToCpuLoad) {
2625 // TODO(pbos): Implement.
2626 FAIL() << "Not implemented.";
2627}
2628
2629TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToCpuLoadDisabled) {
2630 // TODO(pbos): Implement.
2631 FAIL() << "Not implemented.";
2632}
2633
2634TEST_F(WebRtcVideoEngine2SimulcastTest,
2635 DISABLED_TestAdaptWithCpuOveruseObserver) {
2636 // TODO(pbos): Implement.
2637 FAIL() << "Not implemented.";
2638}
2639
2640// Test that codec is not reset for every frame sent in non-conference and
2641// non-screencast mode.
2642TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_DontResetCodecOnSendFrame) {
2643 // TODO(pbos): Implement.
2644 FAIL() << "Not implemented.";
2645}
2646
2647TEST_F(WebRtcVideoEngine2SimulcastTest,
2648 DISABLED_UseSimulcastAdapterOnVp8OnlyFactory) {
2649 // TODO(pbos): Implement.
2650 FAIL() << "Not implemented.";
2651}
2652
2653TEST_F(WebRtcVideoEngine2SimulcastTest,
2654 DISABLED_DontUseSimulcastAdapterOnNoneVp8Factory) {
2655 // TODO(pbos): Implement.
2656 FAIL() << "Not implemented.";
2657}
2658
2659TEST_F(WebRtcVideoEngine2SimulcastTest,
2660 DISABLED_DontUseSimulcastAdapterOnMultipleCodecsFactory) {
2661 // TODO(pbos): Implement.
2662 FAIL() << "Not implemented.";
2663}
2664
2665TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x800) {
2666 // TODO(pbos): Implement.
2667 FAIL() << "Not implemented.";
2668}
2669
2670TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x720) {
2671 // TODO(pbos): Implement.
2672 FAIL() << "Not implemented.";
2673}
2674
2675TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x540) {
2676 // TODO(pbos): Implement.
2677 FAIL() << "Not implemented.";
2678}
2679
2680TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x600) {
2681 // TODO(pbos): Implement.
2682 FAIL() << "Not implemented.";
2683}
2684
2685TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x400) {
2686 // TODO(pbos): Implement.
2687 FAIL() << "Not implemented.";
2688}
2689
2690TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x360) {
2691 // TODO(pbos): Implement.
2692 FAIL() << "Not implemented.";
2693}
2694
2695TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_480x300) {
2696 // TODO(pbos): Implement.
2697 FAIL() << "Not implemented.";
2698}
2699
2700TEST_F(WebRtcVideoChannel2SimulcastTest,
2701 DISABLED_DISABLED_SimulcastSend_480x270) {
2702 // TODO(pbos): Implement.
2703 FAIL() << "Not implemented.";
2704}
2705
2706TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x200) {
2707 // TODO(pbos): Implement.
2708 FAIL() << "Not implemented.";
2709}
2710
2711TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x180) {
2712 // TODO(pbos): Implement.
2713 FAIL() << "Not implemented.";
2714}
2715
2716// Test reset send codec with simulcast.
2717// Disabled per b/6773425
2718TEST_F(WebRtcVideoChannel2SimulcastTest,
2719 DISABLED_DISABLED_SimulcastResetSendCodec) {
2720 // TODO(pbos): Implement.
2721 FAIL() << "Not implemented.";
2722}
2723
2724// Test simulcast streams are decodeable with expected sizes.
2725TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastStreams) {
2726 // TODO(pbos): Implement.
2727 FAIL() << "Not implemented.";
2728}
2729
2730// Simulcast and resolution resizing should be turned off when screencasting
2731// but not otherwise.
2732TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_ScreencastRendering) {
2733 // TODO(pbos): Implement.
2734 FAIL() << "Not implemented.";
2735}
2736
2737// Ensures that the correct settings are applied to the codec when single
2738// temporal layer screencasting is enabled, and that the correct simulcast
2739// settings are reapplied when disabling screencasting.
2740TEST_F(WebRtcVideoChannel2SimulcastTest,
2741 DISABLED_OneTemporalLayerScreencastSettings) {
2742 // TODO(pbos): Implement.
2743 FAIL() << "Not implemented.";
2744}
2745
2746// Ensures that the correct settings are applied to the codec when two temporal
2747// layer screencasting is enabled, and that the correct simulcast settings are
2748// reapplied when disabling screencasting.
2749TEST_F(WebRtcVideoChannel2SimulcastTest,
2750 DISABLED_TwoTemporalLayerScreencastSettings) {
2751 // TODO(pbos): Implement.
2752 FAIL() << "Not implemented.";
2753}
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002754
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002755} // namespace cricket