blob: d9eb7d596f467686aa0c29616d2efd1a42d027e6 [file] [log] [blame]
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001/*
2 * libjingle
3 * Copyright 2004 Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +000028#include <algorithm>
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000029#include <map>
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000030#include <vector>
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000031
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000032#include "talk/media/base/testutils.h"
33#include "talk/media/base/videoengine_unittest.h"
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +000034#include "talk/media/webrtc/fakewebrtcvideoengine.h"
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000035#include "talk/media/webrtc/simulcast.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000036#include "talk/media/webrtc/webrtcvideochannelfactory.h"
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000037#include "talk/media/webrtc/webrtcvideoengine2.h"
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000038#include "talk/media/webrtc/webrtcvideoengine2_unittest.h"
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +000039#include "talk/media/webrtc/webrtcvoiceengine.h"
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +000040#include "webrtc/base/arraysize.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000041#include "webrtc/base/gunit.h"
42#include "webrtc/base/stringutils.h"
pbos@webrtc.org42684be2014-10-03 11:25:45 +000043#include "webrtc/video_encoder.h"
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000044
45namespace {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000046static const int kDefaultQpMax = 56;
47static const int kDefaultFramerate = 30;
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000048
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000049static const cricket::VideoCodec kVp8Codec720p(100, "VP8", 1280, 720, 30, 0);
50static const cricket::VideoCodec kVp8Codec360p(100, "VP8", 640, 360, 30, 0);
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000051static const cricket::VideoCodec kVp8Codec270p(100, "VP8", 480, 270, 30, 0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000052
53static const cricket::VideoCodec kVp8Codec(100, "VP8", 640, 400, 30, 0);
54static const cricket::VideoCodec kVp9Codec(101, "VP9", 640, 400, 30, 0);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +000055static const cricket::VideoCodec kH264Codec(102, "H264", 640, 400, 30, 0);
56
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000057static const cricket::VideoCodec kRedCodec(116, "red", 0, 0, 0, 0);
58static const cricket::VideoCodec kUlpfecCodec(117, "ulpfec", 0, 0, 0, 0);
59
60static const uint32 kSsrcs1[] = {1};
buildbot@webrtc.orga8530772014-12-10 09:01:18 +000061static const uint32 kSsrcs3[] = {1, 2, 3};
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000062static const uint32 kRtxSsrcs1[] = {4};
pbos@webrtc.org3c107582014-07-20 15:27:35 +000063static const char kUnsupportedExtensionName[] =
64 "urn:ietf:params:rtp-hdrext:unsupported";
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +000065
66void VerifyCodecHasDefaultFeedbackParams(const cricket::VideoCodec& codec) {
67 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
68 cricket::kRtcpFbParamNack, cricket::kParamValueEmpty)));
69 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
70 cricket::kRtcpFbParamNack, cricket::kRtcpFbNackParamPli)));
71 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
72 cricket::kRtcpFbParamRemb, cricket::kParamValueEmpty)));
73 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
74 cricket::kRtcpFbParamCcm, cricket::kRtcpFbCcmParamFir)));
75}
76
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +000077static void CreateBlackFrame(webrtc::I420VideoFrame* video_frame,
78 int width,
79 int height) {
80 video_frame->CreateEmptyFrame(
81 width, height, width, (width + 1) / 2, (width + 1) / 2);
82 memset(video_frame->buffer(webrtc::kYPlane), 16,
83 video_frame->allocated_size(webrtc::kYPlane));
84 memset(video_frame->buffer(webrtc::kUPlane), 128,
85 video_frame->allocated_size(webrtc::kUPlane));
86 memset(video_frame->buffer(webrtc::kVPlane), 128,
87 video_frame->allocated_size(webrtc::kVPlane));
88}
89
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000090} // namespace
91
92namespace cricket {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000093FakeVideoSendStream::FakeVideoSendStream(
94 const webrtc::VideoSendStream::Config& config,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +000095 const webrtc::VideoEncoderConfig& encoder_config)
pbos@webrtc.org42684be2014-10-03 11:25:45 +000096 : sending_(false),
97 config_(config),
98 codec_settings_set_(false),
99 num_swapped_frames_(0) {
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000100 assert(config.encoder_settings.encoder != NULL);
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000101 ReconfigureVideoEncoder(encoder_config);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000102}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000103
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000104webrtc::VideoSendStream::Config FakeVideoSendStream::GetConfig() const {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000105 return config_;
106}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000107
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000108webrtc::VideoEncoderConfig FakeVideoSendStream::GetEncoderConfig() const {
109 return encoder_config_;
110}
111
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000112std::vector<webrtc::VideoStream> FakeVideoSendStream::GetVideoStreams() {
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000113 return encoder_config_.streams;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000114}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000115
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000116bool FakeVideoSendStream::IsSending() const {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000117 return sending_;
118}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000119
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000120bool FakeVideoSendStream::GetVp8Settings(
121 webrtc::VideoCodecVP8* settings) const {
122 if (!codec_settings_set_) {
123 return false;
124 }
125
126 *settings = vp8_settings_;
127 return true;
128}
129
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000130int FakeVideoSendStream::GetNumberOfSwappedFrames() const {
131 return num_swapped_frames_;
132}
133
134int FakeVideoSendStream::GetLastWidth() const {
135 return last_frame_.width();
136}
137
138int FakeVideoSendStream::GetLastHeight() const {
139 return last_frame_.height();
140}
141
142void FakeVideoSendStream::SwapFrame(webrtc::I420VideoFrame* frame) {
143 ++num_swapped_frames_;
144 last_frame_.SwapFrame(frame);
145}
pbos@webrtc.org273a4142014-12-01 15:23:21 +0000146
147void FakeVideoSendStream::SetStats(
148 const webrtc::VideoSendStream::Stats& stats) {
149 stats_ = stats;
150}
151
152webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() {
153 return stats_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000154}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000155
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000156bool FakeVideoSendStream::ReconfigureVideoEncoder(
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000157 const webrtc::VideoEncoderConfig& config) {
158 encoder_config_ = config;
159 if (config.encoder_specific_settings != NULL) {
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000160 assert(config_.encoder_settings.payload_name == "VP8");
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000161 vp8_settings_ = *reinterpret_cast<const webrtc::VideoCodecVP8*>(
162 config.encoder_specific_settings);
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000163 }
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000164 codec_settings_set_ = config.encoder_specific_settings != NULL;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000165 return true;
166}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000167
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000168webrtc::VideoSendStreamInput* FakeVideoSendStream::Input() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000169 return this;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000170}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000171
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000172void FakeVideoSendStream::Start() {
173 sending_ = true;
174}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000175
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000176void FakeVideoSendStream::Stop() {
177 sending_ = false;
178}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000179
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000180FakeVideoReceiveStream::FakeVideoReceiveStream(
181 const webrtc::VideoReceiveStream::Config& config)
182 : config_(config), receiving_(false) {
183}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000184
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000185webrtc::VideoReceiveStream::Config FakeVideoReceiveStream::GetConfig() {
186 return config_;
187}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000188
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000189bool FakeVideoReceiveStream::IsReceiving() const {
190 return receiving_;
191}
192
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +0000193void FakeVideoReceiveStream::InjectFrame(const webrtc::I420VideoFrame& frame,
194 int time_to_render_ms) {
195 config_.renderer->RenderFrame(frame, time_to_render_ms);
196}
197
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000198webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const {
199 return webrtc::VideoReceiveStream::Stats();
200}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000201
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000202void FakeVideoReceiveStream::Start() {
203 receiving_ = true;
204}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000205
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000206void FakeVideoReceiveStream::Stop() {
207 receiving_ = false;
208}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000209
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000210FakeCall::FakeCall(const webrtc::Call::Config& config)
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000211 : config_(config),
212 network_state_(kNetworkUp),
213 num_created_send_streams_(0),
214 num_created_receive_streams_(0) {
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000215 SetVideoCodecs(GetDefaultVideoCodecs());
216}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000217
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000218FakeCall::~FakeCall() {
219 EXPECT_EQ(0u, video_send_streams_.size());
220 EXPECT_EQ(0u, video_receive_streams_.size());
221}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000222
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000223void FakeCall::SetVideoCodecs(const std::vector<webrtc::VideoCodec> codecs) {
224 codecs_ = codecs;
225}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000226
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000227webrtc::Call::Config FakeCall::GetConfig() const {
228 return config_;
229}
230
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000231std::vector<FakeVideoSendStream*> FakeCall::GetVideoSendStreams() {
232 return video_send_streams_;
233}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000234
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000235std::vector<FakeVideoReceiveStream*> FakeCall::GetVideoReceiveStreams() {
236 return video_receive_streams_;
237}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000238
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000239webrtc::VideoCodec FakeCall::GetEmptyVideoCodec() {
240 webrtc::VideoCodec codec;
241 codec.minBitrate = 300;
242 codec.startBitrate = 800;
243 codec.maxBitrate = 1500;
244 codec.maxFramerate = 10;
245 codec.width = 640;
246 codec.height = 480;
247 codec.qpMax = 56;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000248
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000249 return codec;
250}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000251
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000252webrtc::VideoCodec FakeCall::GetVideoCodecVp8() {
253 webrtc::VideoCodec vp8_codec = GetEmptyVideoCodec();
254 vp8_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000255 rtc::strcpyn(
256 vp8_codec.plName, ARRAY_SIZE(vp8_codec.plName), kVp8Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000257 vp8_codec.plType = kVp8Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000258
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000259 return vp8_codec;
260}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000261
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000262webrtc::VideoCodec FakeCall::GetVideoCodecVp9() {
263 webrtc::VideoCodec vp9_codec = GetEmptyVideoCodec();
264 // TODO(pbos): Add a correct codecType when webrtc has one.
265 vp9_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000266 rtc::strcpyn(
267 vp9_codec.plName, ARRAY_SIZE(vp9_codec.plName), kVp9Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000268 vp9_codec.plType = kVp9Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000269
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000270 return vp9_codec;
271}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000272
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000273std::vector<webrtc::VideoCodec> FakeCall::GetDefaultVideoCodecs() {
274 std::vector<webrtc::VideoCodec> codecs;
275 codecs.push_back(GetVideoCodecVp8());
276 // codecs.push_back(GetVideoCodecVp9());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000277
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000278 return codecs;
279}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000280
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000281webrtc::Call::NetworkState FakeCall::GetNetworkState() const {
282 return network_state_;
283}
284
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000285webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
286 const webrtc::VideoSendStream::Config& config,
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000287 const webrtc::VideoEncoderConfig& encoder_config) {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000288 FakeVideoSendStream* fake_stream =
pbos@webrtc.orgbbe0a852014-09-19 12:30:25 +0000289 new FakeVideoSendStream(config, encoder_config);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000290 video_send_streams_.push_back(fake_stream);
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000291 ++num_created_send_streams_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000292 return fake_stream;
293}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000294
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000295void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
296 FakeVideoSendStream* fake_stream =
297 static_cast<FakeVideoSendStream*>(send_stream);
298 for (size_t i = 0; i < video_send_streams_.size(); ++i) {
299 if (video_send_streams_[i] == fake_stream) {
300 delete video_send_streams_[i];
301 video_send_streams_.erase(video_send_streams_.begin() + i);
302 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000303 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000304 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000305 ADD_FAILURE() << "DestroyVideoSendStream called with unknown paramter.";
306}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000307
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000308webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
309 const webrtc::VideoReceiveStream::Config& config) {
310 video_receive_streams_.push_back(new FakeVideoReceiveStream(config));
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000311 ++num_created_receive_streams_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000312 return video_receive_streams_[video_receive_streams_.size() - 1];
313}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000314
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000315void FakeCall::DestroyVideoReceiveStream(
316 webrtc::VideoReceiveStream* receive_stream) {
317 FakeVideoReceiveStream* fake_stream =
318 static_cast<FakeVideoReceiveStream*>(receive_stream);
319 for (size_t i = 0; i < video_receive_streams_.size(); ++i) {
320 if (video_receive_streams_[i] == fake_stream) {
321 delete video_receive_streams_[i];
322 video_receive_streams_.erase(video_receive_streams_.begin() + i);
323 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000324 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000325 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000326 ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown paramter.";
327}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000328
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000329webrtc::PacketReceiver* FakeCall::Receiver() {
330 // TODO(pbos): Fix this.
331 return NULL;
332}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000333
pbos@webrtc.org2b19f062014-12-11 13:26:09 +0000334void FakeCall::SetStats(const webrtc::Call::Stats& stats) {
335 stats_ = stats;
336}
337
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +0000338int FakeCall::GetNumCreatedSendStreams() const {
339 return num_created_send_streams_;
340}
341
342int FakeCall::GetNumCreatedReceiveStreams() const {
343 return num_created_receive_streams_;
344}
345
stefan@webrtc.org0bae1fa2014-11-05 14:05:29 +0000346webrtc::Call::Stats FakeCall::GetStats() const {
pbos@webrtc.org2b19f062014-12-11 13:26:09 +0000347 return stats_;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000348}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000349
pbos@webrtc.org00873182014-11-25 14:03:34 +0000350void FakeCall::SetBitrateConfig(
351 const webrtc::Call::Config::BitrateConfig& bitrate_config) {
352 config_.stream_bitrates = bitrate_config;
353}
354
pbos@webrtc.org26c0c412014-09-03 16:17:12 +0000355void FakeCall::SignalNetworkState(webrtc::Call::NetworkState state) {
356 network_state_ = state;
357}
358
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000359class WebRtcVideoEngine2Test : public ::testing::Test {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000360 public:
pbos@webrtc.orgb648b9d2014-08-26 11:08:06 +0000361 WebRtcVideoEngine2Test() {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000362 std::vector<VideoCodec> engine_codecs = engine_.codecs();
363 assert(!engine_codecs.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000364 bool codec_set = false;
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000365 for (size_t i = 0; i < engine_codecs.size(); ++i) {
366 if (engine_codecs[i].name == "red") {
367 default_red_codec_ = engine_codecs[i];
368 } else if (engine_codecs[i].name == "ulpfec") {
369 default_ulpfec_codec_ = engine_codecs[i];
370 } else if (engine_codecs[i].name == "rtx") {
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000371 default_rtx_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000372 } else if (!codec_set) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000373 default_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000374 codec_set = true;
375 }
376 }
377
378 assert(codec_set);
379 }
380
381 protected:
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000382 class FakeCallFactory : public WebRtcCallFactory {
383 public:
384 FakeCallFactory() : fake_call_(NULL) {}
385 FakeCall* GetCall() { return fake_call_; }
386
387 private:
388 virtual webrtc::Call* CreateCall(
389 const webrtc::Call::Config& config) OVERRIDE {
390 assert(fake_call_ == NULL);
391 fake_call_ = new FakeCall(config);
392 return fake_call_;
393 }
394
395 FakeCall* fake_call_;
396 };
397
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000398 VideoMediaChannel* SetUpForExternalEncoderFactory(
399 cricket::WebRtcVideoEncoderFactory* encoder_factory,
400 const std::vector<VideoCodec>& codecs);
pbos@webrtc.orgfa553ef2014-10-20 11:07:07 +0000401
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000402 VideoMediaChannel* SetUpForExternalDecoderFactory(
403 cricket::WebRtcVideoDecoderFactory* decoder_factory,
404 const std::vector<VideoCodec>& codecs);
405
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000406 WebRtcVideoEngine2 engine_;
407 VideoCodec default_codec_;
408 VideoCodec default_red_codec_;
409 VideoCodec default_ulpfec_codec_;
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000410 VideoCodec default_rtx_codec_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000411};
412
pbos@webrtc.org3bf3d232014-10-31 12:59:34 +0000413TEST_F(WebRtcVideoEngine2Test, ConfiguresAvSyncForFirstReceiveChannel) {
414 FakeCallFactory call_factory;
415 engine_.SetCallFactory(&call_factory);
416
417 WebRtcVoiceEngine voice_engine;
418 engine_.SetVoiceEngine(&voice_engine);
419 voice_engine.Init(rtc::Thread::Current());
420 engine_.Init(rtc::Thread::Current());
421
422 rtc::scoped_ptr<VoiceMediaChannel> voice_channel(
423 voice_engine.CreateChannel());
424 ASSERT_TRUE(voice_channel.get() != NULL);
425 WebRtcVoiceMediaChannel* webrtc_voice_channel =
426 static_cast<WebRtcVoiceMediaChannel*>(voice_channel.get());
427 ASSERT_NE(webrtc_voice_channel->voe_channel(), -1);
428 rtc::scoped_ptr<VideoMediaChannel> channel(
429 engine_.CreateChannel(cricket::VideoOptions(), voice_channel.get()));
430
431 FakeCall* fake_call = call_factory.GetCall();
432 ASSERT_TRUE(fake_call != NULL);
433
434 webrtc::Call::Config call_config = fake_call->GetConfig();
435
436 ASSERT_TRUE(voice_engine.voe()->engine() != NULL);
437 ASSERT_EQ(voice_engine.voe()->engine(), call_config.voice_engine);
438
439 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc)));
440 EXPECT_TRUE(channel->AddRecvStream(StreamParams::CreateLegacy(kSsrc + 1)));
441 std::vector<FakeVideoReceiveStream*> receive_streams =
442 fake_call->GetVideoReceiveStreams();
443
444 ASSERT_EQ(2u, receive_streams.size());
445 EXPECT_EQ(webrtc_voice_channel->voe_channel(),
446 receive_streams[0]->GetConfig().audio_channel_id);
447 EXPECT_EQ(-1, receive_streams[1]->GetConfig().audio_channel_id)
448 << "AV sync should only be set up for the first receive channel.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000449}
450
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000451TEST_F(WebRtcVideoEngine2Test, FindCodec) {
452 const std::vector<cricket::VideoCodec>& c = engine_.codecs();
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +0000453 EXPECT_EQ(4U, c.size());
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000454
455 cricket::VideoCodec vp8(104, "VP8", 320, 200, 30, 0);
456 EXPECT_TRUE(engine_.FindCodec(vp8));
457
458 cricket::VideoCodec vp8_ci(104, "vp8", 320, 200, 30, 0);
459 EXPECT_TRUE(engine_.FindCodec(vp8));
460
461 cricket::VideoCodec vp8_diff_fr_diff_pref(104, "VP8", 320, 200, 50, 50);
462 EXPECT_TRUE(engine_.FindCodec(vp8_diff_fr_diff_pref));
463
464 cricket::VideoCodec vp8_diff_id(95, "VP8", 320, 200, 30, 0);
465 EXPECT_FALSE(engine_.FindCodec(vp8_diff_id));
466 vp8_diff_id.id = 97;
467 EXPECT_TRUE(engine_.FindCodec(vp8_diff_id));
468
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000469 // FindCodec ignores the codec size.
470 // Test that FindCodec can accept uncommon codec size.
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000471 cricket::VideoCodec vp8_diff_res(104, "VP8", 320, 111, 30, 0);
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000472 EXPECT_TRUE(engine_.FindCodec(vp8_diff_res));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000473
474 // PeerConnection doesn't negotiate the resolution at this point.
475 // Test that FindCodec can handle the case when width/height is 0.
476 cricket::VideoCodec vp8_zero_res(104, "VP8", 0, 0, 30, 0);
477 EXPECT_TRUE(engine_.FindCodec(vp8_zero_res));
478
479 cricket::VideoCodec red(101, "RED", 0, 0, 30, 0);
480 EXPECT_TRUE(engine_.FindCodec(red));
481
482 cricket::VideoCodec red_ci(101, "red", 0, 0, 30, 0);
483 EXPECT_TRUE(engine_.FindCodec(red));
484
485 cricket::VideoCodec fec(102, "ULPFEC", 0, 0, 30, 0);
486 EXPECT_TRUE(engine_.FindCodec(fec));
487
488 cricket::VideoCodec fec_ci(102, "ulpfec", 0, 0, 30, 0);
489 EXPECT_TRUE(engine_.FindCodec(fec));
490
491 cricket::VideoCodec rtx(96, "rtx", 0, 0, 30, 0);
492 EXPECT_TRUE(engine_.FindCodec(rtx));
493}
494
495TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
496 std::vector<VideoCodec> engine_codecs = engine_.codecs();
497 for (size_t i = 0; i < engine_codecs.size(); ++i) {
498 if (engine_codecs[i].name != kRtxCodecName)
499 continue;
500 int associated_payload_type;
501 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000502 &associated_payload_type));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000503 EXPECT_EQ(default_codec_.id, associated_payload_type);
504 return;
505 }
506 FAIL() << "No RTX codec found among default codecs.";
507}
508
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000509TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
510 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
511 ASSERT_FALSE(extensions.empty());
512 for (size_t i = 0; i < extensions.size(); ++i) {
513 if (extensions[i].uri == kRtpTimestampOffsetHeaderExtension) {
514 EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extensions[i].id);
515 return;
516 }
517 }
518 FAIL() << "Timestamp offset extension not in header-extension list.";
519}
520
521TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
522 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
523 ASSERT_FALSE(extensions.empty());
524 for (size_t i = 0; i < extensions.size(); ++i) {
525 if (extensions[i].uri == kRtpAbsoluteSenderTimeHeaderExtension) {
526 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId,
527 extensions[i].id);
528 return;
529 }
530 }
531 FAIL() << "Absolute Sender Time extension not in header-extension list.";
532}
533
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000534TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000535 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000536 rtc::scoped_ptr<VideoMediaChannel> channel(
537 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000538
539 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
540
541 EXPECT_FALSE(channel->SetSend(true))
542 << "Channel should not start without codecs.";
543 EXPECT_TRUE(channel->SetSend(false))
544 << "Channel should be stoppable even without set codecs.";
545}
546
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000547TEST_F(WebRtcVideoEngine2Test, GetStatsWithoutSendCodecsSetDoesNotCrash) {
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000548 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000549 rtc::scoped_ptr<VideoMediaChannel> channel(
550 engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000551 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
552 VideoMediaInfo info;
553 channel->GetStats(&info);
554}
555
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000556TEST_F(WebRtcVideoEngine2Test, UseExternalFactoryForVp8WhenSupported) {
557 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
558 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
559 std::vector<cricket::VideoCodec> codecs;
560 codecs.push_back(kVp8Codec);
561
562 rtc::scoped_ptr<VideoMediaChannel> channel(
563 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
564
565 EXPECT_TRUE(
566 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
567 ASSERT_EQ(1u, encoder_factory.encoders().size());
568 EXPECT_TRUE(channel->SetSend(true));
569
570 cricket::FakeVideoCapturer capturer;
571 EXPECT_TRUE(channel->SetCapturer(kSsrc, &capturer));
572 EXPECT_EQ(cricket::CS_RUNNING,
573 capturer.Start(capturer.GetSupportedFormats()->front()));
574 EXPECT_TRUE(capturer.CaptureFrame());
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000575 EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0,
576 kTimeout);
577
pbos@webrtc.org86196c42015-02-16 21:02:00 +0000578 // Sending one frame will have reallocated the encoder since input size
579 // changes from a small default to the actual frame width/height.
580 int num_created_encoders = encoder_factory.GetNumCreatedEncoders();
581 EXPECT_EQ(num_created_encoders, 2);
582
583 // Setting codecs of the same type should not reallocate any encoders
584 // (expecting a no-op).
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000585 EXPECT_TRUE(channel->SetSendCodecs(codecs));
pbos@webrtc.org86196c42015-02-16 21:02:00 +0000586 EXPECT_EQ(num_created_encoders, encoder_factory.GetNumCreatedEncoders());
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000587
588 // Remove stream previously added to free the external encoder instance.
589 EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
590 EXPECT_EQ(0u, encoder_factory.encoders().size());
591}
592
593VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalEncoderFactory(
594 cricket::WebRtcVideoEncoderFactory* encoder_factory,
595 const std::vector<VideoCodec>& codecs) {
596 engine_.SetExternalEncoderFactory(encoder_factory);
597 engine_.Init(rtc::Thread::Current());
598
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000599 VideoMediaChannel* channel =
600 engine_.CreateChannel(cricket::VideoOptions(), NULL);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000601 EXPECT_TRUE(channel->SetSendCodecs(codecs));
602
603 return channel;
604}
605
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000606VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalDecoderFactory(
607 cricket::WebRtcVideoDecoderFactory* decoder_factory,
608 const std::vector<VideoCodec>& codecs) {
609 engine_.SetExternalDecoderFactory(decoder_factory);
610 engine_.Init(rtc::Thread::Current());
611
612 VideoMediaChannel* channel =
613 engine_.CreateChannel(cricket::VideoOptions(), NULL);
614 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
615
616 return channel;
617}
618
pbos@webrtc.orgf18fba22015-01-14 16:26:23 +0000619TEST_F(WebRtcVideoEngine2Test, UsesSimulcastAdapterForVp8Factories) {
620 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
621 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
622 std::vector<cricket::VideoCodec> codecs;
623 codecs.push_back(kVp8Codec);
624
625 rtc::scoped_ptr<VideoMediaChannel> channel(
626 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
627
628 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
629
630 EXPECT_TRUE(
631 channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
632 EXPECT_TRUE(channel->SetSend(true));
633
pbos@webrtc.org86196c42015-02-16 21:02:00 +0000634 cricket::FakeVideoCapturer capturer;
635 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), &capturer));
636 EXPECT_EQ(cricket::CS_RUNNING,
637 capturer.Start(capturer.GetSupportedFormats()->front()));
638 EXPECT_TRUE(capturer.CaptureFrame());
639
pbos@webrtc.orgf18fba22015-01-14 16:26:23 +0000640 EXPECT_GT(encoder_factory.encoders().size(), 1u);
641
642 // Verify that encoders are configured for simulcast through adapter
643 // (increasing resolution and only configured to send one stream each).
644 int prev_width = -1;
645 for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) {
646 webrtc::VideoCodec codec_settings =
647 encoder_factory.encoders()[i]->GetCodecSettings();
648 EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams);
649 EXPECT_GT(codec_settings.width, prev_width);
650 prev_width = codec_settings.width;
651 }
pbos@webrtc.org86196c42015-02-16 21:02:00 +0000652
653 EXPECT_TRUE(channel->SetCapturer(ssrcs.front(), NULL));
pbos@webrtc.orgf18fba22015-01-14 16:26:23 +0000654}
655
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000656TEST_F(WebRtcVideoEngine2Test, ChannelWithExternalH264CanChangeToInternalVp8) {
657 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
658 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
659 std::vector<cricket::VideoCodec> codecs;
660 codecs.push_back(kH264Codec);
661
662 rtc::scoped_ptr<VideoMediaChannel> channel(
663 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
664
665 EXPECT_TRUE(
666 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
667 ASSERT_EQ(1u, encoder_factory.encoders().size());
668
669 codecs.clear();
670 codecs.push_back(kVp8Codec);
671 EXPECT_TRUE(channel->SetSendCodecs(codecs));
672
673 ASSERT_EQ(0u, encoder_factory.encoders().size());
674}
675
676TEST_F(WebRtcVideoEngine2Test,
677 DontUseExternalEncoderFactoryForUnsupportedCodecs) {
678 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
679 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
680 std::vector<cricket::VideoCodec> codecs;
681 codecs.push_back(kVp8Codec);
682
683 rtc::scoped_ptr<VideoMediaChannel> channel(
684 SetUpForExternalEncoderFactory(&encoder_factory, codecs));
685
686 EXPECT_TRUE(
687 channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
688 ASSERT_EQ(0u, encoder_factory.encoders().size());
689}
690
691// Test external codec with be added to the end of the supported codec list.
692TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) {
693 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
694 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
695 engine_.SetExternalEncoderFactory(&encoder_factory);
696
697 engine_.Init(rtc::Thread::Current());
698
699 std::vector<cricket::VideoCodec> codecs(engine_.codecs());
700 ASSERT_GE(codecs.size(), 2u);
701 cricket::VideoCodec internal_codec = codecs.front();
702 cricket::VideoCodec external_codec = codecs.back();
703
704 // The external codec will appear at last.
705 EXPECT_EQ("VP8", internal_codec.name);
706 EXPECT_EQ("H264", external_codec.name);
707}
708
pbos@webrtc.org96a93252014-11-03 14:46:44 +0000709TEST_F(WebRtcVideoEngine2Test, RegisterExternalDecodersIfSupported) {
710 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
711 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
712 std::vector<cricket::VideoCodec> codecs;
713 codecs.push_back(kVp8Codec);
714
715 rtc::scoped_ptr<VideoMediaChannel> channel(
716 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
717
718 EXPECT_TRUE(
719 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
720 ASSERT_EQ(1u, decoder_factory.decoders().size());
721
722 // Setting codecs of the same type should not reallocate the decoder.
723 EXPECT_TRUE(channel->SetRecvCodecs(codecs));
724 EXPECT_EQ(1, decoder_factory.GetNumCreatedDecoders());
725
726 // Remove stream previously added to free the external decoder instance.
727 EXPECT_TRUE(channel->RemoveRecvStream(kSsrc));
728 EXPECT_EQ(0u, decoder_factory.decoders().size());
729}
730
731// Verifies that we can set up decoders that are not internally supported.
732TEST_F(WebRtcVideoEngine2Test, RegisterExternalH264DecoderIfSupported) {
733 // TODO(pbos): Do not assume that encoder/decoder support is symmetric. We
734 // can't even query the WebRtcVideoDecoderFactory for supported codecs.
735 // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported
736 // codecs.
737 cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
738 encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
739 engine_.SetExternalEncoderFactory(&encoder_factory);
740 cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
741 decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
742 std::vector<cricket::VideoCodec> codecs;
743 codecs.push_back(kH264Codec);
744
745 rtc::scoped_ptr<VideoMediaChannel> channel(
746 SetUpForExternalDecoderFactory(&decoder_factory, codecs));
747
748 EXPECT_TRUE(
749 channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
750 ASSERT_EQ(1u, decoder_factory.decoders().size());
751}
752
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000753class WebRtcVideoEngine2BaseTest
754 : public VideoEngineTest<cricket::WebRtcVideoEngine2> {
755 protected:
756 typedef VideoEngineTest<cricket::WebRtcVideoEngine2> Base;
757};
758
759#define WEBRTC_ENGINE_BASE_TEST(test) \
760 TEST_F(WebRtcVideoEngine2BaseTest, test) { Base::test##Body(); }
761
762WEBRTC_ENGINE_BASE_TEST(ConstrainNewCodec2);
763
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000764class WebRtcVideoChannel2BaseTest
765 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
766 protected:
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000767 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000768
769 virtual cricket::VideoCodec DefaultCodec() OVERRIDE { return kVp8Codec; }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000770};
771
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000772#define WEBRTC_BASE_TEST(test) \
773 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); }
774
775#define WEBRTC_DISABLED_BASE_TEST(test) \
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000776 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_##test) { Base::test(); }
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000777
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000778// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
779#if 0
780// TODO(juberti): Figure out why ViE is munging the COM refcount.
781#ifdef WIN32
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000782WEBRTC_DISABLED_BASE_TEST(CheckCoInitialize) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000783 Base::CheckCoInitialize();
784}
785#endif
786#endif
787
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000788WEBRTC_BASE_TEST(SetSend);
789WEBRTC_BASE_TEST(SetSendWithoutCodecs);
790WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000791
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000792WEBRTC_BASE_TEST(GetStats);
793WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
794WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000795
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000796WEBRTC_BASE_TEST(SetSendBandwidth);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000797
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000798WEBRTC_BASE_TEST(SetSendSsrc);
799WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000800
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000801WEBRTC_BASE_TEST(SetRenderer);
802WEBRTC_BASE_TEST(AddRemoveRecvStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000803
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000804WEBRTC_DISABLED_BASE_TEST(AddRemoveRecvStreamAndRender);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000805
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000806WEBRTC_BASE_TEST(AddRemoveRecvStreamsNoConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000807
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000808WEBRTC_BASE_TEST(AddRemoveSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000809
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000810WEBRTC_BASE_TEST(SimulateConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000811
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000812WEBRTC_BASE_TEST(AddRemoveCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000813
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000814WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000815
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000816WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000817
818// TODO(pbos): Figure out why this fails so often.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000819WEBRTC_DISABLED_BASE_TEST(HighAspectHighHeightCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000820
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000821WEBRTC_BASE_TEST(RejectEmptyStreamParams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000822
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000823WEBRTC_BASE_TEST(AdaptResolution16x10);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000824
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000825WEBRTC_BASE_TEST(AdaptResolution4x3);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000826
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000827// TODO(juberti): Restore this test once we support sending 0 fps.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000828WEBRTC_DISABLED_BASE_TEST(AdaptDropAllFrames);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000829// TODO(juberti): Understand why we get decode errors on this test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000830WEBRTC_DISABLED_BASE_TEST(AdaptFramerate);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000831
pbos@webrtc.orgc4175b92014-09-03 15:25:49 +0000832WEBRTC_BASE_TEST(SendsLowerResolutionOnSmallerFrames);
833
834WEBRTC_BASE_TEST(MuteStream);
835
836WEBRTC_BASE_TEST(MultipleSendStreams);
837
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000838WEBRTC_BASE_TEST(SetSendStreamFormat0x0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000839
840// TODO(zhurunz): Fix the flakey test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000841WEBRTC_DISABLED_BASE_TEST(SetSendStreamFormat);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000842
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000843TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Vga) {
844 SendAndReceive(cricket::VideoCodec(100, "VP8", 640, 400, 30, 0));
845}
846
847TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Qvga) {
848 SendAndReceive(cricket::VideoCodec(100, "VP8", 320, 200, 30, 0));
849}
850
851TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8SvcQqvga) {
852 SendAndReceive(cricket::VideoCodec(100, "VP8", 160, 100, 30, 0));
853}
854
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000855TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
856 Base::TwoStreamsSendAndReceive(kVp8Codec);
857}
858
859TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
860 Base::TwoStreamsReUseFirstStream(kVp8Codec);
861}
862
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000863WEBRTC_BASE_TEST(SendManyResizeOnce);
864
865// TODO(pbos): Enable and figure out why this fails (or should work).
866TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
867 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL));
868 EXPECT_TRUE(channel_->SetRenderer(kDefaultReceiveSsrc, &renderer_));
869 channel_->UpdateAspectRatio(1280, 720);
870 video_capturer_.reset(new cricket::FakeVideoCapturer);
871 const std::vector<cricket::VideoFormat>* formats =
872 video_capturer_->GetSupportedFormats();
873 cricket::VideoFormat capture_format_hd = (*formats)[0];
874 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(capture_format_hd));
875 EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get()));
876
877 // Capture format HD -> adapt (OnOutputFormatRequest VGA) -> VGA.
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +0000878 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000879 EXPECT_TRUE(SetOneCodec(codec));
880 codec.width /= 2;
881 codec.height /= 2;
882 EXPECT_TRUE(SetSend(true));
883 EXPECT_TRUE(channel_->SetRender(true));
884 EXPECT_EQ(0, renderer_.num_rendered_frames());
885 EXPECT_TRUE(SendFrame());
886 EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout);
887}
888
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000889class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test,
890 public WebRtcCallFactory {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000891 public:
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000892 WebRtcVideoChannel2Test() : fake_call_(NULL) {}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000893 virtual void SetUp() OVERRIDE {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000894 engine_.SetCallFactory(this);
pbos@webrtc.org7fe1e032014-10-14 04:25:33 +0000895 engine_.Init(rtc::Thread::Current());
buildbot@webrtc.org1ecbe452014-10-14 20:29:28 +0000896 channel_.reset(engine_.CreateChannel(cricket::VideoOptions(), NULL));
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000897 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000898 last_ssrc_ = 123;
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000899 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000900 }
901
902 protected:
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000903 virtual webrtc::Call* CreateCall(
904 const webrtc::Call::Config& config) OVERRIDE {
905 assert(fake_call_ == NULL);
906 fake_call_ = new FakeCall(config);
907 return fake_call_;
908 }
909
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000910 FakeVideoSendStream* AddSendStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000911 return AddSendStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000912 }
913
914 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000915 size_t num_streams = fake_call_->GetVideoSendStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000916 EXPECT_TRUE(channel_->AddSendStream(sp));
917 std::vector<FakeVideoSendStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000918 fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000919 EXPECT_EQ(num_streams + 1, streams.size());
920 return streams[streams.size() - 1];
921 }
922
923 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000924 return fake_call_->GetVideoSendStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000925 }
926
927 FakeVideoReceiveStream* AddRecvStream() {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000928 return AddRecvStream(StreamParams::CreateLegacy(++last_ssrc_));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000929 }
930
931 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000932 size_t num_streams = fake_call_->GetVideoReceiveStreams().size();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000933 EXPECT_TRUE(channel_->AddRecvStream(sp));
934 std::vector<FakeVideoReceiveStream*> streams =
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000935 fake_call_->GetVideoReceiveStreams();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000936 EXPECT_EQ(num_streams + 1, streams.size());
937 return streams[streams.size() - 1];
938 }
939
pbos@webrtc.org00873182014-11-25 14:03:34 +0000940 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
941 int expected_min_bitrate_bps,
942 const char* start_bitrate_kbps,
943 int expected_start_bitrate_bps,
944 const char* max_bitrate_kbps,
945 int expected_max_bitrate_bps) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000946 std::vector<VideoCodec> codecs;
947 codecs.push_back(kVp8Codec);
pbos@webrtc.org00873182014-11-25 14:03:34 +0000948 codecs[0].params[kCodecParamMinBitrate] = min_bitrate_kbps;
949 codecs[0].params[kCodecParamStartBitrate] = start_bitrate_kbps;
950 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate_kbps;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000951 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
952
pbos@webrtc.org00873182014-11-25 14:03:34 +0000953 EXPECT_EQ(expected_min_bitrate_bps,
954 fake_call_->GetConfig().stream_bitrates.min_bitrate_bps);
955 EXPECT_EQ(expected_start_bitrate_bps,
956 fake_call_->GetConfig().stream_bitrates.start_bitrate_bps);
957 EXPECT_EQ(expected_max_bitrate_bps,
958 fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000959 }
960
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000961 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
962 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +0000963 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000964 // Enable extension.
965 const int id = 1;
966 std::vector<cricket::RtpHeaderExtension> extensions;
967 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
968 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
969
970 FakeVideoSendStream* send_stream =
971 AddSendStream(cricket::StreamParams::CreateLegacy(123));
972
973 // Verify the send extension id.
974 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
975 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
976 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
977 // Verify call with same set of extensions returns true.
978 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
979 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
980 // receivers.
981 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
982 ->GetConfig()
983 .rtp.extensions.empty());
984
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000985 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000986 std::vector<cricket::RtpHeaderExtension> empty_extensions;
987 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000988 ASSERT_EQ(1u, call->GetVideoSendStreams().size());
989 send_stream = call->GetVideoSendStreams()[0];
990 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
991
992 // Verify that adding receive RTP header extensions adds them for existing
993 // streams.
994 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
995 send_stream = call->GetVideoSendStreams()[0];
996 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
997 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
998 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000999 }
1000
1001 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
1002 const std::string& webrtc_ext) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001003 FakeCall* call = fake_call_;
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001004 // Enable extension.
1005 const int id = 1;
1006 std::vector<cricket::RtpHeaderExtension> extensions;
1007 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
1008 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1009
1010 FakeVideoReceiveStream* recv_stream =
1011 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1012
1013 // Verify the recv extension id.
1014 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1015 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
1016 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
1017 // Verify call with same set of extensions returns true.
1018 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001019
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001020 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
1021 // senders.
1022 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
1023 ->GetConfig()
1024 .rtp.extensions.empty());
1025
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001026 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001027 std::vector<cricket::RtpHeaderExtension> empty_extensions;
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001028 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(empty_extensions));
1029 ASSERT_EQ(1u, call->GetVideoReceiveStreams().size());
1030 recv_stream = call->GetVideoReceiveStreams()[0];
1031 EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
1032
1033 // Verify that adding receive RTP header extensions adds them for existing
1034 // streams.
1035 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1036 recv_stream = call->GetVideoReceiveStreams()[0];
1037 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1038 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
1039 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001040 }
1041
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001042 void TestCpuAdaptation(bool enable_overuse);
1043
1044 FakeCall* fake_call_;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001045 rtc::scoped_ptr<VideoMediaChannel> channel_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001046 uint32 last_ssrc_;
1047};
1048
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001049TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001050 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1051 EXPECT_TRUE(channel_->SetSend(true));
1052 cricket::VideoOptions options;
1053 options.conference_mode.Set(true);
1054 EXPECT_TRUE(channel_->SetOptions(options));
1055
1056 // Send side.
1057 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1058 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1059 FakeVideoSendStream* send_stream = AddSendStream(
1060 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1061
1062 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
1063 for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
1064 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
1065
1066 // Receiver side.
1067 FakeVideoReceiveStream* recv_stream = AddRecvStream(
1068 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1069 ASSERT_GT(recv_stream->GetConfig().rtp.rtx.size(), 0u)
1070 << "No SSRCs for RTX configured by AddRecvStream.";
1071 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size())
1072 << "This test only works with one receive codec. Please update the test.";
1073 EXPECT_EQ(rtx_ssrcs[0],
1074 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
1075 // TODO(pbos): Make sure we set the RTX for correct payloads etc.
1076}
1077
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001078TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
1079 // Setup one channel with an associated RTX stream.
1080 cricket::StreamParams params =
1081 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
1082 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
1083 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
1084 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
1085 EXPECT_EQ(kRtxSsrcs1[0],
1086 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001087}
1088
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001089TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
1090 // Setup one channel without an associated RTX stream.
1091 cricket::StreamParams params =
1092 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
1093 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
1094 ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001095}
1096
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001097TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
1098 FakeVideoSendStream* send_stream =
1099 AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
1100 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
1101
1102 FakeVideoReceiveStream* recv_stream =
1103 AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
1104 ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001105}
1106
pbos@webrtc.org587ef602014-06-16 17:32:02 +00001107// Test support for RTP timestamp offset header extension.
1108TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
1109 TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
1110 webrtc::RtpExtension::kTOffset);
1111}
1112TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
1113 TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
1114 webrtc::RtpExtension::kTOffset);
1115}
1116
1117// Test support for absolute send time header extension.
1118TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
1119 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
1120 webrtc::RtpExtension::kAbsSendTime);
1121}
1122TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
1123 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
1124 webrtc::RtpExtension::kAbsSendTime);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001125}
1126
pbos@webrtc.orgc37e72e2015-01-05 18:51:13 +00001127TEST_F(WebRtcVideoChannel2Test, IdenticalSendExtensionsDoesntRecreateStream) {
1128 const int kTOffsetId = 1;
1129 const int kAbsSendTimeId = 2;
1130 std::vector<cricket::RtpHeaderExtension> extensions;
1131 extensions.push_back(cricket::RtpHeaderExtension(
1132 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1133 extensions.push_back(cricket::RtpHeaderExtension(
1134 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
1135
1136 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1137 FakeVideoSendStream* send_stream =
1138 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1139
1140 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1141 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
1142
1143 // Setting the same extensions (even if in different order) shouldn't
1144 // reallocate the stream.
1145 std::reverse(extensions.begin(), extensions.end());
1146 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1147
1148 EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
1149
1150 // Setting different extensions should recreate the stream.
1151 extensions.resize(1);
1152 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1153
1154 EXPECT_EQ(2, fake_call_->GetNumCreatedSendStreams());
1155}
1156
1157TEST_F(WebRtcVideoChannel2Test, IdenticalRecvExtensionsDoesntRecreateStream) {
1158 const int kTOffsetId = 1;
1159 const int kAbsSendTimeId = 2;
1160 std::vector<cricket::RtpHeaderExtension> extensions;
1161 extensions.push_back(cricket::RtpHeaderExtension(
1162 kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
1163 extensions.push_back(cricket::RtpHeaderExtension(
1164 kRtpTimestampOffsetHeaderExtension, kTOffsetId));
1165
1166 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1167 FakeVideoReceiveStream* send_stream =
1168 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1169
1170 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1171 ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
1172
1173 // Setting the same extensions (even if in different order) shouldn't
1174 // reallocate the stream.
1175 std::reverse(extensions.begin(), extensions.end());
1176 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1177
1178 EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
1179
1180 // Setting different extensions should recreate the stream.
1181 extensions.resize(1);
1182 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1183
1184 EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams());
1185}
1186
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001187TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001188 SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001189 const int kUnsupportedId = 1;
1190 const int kTOffsetId = 2;
1191
1192 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001193 extensions.push_back(
1194 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1195 extensions.push_back(
1196 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001197 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
1198 FakeVideoSendStream* send_stream =
1199 AddSendStream(cricket::StreamParams::CreateLegacy(123));
1200
1201 // Only timestamp offset extension is set to send stream,
1202 // unsupported rtp extension is ignored.
1203 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
1204 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001205 send_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001206}
1207
1208TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001209 SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001210 const int kUnsupportedId = 1;
1211 const int kTOffsetId = 2;
1212
1213 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001214 extensions.push_back(
1215 cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
1216 extensions.push_back(
1217 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001218 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
1219 FakeVideoReceiveStream* recv_stream =
1220 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
1221
1222 // Only timestamp offset extension is set to receive stream,
1223 // unsupported rtp extension is ignored.
1224 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
1225 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001226 recv_stream->GetConfig().rtp.extensions[0].name.c_str());
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001227}
1228
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001229TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001230 const int kIncorrectIds[] = {-2, -1, 15, 16};
1231 for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001232 std::vector<cricket::RtpHeaderExtension> extensions;
1233 extensions.push_back(cricket::RtpHeaderExtension(
1234 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1235 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions))
1236 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1237 }
1238}
1239
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001240TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001241 const int kIncorrectIds[] = {-2, -1, 15, 16};
1242 for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001243 std::vector<cricket::RtpHeaderExtension> extensions;
1244 extensions.push_back(cricket::RtpHeaderExtension(
1245 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
1246 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions))
1247 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
1248 }
1249}
1250
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001251TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001252 const int id = 1;
1253 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001254 extensions.push_back(
1255 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1256 extensions.push_back(
1257 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001258 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1259
1260 // Duplicate entries are also not supported.
1261 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001262 extensions.push_back(
1263 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001264 extensions.push_back(extensions.back());
1265 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
1266}
1267
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001268TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001269 const int id = 1;
1270 std::vector<cricket::RtpHeaderExtension> extensions;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001271 extensions.push_back(
1272 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
1273 extensions.push_back(
1274 cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001275 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1276
1277 // Duplicate entries are also not supported.
1278 extensions.clear();
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001279 extensions.push_back(
1280 cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
pbos@webrtc.org3c107582014-07-20 15:27:35 +00001281 extensions.push_back(extensions.back());
1282 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
1283}
1284
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001285TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
1286 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1287}
1288
1289TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
1290 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1291}
1292
1293TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
1294 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1295}
1296
1297TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
1298 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001299 EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001300}
1301
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001302TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
1303 FakeVideoReceiveStream* stream = AddRecvStream();
1304 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001305}
1306
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001307TEST_F(WebRtcVideoChannel2Test, RembCanBeEnabledAndDisabled) {
1308 FakeVideoReceiveStream* stream = AddRecvStream();
1309 EXPECT_TRUE(stream->GetConfig().rtp.remb);
1310
1311 // Verify that REMB is turned off when codecs without REMB are set.
1312 std::vector<VideoCodec> codecs;
1313 codecs.push_back(kVp8Codec);
1314 EXPECT_TRUE(codecs[0].feedback_params.params().empty());
1315 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001316 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001317 EXPECT_FALSE(stream->GetConfig().rtp.remb);
1318
1319 // Verify that REMB is turned on when setting default codecs since the
1320 // default codecs have REMB enabled.
1321 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001322 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001323 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001324}
1325
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001326TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
1327 VerifyCodecHasDefaultFeedbackParams(default_codec_);
1328
pbos@webrtc.org19864742014-05-30 07:35:47 +00001329 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1330 EXPECT_TRUE(channel_->SetSend(true));
1331
1332 // Send side.
1333 FakeVideoSendStream* send_stream =
1334 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1335 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1336
1337 // Receiver side.
1338 FakeVideoReceiveStream* recv_stream =
1339 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1340 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1341
1342 // Nack history size should match between sender and receiver.
1343 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
1344 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001345}
1346
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001347TEST_F(WebRtcVideoChannel2Test, NackCanBeDisabled) {
1348 std::vector<VideoCodec> codecs;
1349 codecs.push_back(kVp8Codec);
1350
1351 // Send side.
1352 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1353 FakeVideoSendStream* send_stream =
1354 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1355 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
1356
1357 // Receiver side.
1358 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1359 FakeVideoReceiveStream* recv_stream =
1360 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1361 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
1362}
1363
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001364TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
1365 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1366}
1367
1368TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
1369 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1370}
1371
1372TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
1373 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1374}
1375
1376TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
1377 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1378}
1379
1380TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
1381 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1382}
1383
1384TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
1385 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1386}
1387
1388TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
1389 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1390}
1391
1392TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
1393 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1394}
1395
1396TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
1397 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1398}
1399
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001400TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) {
1401 static const int kScreenshareMinBitrateKbps = 800;
1402 cricket::VideoCodec codec = kVp8Codec360p;
1403 std::vector<cricket::VideoCodec> codecs;
1404 codecs.push_back(codec);
1405 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1406 VideoOptions options;
1407 options.screencast_min_bitrate.Set(kScreenshareMinBitrateKbps);
1408 channel_->SetOptions(options);
1409
1410 AddSendStream();
1411
1412 cricket::FakeVideoCapturer capturer;
1413 capturer.SetScreencast(false);
1414 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1415 cricket::VideoFormat capture_format_hd =
1416 capturer.GetSupportedFormats()->front();
1417 EXPECT_EQ(1280, capture_format_hd.width);
1418 EXPECT_EQ(720, capture_format_hd.height);
1419 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1420
1421 EXPECT_TRUE(channel_->SetSend(true));
1422
1423 EXPECT_TRUE(capturer.CaptureFrame());
1424 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1425 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1426
1427 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1428
1429 // Verify non-screencast settings.
1430 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1431 EXPECT_EQ(webrtc::VideoEncoderConfig::kRealtimeVideo,
1432 encoder_config.content_type);
1433 EXPECT_EQ(codec.width, encoder_config.streams.front().width);
1434 EXPECT_EQ(codec.height, encoder_config.streams.front().height);
1435 EXPECT_EQ(0, encoder_config.min_transmit_bitrate_bps)
1436 << "Non-screenshare shouldn't use min-transmit bitrate.";
1437
1438 capturer.SetScreencast(true);
1439 EXPECT_TRUE(capturer.CaptureFrame());
1440
1441 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1442
1443 // Verify screencast settings.
1444 encoder_config = send_stream->GetEncoderConfig();
1445 EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
1446 encoder_config.content_type);
1447 EXPECT_EQ(kScreenshareMinBitrateKbps * 1000,
1448 encoder_config.min_transmit_bitrate_bps);
1449
1450 EXPECT_EQ(capture_format_hd.width, encoder_config.streams.front().width);
1451 EXPECT_EQ(capture_format_hd.height, encoder_config.streams.front().height);
pbos@webrtc.orgb7ed7792014-10-31 13:08:10 +00001452 EXPECT_TRUE(encoder_config.streams[0].temporal_layer_thresholds_bps.empty());
1453
1454 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
1455}
1456
1457TEST_F(WebRtcVideoChannel2Test,
1458 ConferenceModeScreencastConfiguresTemporalLayer) {
1459 static const int kConferenceScreencastTemporalBitrateBps = 100000;
1460 VideoOptions options;
1461 options.conference_mode.Set(true);
1462 channel_->SetOptions(options);
1463
1464 AddSendStream();
1465
1466 cricket::FakeVideoCapturer capturer;
1467 capturer.SetScreencast(true);
1468 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1469 cricket::VideoFormat capture_format_hd =
1470 capturer.GetSupportedFormats()->front();
1471 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
1472
1473 EXPECT_TRUE(channel_->SetSend(true));
1474
1475 EXPECT_TRUE(capturer.CaptureFrame());
1476 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1477 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1478
1479 webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
1480
1481 // Verify screencast settings.
1482 encoder_config = send_stream->GetEncoderConfig();
1483 EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
1484 encoder_config.content_type);
1485 ASSERT_EQ(1u, encoder_config.streams.size());
1486 ASSERT_EQ(1u, encoder_config.streams[0].temporal_layer_thresholds_bps.size());
1487 EXPECT_EQ(kConferenceScreencastTemporalBitrateBps,
1488 encoder_config.streams[0].temporal_layer_thresholds_bps[0]);
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001489
1490 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001491}
1492
1493TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
1494 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1495}
1496
1497TEST_F(WebRtcVideoChannel2Test,
1498 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
1499 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1500}
1501
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001502TEST_F(WebRtcVideoChannel2Test, SuspendBelowMinBitrateDisabledByDefault) {
1503 FakeVideoSendStream* stream = AddSendStream();
1504 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1505}
1506
1507TEST_F(WebRtcVideoChannel2Test, SetOptionsWithSuspendBelowMinBitrate) {
1508 VideoOptions options;
1509 options.suspend_below_min_bitrate.Set(true);
1510 channel_->SetOptions(options);
1511
1512 FakeVideoSendStream* stream = AddSendStream();
1513 EXPECT_TRUE(stream->GetConfig().suspend_below_min_bitrate);
1514
1515 options.suspend_below_min_bitrate.Set(false);
1516 channel_->SetOptions(options);
1517
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001518 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001519 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1520}
1521
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001522TEST_F(WebRtcVideoChannel2Test, Vp8DenoisingEnabledByDefault) {
1523 FakeVideoSendStream* stream = AddSendStream();
1524 webrtc::VideoCodecVP8 vp8_settings;
1525 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1526 EXPECT_TRUE(vp8_settings.denoisingOn);
1527}
1528
1529TEST_F(WebRtcVideoChannel2Test, SetOptionsWithDenoising) {
1530 VideoOptions options;
1531 options.video_noise_reduction.Set(false);
1532 channel_->SetOptions(options);
1533
1534 FakeVideoSendStream* stream = AddSendStream();
1535 webrtc::VideoCodecVP8 vp8_settings;
1536 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1537 EXPECT_FALSE(vp8_settings.denoisingOn);
1538
1539 options.video_noise_reduction.Set(true);
1540 channel_->SetOptions(options);
1541
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001542 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001543 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1544 EXPECT_TRUE(vp8_settings.denoisingOn);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001545}
1546
1547TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
1548 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1549}
1550
pbos@webrtc.org8aed9452014-07-26 10:16:49 +00001551TEST_F(WebRtcVideoChannel2Test, DISABLED_SendReceiveBitratesStats) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001552 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1553}
1554
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001555TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruse) {
1556 TestCpuAdaptation(true);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001557}
1558
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001559TEST_F(WebRtcVideoChannel2Test, DoesNotAdaptOnOveruseWhenDisabled) {
1560 TestCpuAdaptation(false);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001561}
1562
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001563void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse) {
pbos@webrtc.orgefc82c22014-10-27 13:58:00 +00001564 cricket::VideoCodec codec = kVp8Codec720p;
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001565 std::vector<cricket::VideoCodec> codecs;
1566 codecs.push_back(codec);
1567 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
1568
1569 if (enable_overuse) {
1570 VideoOptions options;
1571 options.cpu_overuse_detection.Set(true);
1572 channel_->SetOptions(options);
1573 }
1574
1575 AddSendStream();
1576
1577 cricket::FakeVideoCapturer capturer;
1578 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1579 EXPECT_EQ(cricket::CS_RUNNING,
1580 capturer.Start(capturer.GetSupportedFormats()->front()));
1581
1582 EXPECT_TRUE(channel_->SetSend(true));
1583
1584 // Trigger overuse.
1585 webrtc::LoadObserver* overuse_callback =
1586 fake_call_->GetConfig().overuse_callback;
1587 ASSERT_TRUE(overuse_callback != NULL);
1588 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
1589
1590 EXPECT_TRUE(capturer.CaptureFrame());
1591 ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
1592 FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
1593
1594 EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
1595
1596 if (enable_overuse) {
1597 EXPECT_LT(send_stream->GetLastWidth(), codec.width);
1598 EXPECT_LT(send_stream->GetLastHeight(), codec.height);
1599 } else {
1600 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1601 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1602 }
1603
1604 // Trigger underuse which should go back to normal resolution.
1605 overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
1606 EXPECT_TRUE(capturer.CaptureFrame());
1607
1608 EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
1609
1610 EXPECT_EQ(codec.width, send_stream->GetLastWidth());
1611 EXPECT_EQ(codec.height, send_stream->GetLastHeight());
1612
1613 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001614}
1615
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001616TEST_F(WebRtcVideoChannel2Test, EstimatesNtpStartTimeAndElapsedTimeCorrectly) {
1617 // Start at last timestamp to verify that wraparounds are estimated correctly.
1618 static const uint32_t kInitialTimestamp = 0xFFFFFFFFu;
1619 static const int64_t kInitialNtpTimeMs = 1247891230;
1620 static const int kFrameOffsetMs = 20;
1621 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001622
magjed@webrtc.orgfc5ad952015-01-27 09:57:01 +00001623 FakeVideoReceiveStream* stream = AddRecvStream();
1624 cricket::FakeVideoRenderer renderer;
1625 EXPECT_TRUE(channel_->SetRenderer(last_ssrc_, &renderer));
1626 EXPECT_TRUE(channel_->SetRender(true));
1627
1628 webrtc::I420VideoFrame video_frame;
1629 CreateBlackFrame(&video_frame, 4, 4);
1630 video_frame.set_timestamp(kInitialTimestamp);
1631 // Initial NTP time is not available on the first frame, but should still be
1632 // able to be estimated.
1633 stream->InjectFrame(video_frame, 0);
1634
1635 EXPECT_EQ(1, renderer.num_rendered_frames());
1636 EXPECT_EQ(0, renderer.last_frame_elapsed_time_ns());
1637
1638 // This timestamp is kInitialTimestamp (-1) + kFrameOffsetMs * 90, which
1639 // triggers a constant-overflow warning, hence we're calculating it explicitly
1640 // here.
1641 video_frame.set_timestamp(kFrameOffsetMs * 90 - 1);
1642 video_frame.set_ntp_time_ms(kInitialNtpTimeMs + kFrameOffsetMs);
1643 stream->InjectFrame(video_frame, 0);
1644
1645 EXPECT_EQ(2, renderer.num_rendered_frames());
1646 EXPECT_EQ(kFrameOffsetMs * rtc::kNumNanosecsPerMillisec,
1647 renderer.last_frame_elapsed_time_ns());
1648
1649 // Verify that NTP time has been correctly deduced.
1650 cricket::VideoMediaInfo info;
1651 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
1652 ASSERT_EQ(1u, info.receivers.size());
1653 EXPECT_EQ(kInitialNtpTimeMs, info.receivers[0].capture_start_ntp_time_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001654}
1655
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001656TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001657 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001658
1659 VideoCodec codec;
1660 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001661 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001662
1663 // Using a RTX setup to verify that the default RTX payload type is good.
1664 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1665 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1666 FakeVideoSendStream* stream = AddSendStream(
1667 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1668 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001669
1670 // Make sure NACK and FEC are enabled on the correct payload types.
1671 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
1672 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
1673 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001674
1675 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
1676 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
andrew@webrtc.org8f27fcc2015-01-09 20:22:46 +00001677 EXPECT_EQ(static_cast<int>(default_rtx_codec_.id),
1678 config.rtp.rtx.payload_type);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001679 // TODO(juberti): Check RTCP, PLI, TMMBR.
1680}
1681
1682TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
1683 std::vector<VideoCodec> codecs;
1684 codecs.push_back(kVp8Codec);
1685 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1686
1687 FakeVideoSendStream* stream = AddSendStream();
1688 webrtc::VideoSendStream::Config config = stream->GetConfig();
1689
1690 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1691 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1692}
1693
1694TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001695 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1696 std::vector<VideoCodec> codecs;
1697 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1698 codecs.push_back(rtx_codec);
1699 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1700 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001701}
1702
1703TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001704 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1705 std::vector<VideoCodec> codecs;
1706 cricket::VideoCodec rtx_codec =
1707 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1708 codecs.push_back(kVp8Codec);
1709 codecs.push_back(rtx_codec);
1710 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1711
1712 cricket::VideoCodec rtx_codec2 =
1713 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1714 codecs.pop_back();
1715 codecs.push_back(rtx_codec2);
1716 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1717 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001718}
1719
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001720TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1721 std::vector<VideoCodec> codecs;
1722 codecs.push_back(kVp8Codec);
1723 codecs.push_back(kUlpfecCodec);
1724 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1725
1726 FakeVideoSendStream* stream = AddSendStream();
1727 webrtc::VideoSendStream::Config config = stream->GetConfig();
1728
1729 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1730
1731 codecs.pop_back();
1732 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001733 stream = fake_call_->GetVideoSendStreams()[0];
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001734 ASSERT_TRUE(stream != NULL);
1735 config = stream->GetConfig();
1736 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1737 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001738}
1739
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001740TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1741 std::vector<VideoCodec> codecs;
1742 codecs.push_back(kVp8Codec720p);
1743 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org86196c42015-02-16 21:02:00 +00001744 channel_->SetSend(true);
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001745
pbos@webrtc.org86196c42015-02-16 21:02:00 +00001746 FakeVideoSendStream* stream = AddSendStream();
1747
1748 cricket::FakeVideoCapturer capturer;
1749 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
1750 EXPECT_EQ(cricket::CS_RUNNING,
1751 capturer.Start(capturer.GetSupportedFormats()->front()));
1752 EXPECT_TRUE(capturer.CaptureFrame());
1753
1754 std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001755 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1756 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1757
1758 codecs.clear();
1759 codecs.push_back(kVp8Codec360p);
1760 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001761 streams = fake_call_->GetVideoSendStreams()[0]->GetVideoStreams();
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001762 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1763 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.org86196c42015-02-16 21:02:00 +00001764 EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001765}
1766
pbos@webrtc.org00873182014-11-25 14:03:34 +00001767TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithBitrates) {
1768 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1769 200000);
1770}
1771
1772TEST_F(WebRtcVideoChannel2Test,
1773 SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
1774 SetSendCodecsShouldWorkForBitrates(
1775 "", 0, "", -1, "", -1);
1776}
1777
1778TEST_F(WebRtcVideoChannel2Test, SetSendCodecsCapsMinAndStartBitrate) {
1779 SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001780}
1781
1782TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001783 std::vector<VideoCodec> video_codecs = engine_.codecs();
pbos@webrtc.org88ef6322014-11-04 15:29:29 +00001784 video_codecs[0].params[kCodecParamMinBitrate] = "300";
1785 video_codecs[0].params[kCodecParamMaxBitrate] = "200";
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001786 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001787}
1788
pbos@webrtc.org00873182014-11-25 14:03:34 +00001789TEST_F(WebRtcVideoChannel2Test,
1790 SetMaxSendBandwidthShouldPreserveOtherBitrates) {
1791 SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
1792 200000);
1793 channel_->SetMaxSendBandwidth(300000);
1794 EXPECT_EQ(100000, fake_call_->GetConfig().stream_bitrates.min_bitrate_bps)
1795 << "Setting max bitrate should keep previous min bitrate.";
1796 EXPECT_EQ(-1, fake_call_->GetConfig().stream_bitrates.start_bitrate_bps)
1797 << "Setting max bitrate should not reset start bitrate.";
1798 EXPECT_EQ(300000, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
1799}
1800
1801TEST_F(WebRtcVideoChannel2Test, SetMaxSendBandwidthShouldBeRemovable) {
1802 channel_->SetMaxSendBandwidth(300000);
1803 EXPECT_EQ(300000, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps);
1804 // <= 0 means disable (infinite) max bitrate.
1805 channel_->SetMaxSendBandwidth(0);
1806 EXPECT_EQ(-1, fake_call_->GetConfig().stream_bitrates.max_bitrate_bps)
1807 << "Setting zero max bitrate did not reset start bitrate.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001808}
1809
1810TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1811 static const char* kMaxQuantization = "21";
1812 std::vector<VideoCodec> codecs;
1813 codecs.push_back(kVp8Codec);
1814 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1815 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001816 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1817 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001818
1819 VideoCodec codec;
1820 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1821 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1822}
1823
1824TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1825 std::vector<cricket::VideoCodec> codecs;
1826 codecs.push_back(kVp8Codec);
1827
1828 codecs[0].width = 0;
1829 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1830 << "Codec set though codec width is zero.";
1831
1832 codecs[0].width = kVp8Codec.width;
1833 codecs[0].height = 0;
1834 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1835 << "Codec set though codec height is zero.";
1836}
1837
1838TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
1839 // TODO(pbos): Should we only allow the dynamic range?
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001840 static const int kIncorrectPayloads[] = {-2, -1, 128, 129};
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001841 std::vector<cricket::VideoCodec> codecs;
1842 codecs.push_back(kVp8Codec);
pkasting@chromium.orge7a4a122015-01-28 21:36:55 +00001843 for (size_t i = 0; i < arraysize(kIncorrectPayloads); ++i) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001844 int payload_type = kIncorrectPayloads[i];
1845 codecs[0].id = payload_type;
1846 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1847 << "Bad payload type '" << payload_type << "' accepted.";
1848 }
1849}
1850
1851TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
1852 std::vector<cricket::VideoCodec> codecs;
1853 codecs.push_back(kVp8Codec);
1854 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
1855 codecs[0].id = payload_type;
1856 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
1857 << "Payload type '" << payload_type << "' rejected.";
1858 }
1859}
1860
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001861TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
1862 std::vector<cricket::VideoCodec> codecs;
1863 codecs.push_back(kVp8Codec);
1864 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1865}
1866
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001867// Test that we set our inbound RTX codecs properly.
1868TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
1869 std::vector<cricket::VideoCodec> codecs;
1870 codecs.push_back(kVp8Codec);
1871 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1872 codecs.push_back(rtx_codec);
1873 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1874 << "RTX codec without associated payload should be rejected.";
1875
1876 codecs[1].SetParam("apt", kVp8Codec.id + 1);
1877 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1878 << "RTX codec with invalid associated payload type should be rejected.";
1879
1880 codecs[1].SetParam("apt", kVp8Codec.id);
1881 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1882
1883 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
1884 rtx_codec2.SetParam("apt", rtx_codec.id);
1885 codecs.push_back(rtx_codec2);
1886
1887 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
1888 "as associated payload type "
1889 "should be rejected.";
1890}
1891
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001892TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
1893 std::vector<cricket::VideoCodec> codecs;
1894 codecs.push_back(kVp8Codec);
1895 codecs[0].id = 99;
1896 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1897}
1898
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001899TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001900 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001901
1902 FakeVideoReceiveStream* stream = AddRecvStream();
1903 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
pbos@webrtc.org776e6f22014-10-29 15:28:39 +00001904 EXPECT_EQ(engine_.codecs()[0].name, config.decoders[0].payload_name);
1905 EXPECT_EQ(engine_.codecs()[0].id, config.decoders[0].payload_type);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001906}
1907
1908TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
1909 std::vector<VideoCodec> codecs;
1910 codecs.push_back(kVp8Codec);
1911 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
1912 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1913}
1914
1915// TODO(pbos): Enable VP9 through external codec support
1916TEST_F(WebRtcVideoChannel2Test,
1917 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
1918 std::vector<VideoCodec> codecs;
1919 codecs.push_back(kVp8Codec);
1920 codecs.push_back(kVp9Codec);
1921 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1922}
1923
1924TEST_F(WebRtcVideoChannel2Test,
1925 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
1926 std::vector<VideoCodec> codecs;
1927 codecs.push_back(kVp8Codec);
1928 codecs.push_back(kVp9Codec);
1929 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1930 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
1931}
1932
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001933TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
1934 std::vector<VideoCodec> codecs;
1935 codecs.push_back(kVp8Codec);
1936 codecs.push_back(kUlpfecCodec);
1937 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1938
1939 FakeVideoReceiveStream* stream = AddRecvStream();
1940 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1941
1942 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1943
1944 codecs.pop_back();
1945 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
pbos@webrtc.org42684be2014-10-03 11:25:45 +00001946 stream = fake_call_->GetVideoReceiveStreams()[0];
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001947 ASSERT_TRUE(stream != NULL);
1948 config = stream->GetConfig();
1949 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1950 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001951}
1952
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001953TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
1954 std::vector<VideoCodec> codecs;
1955 codecs.push_back(kVp8Codec);
1956 codecs.push_back(kRedCodec);
1957 codecs[1].id = codecs[0].id;
1958 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1959}
1960
1961TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
1962 std::vector<VideoCodec> codecs;
1963 codecs.push_back(kVp8Codec);
1964 codecs.push_back(kVp9Codec);
1965 codecs[1].id = codecs[0].id;
1966 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1967}
1968
1969TEST_F(WebRtcVideoChannel2Test,
1970 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
1971 std::vector<VideoCodec> codecs;
1972 codecs.push_back(kVp8Codec);
1973 codecs.push_back(kVp8Codec);
1974 codecs[1].id += 1;
1975 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1976}
1977
1978TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
1979 EXPECT_FALSE(AddSendStream()->IsSending());
1980}
1981
pbos@webrtc.org85f42942014-07-22 09:14:58 +00001982TEST_F(WebRtcVideoChannel2Test, ReceiveStreamReceivingByDefault) {
1983 EXPECT_TRUE(AddRecvStream()->IsReceiving());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001984}
1985
1986TEST_F(WebRtcVideoChannel2Test, SetSend) {
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +00001987 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001988 EXPECT_FALSE(stream->IsSending());
1989
1990 // false->true
1991 EXPECT_TRUE(channel_->SetSend(true));
1992 EXPECT_TRUE(stream->IsSending());
1993 // true->true
1994 EXPECT_TRUE(channel_->SetSend(true));
1995 EXPECT_TRUE(stream->IsSending());
1996 // true->false
1997 EXPECT_TRUE(channel_->SetSend(false));
1998 EXPECT_FALSE(stream->IsSending());
1999 // false->false
2000 EXPECT_TRUE(channel_->SetSend(false));
2001 EXPECT_FALSE(stream->IsSending());
2002
2003 EXPECT_TRUE(channel_->SetSend(true));
2004 FakeVideoSendStream* new_stream = AddSendStream();
2005 EXPECT_TRUE(new_stream->IsSending())
2006 << "Send stream created after SetSend(true) not sending initially.";
2007}
2008
pbos@webrtc.orgd8198032014-11-10 14:41:43 +00002009// This test verifies DSCP settings are properly applied on video media channel.
2010TEST_F(WebRtcVideoChannel2Test, TestSetDscpOptions) {
2011 rtc::scoped_ptr<cricket::FakeNetworkInterface> network_interface(
2012 new cricket::FakeNetworkInterface);
2013 channel_->SetInterface(network_interface.get());
2014 cricket::VideoOptions options;
2015 options.dscp.Set(true);
2016 EXPECT_TRUE(channel_->SetOptions(options));
2017 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
2018 // Verify previous value is not modified if dscp option is not set.
2019 cricket::VideoOptions options1;
2020 EXPECT_TRUE(channel_->SetOptions(options1));
2021 EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
2022 options.dscp.Set(false);
2023 EXPECT_TRUE(channel_->SetOptions(options));
2024 EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
2025 channel_->SetInterface(NULL);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002026}
2027
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002028TEST_F(WebRtcVideoChannel2Test, OnReadyToSendSignalsNetworkState) {
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002029 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002030
2031 channel_->OnReadyToSend(false);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002032 EXPECT_EQ(webrtc::Call::kNetworkDown, fake_call_->GetNetworkState());
pbos@webrtc.org26c0c412014-09-03 16:17:12 +00002033
2034 channel_->OnReadyToSend(true);
pbos@webrtc.org42684be2014-10-03 11:25:45 +00002035 EXPECT_EQ(webrtc::Call::kNetworkUp, fake_call_->GetNetworkState());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002036}
2037
pbos@webrtc.org273a4142014-12-01 15:23:21 +00002038TEST_F(WebRtcVideoChannel2Test, GetStatsReportsUpperResolution) {
2039 FakeVideoSendStream* stream = AddSendStream();
2040 webrtc::VideoSendStream::Stats stats;
2041 stats.substreams[17].sent_width = 123;
2042 stats.substreams[17].sent_height = 40;
2043 stats.substreams[42].sent_width = 80;
2044 stats.substreams[42].sent_height = 31;
2045 stats.substreams[11].sent_width = 20;
2046 stats.substreams[11].sent_height = 90;
2047 stream->SetStats(stats);
2048
2049 cricket::VideoMediaInfo info;
2050 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
2051 ASSERT_EQ(1u, info.senders.size());
2052 EXPECT_EQ(123, info.senders[0].send_frame_width);
2053 EXPECT_EQ(90, info.senders[0].send_frame_height);
2054}
2055
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002056TEST_F(WebRtcVideoChannel2Test, TranslatesCallStatsCorrectly) {
2057 AddSendStream();
2058 AddSendStream();
2059 webrtc::Call::Stats stats;
2060 stats.rtt_ms = 123;
2061 fake_call_->SetStats(stats);
2062
2063 cricket::VideoMediaInfo info;
2064 ASSERT_TRUE(channel_->GetStats(cricket::StatsOptions(), &info));
2065 ASSERT_EQ(2u, info.senders.size());
2066 EXPECT_EQ(stats.rtt_ms, info.senders[0].rtt_ms);
2067 EXPECT_EQ(stats.rtt_ms, info.senders[1].rtt_ms);
2068}
2069
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002070class WebRtcVideoEngine2SimulcastTest : public testing::Test {
2071 public:
2072 WebRtcVideoEngine2SimulcastTest()
2073 : engine_codecs_(engine_.codecs()) {
2074 assert(!engine_codecs_.empty());
2075
2076 bool codec_set = false;
2077 for (size_t i = 0; i < engine_codecs_.size(); ++i) {
2078 if (engine_codecs_[i].name == "red") {
2079 default_red_codec_ = engine_codecs_[i];
2080 } else if (engine_codecs_[i].name == "ulpfec") {
2081 default_ulpfec_codec_ = engine_codecs_[i];
2082 } else if (engine_codecs_[i].name == "rtx") {
2083 default_rtx_codec_ = engine_codecs_[i];
2084 } else if (!codec_set) {
2085 default_codec_ = engine_codecs_[i];
2086 codec_set = true;
2087 }
2088 }
2089
2090 assert(codec_set);
2091 }
2092
2093 protected:
2094 WebRtcVideoEngine2 engine_;
2095 VideoCodec default_codec_;
2096 VideoCodec default_red_codec_;
2097 VideoCodec default_ulpfec_codec_;
2098 VideoCodec default_rtx_codec_;
2099 // TODO(pbos): Remove engine_codecs_ unless used a lot.
2100 std::vector<VideoCodec> engine_codecs_;
2101};
2102
2103class WebRtcVideoChannel2SimulcastTest : public WebRtcVideoEngine2SimulcastTest,
pbos@webrtc.org86196c42015-02-16 21:02:00 +00002104 public WebRtcCallFactory {
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002105 public:
2106 WebRtcVideoChannel2SimulcastTest() : fake_call_(NULL) {}
2107
2108 virtual void SetUp() OVERRIDE {
2109 engine_.SetCallFactory(this);
2110 engine_.Init(rtc::Thread::Current());
2111 channel_.reset(engine_.CreateChannel(VideoOptions(), NULL));
2112 ASSERT_TRUE(fake_call_ != NULL) << "Call not created through factory.";
2113 last_ssrc_ = 123;
2114 }
2115
2116 protected:
2117 virtual webrtc::Call* CreateCall(
2118 const webrtc::Call::Config& config) OVERRIDE {
2119 assert(fake_call_ == NULL);
2120 fake_call_ = new FakeCall(config);
2121 return fake_call_;
2122 }
2123
2124 void VerifySimulcastSettings(const VideoCodec& codec,
2125 VideoOptions::HighestBitrate bitrate_mode,
2126 size_t num_configured_streams,
2127 size_t expected_num_streams,
2128 SimulcastBitrateMode simulcast_bitrate_mode) {
2129 cricket::VideoOptions options;
2130 options.video_highest_bitrate.Set(bitrate_mode);
2131 EXPECT_TRUE(channel_->SetOptions(options));
2132
2133 std::vector<VideoCodec> codecs;
2134 codecs.push_back(codec);
2135 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
2136
2137 std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs3);
2138 assert(num_configured_streams <= ssrcs.size());
2139 ssrcs.resize(num_configured_streams);
2140
2141 FakeVideoSendStream* stream =
2142 AddSendStream(CreateSimStreamParams("cname", ssrcs));
pbos@webrtc.org86196c42015-02-16 21:02:00 +00002143 // Send a full-size frame to trigger a stream reconfiguration to use all
2144 // expected simulcast layers.
2145 cricket::FakeVideoCapturer capturer;
2146 EXPECT_TRUE(channel_->SetCapturer(ssrcs.front(), &capturer));
2147 EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(cricket::VideoFormat(
2148 codec.width, codec.height,
2149 cricket::VideoFormat::FpsToInterval(30),
2150 cricket::FOURCC_I420)));
2151 channel_->SetSend(true);
2152 EXPECT_TRUE(capturer.CaptureFrame());
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002153
2154 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
2155 ASSERT_EQ(expected_num_streams, video_streams.size());
2156
2157 std::vector<webrtc::VideoStream> expected_streams = GetSimulcastConfig(
2158 num_configured_streams,
2159 simulcast_bitrate_mode,
2160 codec.width,
2161 codec.height,
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002162 0,
2163 kDefaultQpMax,
2164 codec.framerate != 0 ? codec.framerate : kDefaultFramerate);
2165
2166 ASSERT_EQ(expected_streams.size(), video_streams.size());
2167
2168 size_t num_streams = video_streams.size();
2169 for (size_t i = 0; i < num_streams; ++i) {
2170 EXPECT_EQ(expected_streams[i].width, video_streams[i].width);
2171 EXPECT_EQ(expected_streams[i].height, video_streams[i].height);
2172
2173 EXPECT_GT(video_streams[i].max_framerate, 0);
2174 EXPECT_EQ(expected_streams[i].max_framerate,
2175 video_streams[i].max_framerate);
2176
2177 EXPECT_GT(video_streams[i].min_bitrate_bps, 0);
2178 EXPECT_EQ(expected_streams[i].min_bitrate_bps,
2179 video_streams[i].min_bitrate_bps);
2180
2181 EXPECT_GT(video_streams[i].target_bitrate_bps, 0);
2182 EXPECT_EQ(expected_streams[i].target_bitrate_bps,
2183 video_streams[i].target_bitrate_bps);
2184
2185 EXPECT_GT(video_streams[i].max_bitrate_bps, 0);
2186 EXPECT_EQ(expected_streams[i].max_bitrate_bps,
2187 video_streams[i].max_bitrate_bps);
2188
2189 EXPECT_GT(video_streams[i].max_qp, 0);
2190 EXPECT_EQ(expected_streams[i].max_qp, video_streams[i].max_qp);
2191
2192 EXPECT_FALSE(expected_streams[i].temporal_layer_thresholds_bps.empty());
2193 EXPECT_EQ(expected_streams[i].temporal_layer_thresholds_bps,
2194 video_streams[i].temporal_layer_thresholds_bps);
2195 }
pbos@webrtc.org86196c42015-02-16 21:02:00 +00002196 EXPECT_TRUE(channel_->SetCapturer(ssrcs.front(), NULL));
buildbot@webrtc.orga8530772014-12-10 09:01:18 +00002197 }
2198
2199 FakeVideoSendStream* AddSendStream() {
2200 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
2201 }
2202
2203 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
2204 size_t num_streams =
2205 fake_call_->GetVideoSendStreams().size();
2206 EXPECT_TRUE(channel_->AddSendStream(sp));
2207 std::vector<FakeVideoSendStream*> streams =
2208 fake_call_->GetVideoSendStreams();
2209 EXPECT_EQ(num_streams + 1, streams.size());
2210 return streams[streams.size() - 1];
2211 }
2212
2213 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
2214 return fake_call_->GetVideoSendStreams();
2215 }
2216
2217 FakeVideoReceiveStream* AddRecvStream() {
2218 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
2219 }
2220
2221 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
2222 size_t num_streams =
2223 fake_call_->GetVideoReceiveStreams().size();
2224 EXPECT_TRUE(channel_->AddRecvStream(sp));
2225 std::vector<FakeVideoReceiveStream*> streams =
2226 fake_call_->GetVideoReceiveStreams();
2227 EXPECT_EQ(num_streams + 1, streams.size());
2228 return streams[streams.size() - 1];
2229 }
2230
2231 FakeCall* fake_call_;
2232 rtc::scoped_ptr<VideoMediaChannel> channel_;
2233 uint32 last_ssrc_;
2234};
2235
2236TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith2SimulcastStreams) {
2237 VerifySimulcastSettings(kVp8Codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2238}
2239
2240TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith3SimulcastStreams) {
2241 VerifySimulcastSettings(
2242 kVp8Codec720p, VideoOptions::NORMAL, 3, 3, SBM_NORMAL);
2243}
2244
2245TEST_F(WebRtcVideoChannel2SimulcastTest,
2246 SetSendCodecsWith2SimulcastStreamsHighBitrateMode) {
2247 VerifySimulcastSettings(kVp8Codec, VideoOptions::HIGH, 2, 2, SBM_HIGH);
2248}
2249
2250TEST_F(WebRtcVideoChannel2SimulcastTest,
2251 SetSendCodecsWith3SimulcastStreamsHighBitrateMode) {
2252 VerifySimulcastSettings(kVp8Codec720p, VideoOptions::HIGH, 3, 3, SBM_HIGH);
2253}
2254
2255TEST_F(WebRtcVideoChannel2SimulcastTest,
2256 SetSendCodecsWith2SimulcastStreamsVeryHighBitrateMode) {
2257 VerifySimulcastSettings(
2258 kVp8Codec, VideoOptions::VERY_HIGH, 2, 2, SBM_VERY_HIGH);
2259}
2260
2261TEST_F(WebRtcVideoChannel2SimulcastTest,
2262 SetSendCodecsWith3SimulcastStreamsVeryHighBitrateMode) {
2263 VerifySimulcastSettings(
2264 kVp8Codec720p, VideoOptions::VERY_HIGH, 3, 3, SBM_VERY_HIGH);
2265}
2266
2267// Test that we normalize send codec format size in simulcast.
2268TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) {
2269 cricket::VideoCodec codec(kVp8Codec270p);
2270 codec.width += 1;
2271 codec.height += 1;
2272 VerifySimulcastSettings(codec, VideoOptions::NORMAL, 2, 2, SBM_NORMAL);
2273}
2274
2275// Test that if we add a stream with RTX SSRC's, SSRC's get set correctly.
2276TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestStreamWithRtx) {
2277 // TODO(pbos): Implement.
2278 FAIL() << "Not implemented.";
2279}
2280
2281// Test that if we get too few ssrcs are given in AddSendStream(),
2282// only supported sub-streams will be added.
2283TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TooFewSimulcastSsrcs) {
2284 // TODO(pbos): Implement.
2285 FAIL() << "Not implemented.";
2286}
2287
2288// Test that even more than enough ssrcs are given in AddSendStream(),
2289// only supported sub-streams will be added.
2290TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_MoreThanEnoughSimulcastSscrs) {
2291 // TODO(pbos): Implement.
2292 FAIL() << "Not implemented.";
2293}
2294
2295// Test that SetSendStreamFormat works well with simulcast.
2296TEST_F(WebRtcVideoEngine2SimulcastTest,
2297 DISABLED_SetSendStreamFormatWithSimulcast) {
2298 // TODO(pbos): Implement.
2299 FAIL() << "Not implemented.";
2300}
2301
2302// Test that simulcast send codec is reset on new video frame size.
2303TEST_F(WebRtcVideoEngine2SimulcastTest,
2304 DISABLED_ResetSimulcastSendCodecOnNewFrameSize) {
2305 // TODO(pbos): Implement.
2306 FAIL() << "Not implemented.";
2307}
2308
2309// Test that simulcast send codec is reset on new portait mode video frame.
2310TEST_F(WebRtcVideoEngine2SimulcastTest,
2311 DISABLED_ResetSimulcastSendCodecOnNewPortaitFrame) {
2312 // TODO(pbos): Implement.
2313 FAIL() << "Not implemented.";
2314}
2315
2316TEST_F(WebRtcVideoEngine2SimulcastTest,
2317 DISABLED_SetBandwidthInConferenceWithSimulcast) {
2318 // TODO(pbos): Implement.
2319 FAIL() << "Not implemented.";
2320}
2321
2322// Test that sending screencast frames in conference mode changes
2323// bitrate.
2324TEST_F(WebRtcVideoEngine2SimulcastTest,
2325 DISABLED_SetBandwidthScreencastInConference) {
2326 // TODO(pbos): Implement.
2327 FAIL() << "Not implemented.";
2328}
2329
2330// Test AddSendStream with simulcast rejects bad StreamParams.
2331TEST_F(WebRtcVideoEngine2SimulcastTest,
2332 DISABLED_AddSendStreamWithBadStreamParams) {
2333 // TODO(pbos): Implement.
2334 FAIL() << "Not implemented.";
2335}
2336
2337// Test AddSendStream with simulcast sets ssrc and cname correctly.
2338TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_AddSendStreamWithSimulcast) {
2339 // TODO(pbos): Implement.
2340 FAIL() << "Not implemented.";
2341}
2342
2343// Test RemoveSendStream with simulcast.
2344TEST_F(WebRtcVideoEngine2SimulcastTest,
2345 DISABLED_RemoveSendStreamWithSimulcast) {
2346 // TODO(pbos): Implement.
2347 FAIL() << "Not implemented.";
2348}
2349
2350// Test AddSendStream after send codec has already been set will reset
2351// send codec with simulcast settings.
2352TEST_F(WebRtcVideoEngine2SimulcastTest,
2353 DISABLED_AddSimulcastStreamAfterSetSendCodec) {
2354 // TODO(pbos): Implement.
2355 FAIL() << "Not implemented.";
2356}
2357
2358TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_GetStatsWithMultipleSsrcs) {
2359 // TODO(pbos): Implement.
2360 FAIL() << "Not implemented.";
2361}
2362
2363// Test receiving channel(s) local ssrc is set to the same as the first
2364// simulcast sending ssrc.
2365TEST_F(WebRtcVideoEngine2SimulcastTest,
2366 DISABLED_AddSimulcastStreamAfterCreatingRecvChannels) {
2367 // TODO(pbos): Implement.
2368 FAIL() << "Not implemented.";
2369}
2370
2371// Test 1:1 call never turn on simulcast.
2372TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_NoSimulcastWith1on1) {
2373 // TODO(pbos): Implement.
2374 FAIL() << "Not implemented.";
2375}
2376
2377// Test SetOptions with OPT_CONFERENCE flag.
2378TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_SetOptionsWithConferenceMode) {
2379 // TODO(pbos): Implement.
2380 FAIL() << "Not implemented.";
2381}
2382
2383// Test that two different streams can have different formats.
2384TEST_F(WebRtcVideoEngine2SimulcastTest,
2385 DISABLED_MultipleSendStreamsDifferentFormats) {
2386 // TODO(pbos): Implement.
2387 FAIL() << "Not implemented.";
2388}
2389
2390TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToOutputFormat) {
2391 // TODO(pbos): Implement.
2392 FAIL() << "Not implemented.";
2393}
2394
2395TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToCpuLoad) {
2396 // TODO(pbos): Implement.
2397 FAIL() << "Not implemented.";
2398}
2399
2400TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_TestAdaptToCpuLoadDisabled) {
2401 // TODO(pbos): Implement.
2402 FAIL() << "Not implemented.";
2403}
2404
2405TEST_F(WebRtcVideoEngine2SimulcastTest,
2406 DISABLED_TestAdaptWithCpuOveruseObserver) {
2407 // TODO(pbos): Implement.
2408 FAIL() << "Not implemented.";
2409}
2410
2411// Test that codec is not reset for every frame sent in non-conference and
2412// non-screencast mode.
2413TEST_F(WebRtcVideoEngine2SimulcastTest, DISABLED_DontResetCodecOnSendFrame) {
2414 // TODO(pbos): Implement.
2415 FAIL() << "Not implemented.";
2416}
2417
2418TEST_F(WebRtcVideoEngine2SimulcastTest,
2419 DISABLED_UseSimulcastAdapterOnVp8OnlyFactory) {
2420 // TODO(pbos): Implement.
2421 FAIL() << "Not implemented.";
2422}
2423
2424TEST_F(WebRtcVideoEngine2SimulcastTest,
2425 DISABLED_DontUseSimulcastAdapterOnNoneVp8Factory) {
2426 // TODO(pbos): Implement.
2427 FAIL() << "Not implemented.";
2428}
2429
2430TEST_F(WebRtcVideoEngine2SimulcastTest,
2431 DISABLED_DontUseSimulcastAdapterOnMultipleCodecsFactory) {
2432 // TODO(pbos): Implement.
2433 FAIL() << "Not implemented.";
2434}
2435
2436TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x800) {
2437 // TODO(pbos): Implement.
2438 FAIL() << "Not implemented.";
2439}
2440
2441TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_1280x720) {
2442 // TODO(pbos): Implement.
2443 FAIL() << "Not implemented.";
2444}
2445
2446TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x540) {
2447 // TODO(pbos): Implement.
2448 FAIL() << "Not implemented.";
2449}
2450
2451TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_960x600) {
2452 // TODO(pbos): Implement.
2453 FAIL() << "Not implemented.";
2454}
2455
2456TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x400) {
2457 // TODO(pbos): Implement.
2458 FAIL() << "Not implemented.";
2459}
2460
2461TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_640x360) {
2462 // TODO(pbos): Implement.
2463 FAIL() << "Not implemented.";
2464}
2465
2466TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_480x300) {
2467 // TODO(pbos): Implement.
2468 FAIL() << "Not implemented.";
2469}
2470
2471TEST_F(WebRtcVideoChannel2SimulcastTest,
2472 DISABLED_DISABLED_SimulcastSend_480x270) {
2473 // TODO(pbos): Implement.
2474 FAIL() << "Not implemented.";
2475}
2476
2477TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x200) {
2478 // TODO(pbos): Implement.
2479 FAIL() << "Not implemented.";
2480}
2481
2482TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastSend_320x180) {
2483 // TODO(pbos): Implement.
2484 FAIL() << "Not implemented.";
2485}
2486
2487// Test reset send codec with simulcast.
2488// Disabled per b/6773425
2489TEST_F(WebRtcVideoChannel2SimulcastTest,
2490 DISABLED_DISABLED_SimulcastResetSendCodec) {
2491 // TODO(pbos): Implement.
2492 FAIL() << "Not implemented.";
2493}
2494
2495// Test simulcast streams are decodeable with expected sizes.
2496TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_SimulcastStreams) {
2497 // TODO(pbos): Implement.
2498 FAIL() << "Not implemented.";
2499}
2500
2501// Simulcast and resolution resizing should be turned off when screencasting
2502// but not otherwise.
2503TEST_F(WebRtcVideoChannel2SimulcastTest, DISABLED_ScreencastRendering) {
2504 // TODO(pbos): Implement.
2505 FAIL() << "Not implemented.";
2506}
2507
2508// Ensures that the correct settings are applied to the codec when single
2509// temporal layer screencasting is enabled, and that the correct simulcast
2510// settings are reapplied when disabling screencasting.
2511TEST_F(WebRtcVideoChannel2SimulcastTest,
2512 DISABLED_OneTemporalLayerScreencastSettings) {
2513 // TODO(pbos): Implement.
2514 FAIL() << "Not implemented.";
2515}
2516
2517// Ensures that the correct settings are applied to the codec when two temporal
2518// layer screencasting is enabled, and that the correct simulcast settings are
2519// reapplied when disabling screencasting.
2520TEST_F(WebRtcVideoChannel2SimulcastTest,
2521 DISABLED_TwoTemporalLayerScreencastSettings) {
2522 // TODO(pbos): Implement.
2523 FAIL() << "Not implemented.";
2524}
pbos@webrtc.org2b19f062014-12-11 13:26:09 +00002525
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00002526} // namespace cricket