blob: 5bbec3362c42f8006db4396665975b105995eece [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
31#include "talk/base/gunit.h"
pbos@webrtc.orgcb859ec2014-07-15 08:28:20 +000032#include "talk/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,
71 const std::vector<webrtc::VideoStream>& video_streams)
72 : sending_(false), config_(config), video_streams_(video_streams) {
73}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000074
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000075webrtc::VideoSendStream::Config FakeVideoSendStream::GetConfig() {
76 return config_;
77}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000078
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000079std::vector<webrtc::VideoStream> FakeVideoSendStream::GetVideoStreams() {
80 return video_streams_;
81}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000082
pbos@webrtc.org85f42942014-07-22 09:14:58 +000083bool FakeVideoSendStream::IsSending() const {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000084 return sending_;
85}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000086
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000087webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() const {
88 return webrtc::VideoSendStream::Stats();
89}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000090
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000091bool FakeVideoSendStream::ReconfigureVideoEncoder(
92 const std::vector<webrtc::VideoStream>& streams,
93 const void* encoder_specific) {
94 video_streams_ = streams;
95 return true;
96}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000097
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000098webrtc::VideoSendStreamInput* FakeVideoSendStream::Input() {
99 // TODO(pbos): Fix.
100 return NULL;
101}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000102
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000103void FakeVideoSendStream::Start() {
104 sending_ = true;
105}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000106
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000107void FakeVideoSendStream::Stop() {
108 sending_ = false;
109}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000110
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000111FakeVideoReceiveStream::FakeVideoReceiveStream(
112 const webrtc::VideoReceiveStream::Config& config)
113 : config_(config), receiving_(false) {
114}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000115
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000116webrtc::VideoReceiveStream::Config FakeVideoReceiveStream::GetConfig() {
117 return config_;
118}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000119
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000120bool FakeVideoReceiveStream::IsReceiving() const {
121 return receiving_;
122}
123
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000124webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const {
125 return webrtc::VideoReceiveStream::Stats();
126}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000127
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000128void FakeVideoReceiveStream::Start() {
129 receiving_ = true;
130}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000131
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000132void FakeVideoReceiveStream::Stop() {
133 receiving_ = false;
134}
pbos@webrtc.org85f42942014-07-22 09:14:58 +0000135
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000136void FakeVideoReceiveStream::GetCurrentReceiveCodec(webrtc::VideoCodec* codec) {
137}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000138
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000139FakeCall::FakeCall() { SetVideoCodecs(GetDefaultVideoCodecs()); }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000140
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000141FakeCall::~FakeCall() {
142 EXPECT_EQ(0u, video_send_streams_.size());
143 EXPECT_EQ(0u, video_receive_streams_.size());
144}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000145
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000146void FakeCall::SetVideoCodecs(const std::vector<webrtc::VideoCodec> codecs) {
147 codecs_ = codecs;
148}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000149
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000150std::vector<FakeVideoSendStream*> FakeCall::GetVideoSendStreams() {
151 return video_send_streams_;
152}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000153
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000154std::vector<FakeVideoReceiveStream*> FakeCall::GetVideoReceiveStreams() {
155 return video_receive_streams_;
156}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000157
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000158webrtc::VideoCodec FakeCall::GetEmptyVideoCodec() {
159 webrtc::VideoCodec codec;
160 codec.minBitrate = 300;
161 codec.startBitrate = 800;
162 codec.maxBitrate = 1500;
163 codec.maxFramerate = 10;
164 codec.width = 640;
165 codec.height = 480;
166 codec.qpMax = 56;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000167
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000168 return codec;
169}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000170
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000171webrtc::VideoCodec FakeCall::GetVideoCodecVp8() {
172 webrtc::VideoCodec vp8_codec = GetEmptyVideoCodec();
173 vp8_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.orgcb859ec2014-07-15 08:28:20 +0000174 talk_base::strcpyn(vp8_codec.plName, ARRAY_SIZE(vp8_codec.plName),
175 kVp8Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000176 vp8_codec.plType = kVp8Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000177
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000178 return vp8_codec;
179}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000180
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000181webrtc::VideoCodec FakeCall::GetVideoCodecVp9() {
182 webrtc::VideoCodec vp9_codec = GetEmptyVideoCodec();
183 // TODO(pbos): Add a correct codecType when webrtc has one.
184 vp9_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.orgcb859ec2014-07-15 08:28:20 +0000185 talk_base::strcpyn(vp9_codec.plName, ARRAY_SIZE(vp9_codec.plName),
186 kVp9Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000187 vp9_codec.plType = kVp9Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000188
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000189 return vp9_codec;
190}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000191
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000192std::vector<webrtc::VideoCodec> FakeCall::GetDefaultVideoCodecs() {
193 std::vector<webrtc::VideoCodec> codecs;
194 codecs.push_back(GetVideoCodecVp8());
195 // codecs.push_back(GetVideoCodecVp9());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000196
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000197 return codecs;
198}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000199
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000200webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
201 const webrtc::VideoSendStream::Config& config,
202 const std::vector<webrtc::VideoStream>& video_streams,
203 const void* encoder_settings) {
204 FakeVideoSendStream* fake_stream =
205 new FakeVideoSendStream(config, video_streams);
206 video_send_streams_.push_back(fake_stream);
207 return fake_stream;
208}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000209
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000210void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
211 FakeVideoSendStream* fake_stream =
212 static_cast<FakeVideoSendStream*>(send_stream);
213 for (size_t i = 0; i < video_send_streams_.size(); ++i) {
214 if (video_send_streams_[i] == fake_stream) {
215 delete video_send_streams_[i];
216 video_send_streams_.erase(video_send_streams_.begin() + i);
217 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000218 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000219 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000220 ADD_FAILURE() << "DestroyVideoSendStream called with unknown paramter.";
221}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000222
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000223webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
224 const webrtc::VideoReceiveStream::Config& config) {
225 video_receive_streams_.push_back(new FakeVideoReceiveStream(config));
226 return video_receive_streams_[video_receive_streams_.size() - 1];
227}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000228
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000229void FakeCall::DestroyVideoReceiveStream(
230 webrtc::VideoReceiveStream* receive_stream) {
231 FakeVideoReceiveStream* fake_stream =
232 static_cast<FakeVideoReceiveStream*>(receive_stream);
233 for (size_t i = 0; i < video_receive_streams_.size(); ++i) {
234 if (video_receive_streams_[i] == fake_stream) {
235 delete video_receive_streams_[i];
236 video_receive_streams_.erase(video_receive_streams_.begin() + i);
237 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000238 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000239 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000240 ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown paramter.";
241}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000242
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000243webrtc::PacketReceiver* FakeCall::Receiver() {
244 // TODO(pbos): Fix this.
245 return NULL;
246}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000247
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000248uint32_t FakeCall::SendBitrateEstimate() {
249 return 0;
250}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000251
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000252uint32_t FakeCall::ReceiveBitrateEstimate() {
253 return 0;
254}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000255
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000256FakeWebRtcVideoChannel2::FakeWebRtcVideoChannel2(
257 FakeCall* call,
258 WebRtcVideoEngine2* engine,
259 VoiceMediaChannel* voice_channel)
260 : WebRtcVideoChannel2(call, engine, engine->GetVideoEncoderFactory()),
261 fake_call_(call),
262 voice_channel_(voice_channel) {
263}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000264
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000265FakeWebRtcVideoChannel2::~FakeWebRtcVideoChannel2() {
266}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000267
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000268VoiceMediaChannel* FakeWebRtcVideoChannel2::GetVoiceChannel() {
269 return voice_channel_;
270}
271FakeCall* FakeWebRtcVideoChannel2::GetFakeCall() {
272 return fake_call_;
273}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000274
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000275FakeWebRtcVideoChannel2* FakeWebRtcVideoMediaChannelFactory::GetFakeChannel(
276 VideoMediaChannel* channel) {
277 return channel_map_[channel];
278}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000279
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000280WebRtcVideoChannel2* FakeWebRtcVideoMediaChannelFactory::Create(
281 WebRtcVideoEngine2* engine,
282 VoiceMediaChannel* voice_channel) {
283 FakeWebRtcVideoChannel2* channel =
284 new FakeWebRtcVideoChannel2(new FakeCall(), engine, voice_channel);
285 channel_map_[channel] = channel;
286 return channel;
287}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000288
289class WebRtcVideoEngine2Test : public testing::Test {
290 public:
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000291 WebRtcVideoEngine2Test() : engine_(&factory_) {
292 std::vector<VideoCodec> engine_codecs = engine_.codecs();
293 assert(!engine_codecs.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000294 bool codec_set = false;
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000295 for (size_t i = 0; i < engine_codecs.size(); ++i) {
296 if (engine_codecs[i].name == "red") {
297 default_red_codec_ = engine_codecs[i];
298 } else if (engine_codecs[i].name == "ulpfec") {
299 default_ulpfec_codec_ = engine_codecs[i];
300 } else if (engine_codecs[i].name == "rtx") {
301 default_rtx_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000302 } else if (!codec_set) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000303 default_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000304 codec_set = true;
305 }
306 }
307
308 assert(codec_set);
309 }
310
311 protected:
312 FakeWebRtcVideoMediaChannelFactory factory_;
313 WebRtcVideoEngine2 engine_;
314 VideoCodec default_codec_;
315 VideoCodec default_red_codec_;
316 VideoCodec default_ulpfec_codec_;
317 VideoCodec default_rtx_codec_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000318};
319
320TEST_F(WebRtcVideoEngine2Test, CreateChannel) {
321 talk_base::scoped_ptr<VideoMediaChannel> channel(engine_.CreateChannel(NULL));
322 ASSERT_TRUE(channel.get() != NULL) << "Could not create channel.";
323 EXPECT_TRUE(factory_.GetFakeChannel(channel.get()) != NULL)
324 << "Channel not created through factory.";
325}
326
327TEST_F(WebRtcVideoEngine2Test, CreateChannelWithVoiceEngine) {
328 VoiceMediaChannel* voice_channel = reinterpret_cast<VoiceMediaChannel*>(0x42);
329 talk_base::scoped_ptr<VideoMediaChannel> channel(
330 engine_.CreateChannel(voice_channel));
331 ASSERT_TRUE(channel.get() != NULL) << "Could not create channel.";
332
333 FakeWebRtcVideoChannel2* fake_channel =
334 factory_.GetFakeChannel(channel.get());
335 ASSERT_TRUE(fake_channel != NULL) << "Channel not created through factory.";
336
337 EXPECT_TRUE(fake_channel->GetVoiceChannel() != NULL)
338 << "VoiceChannel not set.";
339 EXPECT_EQ(voice_channel, fake_channel->GetVoiceChannel())
340 << "Different VoiceChannel set than the provided one.";
341}
342
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000343TEST_F(WebRtcVideoEngine2Test, FindCodec) {
344 const std::vector<cricket::VideoCodec>& c = engine_.codecs();
345 EXPECT_EQ(4U, c.size());
346
347 cricket::VideoCodec vp8(104, "VP8", 320, 200, 30, 0);
348 EXPECT_TRUE(engine_.FindCodec(vp8));
349
350 cricket::VideoCodec vp8_ci(104, "vp8", 320, 200, 30, 0);
351 EXPECT_TRUE(engine_.FindCodec(vp8));
352
353 cricket::VideoCodec vp8_diff_fr_diff_pref(104, "VP8", 320, 200, 50, 50);
354 EXPECT_TRUE(engine_.FindCodec(vp8_diff_fr_diff_pref));
355
356 cricket::VideoCodec vp8_diff_id(95, "VP8", 320, 200, 30, 0);
357 EXPECT_FALSE(engine_.FindCodec(vp8_diff_id));
358 vp8_diff_id.id = 97;
359 EXPECT_TRUE(engine_.FindCodec(vp8_diff_id));
360
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000361 // FindCodec ignores the codec size.
362 // Test that FindCodec can accept uncommon codec size.
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000363 cricket::VideoCodec vp8_diff_res(104, "VP8", 320, 111, 30, 0);
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000364 EXPECT_TRUE(engine_.FindCodec(vp8_diff_res));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000365
366 // PeerConnection doesn't negotiate the resolution at this point.
367 // Test that FindCodec can handle the case when width/height is 0.
368 cricket::VideoCodec vp8_zero_res(104, "VP8", 0, 0, 30, 0);
369 EXPECT_TRUE(engine_.FindCodec(vp8_zero_res));
370
371 cricket::VideoCodec red(101, "RED", 0, 0, 30, 0);
372 EXPECT_TRUE(engine_.FindCodec(red));
373
374 cricket::VideoCodec red_ci(101, "red", 0, 0, 30, 0);
375 EXPECT_TRUE(engine_.FindCodec(red));
376
377 cricket::VideoCodec fec(102, "ULPFEC", 0, 0, 30, 0);
378 EXPECT_TRUE(engine_.FindCodec(fec));
379
380 cricket::VideoCodec fec_ci(102, "ulpfec", 0, 0, 30, 0);
381 EXPECT_TRUE(engine_.FindCodec(fec));
382
383 cricket::VideoCodec rtx(96, "rtx", 0, 0, 30, 0);
384 EXPECT_TRUE(engine_.FindCodec(rtx));
385}
386
387TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
388 std::vector<VideoCodec> engine_codecs = engine_.codecs();
389 for (size_t i = 0; i < engine_codecs.size(); ++i) {
390 if (engine_codecs[i].name != kRtxCodecName)
391 continue;
392 int associated_payload_type;
393 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
394 &associated_payload_type));
395 EXPECT_EQ(default_codec_.id, associated_payload_type);
396 return;
397 }
398 FAIL() << "No RTX codec found among default codecs.";
399}
400
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000401TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
402 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
403 ASSERT_FALSE(extensions.empty());
404 for (size_t i = 0; i < extensions.size(); ++i) {
405 if (extensions[i].uri == kRtpTimestampOffsetHeaderExtension) {
406 EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extensions[i].id);
407 return;
408 }
409 }
410 FAIL() << "Timestamp offset extension not in header-extension list.";
411}
412
413TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
414 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
415 ASSERT_FALSE(extensions.empty());
416 for (size_t i = 0; i < extensions.size(); ++i) {
417 if (extensions[i].uri == kRtpAbsoluteSenderTimeHeaderExtension) {
418 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId,
419 extensions[i].id);
420 return;
421 }
422 }
423 FAIL() << "Absolute Sender Time extension not in header-extension list.";
424}
425
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000426TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
427 talk_base::scoped_ptr<VideoMediaChannel> channel(engine_.CreateChannel(NULL));
428
429 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
430
431 EXPECT_FALSE(channel->SetSend(true))
432 << "Channel should not start without codecs.";
433 EXPECT_TRUE(channel->SetSend(false))
434 << "Channel should be stoppable even without set codecs.";
435}
436
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000437class WebRtcVideoEngine2BaseTest
438 : public VideoEngineTest<cricket::WebRtcVideoEngine2> {
439 protected:
440 typedef VideoEngineTest<cricket::WebRtcVideoEngine2> Base;
441};
442
443#define WEBRTC_ENGINE_BASE_TEST(test) \
444 TEST_F(WebRtcVideoEngine2BaseTest, test) { Base::test##Body(); }
445
446WEBRTC_ENGINE_BASE_TEST(ConstrainNewCodec2);
447
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000448class WebRtcVideoChannel2BaseTest
449 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
450 protected:
451 virtual cricket::VideoCodec DefaultCodec() OVERRIDE { return kVp8Codec; }
452 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
453};
454
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000455#define WEBRTC_BASE_TEST(test) \
456 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); }
457
458#define WEBRTC_DISABLED_BASE_TEST(test) \
459 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_ ## test) { Base::test(); }
460
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000461// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
462#if 0
463// TODO(juberti): Figure out why ViE is munging the COM refcount.
464#ifdef WIN32
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000465WEBRTC_DISABLED_BASE_TEST(CheckCoInitialize) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000466 Base::CheckCoInitialize();
467}
468#endif
469#endif
470
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000471WEBRTC_BASE_TEST(SetSend);
472WEBRTC_BASE_TEST(SetSendWithoutCodecs);
473WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000474
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000475WEBRTC_BASE_TEST(GetStats);
476WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
477WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000478
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000479WEBRTC_BASE_TEST(SetSendBandwidth);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000480
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000481WEBRTC_BASE_TEST(SetSendSsrc);
482WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000483
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000484WEBRTC_BASE_TEST(SetRenderer);
485WEBRTC_BASE_TEST(AddRemoveRecvStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000486
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000487WEBRTC_DISABLED_BASE_TEST(AddRemoveRecvStreamAndRender);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000488
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000489WEBRTC_BASE_TEST(AddRemoveRecvStreamsNoConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000490
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000491WEBRTC_BASE_TEST(AddRemoveSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000492
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000493WEBRTC_BASE_TEST(SimulateConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000494
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000495WEBRTC_BASE_TEST(AddRemoveCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000496
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000497WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000498
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000499WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000500
501// TODO(pbos): Figure out why this fails so often.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000502WEBRTC_DISABLED_BASE_TEST(HighAspectHighHeightCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000503
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000504WEBRTC_BASE_TEST(RejectEmptyStreamParams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000505
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000506WEBRTC_BASE_TEST(AdaptResolution16x10);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000507
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000508WEBRTC_BASE_TEST(AdaptResolution4x3);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000509
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000510WEBRTC_BASE_TEST(MuteStream);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000511
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000512WEBRTC_BASE_TEST(MultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000513
514// TODO(juberti): Restore this test once we support sending 0 fps.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000515WEBRTC_DISABLED_BASE_TEST(AdaptDropAllFrames);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000516// TODO(juberti): Understand why we get decode errors on this test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000517WEBRTC_DISABLED_BASE_TEST(AdaptFramerate);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000518
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000519WEBRTC_BASE_TEST(SetSendStreamFormat0x0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000520
521// TODO(zhurunz): Fix the flakey test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000522WEBRTC_DISABLED_BASE_TEST(SetSendStreamFormat);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000523
524TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
525 Base::TwoStreamsSendAndReceive(kVp8Codec);
526}
527
528TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
529 Base::TwoStreamsReUseFirstStream(kVp8Codec);
530}
531
532class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test {
533 public:
534 virtual void SetUp() OVERRIDE {
535 channel_.reset(engine_.CreateChannel(NULL));
536 fake_channel_ = factory_.GetFakeChannel(channel_.get());
537 last_ssrc_ = 123;
538 ASSERT_TRUE(fake_channel_ != NULL)
539 << "Channel not created through factory.";
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000540 EXPECT_TRUE(fake_channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000541 }
542
543 protected:
544 FakeVideoSendStream* AddSendStream() {
545 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
546 }
547
548 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
549 size_t num_streams =
550 fake_channel_->GetFakeCall()->GetVideoSendStreams().size();
551 EXPECT_TRUE(channel_->AddSendStream(sp));
552 std::vector<FakeVideoSendStream*> streams =
553 fake_channel_->GetFakeCall()->GetVideoSendStreams();
554 EXPECT_EQ(num_streams + 1, streams.size());
555 return streams[streams.size() - 1];
556 }
557
558 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
559 return fake_channel_->GetFakeCall()->GetVideoSendStreams();
560 }
561
562 FakeVideoReceiveStream* AddRecvStream() {
563 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
564 }
565
566 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
567 size_t num_streams =
568 fake_channel_->GetFakeCall()->GetVideoReceiveStreams().size();
569 EXPECT_TRUE(channel_->AddRecvStream(sp));
570 std::vector<FakeVideoReceiveStream*> streams =
571 fake_channel_->GetFakeCall()->GetVideoReceiveStreams();
572 EXPECT_EQ(num_streams + 1, streams.size());
573 return streams[streams.size() - 1];
574 }
575
576 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate,
577 const char* max_bitrate) {
578 std::vector<VideoCodec> codecs;
579 codecs.push_back(kVp8Codec);
580 codecs[0].params[kCodecParamMinBitrate] = min_bitrate;
581 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate;
582 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
583
584 FakeVideoSendStream* stream = AddSendStream();
585
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000586 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
587 ASSERT_EQ(1u, video_streams.size());
588 EXPECT_EQ(atoi(min_bitrate), video_streams.back().min_bitrate_bps / 1000);
589 EXPECT_EQ(atoi(max_bitrate), video_streams.back().max_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000590
591 VideoCodec codec;
592 EXPECT_TRUE(channel_->GetSendCodec(&codec));
593 EXPECT_EQ(min_bitrate, codec.params[kCodecParamMinBitrate]);
594 EXPECT_EQ(max_bitrate, codec.params[kCodecParamMaxBitrate]);
595 }
596
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000597 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
598 const std::string& webrtc_ext) {
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000599 FakeCall* call = fake_channel_->GetFakeCall();
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000600 // Enable extension.
601 const int id = 1;
602 std::vector<cricket::RtpHeaderExtension> extensions;
603 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
604 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
605
606 FakeVideoSendStream* send_stream =
607 AddSendStream(cricket::StreamParams::CreateLegacy(123));
608
609 // Verify the send extension id.
610 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
611 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
612 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
613 // Verify call with same set of extensions returns true.
614 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
615 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
616 // receivers.
617 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
618 ->GetConfig()
619 .rtp.extensions.empty());
620
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000621 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000622 std::vector<cricket::RtpHeaderExtension> empty_extensions;
623 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000624 ASSERT_EQ(1u, call->GetVideoSendStreams().size());
625 send_stream = call->GetVideoSendStreams()[0];
626 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
627
628 // Verify that adding receive RTP header extensions adds them for existing
629 // streams.
630 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
631 send_stream = call->GetVideoSendStreams()[0];
632 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
633 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
634 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000635 }
636
637 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
638 const std::string& webrtc_ext) {
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000639 FakeCall* call = fake_channel_->GetFakeCall();
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000640 // Enable extension.
641 const int id = 1;
642 std::vector<cricket::RtpHeaderExtension> extensions;
643 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
644 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
645
646 FakeVideoReceiveStream* recv_stream =
647 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
648
649 // Verify the recv extension id.
650 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
651 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
652 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
653 // Verify call with same set of extensions returns true.
654 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000655
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000656 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
657 // senders.
658 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
659 ->GetConfig()
660 .rtp.extensions.empty());
661
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000662 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000663 std::vector<cricket::RtpHeaderExtension> empty_extensions;
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000664 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(empty_extensions));
665 ASSERT_EQ(1u, call->GetVideoReceiveStreams().size());
666 recv_stream = call->GetVideoReceiveStreams()[0];
667 EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
668
669 // Verify that adding receive RTP header extensions adds them for existing
670 // streams.
671 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
672 recv_stream = call->GetVideoReceiveStreams()[0];
673 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
674 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
675 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000676 }
677
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000678 talk_base::scoped_ptr<VideoMediaChannel> channel_;
679 FakeWebRtcVideoChannel2* fake_channel_;
680 uint32 last_ssrc_;
681};
682
683TEST_F(WebRtcVideoChannel2Test, DISABLED_MaxBitrateResetsWithConferenceMode) {
684 FAIL() << "Not implemented."; // TODO(pbos): Implement.
685}
686
687TEST_F(WebRtcVideoChannel2Test, DISABLED_StartSendBitrate) {
688 // TODO(pbos): Is this test testing vie_ ? this is confusing. No API to set
689 // start send bitrate from outside? Add defaults here that should be kept?
690 std::vector<cricket::VideoCodec> codec_list;
691 codec_list.push_back(kVp8Codec);
692 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
693 const unsigned int kVideoMinSendBitrateKbps = 50;
694 const unsigned int kVideoTargetSendBitrateKbps = 300;
695 const unsigned int kVideoMaxSendBitrateKbps = 2000;
696 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000697 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
698 ASSERT_EQ(1u, video_streams.size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000699 EXPECT_EQ(kVideoMinSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000700 video_streams.back().min_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000701 EXPECT_EQ(kVideoTargetSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000702 video_streams.back().target_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000703 EXPECT_EQ(kVideoMaxSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000704 video_streams.back().max_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000705#if 0
706 // TODO(pbos): un-#if
707 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
708 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
709 kVideoDefaultStartSendBitrateKbps);
710 EXPECT_EQ(0, vie_.StartSend(send_channel));
711
712 // Increase the send bitrate and verify it is used as start bitrate.
713 const unsigned int kVideoSendBitrateBps = 768000;
714 vie_.SetSendBitrates(send_channel, kVideoSendBitrateBps, 0, 0);
715 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
716 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
717 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
718 kVideoSendBitrateBps / 1000);
719
720 // Never set a start bitrate higher than the max bitrate.
721 vie_.SetSendBitrates(send_channel, kVideoMaxSendBitrateKbps + 500, 0, 0);
722 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
723 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
724 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
725 kVideoDefaultStartSendBitrateKbps);
726
727 // Use the default start bitrate if the send bitrate is lower.
728 vie_.SetSendBitrates(send_channel, kVideoDefaultStartSendBitrateKbps - 50, 0,
729 0);
730 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
731 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
732 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
733 kVideoDefaultStartSendBitrateKbps);
734#endif
735}
736
737TEST_F(WebRtcVideoChannel2Test, DISABLED_RtcpEnabled) {
738 // Note(pbos): This is a receiver-side setting, dumbo.
739 FAIL() << "Not implemented."; // TODO(pbos): Implement.
740}
741
742TEST_F(WebRtcVideoChannel2Test, DISABLED_KeyFrameRequestEnabled) {
743 FAIL() << "Not implemented."; // TODO(pbos): Implement.
744}
745
746TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
747 FakeVideoReceiveStream* stream = AddRecvStream();
748 EXPECT_TRUE(stream->GetConfig().rtp.remb);
749}
750
751TEST_F(WebRtcVideoChannel2Test, DISABLED_RembEnabledOnReceiveChannels) {
752 FAIL() << "Not implemented."; // TODO(pbos): Implement.
753}
754
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000755TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000756 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
757 EXPECT_TRUE(channel_->SetSend(true));
758 cricket::VideoOptions options;
759 options.conference_mode.Set(true);
760 EXPECT_TRUE(channel_->SetOptions(options));
761
762 // Send side.
763 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
764 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
765 FakeVideoSendStream* send_stream = AddSendStream(
766 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
767
768 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
769 for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
770 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
771
772 // Receiver side.
773 FakeVideoReceiveStream* recv_stream = AddRecvStream(
774 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
775 ASSERT_GT(recv_stream->GetConfig().rtp.rtx.size(), 0u)
776 << "No SSRCs for RTX configured by AddRecvStream.";
777 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size())
778 << "This test only works with one receive codec. Please update the test.";
779 EXPECT_EQ(rtx_ssrcs[0],
780 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
781 // TODO(pbos): Make sure we set the RTX for correct payloads etc.
782}
783
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000784TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
785 // Setup one channel with an associated RTX stream.
786 cricket::StreamParams params =
787 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
788 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
789 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
790 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
791 EXPECT_EQ(kRtxSsrcs1[0],
792 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000793}
794
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000795TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
796 // Setup one channel without an associated RTX stream.
797 cricket::StreamParams params =
798 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
799 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
800 ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000801}
802
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000803TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
804 FakeVideoSendStream* send_stream =
805 AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
806 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
807
808 FakeVideoReceiveStream* recv_stream =
809 AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
810 ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000811}
812
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000813// Test support for RTP timestamp offset header extension.
814TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
815 TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
816 webrtc::RtpExtension::kTOffset);
817}
818TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
819 TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
820 webrtc::RtpExtension::kTOffset);
821}
822
823// Test support for absolute send time header extension.
824TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
825 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
826 webrtc::RtpExtension::kAbsSendTime);
827}
828TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
829 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
830 webrtc::RtpExtension::kAbsSendTime);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000831}
832
pbos@webrtc.org3c107582014-07-20 15:27:35 +0000833TEST_F(WebRtcVideoChannel2Test,
834 SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
835 const int kUnsupportedId = 1;
836 const int kTOffsetId = 2;
837
838 std::vector<cricket::RtpHeaderExtension> extensions;
839 extensions.push_back(cricket::RtpHeaderExtension(
840 kUnsupportedExtensionName, kUnsupportedId));
841 extensions.push_back(cricket::RtpHeaderExtension(
842 webrtc::RtpExtension::kTOffset, kTOffsetId));
843 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
844 FakeVideoSendStream* send_stream =
845 AddSendStream(cricket::StreamParams::CreateLegacy(123));
846
847 // Only timestamp offset extension is set to send stream,
848 // unsupported rtp extension is ignored.
849 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
850 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
851 send_stream->GetConfig().rtp.extensions[0].name.c_str());
852}
853
854TEST_F(WebRtcVideoChannel2Test,
855 SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
856 const int kUnsupportedId = 1;
857 const int kTOffsetId = 2;
858
859 std::vector<cricket::RtpHeaderExtension> extensions;
860 extensions.push_back(cricket::RtpHeaderExtension(
861 kUnsupportedExtensionName, kUnsupportedId));
862 extensions.push_back(cricket::RtpHeaderExtension(
863 webrtc::RtpExtension::kTOffset, kTOffsetId));
864 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
865 FakeVideoReceiveStream* recv_stream =
866 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
867
868 // Only timestamp offset extension is set to receive stream,
869 // unsupported rtp extension is ignored.
870 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
871 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
872 recv_stream->GetConfig().rtp.extensions[0].name.c_str());
873}
874
875TEST_F(WebRtcVideoChannel2Test,
876 SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
877 const size_t kNumIncorrectIds = 4;
878 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
879 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
880 std::vector<cricket::RtpHeaderExtension> extensions;
881 extensions.push_back(cricket::RtpHeaderExtension(
882 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
883 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions))
884 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
885 }
886}
887
888TEST_F(WebRtcVideoChannel2Test,
889 SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
890 const size_t kNumIncorrectIds = 4;
891 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
892 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
893 std::vector<cricket::RtpHeaderExtension> extensions;
894 extensions.push_back(cricket::RtpHeaderExtension(
895 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
896 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions))
897 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
898 }
899}
900
901TEST_F(WebRtcVideoChannel2Test,
902 SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
903 const int id = 1;
904 std::vector<cricket::RtpHeaderExtension> extensions;
905 extensions.push_back(cricket::RtpHeaderExtension(
906 webrtc::RtpExtension::kTOffset, id));
907 extensions.push_back(cricket::RtpHeaderExtension(
908 kRtpAbsoluteSenderTimeHeaderExtension, id));
909 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
910
911 // Duplicate entries are also not supported.
912 extensions.clear();
913 extensions.push_back(cricket::RtpHeaderExtension(
914 webrtc::RtpExtension::kTOffset, id));
915 extensions.push_back(extensions.back());
916 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
917}
918
919TEST_F(WebRtcVideoChannel2Test,
920 SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
921 const int id = 1;
922 std::vector<cricket::RtpHeaderExtension> extensions;
923 extensions.push_back(cricket::RtpHeaderExtension(
924 webrtc::RtpExtension::kTOffset, id));
925 extensions.push_back(cricket::RtpHeaderExtension(
926 kRtpAbsoluteSenderTimeHeaderExtension, id));
927 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
928
929 // Duplicate entries are also not supported.
930 extensions.clear();
931 extensions.push_back(cricket::RtpHeaderExtension(
932 webrtc::RtpExtension::kTOffset, id));
933 extensions.push_back(extensions.back());
934 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
935}
936
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000937TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
938 FAIL() << "Not implemented."; // TODO(pbos): Implement.
939}
940
941TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
942 FAIL() << "Not implemented."; // TODO(pbos): Implement.
943}
944
945TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
946 FAIL() << "Not implemented."; // TODO(pbos): Implement.
947}
948
949TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
950 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
951 EXPECT_EQ(1u, fake_channel_->GetFakeCall()->GetVideoReceiveStreams().size());
952}
953
954TEST_F(WebRtcVideoChannel2Test, DISABLED_NoRembChangeAfterAddRecvStream) {
955 FAIL() << "Not implemented."; // TODO(pbos): Implement.
956}
957
958TEST_F(WebRtcVideoChannel2Test, DISABLED_RembOnOff) {
959 FAIL() << "Not implemented."; // TODO(pbos): Implement.
960}
961
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +0000962TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
963 VerifyCodecHasDefaultFeedbackParams(default_codec_);
964
pbos@webrtc.org19864742014-05-30 07:35:47 +0000965 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
966 EXPECT_TRUE(channel_->SetSend(true));
967
968 // Send side.
969 FakeVideoSendStream* send_stream =
970 AddSendStream(cricket::StreamParams::CreateLegacy(1));
971 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
972
973 // Receiver side.
974 FakeVideoReceiveStream* recv_stream =
975 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
976 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
977
978 // Nack history size should match between sender and receiver.
979 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
980 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000981}
982
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +0000983TEST_F(WebRtcVideoChannel2Test, NackCanBeDisabled) {
984 std::vector<VideoCodec> codecs;
985 codecs.push_back(kVp8Codec);
986
987 // Send side.
988 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
989 FakeVideoSendStream* send_stream =
990 AddSendStream(cricket::StreamParams::CreateLegacy(1));
991 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
992
993 // Receiver side.
994 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
995 FakeVideoReceiveStream* recv_stream =
996 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
997 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
998}
999
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001000TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
1001 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1002}
1003
1004TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
1005 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1006}
1007
1008TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
1009 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1010}
1011
1012TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
1013 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1014}
1015
1016TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
1017 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1018}
1019
1020TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
1021 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1022}
1023
1024TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
1025 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1026}
1027
1028TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
1029 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1030}
1031
1032TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
1033 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1034}
1035
1036TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthScreencast) {
1037 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1038}
1039
1040TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
1041 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1042}
1043
1044TEST_F(WebRtcVideoChannel2Test,
1045 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
1046 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1047}
1048
1049TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithDenoising) {
1050 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1051}
1052
1053TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
1054 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1055}
1056
1057TEST_F(WebRtcVideoChannel2Test, DISABLED_DISABLED_SendReceiveBitratesStats) {
1058 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1059}
1060
1061TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetAdaptInputToCpuUsage) {
1062 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1063}
1064
1065TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetCpuThreshold) {
1066 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1067}
1068
1069TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetInvalidCpuThreshold) {
1070 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1071}
1072
1073TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldLog) {
1074 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1075}
1076
1077TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldNotLog) {
1078 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1079}
1080
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001081TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001082 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001083
1084 VideoCodec codec;
1085 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001086 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001087
1088 // Using a RTX setup to verify that the default RTX payload type is good.
1089 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1090 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1091 FakeVideoSendStream* stream = AddSendStream(
1092 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1093 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001094
1095 // Make sure NACK and FEC are enabled on the correct payload types.
1096 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
1097 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
1098 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001099
1100 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
1101 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001102 EXPECT_EQ(static_cast<int>(default_rtx_codec_.id),
1103 config.rtp.rtx.payload_type);
1104 // TODO(juberti): Check RTCP, PLI, TMMBR.
1105}
1106
1107TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
1108 std::vector<VideoCodec> codecs;
1109 codecs.push_back(kVp8Codec);
1110 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1111
1112 FakeVideoSendStream* stream = AddSendStream();
1113 webrtc::VideoSendStream::Config config = stream->GetConfig();
1114
1115 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1116 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1117}
1118
1119TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001120 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1121 std::vector<VideoCodec> codecs;
1122 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1123 codecs.push_back(rtx_codec);
1124 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1125 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001126}
1127
1128TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001129 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1130 std::vector<VideoCodec> codecs;
1131 cricket::VideoCodec rtx_codec =
1132 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1133 codecs.push_back(kVp8Codec);
1134 codecs.push_back(rtx_codec);
1135 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1136
1137 cricket::VideoCodec rtx_codec2 =
1138 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1139 codecs.pop_back();
1140 codecs.push_back(rtx_codec2);
1141 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1142 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001143}
1144
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001145TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1146 std::vector<VideoCodec> codecs;
1147 codecs.push_back(kVp8Codec);
1148 codecs.push_back(kUlpfecCodec);
1149 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1150
1151 FakeVideoSendStream* stream = AddSendStream();
1152 webrtc::VideoSendStream::Config config = stream->GetConfig();
1153
1154 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1155
1156 codecs.pop_back();
1157 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1158 stream = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0];
1159 ASSERT_TRUE(stream != NULL);
1160 config = stream->GetConfig();
1161 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1162 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001163}
1164
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001165TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1166 std::vector<VideoCodec> codecs;
1167 codecs.push_back(kVp8Codec720p);
1168 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1169
1170 std::vector<webrtc::VideoStream> streams =
1171 AddSendStream()->GetVideoStreams();
1172 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1173 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1174
1175 codecs.clear();
1176 codecs.push_back(kVp8Codec360p);
1177 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1178 streams = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0]
1179 ->GetVideoStreams();
1180 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1181 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001182}
1183
1184TEST_F(WebRtcVideoChannel2Test,
1185 DISABLED_ConstrainsSetCodecsAccordingToEncoderConfig) {
1186 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1187}
1188
1189TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMinMaxBitrate) {
1190 SetSendCodecsShouldWorkForBitrates("10", "20");
1191}
1192
1193TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001194 std::vector<VideoCodec> video_codecs = engine_.codecs();
1195 video_codecs[0].params[kCodecParamMinBitrate] = "30";
1196 video_codecs[0].params[kCodecParamMaxBitrate] = "20";
1197 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001198}
1199
1200TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptLargeMinMaxBitrate) {
1201 SetSendCodecsShouldWorkForBitrates("1000", "2000");
1202}
1203
1204TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1205 static const char* kMaxQuantization = "21";
1206 std::vector<VideoCodec> codecs;
1207 codecs.push_back(kVp8Codec);
1208 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1209 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001210 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1211 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001212
1213 VideoCodec codec;
1214 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1215 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1216}
1217
1218TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1219 std::vector<cricket::VideoCodec> codecs;
1220 codecs.push_back(kVp8Codec);
1221
1222 codecs[0].width = 0;
1223 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1224 << "Codec set though codec width is zero.";
1225
1226 codecs[0].width = kVp8Codec.width;
1227 codecs[0].height = 0;
1228 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1229 << "Codec set though codec height is zero.";
1230}
1231
1232TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
1233 // TODO(pbos): Should we only allow the dynamic range?
1234 static const size_t kNumIncorrectPayloads = 4;
1235 static const int kIncorrectPayloads[kNumIncorrectPayloads] = {-2, -1, 128,
1236 129};
1237 std::vector<cricket::VideoCodec> codecs;
1238 codecs.push_back(kVp8Codec);
1239 for (size_t i = 0; i < kNumIncorrectPayloads; ++i) {
1240 int payload_type = kIncorrectPayloads[i];
1241 codecs[0].id = payload_type;
1242 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1243 << "Bad payload type '" << payload_type << "' accepted.";
1244 }
1245}
1246
1247TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
1248 std::vector<cricket::VideoCodec> codecs;
1249 codecs.push_back(kVp8Codec);
1250 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
1251 codecs[0].id = payload_type;
1252 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
1253 << "Payload type '" << payload_type << "' rejected.";
1254 }
1255}
1256
1257TEST_F(WebRtcVideoChannel2Test, DISABLED_ResetVieSendCodecOnNewFrameSize) {
1258 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1259}
1260
1261TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
1262 std::vector<cricket::VideoCodec> codecs;
1263 codecs.push_back(kVp8Codec);
1264 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1265}
1266
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001267// Test that we set our inbound RTX codecs properly.
1268TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
1269 std::vector<cricket::VideoCodec> codecs;
1270 codecs.push_back(kVp8Codec);
1271 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1272 codecs.push_back(rtx_codec);
1273 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1274 << "RTX codec without associated payload should be rejected.";
1275
1276 codecs[1].SetParam("apt", kVp8Codec.id + 1);
1277 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1278 << "RTX codec with invalid associated payload type should be rejected.";
1279
1280 codecs[1].SetParam("apt", kVp8Codec.id);
1281 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1282
1283 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
1284 rtx_codec2.SetParam("apt", rtx_codec.id);
1285 codecs.push_back(rtx_codec2);
1286
1287 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
1288 "as associated payload type "
1289 "should be rejected.";
1290}
1291
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001292TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
1293 std::vector<cricket::VideoCodec> codecs;
1294 codecs.push_back(kVp8Codec);
1295 codecs[0].id = 99;
1296 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1297}
1298
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001299TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001300 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001301
1302 FakeVideoReceiveStream* stream = AddRecvStream();
1303 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1304 EXPECT_STREQ(engine_.codecs()[0].name.c_str(), config.codecs[0].plName);
1305 EXPECT_EQ(engine_.codecs()[0].id, config.codecs[0].plType);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001306}
1307
1308TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
1309 std::vector<VideoCodec> codecs;
1310 codecs.push_back(kVp8Codec);
1311 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
1312 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1313}
1314
1315// TODO(pbos): Enable VP9 through external codec support
1316TEST_F(WebRtcVideoChannel2Test,
1317 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
1318 std::vector<VideoCodec> codecs;
1319 codecs.push_back(kVp8Codec);
1320 codecs.push_back(kVp9Codec);
1321 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1322}
1323
1324TEST_F(WebRtcVideoChannel2Test,
1325 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
1326 std::vector<VideoCodec> codecs;
1327 codecs.push_back(kVp8Codec);
1328 codecs.push_back(kVp9Codec);
1329 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1330 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
1331}
1332
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001333TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
1334 std::vector<VideoCodec> codecs;
1335 codecs.push_back(kVp8Codec);
1336 codecs.push_back(kUlpfecCodec);
1337 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1338
1339 FakeVideoReceiveStream* stream = AddRecvStream();
1340 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1341
1342 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1343
1344 codecs.pop_back();
1345 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1346 stream = fake_channel_->GetFakeCall()->GetVideoReceiveStreams()[0];
1347 ASSERT_TRUE(stream != NULL);
1348 config = stream->GetConfig();
1349 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1350 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001351}
1352
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001353TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
1354 std::vector<VideoCodec> codecs;
1355 codecs.push_back(kVp8Codec);
1356 codecs.push_back(kRedCodec);
1357 codecs[1].id = codecs[0].id;
1358 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1359}
1360
1361TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
1362 std::vector<VideoCodec> codecs;
1363 codecs.push_back(kVp8Codec);
1364 codecs.push_back(kVp9Codec);
1365 codecs[1].id = codecs[0].id;
1366 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1367}
1368
1369TEST_F(WebRtcVideoChannel2Test,
1370 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
1371 std::vector<VideoCodec> codecs;
1372 codecs.push_back(kVp8Codec);
1373 codecs.push_back(kVp8Codec);
1374 codecs[1].id += 1;
1375 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1376}
1377
1378TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
1379 EXPECT_FALSE(AddSendStream()->IsSending());
1380}
1381
pbos@webrtc.org85f42942014-07-22 09:14:58 +00001382TEST_F(WebRtcVideoChannel2Test, ReceiveStreamReceivingByDefault) {
1383 EXPECT_TRUE(AddRecvStream()->IsReceiving());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001384}
1385
1386TEST_F(WebRtcVideoChannel2Test, SetSend) {
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +00001387 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001388 EXPECT_FALSE(stream->IsSending());
1389
1390 // false->true
1391 EXPECT_TRUE(channel_->SetSend(true));
1392 EXPECT_TRUE(stream->IsSending());
1393 // true->true
1394 EXPECT_TRUE(channel_->SetSend(true));
1395 EXPECT_TRUE(stream->IsSending());
1396 // true->false
1397 EXPECT_TRUE(channel_->SetSend(false));
1398 EXPECT_FALSE(stream->IsSending());
1399 // false->false
1400 EXPECT_TRUE(channel_->SetSend(false));
1401 EXPECT_FALSE(stream->IsSending());
1402
1403 EXPECT_TRUE(channel_->SetSend(true));
1404 FakeVideoSendStream* new_stream = AddSendStream();
1405 EXPECT_TRUE(new_stream->IsSending())
1406 << "Send stream created after SetSend(true) not sending initially.";
1407}
1408
1409TEST_F(WebRtcVideoChannel2Test, DISABLED_SendAndReceiveVp8Vga) {
1410 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1411}
1412
1413TEST_F(WebRtcVideoChannel2Test, DISABLED_SendAndReceiveVp8Qvga) {
1414 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1415}
1416
1417TEST_F(WebRtcVideoChannel2Test, DISABLED_SendAndReceiveH264SvcQqvga) {
1418 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1419}
1420
1421TEST_F(WebRtcVideoChannel2Test, DISABLED_SendManyResizeOnce) {
1422 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1423}
1424
1425TEST_F(WebRtcVideoChannel2Test, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
1426 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1427}
1428
1429TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetDscpOptions) {
1430 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1431}
1432
1433TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithMaxBitrate) {
1434 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1435}
1436
1437TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithLoweredBitrate) {
1438 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1439}
1440
1441TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsSucceedsWhenSending) {
1442 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1443}
1444
1445TEST_F(WebRtcVideoChannel2Test, DISABLED_ResetCodecOnScreencast) {
1446 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1447}
1448
1449TEST_F(WebRtcVideoChannel2Test, DISABLED_DontResetCodecOnSendFrame) {
1450 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1451}
1452
1453TEST_F(WebRtcVideoChannel2Test,
1454 DISABLED_DontRegisterDecoderIfFactoryIsNotGiven) {
1455 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1456}
1457
1458TEST_F(WebRtcVideoChannel2Test, DISABLED_RegisterDecoderIfFactoryIsGiven) {
1459 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1460}
1461
1462TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterDecoderMultipleTimes) {
1463 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1464}
1465
1466TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterDecoderForNonVP8) {
1467 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1468}
1469
1470TEST_F(WebRtcVideoChannel2Test,
1471 DISABLED_DontRegisterEncoderIfFactoryIsNotGiven) {
1472 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1473}
1474
1475TEST_F(WebRtcVideoChannel2Test, DISABLED_RegisterEncoderIfFactoryIsGiven) {
1476 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1477}
1478
1479TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterEncoderMultipleTimes) {
1480 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1481}
1482
1483TEST_F(WebRtcVideoChannel2Test,
1484 DISABLED_RegisterEncoderWithMultipleSendStreams) {
1485 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1486}
1487
1488TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterEncoderForNonVP8) {
1489 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1490}
1491
1492TEST_F(WebRtcVideoChannel2Test, DISABLED_FeedbackParamsForNonVP8) {
1493 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1494}
1495
1496TEST_F(WebRtcVideoChannel2Test, DISABLED_ExternalCodecAddedToTheEnd) {
1497 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1498}
1499
1500TEST_F(WebRtcVideoChannel2Test, DISABLED_ExternalCodecIgnored) {
1501 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1502}
1503
1504TEST_F(WebRtcVideoChannel2Test, DISABLED_UpdateEncoderCodecsAfterSetFactory) {
1505 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1506}
1507
1508TEST_F(WebRtcVideoChannel2Test, DISABLED_OnReadyToSend) {
1509 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1510}
1511
1512TEST_F(WebRtcVideoChannel2Test, DISABLED_CaptureFrameTimestampToNtpTimestamp) {
1513 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1514}
1515} // namespace cricket