blob: 4f69f6d3c20e09eeaa2c385ef48eee16d0963467 [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
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000031#include "talk/media/base/testutils.h"
32#include "talk/media/base/videoengine_unittest.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000033#include "talk/media/webrtc/webrtcvideochannelfactory.h"
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000034#include "talk/media/webrtc/webrtcvideoengine2.h"
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000035#include "talk/media/webrtc/webrtcvideoengine2_unittest.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000036#include "webrtc/base/gunit.h"
37#include "webrtc/base/stringutils.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.orgb648b9d2014-08-26 11:08:06 +0000312 WebRtcVideoEngine2Test() {
313 engine_.SetChannelFactory(&factory_);
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000314 std::vector<VideoCodec> engine_codecs = engine_.codecs();
315 assert(!engine_codecs.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000316 bool codec_set = false;
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000317 for (size_t i = 0; i < engine_codecs.size(); ++i) {
318 if (engine_codecs[i].name == "red") {
319 default_red_codec_ = engine_codecs[i];
320 } else if (engine_codecs[i].name == "ulpfec") {
321 default_ulpfec_codec_ = engine_codecs[i];
322 } else if (engine_codecs[i].name == "rtx") {
323 default_rtx_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000324 } else if (!codec_set) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000325 default_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000326 codec_set = true;
327 }
328 }
329
330 assert(codec_set);
331 }
332
333 protected:
334 FakeWebRtcVideoMediaChannelFactory factory_;
335 WebRtcVideoEngine2 engine_;
336 VideoCodec default_codec_;
337 VideoCodec default_red_codec_;
338 VideoCodec default_ulpfec_codec_;
339 VideoCodec default_rtx_codec_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000340};
341
342TEST_F(WebRtcVideoEngine2Test, CreateChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000343 rtc::scoped_ptr<VideoMediaChannel> channel(engine_.CreateChannel(NULL));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000344 ASSERT_TRUE(channel.get() != NULL) << "Could not create channel.";
345 EXPECT_TRUE(factory_.GetFakeChannel(channel.get()) != NULL)
346 << "Channel not created through factory.";
347}
348
349TEST_F(WebRtcVideoEngine2Test, CreateChannelWithVoiceEngine) {
350 VoiceMediaChannel* voice_channel = reinterpret_cast<VoiceMediaChannel*>(0x42);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000351 rtc::scoped_ptr<VideoMediaChannel> channel(
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000352 engine_.CreateChannel(voice_channel));
353 ASSERT_TRUE(channel.get() != NULL) << "Could not create channel.";
354
355 FakeWebRtcVideoChannel2* fake_channel =
356 factory_.GetFakeChannel(channel.get());
357 ASSERT_TRUE(fake_channel != NULL) << "Channel not created through factory.";
358
359 EXPECT_TRUE(fake_channel->GetVoiceChannel() != NULL)
360 << "VoiceChannel not set.";
361 EXPECT_EQ(voice_channel, fake_channel->GetVoiceChannel())
362 << "Different VoiceChannel set than the provided one.";
363}
364
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000365TEST_F(WebRtcVideoEngine2Test, FindCodec) {
366 const std::vector<cricket::VideoCodec>& c = engine_.codecs();
367 EXPECT_EQ(4U, c.size());
368
369 cricket::VideoCodec vp8(104, "VP8", 320, 200, 30, 0);
370 EXPECT_TRUE(engine_.FindCodec(vp8));
371
372 cricket::VideoCodec vp8_ci(104, "vp8", 320, 200, 30, 0);
373 EXPECT_TRUE(engine_.FindCodec(vp8));
374
375 cricket::VideoCodec vp8_diff_fr_diff_pref(104, "VP8", 320, 200, 50, 50);
376 EXPECT_TRUE(engine_.FindCodec(vp8_diff_fr_diff_pref));
377
378 cricket::VideoCodec vp8_diff_id(95, "VP8", 320, 200, 30, 0);
379 EXPECT_FALSE(engine_.FindCodec(vp8_diff_id));
380 vp8_diff_id.id = 97;
381 EXPECT_TRUE(engine_.FindCodec(vp8_diff_id));
382
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000383 // FindCodec ignores the codec size.
384 // Test that FindCodec can accept uncommon codec size.
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000385 cricket::VideoCodec vp8_diff_res(104, "VP8", 320, 111, 30, 0);
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000386 EXPECT_TRUE(engine_.FindCodec(vp8_diff_res));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000387
388 // PeerConnection doesn't negotiate the resolution at this point.
389 // Test that FindCodec can handle the case when width/height is 0.
390 cricket::VideoCodec vp8_zero_res(104, "VP8", 0, 0, 30, 0);
391 EXPECT_TRUE(engine_.FindCodec(vp8_zero_res));
392
393 cricket::VideoCodec red(101, "RED", 0, 0, 30, 0);
394 EXPECT_TRUE(engine_.FindCodec(red));
395
396 cricket::VideoCodec red_ci(101, "red", 0, 0, 30, 0);
397 EXPECT_TRUE(engine_.FindCodec(red));
398
399 cricket::VideoCodec fec(102, "ULPFEC", 0, 0, 30, 0);
400 EXPECT_TRUE(engine_.FindCodec(fec));
401
402 cricket::VideoCodec fec_ci(102, "ulpfec", 0, 0, 30, 0);
403 EXPECT_TRUE(engine_.FindCodec(fec));
404
405 cricket::VideoCodec rtx(96, "rtx", 0, 0, 30, 0);
406 EXPECT_TRUE(engine_.FindCodec(rtx));
407}
408
409TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
410 std::vector<VideoCodec> engine_codecs = engine_.codecs();
411 for (size_t i = 0; i < engine_codecs.size(); ++i) {
412 if (engine_codecs[i].name != kRtxCodecName)
413 continue;
414 int associated_payload_type;
415 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
416 &associated_payload_type));
417 EXPECT_EQ(default_codec_.id, associated_payload_type);
418 return;
419 }
420 FAIL() << "No RTX codec found among default codecs.";
421}
422
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000423TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
424 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
425 ASSERT_FALSE(extensions.empty());
426 for (size_t i = 0; i < extensions.size(); ++i) {
427 if (extensions[i].uri == kRtpTimestampOffsetHeaderExtension) {
428 EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extensions[i].id);
429 return;
430 }
431 }
432 FAIL() << "Timestamp offset extension not in header-extension list.";
433}
434
435TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
436 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
437 ASSERT_FALSE(extensions.empty());
438 for (size_t i = 0; i < extensions.size(); ++i) {
439 if (extensions[i].uri == kRtpAbsoluteSenderTimeHeaderExtension) {
440 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId,
441 extensions[i].id);
442 return;
443 }
444 }
445 FAIL() << "Absolute Sender Time extension not in header-extension list.";
446}
447
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000448TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000449 rtc::scoped_ptr<VideoMediaChannel> channel(engine_.CreateChannel(NULL));
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000450
451 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
452
453 EXPECT_FALSE(channel->SetSend(true))
454 << "Channel should not start without codecs.";
455 EXPECT_TRUE(channel->SetSend(false))
456 << "Channel should be stoppable even without set codecs.";
457}
458
pbos@webrtc.orgc3d2bd22014-08-12 20:55:10 +0000459TEST_F(WebRtcVideoEngine2Test, GetStatsWithoutSendCodecsSetDoesNotCrash) {
460 rtc::scoped_ptr<VideoMediaChannel> channel(engine_.CreateChannel(NULL));
461 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
462 VideoMediaInfo info;
463 channel->GetStats(&info);
464}
465
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000466class WebRtcVideoEngine2BaseTest
467 : public VideoEngineTest<cricket::WebRtcVideoEngine2> {
468 protected:
469 typedef VideoEngineTest<cricket::WebRtcVideoEngine2> Base;
470};
471
472#define WEBRTC_ENGINE_BASE_TEST(test) \
473 TEST_F(WebRtcVideoEngine2BaseTest, test) { Base::test##Body(); }
474
475WEBRTC_ENGINE_BASE_TEST(ConstrainNewCodec2);
476
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000477class WebRtcVideoChannel2BaseTest
478 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
479 protected:
480 virtual cricket::VideoCodec DefaultCodec() OVERRIDE { return kVp8Codec; }
481 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
482};
483
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000484#define WEBRTC_BASE_TEST(test) \
485 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); }
486
487#define WEBRTC_DISABLED_BASE_TEST(test) \
488 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_ ## test) { Base::test(); }
489
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000490// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
491#if 0
492// TODO(juberti): Figure out why ViE is munging the COM refcount.
493#ifdef WIN32
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000494WEBRTC_DISABLED_BASE_TEST(CheckCoInitialize) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000495 Base::CheckCoInitialize();
496}
497#endif
498#endif
499
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000500WEBRTC_BASE_TEST(SetSend);
501WEBRTC_BASE_TEST(SetSendWithoutCodecs);
502WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000503
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000504WEBRTC_BASE_TEST(GetStats);
505WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
506WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000507
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000508WEBRTC_BASE_TEST(SetSendBandwidth);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000509
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000510WEBRTC_BASE_TEST(SetSendSsrc);
511WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000512
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000513WEBRTC_BASE_TEST(SetRenderer);
514WEBRTC_BASE_TEST(AddRemoveRecvStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000515
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000516WEBRTC_DISABLED_BASE_TEST(AddRemoveRecvStreamAndRender);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000517
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000518WEBRTC_BASE_TEST(AddRemoveRecvStreamsNoConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000519
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000520WEBRTC_BASE_TEST(AddRemoveSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000521
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000522WEBRTC_BASE_TEST(SimulateConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000523
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000524WEBRTC_BASE_TEST(AddRemoveCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000525
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000526WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000527
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000528WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000529
530// TODO(pbos): Figure out why this fails so often.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000531WEBRTC_DISABLED_BASE_TEST(HighAspectHighHeightCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000532
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000533WEBRTC_BASE_TEST(RejectEmptyStreamParams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000534
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000535WEBRTC_BASE_TEST(AdaptResolution16x10);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000536
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000537WEBRTC_BASE_TEST(AdaptResolution4x3);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000538
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000539// TODO(juberti): Restore this test once we support sending 0 fps.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000540WEBRTC_DISABLED_BASE_TEST(AdaptDropAllFrames);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000541// TODO(juberti): Understand why we get decode errors on this test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000542WEBRTC_DISABLED_BASE_TEST(AdaptFramerate);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000543
pbos@webrtc.orgc4175b92014-09-03 15:25:49 +0000544WEBRTC_BASE_TEST(SendsLowerResolutionOnSmallerFrames);
545
546WEBRTC_BASE_TEST(MuteStream);
547
548WEBRTC_BASE_TEST(MultipleSendStreams);
549
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000550WEBRTC_BASE_TEST(SetSendStreamFormat0x0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000551
552// TODO(zhurunz): Fix the flakey test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000553WEBRTC_DISABLED_BASE_TEST(SetSendStreamFormat);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000554
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000555TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Vga) {
556 SendAndReceive(cricket::VideoCodec(100, "VP8", 640, 400, 30, 0));
557}
558
559TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Qvga) {
560 SendAndReceive(cricket::VideoCodec(100, "VP8", 320, 200, 30, 0));
561}
562
563TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8SvcQqvga) {
564 SendAndReceive(cricket::VideoCodec(100, "VP8", 160, 100, 30, 0));
565}
566
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000567TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
568 Base::TwoStreamsSendAndReceive(kVp8Codec);
569}
570
571TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
572 Base::TwoStreamsReUseFirstStream(kVp8Codec);
573}
574
pbos@webrtc.org9359cb32014-07-23 15:44:48 +0000575WEBRTC_BASE_TEST(SendManyResizeOnce);
576
577// TODO(pbos): Enable and figure out why this fails (or should work).
578TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
579 EXPECT_TRUE(channel_->SetCapturer(kSsrc, NULL));
580 EXPECT_TRUE(channel_->SetRenderer(kDefaultReceiveSsrc, &renderer_));
581 channel_->UpdateAspectRatio(1280, 720);
582 video_capturer_.reset(new cricket::FakeVideoCapturer);
583 const std::vector<cricket::VideoFormat>* formats =
584 video_capturer_->GetSupportedFormats();
585 cricket::VideoFormat capture_format_hd = (*formats)[0];
586 EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(capture_format_hd));
587 EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get()));
588
589 // Capture format HD -> adapt (OnOutputFormatRequest VGA) -> VGA.
590 cricket::VideoCodec codec(100, "VP8", 1280, 720, 30, 0);
591 EXPECT_TRUE(SetOneCodec(codec));
592 codec.width /= 2;
593 codec.height /= 2;
594 EXPECT_TRUE(SetSend(true));
595 EXPECT_TRUE(channel_->SetRender(true));
596 EXPECT_EQ(0, renderer_.num_rendered_frames());
597 EXPECT_TRUE(SendFrame());
598 EXPECT_FRAME_WAIT(1, codec.width, codec.height, kTimeout);
599}
600
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000601class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test {
602 public:
603 virtual void SetUp() OVERRIDE {
604 channel_.reset(engine_.CreateChannel(NULL));
605 fake_channel_ = factory_.GetFakeChannel(channel_.get());
606 last_ssrc_ = 123;
607 ASSERT_TRUE(fake_channel_ != NULL)
608 << "Channel not created through factory.";
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000609 EXPECT_TRUE(fake_channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000610 }
611
612 protected:
613 FakeVideoSendStream* AddSendStream() {
614 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
615 }
616
617 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
618 size_t num_streams =
619 fake_channel_->GetFakeCall()->GetVideoSendStreams().size();
620 EXPECT_TRUE(channel_->AddSendStream(sp));
621 std::vector<FakeVideoSendStream*> streams =
622 fake_channel_->GetFakeCall()->GetVideoSendStreams();
623 EXPECT_EQ(num_streams + 1, streams.size());
624 return streams[streams.size() - 1];
625 }
626
627 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
628 return fake_channel_->GetFakeCall()->GetVideoSendStreams();
629 }
630
631 FakeVideoReceiveStream* AddRecvStream() {
632 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
633 }
634
635 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
636 size_t num_streams =
637 fake_channel_->GetFakeCall()->GetVideoReceiveStreams().size();
638 EXPECT_TRUE(channel_->AddRecvStream(sp));
639 std::vector<FakeVideoReceiveStream*> streams =
640 fake_channel_->GetFakeCall()->GetVideoReceiveStreams();
641 EXPECT_EQ(num_streams + 1, streams.size());
642 return streams[streams.size() - 1];
643 }
644
645 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate,
646 const char* max_bitrate) {
647 std::vector<VideoCodec> codecs;
648 codecs.push_back(kVp8Codec);
649 codecs[0].params[kCodecParamMinBitrate] = min_bitrate;
650 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate;
651 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
652
653 FakeVideoSendStream* stream = AddSendStream();
654
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000655 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
656 ASSERT_EQ(1u, video_streams.size());
657 EXPECT_EQ(atoi(min_bitrate), video_streams.back().min_bitrate_bps / 1000);
658 EXPECT_EQ(atoi(max_bitrate), video_streams.back().max_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000659
660 VideoCodec codec;
661 EXPECT_TRUE(channel_->GetSendCodec(&codec));
662 EXPECT_EQ(min_bitrate, codec.params[kCodecParamMinBitrate]);
663 EXPECT_EQ(max_bitrate, codec.params[kCodecParamMaxBitrate]);
664 }
665
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000666 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
667 const std::string& webrtc_ext) {
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000668 FakeCall* call = fake_channel_->GetFakeCall();
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000669 // Enable extension.
670 const int id = 1;
671 std::vector<cricket::RtpHeaderExtension> extensions;
672 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
673 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
674
675 FakeVideoSendStream* send_stream =
676 AddSendStream(cricket::StreamParams::CreateLegacy(123));
677
678 // Verify the send extension id.
679 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
680 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
681 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
682 // Verify call with same set of extensions returns true.
683 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
684 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
685 // receivers.
686 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
687 ->GetConfig()
688 .rtp.extensions.empty());
689
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000690 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000691 std::vector<cricket::RtpHeaderExtension> empty_extensions;
692 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000693 ASSERT_EQ(1u, call->GetVideoSendStreams().size());
694 send_stream = call->GetVideoSendStreams()[0];
695 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
696
697 // Verify that adding receive RTP header extensions adds them for existing
698 // streams.
699 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
700 send_stream = call->GetVideoSendStreams()[0];
701 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
702 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
703 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000704 }
705
706 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
707 const std::string& webrtc_ext) {
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000708 FakeCall* call = fake_channel_->GetFakeCall();
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000709 // Enable extension.
710 const int id = 1;
711 std::vector<cricket::RtpHeaderExtension> extensions;
712 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
713 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
714
715 FakeVideoReceiveStream* recv_stream =
716 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
717
718 // Verify the recv extension id.
719 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
720 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
721 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
722 // Verify call with same set of extensions returns true.
723 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000724
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000725 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
726 // senders.
727 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
728 ->GetConfig()
729 .rtp.extensions.empty());
730
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000731 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000732 std::vector<cricket::RtpHeaderExtension> empty_extensions;
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000733 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(empty_extensions));
734 ASSERT_EQ(1u, call->GetVideoReceiveStreams().size());
735 recv_stream = call->GetVideoReceiveStreams()[0];
736 EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
737
738 // Verify that adding receive RTP header extensions adds them for existing
739 // streams.
740 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
741 recv_stream = call->GetVideoReceiveStreams()[0];
742 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
743 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
744 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000745 }
746
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000747 rtc::scoped_ptr<VideoMediaChannel> channel_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000748 FakeWebRtcVideoChannel2* fake_channel_;
749 uint32 last_ssrc_;
750};
751
752TEST_F(WebRtcVideoChannel2Test, DISABLED_MaxBitrateResetsWithConferenceMode) {
753 FAIL() << "Not implemented."; // TODO(pbos): Implement.
754}
755
756TEST_F(WebRtcVideoChannel2Test, DISABLED_StartSendBitrate) {
757 // TODO(pbos): Is this test testing vie_ ? this is confusing. No API to set
758 // start send bitrate from outside? Add defaults here that should be kept?
759 std::vector<cricket::VideoCodec> codec_list;
760 codec_list.push_back(kVp8Codec);
761 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
762 const unsigned int kVideoMinSendBitrateKbps = 50;
763 const unsigned int kVideoTargetSendBitrateKbps = 300;
764 const unsigned int kVideoMaxSendBitrateKbps = 2000;
765 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000766 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
767 ASSERT_EQ(1u, video_streams.size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000768 EXPECT_EQ(kVideoMinSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000769 video_streams.back().min_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000770 EXPECT_EQ(kVideoTargetSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000771 video_streams.back().target_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000772 EXPECT_EQ(kVideoMaxSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000773 video_streams.back().max_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000774#if 0
775 // TODO(pbos): un-#if
776 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
777 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
778 kVideoDefaultStartSendBitrateKbps);
779 EXPECT_EQ(0, vie_.StartSend(send_channel));
780
781 // Increase the send bitrate and verify it is used as start bitrate.
782 const unsigned int kVideoSendBitrateBps = 768000;
783 vie_.SetSendBitrates(send_channel, kVideoSendBitrateBps, 0, 0);
784 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
785 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
786 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
787 kVideoSendBitrateBps / 1000);
788
789 // Never set a start bitrate higher than the max bitrate.
790 vie_.SetSendBitrates(send_channel, kVideoMaxSendBitrateKbps + 500, 0, 0);
791 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
792 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
793 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
794 kVideoDefaultStartSendBitrateKbps);
795
796 // Use the default start bitrate if the send bitrate is lower.
797 vie_.SetSendBitrates(send_channel, kVideoDefaultStartSendBitrateKbps - 50, 0,
798 0);
799 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
800 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
801 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
802 kVideoDefaultStartSendBitrateKbps);
803#endif
804}
805
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000806TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000807 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
808 EXPECT_TRUE(channel_->SetSend(true));
809 cricket::VideoOptions options;
810 options.conference_mode.Set(true);
811 EXPECT_TRUE(channel_->SetOptions(options));
812
813 // Send side.
814 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
815 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
816 FakeVideoSendStream* send_stream = AddSendStream(
817 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
818
819 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
820 for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
821 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
822
823 // Receiver side.
824 FakeVideoReceiveStream* recv_stream = AddRecvStream(
825 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
826 ASSERT_GT(recv_stream->GetConfig().rtp.rtx.size(), 0u)
827 << "No SSRCs for RTX configured by AddRecvStream.";
828 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size())
829 << "This test only works with one receive codec. Please update the test.";
830 EXPECT_EQ(rtx_ssrcs[0],
831 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
832 // TODO(pbos): Make sure we set the RTX for correct payloads etc.
833}
834
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000835TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
836 // Setup one channel with an associated RTX stream.
837 cricket::StreamParams params =
838 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
839 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
840 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
841 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
842 EXPECT_EQ(kRtxSsrcs1[0],
843 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000844}
845
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000846TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
847 // Setup one channel without an associated RTX stream.
848 cricket::StreamParams params =
849 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
850 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
851 ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000852}
853
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000854TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
855 FakeVideoSendStream* send_stream =
856 AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
857 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
858
859 FakeVideoReceiveStream* recv_stream =
860 AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
861 ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000862}
863
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000864// Test support for RTP timestamp offset header extension.
865TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
866 TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
867 webrtc::RtpExtension::kTOffset);
868}
869TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
870 TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
871 webrtc::RtpExtension::kTOffset);
872}
873
874// Test support for absolute send time header extension.
875TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
876 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
877 webrtc::RtpExtension::kAbsSendTime);
878}
879TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
880 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
881 webrtc::RtpExtension::kAbsSendTime);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000882}
883
pbos@webrtc.org3c107582014-07-20 15:27:35 +0000884TEST_F(WebRtcVideoChannel2Test,
885 SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
886 const int kUnsupportedId = 1;
887 const int kTOffsetId = 2;
888
889 std::vector<cricket::RtpHeaderExtension> extensions;
890 extensions.push_back(cricket::RtpHeaderExtension(
891 kUnsupportedExtensionName, kUnsupportedId));
892 extensions.push_back(cricket::RtpHeaderExtension(
893 webrtc::RtpExtension::kTOffset, kTOffsetId));
894 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
895 FakeVideoSendStream* send_stream =
896 AddSendStream(cricket::StreamParams::CreateLegacy(123));
897
898 // Only timestamp offset extension is set to send stream,
899 // unsupported rtp extension is ignored.
900 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
901 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
902 send_stream->GetConfig().rtp.extensions[0].name.c_str());
903}
904
905TEST_F(WebRtcVideoChannel2Test,
906 SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
907 const int kUnsupportedId = 1;
908 const int kTOffsetId = 2;
909
910 std::vector<cricket::RtpHeaderExtension> extensions;
911 extensions.push_back(cricket::RtpHeaderExtension(
912 kUnsupportedExtensionName, kUnsupportedId));
913 extensions.push_back(cricket::RtpHeaderExtension(
914 webrtc::RtpExtension::kTOffset, kTOffsetId));
915 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
916 FakeVideoReceiveStream* recv_stream =
917 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
918
919 // Only timestamp offset extension is set to receive stream,
920 // unsupported rtp extension is ignored.
921 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
922 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
923 recv_stream->GetConfig().rtp.extensions[0].name.c_str());
924}
925
926TEST_F(WebRtcVideoChannel2Test,
927 SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
928 const size_t kNumIncorrectIds = 4;
929 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
930 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
931 std::vector<cricket::RtpHeaderExtension> extensions;
932 extensions.push_back(cricket::RtpHeaderExtension(
933 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
934 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions))
935 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
936 }
937}
938
939TEST_F(WebRtcVideoChannel2Test,
940 SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
941 const size_t kNumIncorrectIds = 4;
942 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
943 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
944 std::vector<cricket::RtpHeaderExtension> extensions;
945 extensions.push_back(cricket::RtpHeaderExtension(
946 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
947 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions))
948 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
949 }
950}
951
952TEST_F(WebRtcVideoChannel2Test,
953 SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
954 const int id = 1;
955 std::vector<cricket::RtpHeaderExtension> extensions;
956 extensions.push_back(cricket::RtpHeaderExtension(
957 webrtc::RtpExtension::kTOffset, id));
958 extensions.push_back(cricket::RtpHeaderExtension(
959 kRtpAbsoluteSenderTimeHeaderExtension, id));
960 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
961
962 // Duplicate entries are also not supported.
963 extensions.clear();
964 extensions.push_back(cricket::RtpHeaderExtension(
965 webrtc::RtpExtension::kTOffset, id));
966 extensions.push_back(extensions.back());
967 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
968}
969
970TEST_F(WebRtcVideoChannel2Test,
971 SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
972 const int id = 1;
973 std::vector<cricket::RtpHeaderExtension> extensions;
974 extensions.push_back(cricket::RtpHeaderExtension(
975 webrtc::RtpExtension::kTOffset, id));
976 extensions.push_back(cricket::RtpHeaderExtension(
977 kRtpAbsoluteSenderTimeHeaderExtension, id));
978 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
979
980 // Duplicate entries are also not supported.
981 extensions.clear();
982 extensions.push_back(cricket::RtpHeaderExtension(
983 webrtc::RtpExtension::kTOffset, id));
984 extensions.push_back(extensions.back());
985 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
986}
987
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000988TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
989 FAIL() << "Not implemented."; // TODO(pbos): Implement.
990}
991
992TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
993 FAIL() << "Not implemented."; // TODO(pbos): Implement.
994}
995
996TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
997 FAIL() << "Not implemented."; // TODO(pbos): Implement.
998}
999
1000TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
1001 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
1002 EXPECT_EQ(1u, fake_channel_->GetFakeCall()->GetVideoReceiveStreams().size());
1003}
1004
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001005TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
1006 FakeVideoReceiveStream* stream = AddRecvStream();
1007 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001008}
1009
pbos@webrtc.org257e1302014-07-25 19:01:32 +00001010TEST_F(WebRtcVideoChannel2Test, RembCanBeEnabledAndDisabled) {
1011 FakeVideoReceiveStream* stream = AddRecvStream();
1012 EXPECT_TRUE(stream->GetConfig().rtp.remb);
1013
1014 // Verify that REMB is turned off when codecs without REMB are set.
1015 std::vector<VideoCodec> codecs;
1016 codecs.push_back(kVp8Codec);
1017 EXPECT_TRUE(codecs[0].feedback_params.params().empty());
1018 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1019 stream = fake_channel_->GetFakeCall()->GetVideoReceiveStreams()[0];
1020 EXPECT_FALSE(stream->GetConfig().rtp.remb);
1021
1022 // Verify that REMB is turned on when setting default codecs since the
1023 // default codecs have REMB enabled.
1024 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
1025 stream = fake_channel_->GetFakeCall()->GetVideoReceiveStreams()[0];
1026 EXPECT_TRUE(stream->GetConfig().rtp.remb);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001027}
1028
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001029TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
1030 VerifyCodecHasDefaultFeedbackParams(default_codec_);
1031
pbos@webrtc.org19864742014-05-30 07:35:47 +00001032 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
1033 EXPECT_TRUE(channel_->SetSend(true));
1034
1035 // Send side.
1036 FakeVideoSendStream* send_stream =
1037 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1038 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1039
1040 // Receiver side.
1041 FakeVideoReceiveStream* recv_stream =
1042 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1043 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
1044
1045 // Nack history size should match between sender and receiver.
1046 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
1047 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001048}
1049
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +00001050TEST_F(WebRtcVideoChannel2Test, NackCanBeDisabled) {
1051 std::vector<VideoCodec> codecs;
1052 codecs.push_back(kVp8Codec);
1053
1054 // Send side.
1055 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1056 FakeVideoSendStream* send_stream =
1057 AddSendStream(cricket::StreamParams::CreateLegacy(1));
1058 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
1059
1060 // Receiver side.
1061 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1062 FakeVideoReceiveStream* recv_stream =
1063 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
1064 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
1065}
1066
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001067TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
1068 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1069}
1070
1071TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
1072 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1073}
1074
1075TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
1076 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1077}
1078
1079TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
1080 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1081}
1082
1083TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
1084 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1085}
1086
1087TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
1088 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1089}
1090
1091TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
1092 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1093}
1094
1095TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
1096 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1097}
1098
1099TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
1100 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1101}
1102
1103TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthScreencast) {
1104 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1105}
1106
1107TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
1108 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1109}
1110
1111TEST_F(WebRtcVideoChannel2Test,
1112 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
1113 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1114}
1115
pbos@webrtc.org5ff71ab2014-07-23 07:28:56 +00001116TEST_F(WebRtcVideoChannel2Test, SuspendBelowMinBitrateDisabledByDefault) {
1117 FakeVideoSendStream* stream = AddSendStream();
1118 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1119}
1120
1121TEST_F(WebRtcVideoChannel2Test, SetOptionsWithSuspendBelowMinBitrate) {
1122 VideoOptions options;
1123 options.suspend_below_min_bitrate.Set(true);
1124 channel_->SetOptions(options);
1125
1126 FakeVideoSendStream* stream = AddSendStream();
1127 EXPECT_TRUE(stream->GetConfig().suspend_below_min_bitrate);
1128
1129 options.suspend_below_min_bitrate.Set(false);
1130 channel_->SetOptions(options);
1131
1132 stream = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0];
1133 EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
1134}
1135
pbos@webrtc.org543e5892014-07-23 07:01:31 +00001136TEST_F(WebRtcVideoChannel2Test, RedundantPayloadsDisabledByDefault) {
1137 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1138 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1139 FakeVideoSendStream* stream = AddSendStream(
1140 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1141 EXPECT_FALSE(stream->GetConfig().rtp.rtx.pad_with_redundant_payloads);
1142}
1143
1144TEST_F(WebRtcVideoChannel2Test, SetOptionsWithPayloadPadding) {
1145 VideoOptions options;
1146 options.use_payload_padding.Set(true);
1147 channel_->SetOptions(options);
1148
1149 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1150 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1151 FakeVideoSendStream* stream = AddSendStream(
1152 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1153 EXPECT_TRUE(stream->GetConfig().rtp.rtx.pad_with_redundant_payloads);
1154
1155 options.use_payload_padding.Set(false);
1156 channel_->SetOptions(options);
1157
1158 stream = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0];
1159 EXPECT_FALSE(stream->GetConfig().rtp.rtx.pad_with_redundant_payloads);
1160}
1161
pbos@webrtc.org6f48f1b2014-07-22 16:29:54 +00001162TEST_F(WebRtcVideoChannel2Test, Vp8DenoisingEnabledByDefault) {
1163 FakeVideoSendStream* stream = AddSendStream();
1164 webrtc::VideoCodecVP8 vp8_settings;
1165 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1166 EXPECT_TRUE(vp8_settings.denoisingOn);
1167}
1168
1169TEST_F(WebRtcVideoChannel2Test, SetOptionsWithDenoising) {
1170 VideoOptions options;
1171 options.video_noise_reduction.Set(false);
1172 channel_->SetOptions(options);
1173
1174 FakeVideoSendStream* stream = AddSendStream();
1175 webrtc::VideoCodecVP8 vp8_settings;
1176 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1177 EXPECT_FALSE(vp8_settings.denoisingOn);
1178
1179 options.video_noise_reduction.Set(true);
1180 channel_->SetOptions(options);
1181
1182 stream = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0];
1183 ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
1184 EXPECT_TRUE(vp8_settings.denoisingOn);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001185}
1186
1187TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
1188 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1189}
1190
pbos@webrtc.org8aed9452014-07-26 10:16:49 +00001191TEST_F(WebRtcVideoChannel2Test, DISABLED_SendReceiveBitratesStats) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001192 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1193}
1194
1195TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetAdaptInputToCpuUsage) {
1196 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1197}
1198
1199TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetCpuThreshold) {
1200 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1201}
1202
1203TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetInvalidCpuThreshold) {
1204 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1205}
1206
1207TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldLog) {
1208 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1209}
1210
1211TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldNotLog) {
1212 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1213}
1214
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001215TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001216 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001217
1218 VideoCodec codec;
1219 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001220 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001221
1222 // Using a RTX setup to verify that the default RTX payload type is good.
1223 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1224 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1225 FakeVideoSendStream* stream = AddSendStream(
1226 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1227 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001228
1229 // Make sure NACK and FEC are enabled on the correct payload types.
1230 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
1231 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
1232 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001233
1234 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
1235 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001236 EXPECT_EQ(static_cast<int>(default_rtx_codec_.id),
1237 config.rtp.rtx.payload_type);
1238 // TODO(juberti): Check RTCP, PLI, TMMBR.
1239}
1240
1241TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
1242 std::vector<VideoCodec> codecs;
1243 codecs.push_back(kVp8Codec);
1244 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1245
1246 FakeVideoSendStream* stream = AddSendStream();
1247 webrtc::VideoSendStream::Config config = stream->GetConfig();
1248
1249 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1250 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1251}
1252
1253TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001254 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1255 std::vector<VideoCodec> codecs;
1256 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1257 codecs.push_back(rtx_codec);
1258 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1259 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001260}
1261
1262TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001263 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1264 std::vector<VideoCodec> codecs;
1265 cricket::VideoCodec rtx_codec =
1266 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1267 codecs.push_back(kVp8Codec);
1268 codecs.push_back(rtx_codec);
1269 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1270
1271 cricket::VideoCodec rtx_codec2 =
1272 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1273 codecs.pop_back();
1274 codecs.push_back(rtx_codec2);
1275 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1276 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001277}
1278
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001279TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1280 std::vector<VideoCodec> codecs;
1281 codecs.push_back(kVp8Codec);
1282 codecs.push_back(kUlpfecCodec);
1283 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1284
1285 FakeVideoSendStream* stream = AddSendStream();
1286 webrtc::VideoSendStream::Config config = stream->GetConfig();
1287
1288 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1289
1290 codecs.pop_back();
1291 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1292 stream = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0];
1293 ASSERT_TRUE(stream != NULL);
1294 config = stream->GetConfig();
1295 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1296 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001297}
1298
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001299TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1300 std::vector<VideoCodec> codecs;
1301 codecs.push_back(kVp8Codec720p);
1302 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1303
1304 std::vector<webrtc::VideoStream> streams =
1305 AddSendStream()->GetVideoStreams();
1306 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1307 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1308
1309 codecs.clear();
1310 codecs.push_back(kVp8Codec360p);
1311 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1312 streams = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0]
1313 ->GetVideoStreams();
1314 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1315 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001316}
1317
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001318TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMinMaxBitrate) {
1319 SetSendCodecsShouldWorkForBitrates("10", "20");
1320}
1321
1322TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001323 std::vector<VideoCodec> video_codecs = engine_.codecs();
1324 video_codecs[0].params[kCodecParamMinBitrate] = "30";
1325 video_codecs[0].params[kCodecParamMaxBitrate] = "20";
1326 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001327}
1328
1329TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptLargeMinMaxBitrate) {
1330 SetSendCodecsShouldWorkForBitrates("1000", "2000");
1331}
1332
1333TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1334 static const char* kMaxQuantization = "21";
1335 std::vector<VideoCodec> codecs;
1336 codecs.push_back(kVp8Codec);
1337 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1338 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001339 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1340 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001341
1342 VideoCodec codec;
1343 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1344 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1345}
1346
1347TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1348 std::vector<cricket::VideoCodec> codecs;
1349 codecs.push_back(kVp8Codec);
1350
1351 codecs[0].width = 0;
1352 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1353 << "Codec set though codec width is zero.";
1354
1355 codecs[0].width = kVp8Codec.width;
1356 codecs[0].height = 0;
1357 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1358 << "Codec set though codec height is zero.";
1359}
1360
1361TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
1362 // TODO(pbos): Should we only allow the dynamic range?
1363 static const size_t kNumIncorrectPayloads = 4;
1364 static const int kIncorrectPayloads[kNumIncorrectPayloads] = {-2, -1, 128,
1365 129};
1366 std::vector<cricket::VideoCodec> codecs;
1367 codecs.push_back(kVp8Codec);
1368 for (size_t i = 0; i < kNumIncorrectPayloads; ++i) {
1369 int payload_type = kIncorrectPayloads[i];
1370 codecs[0].id = payload_type;
1371 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1372 << "Bad payload type '" << payload_type << "' accepted.";
1373 }
1374}
1375
1376TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
1377 std::vector<cricket::VideoCodec> codecs;
1378 codecs.push_back(kVp8Codec);
1379 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
1380 codecs[0].id = payload_type;
1381 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
1382 << "Payload type '" << payload_type << "' rejected.";
1383 }
1384}
1385
1386TEST_F(WebRtcVideoChannel2Test, DISABLED_ResetVieSendCodecOnNewFrameSize) {
1387 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1388}
1389
1390TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
1391 std::vector<cricket::VideoCodec> codecs;
1392 codecs.push_back(kVp8Codec);
1393 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1394}
1395
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001396// Test that we set our inbound RTX codecs properly.
1397TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
1398 std::vector<cricket::VideoCodec> codecs;
1399 codecs.push_back(kVp8Codec);
1400 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1401 codecs.push_back(rtx_codec);
1402 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1403 << "RTX codec without associated payload should be rejected.";
1404
1405 codecs[1].SetParam("apt", kVp8Codec.id + 1);
1406 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1407 << "RTX codec with invalid associated payload type should be rejected.";
1408
1409 codecs[1].SetParam("apt", kVp8Codec.id);
1410 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1411
1412 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
1413 rtx_codec2.SetParam("apt", rtx_codec.id);
1414 codecs.push_back(rtx_codec2);
1415
1416 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
1417 "as associated payload type "
1418 "should be rejected.";
1419}
1420
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001421TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
1422 std::vector<cricket::VideoCodec> codecs;
1423 codecs.push_back(kVp8Codec);
1424 codecs[0].id = 99;
1425 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1426}
1427
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001428TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001429 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001430
1431 FakeVideoReceiveStream* stream = AddRecvStream();
1432 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1433 EXPECT_STREQ(engine_.codecs()[0].name.c_str(), config.codecs[0].plName);
1434 EXPECT_EQ(engine_.codecs()[0].id, config.codecs[0].plType);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001435}
1436
1437TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
1438 std::vector<VideoCodec> codecs;
1439 codecs.push_back(kVp8Codec);
1440 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
1441 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1442}
1443
1444// TODO(pbos): Enable VP9 through external codec support
1445TEST_F(WebRtcVideoChannel2Test,
1446 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
1447 std::vector<VideoCodec> codecs;
1448 codecs.push_back(kVp8Codec);
1449 codecs.push_back(kVp9Codec);
1450 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1451}
1452
1453TEST_F(WebRtcVideoChannel2Test,
1454 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
1455 std::vector<VideoCodec> codecs;
1456 codecs.push_back(kVp8Codec);
1457 codecs.push_back(kVp9Codec);
1458 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1459 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
1460}
1461
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001462TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
1463 std::vector<VideoCodec> codecs;
1464 codecs.push_back(kVp8Codec);
1465 codecs.push_back(kUlpfecCodec);
1466 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1467
1468 FakeVideoReceiveStream* stream = AddRecvStream();
1469 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1470
1471 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1472
1473 codecs.pop_back();
1474 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1475 stream = fake_channel_->GetFakeCall()->GetVideoReceiveStreams()[0];
1476 ASSERT_TRUE(stream != NULL);
1477 config = stream->GetConfig();
1478 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1479 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001480}
1481
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001482TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
1483 std::vector<VideoCodec> codecs;
1484 codecs.push_back(kVp8Codec);
1485 codecs.push_back(kRedCodec);
1486 codecs[1].id = codecs[0].id;
1487 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1488}
1489
1490TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
1491 std::vector<VideoCodec> codecs;
1492 codecs.push_back(kVp8Codec);
1493 codecs.push_back(kVp9Codec);
1494 codecs[1].id = codecs[0].id;
1495 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1496}
1497
1498TEST_F(WebRtcVideoChannel2Test,
1499 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
1500 std::vector<VideoCodec> codecs;
1501 codecs.push_back(kVp8Codec);
1502 codecs.push_back(kVp8Codec);
1503 codecs[1].id += 1;
1504 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1505}
1506
1507TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
1508 EXPECT_FALSE(AddSendStream()->IsSending());
1509}
1510
pbos@webrtc.org85f42942014-07-22 09:14:58 +00001511TEST_F(WebRtcVideoChannel2Test, ReceiveStreamReceivingByDefault) {
1512 EXPECT_TRUE(AddRecvStream()->IsReceiving());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001513}
1514
1515TEST_F(WebRtcVideoChannel2Test, SetSend) {
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +00001516 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001517 EXPECT_FALSE(stream->IsSending());
1518
1519 // false->true
1520 EXPECT_TRUE(channel_->SetSend(true));
1521 EXPECT_TRUE(stream->IsSending());
1522 // true->true
1523 EXPECT_TRUE(channel_->SetSend(true));
1524 EXPECT_TRUE(stream->IsSending());
1525 // true->false
1526 EXPECT_TRUE(channel_->SetSend(false));
1527 EXPECT_FALSE(stream->IsSending());
1528 // false->false
1529 EXPECT_TRUE(channel_->SetSend(false));
1530 EXPECT_FALSE(stream->IsSending());
1531
1532 EXPECT_TRUE(channel_->SetSend(true));
1533 FakeVideoSendStream* new_stream = AddSendStream();
1534 EXPECT_TRUE(new_stream->IsSending())
1535 << "Send stream created after SetSend(true) not sending initially.";
1536}
1537
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001538TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetDscpOptions) {
1539 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1540}
1541
1542TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithMaxBitrate) {
1543 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1544}
1545
1546TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithLoweredBitrate) {
1547 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1548}
1549
1550TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsSucceedsWhenSending) {
1551 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1552}
1553
1554TEST_F(WebRtcVideoChannel2Test, DISABLED_ResetCodecOnScreencast) {
1555 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1556}
1557
1558TEST_F(WebRtcVideoChannel2Test, DISABLED_DontResetCodecOnSendFrame) {
1559 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1560}
1561
1562TEST_F(WebRtcVideoChannel2Test,
1563 DISABLED_DontRegisterDecoderIfFactoryIsNotGiven) {
1564 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1565}
1566
1567TEST_F(WebRtcVideoChannel2Test, DISABLED_RegisterDecoderIfFactoryIsGiven) {
1568 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1569}
1570
1571TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterDecoderMultipleTimes) {
1572 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1573}
1574
1575TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterDecoderForNonVP8) {
1576 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1577}
1578
1579TEST_F(WebRtcVideoChannel2Test,
1580 DISABLED_DontRegisterEncoderIfFactoryIsNotGiven) {
1581 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1582}
1583
1584TEST_F(WebRtcVideoChannel2Test, DISABLED_RegisterEncoderIfFactoryIsGiven) {
1585 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1586}
1587
1588TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterEncoderMultipleTimes) {
1589 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1590}
1591
1592TEST_F(WebRtcVideoChannel2Test,
1593 DISABLED_RegisterEncoderWithMultipleSendStreams) {
1594 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1595}
1596
1597TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterEncoderForNonVP8) {
1598 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1599}
1600
1601TEST_F(WebRtcVideoChannel2Test, DISABLED_FeedbackParamsForNonVP8) {
1602 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1603}
1604
1605TEST_F(WebRtcVideoChannel2Test, DISABLED_ExternalCodecAddedToTheEnd) {
1606 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1607}
1608
1609TEST_F(WebRtcVideoChannel2Test, DISABLED_ExternalCodecIgnored) {
1610 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1611}
1612
1613TEST_F(WebRtcVideoChannel2Test, DISABLED_UpdateEncoderCodecsAfterSetFactory) {
1614 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1615}
1616
1617TEST_F(WebRtcVideoChannel2Test, DISABLED_OnReadyToSend) {
1618 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1619}
1620
1621TEST_F(WebRtcVideoChannel2Test, DISABLED_CaptureFrameTimestampToNtpTimestamp) {
1622 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1623}
1624} // namespace cricket