blob: 5953f348d5d362c7221d540bc750d76c6a754aa9 [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
28#include <map>
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000029#include <vector>
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000030
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000031#include "webrtc/base/gunit.h"
32#include "webrtc/base/stringutils.h"
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000033#include "talk/media/base/testutils.h"
34#include "talk/media/base/videoengine_unittest.h"
35#include "talk/media/webrtc/webrtcvideoengine2.h"
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000036#include "talk/media/webrtc/webrtcvideoengine2_unittest.h"
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000037#include "talk/media/webrtc/webrtcvideochannelfactory.h"
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000038
39namespace {
40static const cricket::VideoCodec kVp8Codec720p(100, "VP8", 1280, 720, 30, 0);
41static const cricket::VideoCodec kVp8Codec360p(100, "VP8", 640, 360, 30, 0);
42static const cricket::VideoCodec kVp8Codec270p(100, "VP8", 480, 270, 30, 0);
43static const cricket::VideoCodec kVp8Codec180p(100, "VP8", 320, 180, 30, 0);
44
45static const cricket::VideoCodec kVp8Codec(100, "VP8", 640, 400, 30, 0);
46static const cricket::VideoCodec kVp9Codec(101, "VP9", 640, 400, 30, 0);
47static const cricket::VideoCodec kRedCodec(116, "red", 0, 0, 0, 0);
48static const cricket::VideoCodec kUlpfecCodec(117, "ulpfec", 0, 0, 0, 0);
49
50static const uint32 kSsrcs1[] = {1};
51static const uint32 kRtxSsrcs1[] = {4};
pbos@webrtc.org3c107582014-07-20 15:27:35 +000052static const char kUnsupportedExtensionName[] =
53 "urn:ietf:params:rtp-hdrext:unsupported";
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +000054
55void VerifyCodecHasDefaultFeedbackParams(const cricket::VideoCodec& codec) {
56 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
57 cricket::kRtcpFbParamNack, cricket::kParamValueEmpty)));
58 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
59 cricket::kRtcpFbParamNack, cricket::kRtcpFbNackParamPli)));
60 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
61 cricket::kRtcpFbParamRemb, cricket::kParamValueEmpty)));
62 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
63 cricket::kRtcpFbParamCcm, cricket::kRtcpFbCcmParamFir)));
64}
65
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000066} // namespace
67
68namespace cricket {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000069FakeVideoSendStream::FakeVideoSendStream(
70 const webrtc::VideoSendStream::Config& config,
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +000071 const std::vector<webrtc::VideoStream>& video_streams,
72 const void* encoder_settings)
73 : sending_(false),
74 config_(config),
75 codec_settings_set_(false) {
76 assert(config.encoder_settings.encoder != NULL);
77 ReconfigureVideoEncoder(video_streams, encoder_settings);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000078}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000079
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000080webrtc::VideoSendStream::Config FakeVideoSendStream::GetConfig() {
81 return config_;
82}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000083
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000084std::vector<webrtc::VideoStream> FakeVideoSendStream::GetVideoStreams() {
85 return video_streams_;
86}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000087
pbos@webrtc.org85f42942014-07-22 09:14:58 +000088bool FakeVideoSendStream::IsSending() const {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000089 return sending_;
90}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000091
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +000092bool FakeVideoSendStream::GetVp8Settings(
93 webrtc::VideoCodecVP8* settings) const {
94 if (!codec_settings_set_) {
95 return false;
96 }
97
98 *settings = vp8_settings_;
99 return true;
100}
101
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000102webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() const {
103 return webrtc::VideoSendStream::Stats();
104}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000105
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000106bool FakeVideoSendStream::ReconfigureVideoEncoder(
107 const std::vector<webrtc::VideoStream>& streams,
108 const void* encoder_specific) {
109 video_streams_ = streams;
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000110 if (encoder_specific != NULL) {
111 assert(config_.encoder_settings.payload_name == "VP8");
112 vp8_settings_ =
113 *reinterpret_cast<const webrtc::VideoCodecVP8*>(encoder_specific);
114 }
115 codec_settings_set_ = encoder_specific != NULL;
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000116 return true;
117}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000118
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000119webrtc::VideoSendStreamInput* FakeVideoSendStream::Input() {
120 // TODO(pbos): Fix.
121 return NULL;
122}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000123
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000124void FakeVideoSendStream::Start() {
125 sending_ = true;
126}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000127
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000128void FakeVideoSendStream::Stop() {
129 sending_ = false;
130}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000131
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000132FakeVideoReceiveStream::FakeVideoReceiveStream(
133 const webrtc::VideoReceiveStream::Config& config)
134 : config_(config), receiving_(false) {
135}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000136
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000137webrtc::VideoReceiveStream::Config FakeVideoReceiveStream::GetConfig() {
138 return config_;
139}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000140
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000141bool FakeVideoReceiveStream::IsReceiving() const {
142 return receiving_;
143}
144
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000145webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const {
146 return webrtc::VideoReceiveStream::Stats();
147}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000148
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000149void FakeVideoReceiveStream::Start() {
150 receiving_ = true;
151}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000152
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000153void FakeVideoReceiveStream::Stop() {
154 receiving_ = false;
155}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000156
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000157void FakeVideoReceiveStream::GetCurrentReceiveCodec(webrtc::VideoCodec* codec) {
158}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000159
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000160FakeCall::FakeCall() { SetVideoCodecs(GetDefaultVideoCodecs()); }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000161
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000162FakeCall::~FakeCall() {
163 EXPECT_EQ(0u, video_send_streams_.size());
164 EXPECT_EQ(0u, video_receive_streams_.size());
165}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000166
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000167void FakeCall::SetVideoCodecs(const std::vector<webrtc::VideoCodec> codecs) {
168 codecs_ = codecs;
169}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000170
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000171std::vector<FakeVideoSendStream*> FakeCall::GetVideoSendStreams() {
172 return video_send_streams_;
173}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000174
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000175std::vector<FakeVideoReceiveStream*> FakeCall::GetVideoReceiveStreams() {
176 return video_receive_streams_;
177}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000178
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000179webrtc::VideoCodec FakeCall::GetEmptyVideoCodec() {
180 webrtc::VideoCodec codec;
181 codec.minBitrate = 300;
182 codec.startBitrate = 800;
183 codec.maxBitrate = 1500;
184 codec.maxFramerate = 10;
185 codec.width = 640;
186 codec.height = 480;
187 codec.qpMax = 56;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000188
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000189 return codec;
190}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000191
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000192webrtc::VideoCodec FakeCall::GetVideoCodecVp8() {
193 webrtc::VideoCodec vp8_codec = GetEmptyVideoCodec();
194 vp8_codec.codecType = webrtc::kVideoCodecVP8;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000195 rtc::strcpyn(vp8_codec.plName, ARRAY_SIZE(vp8_codec.plName),
pbos@webrtc.orgcb859ec2014-07-15 08:28:20 +0000196 kVp8Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000197 vp8_codec.plType = kVp8Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000198
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000199 return vp8_codec;
200}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000201
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000202webrtc::VideoCodec FakeCall::GetVideoCodecVp9() {
203 webrtc::VideoCodec vp9_codec = GetEmptyVideoCodec();
204 // TODO(pbos): Add a correct codecType when webrtc has one.
205 vp9_codec.codecType = webrtc::kVideoCodecVP8;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000206 rtc::strcpyn(vp9_codec.plName, ARRAY_SIZE(vp9_codec.plName),
pbos@webrtc.orgcb859ec2014-07-15 08:28:20 +0000207 kVp9Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000208 vp9_codec.plType = kVp9Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000209
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000210 return vp9_codec;
211}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000212
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000213std::vector<webrtc::VideoCodec> FakeCall::GetDefaultVideoCodecs() {
214 std::vector<webrtc::VideoCodec> codecs;
215 codecs.push_back(GetVideoCodecVp8());
216 // codecs.push_back(GetVideoCodecVp9());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000217
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000218 return codecs;
219}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000220
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000221webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
222 const webrtc::VideoSendStream::Config& config,
223 const std::vector<webrtc::VideoStream>& video_streams,
224 const void* encoder_settings) {
225 FakeVideoSendStream* fake_stream =
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +0000226 new FakeVideoSendStream(config, video_streams, encoder_settings);
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000227 video_send_streams_.push_back(fake_stream);
228 return fake_stream;
229}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000230
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000231void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
232 FakeVideoSendStream* fake_stream =
233 static_cast<FakeVideoSendStream*>(send_stream);
234 for (size_t i = 0; i < video_send_streams_.size(); ++i) {
235 if (video_send_streams_[i] == fake_stream) {
236 delete video_send_streams_[i];
237 video_send_streams_.erase(video_send_streams_.begin() + i);
238 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000239 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000240 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000241 ADD_FAILURE() << "DestroyVideoSendStream called with unknown paramter.";
242}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000243
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000244webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
245 const webrtc::VideoReceiveStream::Config& config) {
246 video_receive_streams_.push_back(new FakeVideoReceiveStream(config));
247 return video_receive_streams_[video_receive_streams_.size() - 1];
248}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000249
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000250void FakeCall::DestroyVideoReceiveStream(
251 webrtc::VideoReceiveStream* receive_stream) {
252 FakeVideoReceiveStream* fake_stream =
253 static_cast<FakeVideoReceiveStream*>(receive_stream);
254 for (size_t i = 0; i < video_receive_streams_.size(); ++i) {
255 if (video_receive_streams_[i] == fake_stream) {
256 delete video_receive_streams_[i];
257 video_receive_streams_.erase(video_receive_streams_.begin() + i);
258 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000259 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000260 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000261 ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown paramter.";
262}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000263
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000264webrtc::PacketReceiver* FakeCall::Receiver() {
265 // TODO(pbos): Fix this.
266 return NULL;
267}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000268
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000269uint32_t FakeCall::SendBitrateEstimate() {
270 return 0;
271}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000272
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000273uint32_t FakeCall::ReceiveBitrateEstimate() {
274 return 0;
275}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000276
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000277FakeWebRtcVideoChannel2::FakeWebRtcVideoChannel2(
278 FakeCall* call,
279 WebRtcVideoEngine2* engine,
280 VoiceMediaChannel* voice_channel)
281 : WebRtcVideoChannel2(call, engine, engine->GetVideoEncoderFactory()),
282 fake_call_(call),
283 voice_channel_(voice_channel) {
284}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000285
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000286FakeWebRtcVideoChannel2::~FakeWebRtcVideoChannel2() {
287}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000288
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000289VoiceMediaChannel* FakeWebRtcVideoChannel2::GetVoiceChannel() {
290 return voice_channel_;
291}
292FakeCall* FakeWebRtcVideoChannel2::GetFakeCall() {
293 return fake_call_;
294}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000295
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000296FakeWebRtcVideoChannel2* FakeWebRtcVideoMediaChannelFactory::GetFakeChannel(
297 VideoMediaChannel* channel) {
298 return channel_map_[channel];
299}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000300
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000301WebRtcVideoChannel2* FakeWebRtcVideoMediaChannelFactory::Create(
302 WebRtcVideoEngine2* engine,
303 VoiceMediaChannel* voice_channel) {
304 FakeWebRtcVideoChannel2* channel =
305 new FakeWebRtcVideoChannel2(new FakeCall(), engine, voice_channel);
306 channel_map_[channel] = channel;
307 return channel;
308}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000309
310class WebRtcVideoEngine2Test : public testing::Test {
311 public:
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000312 WebRtcVideoEngine2Test() : engine_(&factory_) {
313 std::vector<VideoCodec> engine_codecs = engine_.codecs();
314 assert(!engine_codecs.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000315 bool codec_set = false;
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000316 for (size_t i = 0; i < engine_codecs.size(); ++i) {
317 if (engine_codecs[i].name == "red") {
318 default_red_codec_ = engine_codecs[i];
319 } else if (engine_codecs[i].name == "ulpfec") {
320 default_ulpfec_codec_ = engine_codecs[i];
321 } else if (engine_codecs[i].name == "rtx") {
322 default_rtx_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000323 } else if (!codec_set) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000324 default_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000325 codec_set = true;
326 }
327 }
328
329 assert(codec_set);
330 }
331
332 protected:
333 FakeWebRtcVideoMediaChannelFactory factory_;
334 WebRtcVideoEngine2 engine_;
335 VideoCodec default_codec_;
336 VideoCodec default_red_codec_;
337 VideoCodec default_ulpfec_codec_;
338 VideoCodec default_rtx_codec_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000339};
340
341TEST_F(WebRtcVideoEngine2Test, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000342 rtc::scoped_ptr<VideoMediaChannel> channel(engine_.CreateChannel(NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000343 ASSERT_TRUE(channel.get() != NULL) << "Could not create channel.";
344 EXPECT_TRUE(factory_.GetFakeChannel(channel.get()) != NULL)
345 << "Channel not created through factory.";
346}
347
348TEST_F(WebRtcVideoEngine2Test, CreateChannelWithVoiceEngine) {
349 VoiceMediaChannel* voice_channel = reinterpret_cast<VoiceMediaChannel*>(0x42);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000350 rtc::scoped_ptr<VideoMediaChannel> channel(
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000351 engine_.CreateChannel(voice_channel));
352 ASSERT_TRUE(channel.get() != NULL) << "Could not create channel.";
353
354 FakeWebRtcVideoChannel2* fake_channel =
355 factory_.GetFakeChannel(channel.get());
356 ASSERT_TRUE(fake_channel != NULL) << "Channel not created through factory.";
357
358 EXPECT_TRUE(fake_channel->GetVoiceChannel() != NULL)
359 << "VoiceChannel not set.";
360 EXPECT_EQ(voice_channel, fake_channel->GetVoiceChannel())
361 << "Different VoiceChannel set than the provided one.";
362}
363
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000364TEST_F(WebRtcVideoEngine2Test, FindCodec) {
365 const std::vector<cricket::VideoCodec>& c = engine_.codecs();
366 EXPECT_EQ(4U, c.size());
367
368 cricket::VideoCodec vp8(104, "VP8", 320, 200, 30, 0);
369 EXPECT_TRUE(engine_.FindCodec(vp8));
370
371 cricket::VideoCodec vp8_ci(104, "vp8", 320, 200, 30, 0);
372 EXPECT_TRUE(engine_.FindCodec(vp8));
373
374 cricket::VideoCodec vp8_diff_fr_diff_pref(104, "VP8", 320, 200, 50, 50);
375 EXPECT_TRUE(engine_.FindCodec(vp8_diff_fr_diff_pref));
376
377 cricket::VideoCodec vp8_diff_id(95, "VP8", 320, 200, 30, 0);
378 EXPECT_FALSE(engine_.FindCodec(vp8_diff_id));
379 vp8_diff_id.id = 97;
380 EXPECT_TRUE(engine_.FindCodec(vp8_diff_id));
381
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000382 // FindCodec ignores the codec size.
383 // Test that FindCodec can accept uncommon codec size.
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000384 cricket::VideoCodec vp8_diff_res(104, "VP8", 320, 111, 30, 0);
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000385 EXPECT_TRUE(engine_.FindCodec(vp8_diff_res));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000386
387 // PeerConnection doesn't negotiate the resolution at this point.
388 // Test that FindCodec can handle the case when width/height is 0.
389 cricket::VideoCodec vp8_zero_res(104, "VP8", 0, 0, 30, 0);
390 EXPECT_TRUE(engine_.FindCodec(vp8_zero_res));
391
392 cricket::VideoCodec red(101, "RED", 0, 0, 30, 0);
393 EXPECT_TRUE(engine_.FindCodec(red));
394
395 cricket::VideoCodec red_ci(101, "red", 0, 0, 30, 0);
396 EXPECT_TRUE(engine_.FindCodec(red));
397
398 cricket::VideoCodec fec(102, "ULPFEC", 0, 0, 30, 0);
399 EXPECT_TRUE(engine_.FindCodec(fec));
400
401 cricket::VideoCodec fec_ci(102, "ulpfec", 0, 0, 30, 0);
402 EXPECT_TRUE(engine_.FindCodec(fec));
403
404 cricket::VideoCodec rtx(96, "rtx", 0, 0, 30, 0);
405 EXPECT_TRUE(engine_.FindCodec(rtx));
406}
407
408TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
409 std::vector<VideoCodec> engine_codecs = engine_.codecs();
410 for (size_t i = 0; i < engine_codecs.size(); ++i) {
411 if (engine_codecs[i].name != kRtxCodecName)
412 continue;
413 int associated_payload_type;
414 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
415 &associated_payload_type));
416 EXPECT_EQ(default_codec_.id, associated_payload_type);
417 return;
418 }
419 FAIL() << "No RTX codec found among default codecs.";
420}
421
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000422TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
423 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
424 ASSERT_FALSE(extensions.empty());
425 for (size_t i = 0; i < extensions.size(); ++i) {
426 if (extensions[i].uri == kRtpTimestampOffsetHeaderExtension) {
427 EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extensions[i].id);
428 return;
429 }
430 }
431 FAIL() << "Timestamp offset extension not in header-extension list.";
432}
433
434TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
435 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
436 ASSERT_FALSE(extensions.empty());
437 for (size_t i = 0; i < extensions.size(); ++i) {
438 if (extensions[i].uri == kRtpAbsoluteSenderTimeHeaderExtension) {
439 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId,
440 extensions[i].id);
441 return;
442 }
443 }
444 FAIL() << "Absolute Sender Time extension not in header-extension list.";
445}
446
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000447TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000448 rtc::scoped_ptr<VideoMediaChannel> channel(engine_.CreateChannel(NULL));
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000449
450 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
451
452 EXPECT_FALSE(channel->SetSend(true))
453 << "Channel should not start without codecs.";
454 EXPECT_TRUE(channel->SetSend(false))
455 << "Channel should be stoppable even without set codecs.";
456}
457
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000458TEST_F(WebRtcVideoEngine2Test, GetStatsWithoutSendCodecsSetDoesNotCrash) {
459 rtc::scoped_ptr<VideoMediaChannel> channel(engine_.CreateChannel(NULL));
460 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
461 VideoMediaInfo info;
462 channel->GetStats(&info);
463}
464
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000465class WebRtcVideoEngine2BaseTest
466 : public VideoEngineTest<cricket::WebRtcVideoEngine2> {
467 protected:
468 typedef VideoEngineTest<cricket::WebRtcVideoEngine2> Base;
469};
470
471#define WEBRTC_ENGINE_BASE_TEST(test) \
472 TEST_F(WebRtcVideoEngine2BaseTest, test) { Base::test##Body(); }
473
474WEBRTC_ENGINE_BASE_TEST(ConstrainNewCodec2);
475
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000476class WebRtcVideoChannel2BaseTest
477 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
478 protected:
479 virtual cricket::VideoCodec DefaultCodec() OVERRIDE { return kVp8Codec; }
480 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
481};
482
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000483#define WEBRTC_BASE_TEST(test) \
484 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); }
485
486#define WEBRTC_DISABLED_BASE_TEST(test) \
487 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_ ## test) { Base::test(); }
488
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000489// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
490#if 0
491// TODO(juberti): Figure out why ViE is munging the COM refcount.
492#ifdef WIN32
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000493WEBRTC_DISABLED_BASE_TEST(CheckCoInitialize) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000494 Base::CheckCoInitialize();
495}
496#endif
497#endif
498
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000499WEBRTC_BASE_TEST(SetSend);
500WEBRTC_BASE_TEST(SetSendWithoutCodecs);
501WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000502
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000503WEBRTC_BASE_TEST(GetStats);
504WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
505WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000506
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000507WEBRTC_BASE_TEST(SetSendBandwidth);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000508
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000509WEBRTC_BASE_TEST(SetSendSsrc);
510WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000511
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000512WEBRTC_BASE_TEST(SetRenderer);
513WEBRTC_BASE_TEST(AddRemoveRecvStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000514
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000515WEBRTC_DISABLED_BASE_TEST(AddRemoveRecvStreamAndRender);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000516
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000517WEBRTC_BASE_TEST(AddRemoveRecvStreamsNoConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000518
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000519WEBRTC_BASE_TEST(AddRemoveSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000520
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000521WEBRTC_BASE_TEST(SimulateConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000522
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000523WEBRTC_BASE_TEST(AddRemoveCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000524
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000525WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000526
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000527WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000528
529// TODO(pbos): Figure out why this fails so often.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000530WEBRTC_DISABLED_BASE_TEST(HighAspectHighHeightCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000531
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000532WEBRTC_BASE_TEST(RejectEmptyStreamParams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000533
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000534WEBRTC_BASE_TEST(AdaptResolution16x10);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000535
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000536WEBRTC_BASE_TEST(AdaptResolution4x3);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000537
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000538WEBRTC_BASE_TEST(MuteStream);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000539
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000540WEBRTC_BASE_TEST(MultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000541
542// TODO(juberti): Restore this test once we support sending 0 fps.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000543WEBRTC_DISABLED_BASE_TEST(AdaptDropAllFrames);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000544// TODO(juberti): Understand why we get decode errors on this test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000545WEBRTC_DISABLED_BASE_TEST(AdaptFramerate);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000546
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000547WEBRTC_BASE_TEST(SetSendStreamFormat0x0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000548
549// TODO(zhurunz): Fix the flakey test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000550WEBRTC_DISABLED_BASE_TEST(SetSendStreamFormat);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000551
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000552TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Vga) {
553 SendAndReceive(cricket::VideoCodec(100, "VP8", 640, 400, 30, 0));
554}
555
556TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Qvga) {
557 SendAndReceive(cricket::VideoCodec(100, "VP8", 320, 200, 30, 0));
558}
559
560TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8SvcQqvga) {
561 SendAndReceive(cricket::VideoCodec(100, "VP8", 160, 100, 30, 0));
562}
563
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000564TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
565 Base::TwoStreamsSendAndReceive(kVp8Codec);
566}
567
568TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
569 Base::TwoStreamsReUseFirstStream(kVp8Codec);
570}
571
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000572WEBRTC_BASE_TEST(SendManyResizeOnce);
573
574// TODO(pbos): Enable and figure out why this fails (or should work).
575TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
576 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL));
577 EXPECT_TRUE(channel_->SetRenderer(kDefaultReceiveSsrc, &renderer_));
578 channel_->UpdateAspectRatio(1280, 720);
579 video_capturer_.reset(new cricket::FakeVideoCapturer);
580 const std::vector<cricket::VideoFormat>* formats =
581 video_capturer_->GetSupportedFormats();
582 cricket::VideoFormat capture_format_hd = (*formats)[0];
583 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(capture_format_hd));
584 EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get()));
585
586 // Capture format HD -> adapt (OnOutputFormatRequest VGA) -> VGA.
587 cricket::VideoCodec codec(100, "VP8", 1280, 720, 30, 0);
588 EXPECT_TRUE(SetOneCodec(codec));
589 codec.width /= 2;
590 codec.height /= 2;
591 EXPECT_TRUE(SetSend(true));
592 EXPECT_TRUE(channel_->SetRender(true));
593 EXPECT_EQ(0, renderer_.num_rendered_frames());
594 EXPECT_TRUE(SendFrame());
595 EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout);
596}
597
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000598class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test {
599 public:
600 virtual void SetUp() OVERRIDE {
601 channel_.reset(engine_.CreateChannel(NULL));
602 fake_channel_ = factory_.GetFakeChannel(channel_.get());
603 last_ssrc_ = 123;
604 ASSERT_TRUE(fake_channel_ != NULL)
605 << "Channel not created through factory.";
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000606 EXPECT_TRUE(fake_channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000607 }
608
609 protected:
610 FakeVideoSendStream* AddSendStream() {
611 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
612 }
613
614 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
615 size_t num_streams =
616 fake_channel_->GetFakeCall()->GetVideoSendStreams().size();
617 EXPECT_TRUE(channel_->AddSendStream(sp));
618 std::vector<FakeVideoSendStream*> streams =
619 fake_channel_->GetFakeCall()->GetVideoSendStreams();
620 EXPECT_EQ(num_streams + 1, streams.size());
621 return streams[streams.size() - 1];
622 }
623
624 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
625 return fake_channel_->GetFakeCall()->GetVideoSendStreams();
626 }
627
628 FakeVideoReceiveStream* AddRecvStream() {
629 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
630 }
631
632 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
633 size_t num_streams =
634 fake_channel_->GetFakeCall()->GetVideoReceiveStreams().size();
635 EXPECT_TRUE(channel_->AddRecvStream(sp));
636 std::vector<FakeVideoReceiveStream*> streams =
637 fake_channel_->GetFakeCall()->GetVideoReceiveStreams();
638 EXPECT_EQ(num_streams + 1, streams.size());
639 return streams[streams.size() - 1];
640 }
641
642 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate,
643 const char* max_bitrate) {
644 std::vector<VideoCodec> codecs;
645 codecs.push_back(kVp8Codec);
646 codecs[0].params[kCodecParamMinBitrate] = min_bitrate;
647 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate;
648 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
649
650 FakeVideoSendStream* stream = AddSendStream();
651
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000652 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
653 ASSERT_EQ(1u, video_streams.size());
654 EXPECT_EQ(atoi(min_bitrate), video_streams.back().min_bitrate_bps / 1000);
655 EXPECT_EQ(atoi(max_bitrate), video_streams.back().max_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000656
657 VideoCodec codec;
658 EXPECT_TRUE(channel_->GetSendCodec(&codec));
659 EXPECT_EQ(min_bitrate, codec.params[kCodecParamMinBitrate]);
660 EXPECT_EQ(max_bitrate, codec.params[kCodecParamMaxBitrate]);
661 }
662
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000663 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
664 const std::string& webrtc_ext) {
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000665 FakeCall* call = fake_channel_->GetFakeCall();
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000666 // Enable extension.
667 const int id = 1;
668 std::vector<cricket::RtpHeaderExtension> extensions;
669 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
670 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
671
672 FakeVideoSendStream* send_stream =
673 AddSendStream(cricket::StreamParams::CreateLegacy(123));
674
675 // Verify the send extension id.
676 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
677 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
678 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
679 // Verify call with same set of extensions returns true.
680 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
681 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
682 // receivers.
683 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
684 ->GetConfig()
685 .rtp.extensions.empty());
686
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000687 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000688 std::vector<cricket::RtpHeaderExtension> empty_extensions;
689 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000690 ASSERT_EQ(1u, call->GetVideoSendStreams().size());
691 send_stream = call->GetVideoSendStreams()[0];
692 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
693
694 // Verify that adding receive RTP header extensions adds them for existing
695 // streams.
696 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
697 send_stream = call->GetVideoSendStreams()[0];
698 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
699 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
700 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000701 }
702
703 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
704 const std::string& webrtc_ext) {
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000705 FakeCall* call = fake_channel_->GetFakeCall();
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000706 // Enable extension.
707 const int id = 1;
708 std::vector<cricket::RtpHeaderExtension> extensions;
709 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
710 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
711
712 FakeVideoReceiveStream* recv_stream =
713 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
714
715 // Verify the recv extension id.
716 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
717 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
718 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
719 // Verify call with same set of extensions returns true.
720 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000721
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000722 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
723 // senders.
724 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
725 ->GetConfig()
726 .rtp.extensions.empty());
727
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000728 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000729 std::vector<cricket::RtpHeaderExtension> empty_extensions;
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000730 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(empty_extensions));
731 ASSERT_EQ(1u, call->GetVideoReceiveStreams().size());
732 recv_stream = call->GetVideoReceiveStreams()[0];
733 EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
734
735 // Verify that adding receive RTP header extensions adds them for existing
736 // streams.
737 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
738 recv_stream = call->GetVideoReceiveStreams()[0];
739 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
740 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
741 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000742 }
743
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000744 rtc::scoped_ptr<VideoMediaChannel> channel_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000745 FakeWebRtcVideoChannel2* fake_channel_;
746 uint32 last_ssrc_;
747};
748
749TEST_F(WebRtcVideoChannel2Test, DISABLED_MaxBitrateResetsWithConferenceMode) {
750 FAIL() << "Not implemented."; // TODO(pbos): Implement.
751}
752
753TEST_F(WebRtcVideoChannel2Test, DISABLED_StartSendBitrate) {
754 // TODO(pbos): Is this test testing vie_ ? this is confusing. No API to set
755 // start send bitrate from outside? Add defaults here that should be kept?
756 std::vector<cricket::VideoCodec> codec_list;
757 codec_list.push_back(kVp8Codec);
758 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
759 const unsigned int kVideoMinSendBitrateKbps = 50;
760 const unsigned int kVideoTargetSendBitrateKbps = 300;
761 const unsigned int kVideoMaxSendBitrateKbps = 2000;
762 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000763 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
764 ASSERT_EQ(1u, video_streams.size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000765 EXPECT_EQ(kVideoMinSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000766 video_streams.back().min_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000767 EXPECT_EQ(kVideoTargetSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000768 video_streams.back().target_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000769 EXPECT_EQ(kVideoMaxSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000770 video_streams.back().max_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000771#if 0
772 // TODO(pbos): un-#if
773 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
774 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
775 kVideoDefaultStartSendBitrateKbps);
776 EXPECT_EQ(0, vie_.StartSend(send_channel));
777
778 // Increase the send bitrate and verify it is used as start bitrate.
779 const unsigned int kVideoSendBitrateBps = 768000;
780 vie_.SetSendBitrates(send_channel, kVideoSendBitrateBps, 0, 0);
781 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
782 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
783 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
784 kVideoSendBitrateBps / 1000);
785
786 // Never set a start bitrate higher than the max bitrate.
787 vie_.SetSendBitrates(send_channel, kVideoMaxSendBitrateKbps + 500, 0, 0);
788 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
789 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
790 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
791 kVideoDefaultStartSendBitrateKbps);
792
793 // Use the default start bitrate if the send bitrate is lower.
794 vie_.SetSendBitrates(send_channel, kVideoDefaultStartSendBitrateKbps - 50, 0,
795 0);
796 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
797 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
798 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
799 kVideoDefaultStartSendBitrateKbps);
800#endif
801}
802
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000803TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000804 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
805 EXPECT_TRUE(channel_->SetSend(true));
806 cricket::VideoOptions options;
807 options.conference_mode.Set(true);
808 EXPECT_TRUE(channel_->SetOptions(options));
809
810 // Send side.
811 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
812 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
813 FakeVideoSendStream* send_stream = AddSendStream(
814 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
815
816 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
817 for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
818 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
819
820 // Receiver side.
821 FakeVideoReceiveStream* recv_stream = AddRecvStream(
822 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
823 ASSERT_GT(recv_stream->GetConfig().rtp.rtx.size(), 0u)
824 << "No SSRCs for RTX configured by AddRecvStream.";
825 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size())
826 << "This test only works with one receive codec. Please update the test.";
827 EXPECT_EQ(rtx_ssrcs[0],
828 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
829 // TODO(pbos): Make sure we set the RTX for correct payloads etc.
830}
831
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000832TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
833 // Setup one channel with an associated RTX stream.
834 cricket::StreamParams params =
835 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
836 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
837 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
838 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
839 EXPECT_EQ(kRtxSsrcs1[0],
840 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000841}
842
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000843TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
844 // Setup one channel without an associated RTX stream.
845 cricket::StreamParams params =
846 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
847 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
848 ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000849}
850
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000851TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
852 FakeVideoSendStream* send_stream =
853 AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
854 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
855
856 FakeVideoReceiveStream* recv_stream =
857 AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
858 ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000859}
860
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000861// Test support for RTP timestamp offset header extension.
862TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
863 TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
864 webrtc::RtpExtension::kTOffset);
865}
866TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
867 TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
868 webrtc::RtpExtension::kTOffset);
869}
870
871// Test support for absolute send time header extension.
872TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
873 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
874 webrtc::RtpExtension::kAbsSendTime);
875}
876TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
877 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
878 webrtc::RtpExtension::kAbsSendTime);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000879}
880
pbos@webrtc.org3c107582014-07-20 15:27:35 +0000881TEST_F(WebRtcVideoChannel2Test,
882 SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
883 const int kUnsupportedId = 1;
884 const int kTOffsetId = 2;
885
886 std::vector<cricket::RtpHeaderExtension> extensions;
887 extensions.push_back(cricket::RtpHeaderExtension(
888 kUnsupportedExtensionName, kUnsupportedId));
889 extensions.push_back(cricket::RtpHeaderExtension(
890 webrtc::RtpExtension::kTOffset, kTOffsetId));
891 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
892 FakeVideoSendStream* send_stream =
893 AddSendStream(cricket::StreamParams::CreateLegacy(123));
894
895 // Only timestamp offset extension is set to send stream,
896 // unsupported rtp extension is ignored.
897 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
898 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
899 send_stream->GetConfig().rtp.extensions[0].name.c_str());
900}
901
902TEST_F(WebRtcVideoChannel2Test,
903 SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
904 const int kUnsupportedId = 1;
905 const int kTOffsetId = 2;
906
907 std::vector<cricket::RtpHeaderExtension> extensions;
908 extensions.push_back(cricket::RtpHeaderExtension(
909 kUnsupportedExtensionName, kUnsupportedId));
910 extensions.push_back(cricket::RtpHeaderExtension(
911 webrtc::RtpExtension::kTOffset, kTOffsetId));
912 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
913 FakeVideoReceiveStream* recv_stream =
914 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
915
916 // Only timestamp offset extension is set to receive stream,
917 // unsupported rtp extension is ignored.
918 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
919 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
920 recv_stream->GetConfig().rtp.extensions[0].name.c_str());
921}
922
923TEST_F(WebRtcVideoChannel2Test,
924 SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
925 const size_t kNumIncorrectIds = 4;
926 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
927 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
928 std::vector<cricket::RtpHeaderExtension> extensions;
929 extensions.push_back(cricket::RtpHeaderExtension(
930 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
931 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions))
932 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
933 }
934}
935
936TEST_F(WebRtcVideoChannel2Test,
937 SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
938 const size_t kNumIncorrectIds = 4;
939 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
940 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
941 std::vector<cricket::RtpHeaderExtension> extensions;
942 extensions.push_back(cricket::RtpHeaderExtension(
943 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
944 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions))
945 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
946 }
947}
948
949TEST_F(WebRtcVideoChannel2Test,
950 SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
951 const int id = 1;
952 std::vector<cricket::RtpHeaderExtension> extensions;
953 extensions.push_back(cricket::RtpHeaderExtension(
954 webrtc::RtpExtension::kTOffset, id));
955 extensions.push_back(cricket::RtpHeaderExtension(
956 kRtpAbsoluteSenderTimeHeaderExtension, id));
957 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
958
959 // Duplicate entries are also not supported.
960 extensions.clear();
961 extensions.push_back(cricket::RtpHeaderExtension(
962 webrtc::RtpExtension::kTOffset, id));
963 extensions.push_back(extensions.back());
964 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
965}
966
967TEST_F(WebRtcVideoChannel2Test,
968 SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
969 const int id = 1;
970 std::vector<cricket::RtpHeaderExtension> extensions;
971 extensions.push_back(cricket::RtpHeaderExtension(
972 webrtc::RtpExtension::kTOffset, id));
973 extensions.push_back(cricket::RtpHeaderExtension(
974 kRtpAbsoluteSenderTimeHeaderExtension, id));
975 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
976
977 // Duplicate entries are also not supported.
978 extensions.clear();
979 extensions.push_back(cricket::RtpHeaderExtension(
980 webrtc::RtpExtension::kTOffset, id));
981 extensions.push_back(extensions.back());
982 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
983}
984
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000985TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
986 FAIL() << "Not implemented."; // TODO(pbos): Implement.
987}
988
989TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
990 FAIL() << "Not implemented."; // TODO(pbos): Implement.
991}
992
993TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
994 FAIL() << "Not implemented."; // TODO(pbos): Implement.
995}
996
997TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
998 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
999 EXPECT_EQ(1u, fake_channel_->GetFakeCall()->GetVideoReceiveStreams().size());
1000}
1001
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001002TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
1003 FakeVideoReceiveStream* stream = AddRecvStream();
1004 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001005}
1006
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001007TEST_F(WebRtcVideoChannel2Test, RembCanBeEnabledAndDisabled) {
1008 FakeVideoReceiveStream* stream = AddRecvStream();
1009 EXPECT_TRUE(stream->GetConfig().rtp.remb);
1010
1011 // Verify that REMB is turned off when codecs without REMB are set.
1012 std::vector<VideoCodec> codecs;
1013 codecs.push_back(kVp8Codec);
1014 EXPECT_TRUE(codecs[0].feedback_params.params().empty());
1015 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1016 stream = fake_channel_->GetFakeCall()->GetVideoReceiveStreams()[0];
1017 EXPECT_FALSE(stream->GetConfig().rtp.remb);
1018
1019 // Verify that REMB is turned on when setting default codecs since the
1020 // default codecs have REMB enabled.
1021 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
1022 stream = fake_channel_->GetFakeCall()->GetVideoReceiveStreams()[0];
1023 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001024}
1025
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001026TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
1027 VerifyCodecHasDefaultFeedbackParams(default_codec_);
1028
pbos@webrtc.org19864742014-05-30 07:35:47 +00001029 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1030 EXPECT_TRUE(channel_->SetSend(true));
1031
1032 // Send side.
1033 FakeVideoSendStream* send_stream =
1034 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1035 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1036
1037 // Receiver side.
1038 FakeVideoReceiveStream* recv_stream =
1039 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1040 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1041
1042 // Nack history size should match between sender and receiver.
1043 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
1044 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001045}
1046
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001047TEST_F(WebRtcVideoChannel2Test, NackCanBeDisabled) {
1048 std::vector<VideoCodec> codecs;
1049 codecs.push_back(kVp8Codec);
1050
1051 // Send side.
1052 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1053 FakeVideoSendStream* send_stream =
1054 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1055 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
1056
1057 // Receiver side.
1058 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1059 FakeVideoReceiveStream* recv_stream =
1060 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1061 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
1062}
1063
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001064TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
1065 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1066}
1067
1068TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
1069 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1070}
1071
1072TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
1073 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1074}
1075
1076TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
1077 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1078}
1079
1080TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
1081 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1082}
1083
1084TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
1085 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1086}
1087
1088TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
1089 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1090}
1091
1092TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
1093 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1094}
1095
1096TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
1097 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1098}
1099
1100TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthScreencast) {
1101 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1102}
1103
1104TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
1105 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1106}
1107
1108TEST_F(WebRtcVideoChannel2Test,
1109 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
1110 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1111}
1112
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001113TEST_F(WebRtcVideoChannel2Test, SuspendBelowMinBitrateDisabledByDefault) {
1114 FakeVideoSendStream* stream = AddSendStream();
1115 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1116}
1117
1118TEST_F(WebRtcVideoChannel2Test, SetOptionsWithSuspendBelowMinBitrate) {
1119 VideoOptions options;
1120 options.suspend_below_min_bitrate.Set(true);
1121 channel_->SetOptions(options);
1122
1123 FakeVideoSendStream* stream = AddSendStream();
1124 EXPECT_TRUE(stream->GetConfig().suspend_below_min_bitrate);
1125
1126 options.suspend_below_min_bitrate.Set(false);
1127 channel_->SetOptions(options);
1128
1129 stream = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0];
1130 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1131}
1132
pbos@webrtc.org543e5892014-07-23 07:01:31 +00001133TEST_F(WebRtcVideoChannel2Test, RedundantPayloadsDisabledByDefault) {
1134 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1135 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1136 FakeVideoSendStream* stream = AddSendStream(
1137 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1138 EXPECT_FALSE(stream->GetConfig().rtp.rtx.pad_with_redundant_payloads);
1139}
1140
1141TEST_F(WebRtcVideoChannel2Test, SetOptionsWithPayloadPadding) {
1142 VideoOptions options;
1143 options.use_payload_padding.Set(true);
1144 channel_->SetOptions(options);
1145
1146 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1147 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1148 FakeVideoSendStream* stream = AddSendStream(
1149 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1150 EXPECT_TRUE(stream->GetConfig().rtp.rtx.pad_with_redundant_payloads);
1151
1152 options.use_payload_padding.Set(false);
1153 channel_->SetOptions(options);
1154
1155 stream = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0];
1156 EXPECT_FALSE(stream->GetConfig().rtp.rtx.pad_with_redundant_payloads);
1157}
1158
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001159TEST_F(WebRtcVideoChannel2Test, Vp8DenoisingEnabledByDefault) {
1160 FakeVideoSendStream* stream = AddSendStream();
1161 webrtc::VideoCodecVP8 vp8_settings;
1162 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1163 EXPECT_TRUE(vp8_settings.denoisingOn);
1164}
1165
1166TEST_F(WebRtcVideoChannel2Test, SetOptionsWithDenoising) {
1167 VideoOptions options;
1168 options.video_noise_reduction.Set(false);
1169 channel_->SetOptions(options);
1170
1171 FakeVideoSendStream* stream = AddSendStream();
1172 webrtc::VideoCodecVP8 vp8_settings;
1173 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1174 EXPECT_FALSE(vp8_settings.denoisingOn);
1175
1176 options.video_noise_reduction.Set(true);
1177 channel_->SetOptions(options);
1178
1179 stream = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0];
1180 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1181 EXPECT_TRUE(vp8_settings.denoisingOn);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001182}
1183
1184TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
1185 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1186}
1187
pbos@webrtc.org8aed9452014-07-26 10:16:49 +00001188TEST_F(WebRtcVideoChannel2Test, DISABLED_SendReceiveBitratesStats) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001189 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1190}
1191
1192TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetAdaptInputToCpuUsage) {
1193 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1194}
1195
1196TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetCpuThreshold) {
1197 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1198}
1199
1200TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetInvalidCpuThreshold) {
1201 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1202}
1203
1204TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldLog) {
1205 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1206}
1207
1208TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldNotLog) {
1209 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1210}
1211
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001212TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001213 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001214
1215 VideoCodec codec;
1216 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001217 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001218
1219 // Using a RTX setup to verify that the default RTX payload type is good.
1220 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1221 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1222 FakeVideoSendStream* stream = AddSendStream(
1223 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1224 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001225
1226 // Make sure NACK and FEC are enabled on the correct payload types.
1227 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
1228 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
1229 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001230
1231 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
1232 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001233 EXPECT_EQ(static_cast<int>(default_rtx_codec_.id),
1234 config.rtp.rtx.payload_type);
1235 // TODO(juberti): Check RTCP, PLI, TMMBR.
1236}
1237
1238TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
1239 std::vector<VideoCodec> codecs;
1240 codecs.push_back(kVp8Codec);
1241 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1242
1243 FakeVideoSendStream* stream = AddSendStream();
1244 webrtc::VideoSendStream::Config config = stream->GetConfig();
1245
1246 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1247 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1248}
1249
1250TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001251 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1252 std::vector<VideoCodec> codecs;
1253 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1254 codecs.push_back(rtx_codec);
1255 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1256 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001257}
1258
1259TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001260 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1261 std::vector<VideoCodec> codecs;
1262 cricket::VideoCodec rtx_codec =
1263 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1264 codecs.push_back(kVp8Codec);
1265 codecs.push_back(rtx_codec);
1266 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1267
1268 cricket::VideoCodec rtx_codec2 =
1269 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1270 codecs.pop_back();
1271 codecs.push_back(rtx_codec2);
1272 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1273 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001274}
1275
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001276TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1277 std::vector<VideoCodec> codecs;
1278 codecs.push_back(kVp8Codec);
1279 codecs.push_back(kUlpfecCodec);
1280 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1281
1282 FakeVideoSendStream* stream = AddSendStream();
1283 webrtc::VideoSendStream::Config config = stream->GetConfig();
1284
1285 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1286
1287 codecs.pop_back();
1288 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1289 stream = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0];
1290 ASSERT_TRUE(stream != NULL);
1291 config = stream->GetConfig();
1292 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1293 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001294}
1295
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001296TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1297 std::vector<VideoCodec> codecs;
1298 codecs.push_back(kVp8Codec720p);
1299 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1300
1301 std::vector<webrtc::VideoStream> streams =
1302 AddSendStream()->GetVideoStreams();
1303 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1304 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1305
1306 codecs.clear();
1307 codecs.push_back(kVp8Codec360p);
1308 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1309 streams = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0]
1310 ->GetVideoStreams();
1311 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1312 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001313}
1314
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001315TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMinMaxBitrate) {
1316 SetSendCodecsShouldWorkForBitrates("10", "20");
1317}
1318
1319TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001320 std::vector<VideoCodec> video_codecs = engine_.codecs();
1321 video_codecs[0].params[kCodecParamMinBitrate] = "30";
1322 video_codecs[0].params[kCodecParamMaxBitrate] = "20";
1323 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001324}
1325
1326TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptLargeMinMaxBitrate) {
1327 SetSendCodecsShouldWorkForBitrates("1000", "2000");
1328}
1329
1330TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1331 static const char* kMaxQuantization = "21";
1332 std::vector<VideoCodec> codecs;
1333 codecs.push_back(kVp8Codec);
1334 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1335 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001336 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1337 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001338
1339 VideoCodec codec;
1340 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1341 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1342}
1343
1344TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1345 std::vector<cricket::VideoCodec> codecs;
1346 codecs.push_back(kVp8Codec);
1347
1348 codecs[0].width = 0;
1349 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1350 << "Codec set though codec width is zero.";
1351
1352 codecs[0].width = kVp8Codec.width;
1353 codecs[0].height = 0;
1354 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1355 << "Codec set though codec height is zero.";
1356}
1357
1358TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
1359 // TODO(pbos): Should we only allow the dynamic range?
1360 static const size_t kNumIncorrectPayloads = 4;
1361 static const int kIncorrectPayloads[kNumIncorrectPayloads] = {-2, -1, 128,
1362 129};
1363 std::vector<cricket::VideoCodec> codecs;
1364 codecs.push_back(kVp8Codec);
1365 for (size_t i = 0; i < kNumIncorrectPayloads; ++i) {
1366 int payload_type = kIncorrectPayloads[i];
1367 codecs[0].id = payload_type;
1368 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1369 << "Bad payload type '" << payload_type << "' accepted.";
1370 }
1371}
1372
1373TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
1374 std::vector<cricket::VideoCodec> codecs;
1375 codecs.push_back(kVp8Codec);
1376 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
1377 codecs[0].id = payload_type;
1378 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
1379 << "Payload type '" << payload_type << "' rejected.";
1380 }
1381}
1382
1383TEST_F(WebRtcVideoChannel2Test, DISABLED_ResetVieSendCodecOnNewFrameSize) {
1384 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1385}
1386
1387TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
1388 std::vector<cricket::VideoCodec> codecs;
1389 codecs.push_back(kVp8Codec);
1390 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1391}
1392
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001393// Test that we set our inbound RTX codecs properly.
1394TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
1395 std::vector<cricket::VideoCodec> codecs;
1396 codecs.push_back(kVp8Codec);
1397 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1398 codecs.push_back(rtx_codec);
1399 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1400 << "RTX codec without associated payload should be rejected.";
1401
1402 codecs[1].SetParam("apt", kVp8Codec.id + 1);
1403 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1404 << "RTX codec with invalid associated payload type should be rejected.";
1405
1406 codecs[1].SetParam("apt", kVp8Codec.id);
1407 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1408
1409 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
1410 rtx_codec2.SetParam("apt", rtx_codec.id);
1411 codecs.push_back(rtx_codec2);
1412
1413 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
1414 "as associated payload type "
1415 "should be rejected.";
1416}
1417
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001418TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
1419 std::vector<cricket::VideoCodec> codecs;
1420 codecs.push_back(kVp8Codec);
1421 codecs[0].id = 99;
1422 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1423}
1424
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001425TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001426 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001427
1428 FakeVideoReceiveStream* stream = AddRecvStream();
1429 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1430 EXPECT_STREQ(engine_.codecs()[0].name.c_str(), config.codecs[0].plName);
1431 EXPECT_EQ(engine_.codecs()[0].id, config.codecs[0].plType);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001432}
1433
1434TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
1435 std::vector<VideoCodec> codecs;
1436 codecs.push_back(kVp8Codec);
1437 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
1438 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1439}
1440
1441// TODO(pbos): Enable VP9 through external codec support
1442TEST_F(WebRtcVideoChannel2Test,
1443 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
1444 std::vector<VideoCodec> codecs;
1445 codecs.push_back(kVp8Codec);
1446 codecs.push_back(kVp9Codec);
1447 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1448}
1449
1450TEST_F(WebRtcVideoChannel2Test,
1451 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
1452 std::vector<VideoCodec> codecs;
1453 codecs.push_back(kVp8Codec);
1454 codecs.push_back(kVp9Codec);
1455 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1456 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
1457}
1458
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001459TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
1460 std::vector<VideoCodec> codecs;
1461 codecs.push_back(kVp8Codec);
1462 codecs.push_back(kUlpfecCodec);
1463 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1464
1465 FakeVideoReceiveStream* stream = AddRecvStream();
1466 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1467
1468 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1469
1470 codecs.pop_back();
1471 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1472 stream = fake_channel_->GetFakeCall()->GetVideoReceiveStreams()[0];
1473 ASSERT_TRUE(stream != NULL);
1474 config = stream->GetConfig();
1475 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1476 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001477}
1478
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001479TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
1480 std::vector<VideoCodec> codecs;
1481 codecs.push_back(kVp8Codec);
1482 codecs.push_back(kRedCodec);
1483 codecs[1].id = codecs[0].id;
1484 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1485}
1486
1487TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
1488 std::vector<VideoCodec> codecs;
1489 codecs.push_back(kVp8Codec);
1490 codecs.push_back(kVp9Codec);
1491 codecs[1].id = codecs[0].id;
1492 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1493}
1494
1495TEST_F(WebRtcVideoChannel2Test,
1496 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
1497 std::vector<VideoCodec> codecs;
1498 codecs.push_back(kVp8Codec);
1499 codecs.push_back(kVp8Codec);
1500 codecs[1].id += 1;
1501 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1502}
1503
1504TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
1505 EXPECT_FALSE(AddSendStream()->IsSending());
1506}
1507
pbos@webrtc.org85f42942014-07-22 09:14:58 +00001508TEST_F(WebRtcVideoChannel2Test, ReceiveStreamReceivingByDefault) {
1509 EXPECT_TRUE(AddRecvStream()->IsReceiving());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001510}
1511
1512TEST_F(WebRtcVideoChannel2Test, SetSend) {
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +00001513 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001514 EXPECT_FALSE(stream->IsSending());
1515
1516 // false->true
1517 EXPECT_TRUE(channel_->SetSend(true));
1518 EXPECT_TRUE(stream->IsSending());
1519 // true->true
1520 EXPECT_TRUE(channel_->SetSend(true));
1521 EXPECT_TRUE(stream->IsSending());
1522 // true->false
1523 EXPECT_TRUE(channel_->SetSend(false));
1524 EXPECT_FALSE(stream->IsSending());
1525 // false->false
1526 EXPECT_TRUE(channel_->SetSend(false));
1527 EXPECT_FALSE(stream->IsSending());
1528
1529 EXPECT_TRUE(channel_->SetSend(true));
1530 FakeVideoSendStream* new_stream = AddSendStream();
1531 EXPECT_TRUE(new_stream->IsSending())
1532 << "Send stream created after SetSend(true) not sending initially.";
1533}
1534
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001535TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetDscpOptions) {
1536 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1537}
1538
1539TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithMaxBitrate) {
1540 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1541}
1542
1543TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithLoweredBitrate) {
1544 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1545}
1546
1547TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsSucceedsWhenSending) {
1548 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1549}
1550
1551TEST_F(WebRtcVideoChannel2Test, DISABLED_ResetCodecOnScreencast) {
1552 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1553}
1554
1555TEST_F(WebRtcVideoChannel2Test, DISABLED_DontResetCodecOnSendFrame) {
1556 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1557}
1558
1559TEST_F(WebRtcVideoChannel2Test,
1560 DISABLED_DontRegisterDecoderIfFactoryIsNotGiven) {
1561 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1562}
1563
1564TEST_F(WebRtcVideoChannel2Test, DISABLED_RegisterDecoderIfFactoryIsGiven) {
1565 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1566}
1567
1568TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterDecoderMultipleTimes) {
1569 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1570}
1571
1572TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterDecoderForNonVP8) {
1573 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1574}
1575
1576TEST_F(WebRtcVideoChannel2Test,
1577 DISABLED_DontRegisterEncoderIfFactoryIsNotGiven) {
1578 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1579}
1580
1581TEST_F(WebRtcVideoChannel2Test, DISABLED_RegisterEncoderIfFactoryIsGiven) {
1582 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1583}
1584
1585TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterEncoderMultipleTimes) {
1586 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1587}
1588
1589TEST_F(WebRtcVideoChannel2Test,
1590 DISABLED_RegisterEncoderWithMultipleSendStreams) {
1591 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1592}
1593
1594TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterEncoderForNonVP8) {
1595 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1596}
1597
1598TEST_F(WebRtcVideoChannel2Test, DISABLED_FeedbackParamsForNonVP8) {
1599 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1600}
1601
1602TEST_F(WebRtcVideoChannel2Test, DISABLED_ExternalCodecAddedToTheEnd) {
1603 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1604}
1605
1606TEST_F(WebRtcVideoChannel2Test, DISABLED_ExternalCodecIgnored) {
1607 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1608}
1609
1610TEST_F(WebRtcVideoChannel2Test, DISABLED_UpdateEncoderCodecsAfterSetFactory) {
1611 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1612}
1613
1614TEST_F(WebRtcVideoChannel2Test, DISABLED_OnReadyToSend) {
1615 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1616}
1617
1618TEST_F(WebRtcVideoChannel2Test, DISABLED_CaptureFrameTimestampToNtpTimestamp) {
1619 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1620}
1621} // namespace cricket