blob: 0d46e2b64188a091cd9a493c5b05a9f304a9de6e [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.org86f613d2014-06-10 08:53:05 +000083bool FakeVideoSendStream::IsSending() {
84 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.org86f613d2014-06-10 08:53:05 +0000120webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const {
121 return webrtc::VideoReceiveStream::Stats();
122}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000123
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000124void FakeVideoReceiveStream::Start() {
125 receiving_ = true;
126}
127void FakeVideoReceiveStream::Stop() {
128 receiving_ = false;
129}
130void FakeVideoReceiveStream::GetCurrentReceiveCodec(webrtc::VideoCodec* codec) {
131}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000132
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000133FakeCall::FakeCall() { SetVideoCodecs(GetDefaultVideoCodecs()); }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000134
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000135FakeCall::~FakeCall() {
136 EXPECT_EQ(0u, video_send_streams_.size());
137 EXPECT_EQ(0u, video_receive_streams_.size());
138}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000139
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000140void FakeCall::SetVideoCodecs(const std::vector<webrtc::VideoCodec> codecs) {
141 codecs_ = codecs;
142}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000143
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000144std::vector<FakeVideoSendStream*> FakeCall::GetVideoSendStreams() {
145 return video_send_streams_;
146}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000147
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000148std::vector<FakeVideoReceiveStream*> FakeCall::GetVideoReceiveStreams() {
149 return video_receive_streams_;
150}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000151
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000152webrtc::VideoCodec FakeCall::GetEmptyVideoCodec() {
153 webrtc::VideoCodec codec;
154 codec.minBitrate = 300;
155 codec.startBitrate = 800;
156 codec.maxBitrate = 1500;
157 codec.maxFramerate = 10;
158 codec.width = 640;
159 codec.height = 480;
160 codec.qpMax = 56;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000161
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000162 return codec;
163}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000164
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000165webrtc::VideoCodec FakeCall::GetVideoCodecVp8() {
166 webrtc::VideoCodec vp8_codec = GetEmptyVideoCodec();
167 vp8_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.orgcb859ec2014-07-15 08:28:20 +0000168 talk_base::strcpyn(vp8_codec.plName, ARRAY_SIZE(vp8_codec.plName),
169 kVp8Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000170 vp8_codec.plType = kVp8Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000171
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000172 return vp8_codec;
173}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000174
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000175webrtc::VideoCodec FakeCall::GetVideoCodecVp9() {
176 webrtc::VideoCodec vp9_codec = GetEmptyVideoCodec();
177 // TODO(pbos): Add a correct codecType when webrtc has one.
178 vp9_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.orgcb859ec2014-07-15 08:28:20 +0000179 talk_base::strcpyn(vp9_codec.plName, ARRAY_SIZE(vp9_codec.plName),
180 kVp9Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000181 vp9_codec.plType = kVp9Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000182
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000183 return vp9_codec;
184}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000185
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000186std::vector<webrtc::VideoCodec> FakeCall::GetDefaultVideoCodecs() {
187 std::vector<webrtc::VideoCodec> codecs;
188 codecs.push_back(GetVideoCodecVp8());
189 // codecs.push_back(GetVideoCodecVp9());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000190
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000191 return codecs;
192}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000193
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000194webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
195 const webrtc::VideoSendStream::Config& config,
196 const std::vector<webrtc::VideoStream>& video_streams,
197 const void* encoder_settings) {
198 FakeVideoSendStream* fake_stream =
199 new FakeVideoSendStream(config, video_streams);
200 video_send_streams_.push_back(fake_stream);
201 return fake_stream;
202}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000203
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000204void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
205 FakeVideoSendStream* fake_stream =
206 static_cast<FakeVideoSendStream*>(send_stream);
207 for (size_t i = 0; i < video_send_streams_.size(); ++i) {
208 if (video_send_streams_[i] == fake_stream) {
209 delete video_send_streams_[i];
210 video_send_streams_.erase(video_send_streams_.begin() + i);
211 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000212 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000213 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000214 ADD_FAILURE() << "DestroyVideoSendStream called with unknown paramter.";
215}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000216
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000217webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
218 const webrtc::VideoReceiveStream::Config& config) {
219 video_receive_streams_.push_back(new FakeVideoReceiveStream(config));
220 return video_receive_streams_[video_receive_streams_.size() - 1];
221}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000222
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000223void FakeCall::DestroyVideoReceiveStream(
224 webrtc::VideoReceiveStream* receive_stream) {
225 FakeVideoReceiveStream* fake_stream =
226 static_cast<FakeVideoReceiveStream*>(receive_stream);
227 for (size_t i = 0; i < video_receive_streams_.size(); ++i) {
228 if (video_receive_streams_[i] == fake_stream) {
229 delete video_receive_streams_[i];
230 video_receive_streams_.erase(video_receive_streams_.begin() + i);
231 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000232 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000233 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000234 ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown paramter.";
235}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000236
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000237webrtc::PacketReceiver* FakeCall::Receiver() {
238 // TODO(pbos): Fix this.
239 return NULL;
240}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000241
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000242uint32_t FakeCall::SendBitrateEstimate() {
243 return 0;
244}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000245
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000246uint32_t FakeCall::ReceiveBitrateEstimate() {
247 return 0;
248}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000249
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000250FakeWebRtcVideoChannel2::FakeWebRtcVideoChannel2(
251 FakeCall* call,
252 WebRtcVideoEngine2* engine,
253 VoiceMediaChannel* voice_channel)
254 : WebRtcVideoChannel2(call, engine, engine->GetVideoEncoderFactory()),
255 fake_call_(call),
256 voice_channel_(voice_channel) {
257}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000258
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000259FakeWebRtcVideoChannel2::~FakeWebRtcVideoChannel2() {
260}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000261
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000262VoiceMediaChannel* FakeWebRtcVideoChannel2::GetVoiceChannel() {
263 return voice_channel_;
264}
265FakeCall* FakeWebRtcVideoChannel2::GetFakeCall() {
266 return fake_call_;
267}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000268
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000269FakeWebRtcVideoChannel2* FakeWebRtcVideoMediaChannelFactory::GetFakeChannel(
270 VideoMediaChannel* channel) {
271 return channel_map_[channel];
272}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000273
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000274WebRtcVideoChannel2* FakeWebRtcVideoMediaChannelFactory::Create(
275 WebRtcVideoEngine2* engine,
276 VoiceMediaChannel* voice_channel) {
277 FakeWebRtcVideoChannel2* channel =
278 new FakeWebRtcVideoChannel2(new FakeCall(), engine, voice_channel);
279 channel_map_[channel] = channel;
280 return channel;
281}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000282
283class WebRtcVideoEngine2Test : public testing::Test {
284 public:
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000285 WebRtcVideoEngine2Test() : engine_(&factory_) {
286 std::vector<VideoCodec> engine_codecs = engine_.codecs();
287 assert(!engine_codecs.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000288 bool codec_set = false;
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000289 for (size_t i = 0; i < engine_codecs.size(); ++i) {
290 if (engine_codecs[i].name == "red") {
291 default_red_codec_ = engine_codecs[i];
292 } else if (engine_codecs[i].name == "ulpfec") {
293 default_ulpfec_codec_ = engine_codecs[i];
294 } else if (engine_codecs[i].name == "rtx") {
295 default_rtx_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000296 } else if (!codec_set) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000297 default_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000298 codec_set = true;
299 }
300 }
301
302 assert(codec_set);
303 }
304
305 protected:
306 FakeWebRtcVideoMediaChannelFactory factory_;
307 WebRtcVideoEngine2 engine_;
308 VideoCodec default_codec_;
309 VideoCodec default_red_codec_;
310 VideoCodec default_ulpfec_codec_;
311 VideoCodec default_rtx_codec_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000312};
313
314TEST_F(WebRtcVideoEngine2Test, CreateChannel) {
315 talk_base::scoped_ptr<VideoMediaChannel> channel(engine_.CreateChannel(NULL));
316 ASSERT_TRUE(channel.get() != NULL) << "Could not create channel.";
317 EXPECT_TRUE(factory_.GetFakeChannel(channel.get()) != NULL)
318 << "Channel not created through factory.";
319}
320
321TEST_F(WebRtcVideoEngine2Test, CreateChannelWithVoiceEngine) {
322 VoiceMediaChannel* voice_channel = reinterpret_cast<VoiceMediaChannel*>(0x42);
323 talk_base::scoped_ptr<VideoMediaChannel> channel(
324 engine_.CreateChannel(voice_channel));
325 ASSERT_TRUE(channel.get() != NULL) << "Could not create channel.";
326
327 FakeWebRtcVideoChannel2* fake_channel =
328 factory_.GetFakeChannel(channel.get());
329 ASSERT_TRUE(fake_channel != NULL) << "Channel not created through factory.";
330
331 EXPECT_TRUE(fake_channel->GetVoiceChannel() != NULL)
332 << "VoiceChannel not set.";
333 EXPECT_EQ(voice_channel, fake_channel->GetVoiceChannel())
334 << "Different VoiceChannel set than the provided one.";
335}
336
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000337TEST_F(WebRtcVideoEngine2Test, FindCodec) {
338 const std::vector<cricket::VideoCodec>& c = engine_.codecs();
339 EXPECT_EQ(4U, c.size());
340
341 cricket::VideoCodec vp8(104, "VP8", 320, 200, 30, 0);
342 EXPECT_TRUE(engine_.FindCodec(vp8));
343
344 cricket::VideoCodec vp8_ci(104, "vp8", 320, 200, 30, 0);
345 EXPECT_TRUE(engine_.FindCodec(vp8));
346
347 cricket::VideoCodec vp8_diff_fr_diff_pref(104, "VP8", 320, 200, 50, 50);
348 EXPECT_TRUE(engine_.FindCodec(vp8_diff_fr_diff_pref));
349
350 cricket::VideoCodec vp8_diff_id(95, "VP8", 320, 200, 30, 0);
351 EXPECT_FALSE(engine_.FindCodec(vp8_diff_id));
352 vp8_diff_id.id = 97;
353 EXPECT_TRUE(engine_.FindCodec(vp8_diff_id));
354
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000355 // FindCodec ignores the codec size.
356 // Test that FindCodec can accept uncommon codec size.
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000357 cricket::VideoCodec vp8_diff_res(104, "VP8", 320, 111, 30, 0);
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000358 EXPECT_TRUE(engine_.FindCodec(vp8_diff_res));
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000359
360 // PeerConnection doesn't negotiate the resolution at this point.
361 // Test that FindCodec can handle the case when width/height is 0.
362 cricket::VideoCodec vp8_zero_res(104, "VP8", 0, 0, 30, 0);
363 EXPECT_TRUE(engine_.FindCodec(vp8_zero_res));
364
365 cricket::VideoCodec red(101, "RED", 0, 0, 30, 0);
366 EXPECT_TRUE(engine_.FindCodec(red));
367
368 cricket::VideoCodec red_ci(101, "red", 0, 0, 30, 0);
369 EXPECT_TRUE(engine_.FindCodec(red));
370
371 cricket::VideoCodec fec(102, "ULPFEC", 0, 0, 30, 0);
372 EXPECT_TRUE(engine_.FindCodec(fec));
373
374 cricket::VideoCodec fec_ci(102, "ulpfec", 0, 0, 30, 0);
375 EXPECT_TRUE(engine_.FindCodec(fec));
376
377 cricket::VideoCodec rtx(96, "rtx", 0, 0, 30, 0);
378 EXPECT_TRUE(engine_.FindCodec(rtx));
379}
380
381TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
382 std::vector<VideoCodec> engine_codecs = engine_.codecs();
383 for (size_t i = 0; i < engine_codecs.size(); ++i) {
384 if (engine_codecs[i].name != kRtxCodecName)
385 continue;
386 int associated_payload_type;
387 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
388 &associated_payload_type));
389 EXPECT_EQ(default_codec_.id, associated_payload_type);
390 return;
391 }
392 FAIL() << "No RTX codec found among default codecs.";
393}
394
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000395TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
396 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
397 ASSERT_FALSE(extensions.empty());
398 for (size_t i = 0; i < extensions.size(); ++i) {
399 if (extensions[i].uri == kRtpTimestampOffsetHeaderExtension) {
400 EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extensions[i].id);
401 return;
402 }
403 }
404 FAIL() << "Timestamp offset extension not in header-extension list.";
405}
406
407TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
408 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
409 ASSERT_FALSE(extensions.empty());
410 for (size_t i = 0; i < extensions.size(); ++i) {
411 if (extensions[i].uri == kRtpAbsoluteSenderTimeHeaderExtension) {
412 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId,
413 extensions[i].id);
414 return;
415 }
416 }
417 FAIL() << "Absolute Sender Time extension not in header-extension list.";
418}
419
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000420TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
421 talk_base::scoped_ptr<VideoMediaChannel> channel(engine_.CreateChannel(NULL));
422
423 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
424
425 EXPECT_FALSE(channel->SetSend(true))
426 << "Channel should not start without codecs.";
427 EXPECT_TRUE(channel->SetSend(false))
428 << "Channel should be stoppable even without set codecs.";
429}
430
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000431class WebRtcVideoEngine2BaseTest
432 : public VideoEngineTest<cricket::WebRtcVideoEngine2> {
433 protected:
434 typedef VideoEngineTest<cricket::WebRtcVideoEngine2> Base;
435};
436
437#define WEBRTC_ENGINE_BASE_TEST(test) \
438 TEST_F(WebRtcVideoEngine2BaseTest, test) { Base::test##Body(); }
439
440WEBRTC_ENGINE_BASE_TEST(ConstrainNewCodec2);
441
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000442class WebRtcVideoChannel2BaseTest
443 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
444 protected:
445 virtual cricket::VideoCodec DefaultCodec() OVERRIDE { return kVp8Codec; }
446 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
447};
448
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000449#define WEBRTC_BASE_TEST(test) \
450 TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); }
451
452#define WEBRTC_DISABLED_BASE_TEST(test) \
453 TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_ ## test) { Base::test(); }
454
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000455// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
456#if 0
457// TODO(juberti): Figure out why ViE is munging the COM refcount.
458#ifdef WIN32
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000459WEBRTC_DISABLED_BASE_TEST(CheckCoInitialize) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000460 Base::CheckCoInitialize();
461}
462#endif
463#endif
464
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000465WEBRTC_BASE_TEST(SetSend);
466WEBRTC_BASE_TEST(SetSendWithoutCodecs);
467WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000468
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000469WEBRTC_BASE_TEST(GetStats);
470WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
471WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000472
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000473WEBRTC_BASE_TEST(SetSendBandwidth);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000474
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000475WEBRTC_BASE_TEST(SetSendSsrc);
476WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000477
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000478WEBRTC_BASE_TEST(SetRenderer);
479WEBRTC_BASE_TEST(AddRemoveRecvStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000480
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000481WEBRTC_DISABLED_BASE_TEST(AddRemoveRecvStreamAndRender);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000482
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000483WEBRTC_BASE_TEST(AddRemoveRecvStreamsNoConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000484
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000485WEBRTC_BASE_TEST(AddRemoveSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000486
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000487WEBRTC_BASE_TEST(SimulateConference);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000488
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000489WEBRTC_BASE_TEST(AddRemoveCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000490
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000491WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000492
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000493WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000494
495// TODO(pbos): Figure out why this fails so often.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000496WEBRTC_DISABLED_BASE_TEST(HighAspectHighHeightCapturer);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000497
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000498WEBRTC_BASE_TEST(RejectEmptyStreamParams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000499
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000500WEBRTC_BASE_TEST(AdaptResolution16x10);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000501
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000502WEBRTC_BASE_TEST(AdaptResolution4x3);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000503
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000504WEBRTC_BASE_TEST(MuteStream);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000505
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000506WEBRTC_BASE_TEST(MultipleSendStreams);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000507
508// TODO(juberti): Restore this test once we support sending 0 fps.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000509WEBRTC_DISABLED_BASE_TEST(AdaptDropAllFrames);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000510// TODO(juberti): Understand why we get decode errors on this test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000511WEBRTC_DISABLED_BASE_TEST(AdaptFramerate);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000512
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000513WEBRTC_BASE_TEST(SetSendStreamFormat0x0);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000514
515// TODO(zhurunz): Fix the flakey test.
pbos@webrtc.org8fdeee62014-07-20 14:40:23 +0000516WEBRTC_DISABLED_BASE_TEST(SetSendStreamFormat);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000517
518TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
519 Base::TwoStreamsSendAndReceive(kVp8Codec);
520}
521
522TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
523 Base::TwoStreamsReUseFirstStream(kVp8Codec);
524}
525
526class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test {
527 public:
528 virtual void SetUp() OVERRIDE {
529 channel_.reset(engine_.CreateChannel(NULL));
530 fake_channel_ = factory_.GetFakeChannel(channel_.get());
531 last_ssrc_ = 123;
532 ASSERT_TRUE(fake_channel_ != NULL)
533 << "Channel not created through factory.";
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000534 EXPECT_TRUE(fake_channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000535 }
536
537 protected:
538 FakeVideoSendStream* AddSendStream() {
539 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
540 }
541
542 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
543 size_t num_streams =
544 fake_channel_->GetFakeCall()->GetVideoSendStreams().size();
545 EXPECT_TRUE(channel_->AddSendStream(sp));
546 std::vector<FakeVideoSendStream*> streams =
547 fake_channel_->GetFakeCall()->GetVideoSendStreams();
548 EXPECT_EQ(num_streams + 1, streams.size());
549 return streams[streams.size() - 1];
550 }
551
552 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
553 return fake_channel_->GetFakeCall()->GetVideoSendStreams();
554 }
555
556 FakeVideoReceiveStream* AddRecvStream() {
557 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
558 }
559
560 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
561 size_t num_streams =
562 fake_channel_->GetFakeCall()->GetVideoReceiveStreams().size();
563 EXPECT_TRUE(channel_->AddRecvStream(sp));
564 std::vector<FakeVideoReceiveStream*> streams =
565 fake_channel_->GetFakeCall()->GetVideoReceiveStreams();
566 EXPECT_EQ(num_streams + 1, streams.size());
567 return streams[streams.size() - 1];
568 }
569
570 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate,
571 const char* max_bitrate) {
572 std::vector<VideoCodec> codecs;
573 codecs.push_back(kVp8Codec);
574 codecs[0].params[kCodecParamMinBitrate] = min_bitrate;
575 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate;
576 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
577
578 FakeVideoSendStream* stream = AddSendStream();
579
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000580 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
581 ASSERT_EQ(1u, video_streams.size());
582 EXPECT_EQ(atoi(min_bitrate), video_streams.back().min_bitrate_bps / 1000);
583 EXPECT_EQ(atoi(max_bitrate), video_streams.back().max_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000584
585 VideoCodec codec;
586 EXPECT_TRUE(channel_->GetSendCodec(&codec));
587 EXPECT_EQ(min_bitrate, codec.params[kCodecParamMinBitrate]);
588 EXPECT_EQ(max_bitrate, codec.params[kCodecParamMaxBitrate]);
589 }
590
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000591 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
592 const std::string& webrtc_ext) {
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000593 FakeCall* call = fake_channel_->GetFakeCall();
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000594 // Enable extension.
595 const int id = 1;
596 std::vector<cricket::RtpHeaderExtension> extensions;
597 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
598 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
599
600 FakeVideoSendStream* send_stream =
601 AddSendStream(cricket::StreamParams::CreateLegacy(123));
602
603 // Verify the send extension id.
604 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
605 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
606 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
607 // Verify call with same set of extensions returns true.
608 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
609 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
610 // receivers.
611 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
612 ->GetConfig()
613 .rtp.extensions.empty());
614
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000615 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000616 std::vector<cricket::RtpHeaderExtension> empty_extensions;
617 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000618 ASSERT_EQ(1u, call->GetVideoSendStreams().size());
619 send_stream = call->GetVideoSendStreams()[0];
620 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
621
622 // Verify that adding receive RTP header extensions adds them for existing
623 // streams.
624 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
625 send_stream = call->GetVideoSendStreams()[0];
626 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
627 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
628 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000629 }
630
631 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
632 const std::string& webrtc_ext) {
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000633 FakeCall* call = fake_channel_->GetFakeCall();
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000634 // Enable extension.
635 const int id = 1;
636 std::vector<cricket::RtpHeaderExtension> extensions;
637 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
638 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
639
640 FakeVideoReceiveStream* recv_stream =
641 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
642
643 // Verify the recv extension id.
644 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
645 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
646 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
647 // Verify call with same set of extensions returns true.
648 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000649
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000650 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
651 // senders.
652 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
653 ->GetConfig()
654 .rtp.extensions.empty());
655
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000656 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000657 std::vector<cricket::RtpHeaderExtension> empty_extensions;
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000658 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(empty_extensions));
659 ASSERT_EQ(1u, call->GetVideoReceiveStreams().size());
660 recv_stream = call->GetVideoReceiveStreams()[0];
661 EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
662
663 // Verify that adding receive RTP header extensions adds them for existing
664 // streams.
665 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
666 recv_stream = call->GetVideoReceiveStreams()[0];
667 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
668 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
669 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000670 }
671
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000672 talk_base::scoped_ptr<VideoMediaChannel> channel_;
673 FakeWebRtcVideoChannel2* fake_channel_;
674 uint32 last_ssrc_;
675};
676
677TEST_F(WebRtcVideoChannel2Test, DISABLED_MaxBitrateResetsWithConferenceMode) {
678 FAIL() << "Not implemented."; // TODO(pbos): Implement.
679}
680
681TEST_F(WebRtcVideoChannel2Test, DISABLED_StartSendBitrate) {
682 // TODO(pbos): Is this test testing vie_ ? this is confusing. No API to set
683 // start send bitrate from outside? Add defaults here that should be kept?
684 std::vector<cricket::VideoCodec> codec_list;
685 codec_list.push_back(kVp8Codec);
686 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
687 const unsigned int kVideoMinSendBitrateKbps = 50;
688 const unsigned int kVideoTargetSendBitrateKbps = 300;
689 const unsigned int kVideoMaxSendBitrateKbps = 2000;
690 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000691 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
692 ASSERT_EQ(1u, video_streams.size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000693 EXPECT_EQ(kVideoMinSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000694 video_streams.back().min_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000695 EXPECT_EQ(kVideoTargetSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000696 video_streams.back().target_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000697 EXPECT_EQ(kVideoMaxSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000698 video_streams.back().max_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000699#if 0
700 // TODO(pbos): un-#if
701 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
702 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
703 kVideoDefaultStartSendBitrateKbps);
704 EXPECT_EQ(0, vie_.StartSend(send_channel));
705
706 // Increase the send bitrate and verify it is used as start bitrate.
707 const unsigned int kVideoSendBitrateBps = 768000;
708 vie_.SetSendBitrates(send_channel, kVideoSendBitrateBps, 0, 0);
709 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
710 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
711 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
712 kVideoSendBitrateBps / 1000);
713
714 // Never set a start bitrate higher than the max bitrate.
715 vie_.SetSendBitrates(send_channel, kVideoMaxSendBitrateKbps + 500, 0, 0);
716 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
717 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
718 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
719 kVideoDefaultStartSendBitrateKbps);
720
721 // Use the default start bitrate if the send bitrate is lower.
722 vie_.SetSendBitrates(send_channel, kVideoDefaultStartSendBitrateKbps - 50, 0,
723 0);
724 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
725 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
726 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
727 kVideoDefaultStartSendBitrateKbps);
728#endif
729}
730
731TEST_F(WebRtcVideoChannel2Test, DISABLED_RtcpEnabled) {
732 // Note(pbos): This is a receiver-side setting, dumbo.
733 FAIL() << "Not implemented."; // TODO(pbos): Implement.
734}
735
736TEST_F(WebRtcVideoChannel2Test, DISABLED_KeyFrameRequestEnabled) {
737 FAIL() << "Not implemented."; // TODO(pbos): Implement.
738}
739
740TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
741 FakeVideoReceiveStream* stream = AddRecvStream();
742 EXPECT_TRUE(stream->GetConfig().rtp.remb);
743}
744
745TEST_F(WebRtcVideoChannel2Test, DISABLED_RembEnabledOnReceiveChannels) {
746 FAIL() << "Not implemented."; // TODO(pbos): Implement.
747}
748
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000749TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000750 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
751 EXPECT_TRUE(channel_->SetSend(true));
752 cricket::VideoOptions options;
753 options.conference_mode.Set(true);
754 EXPECT_TRUE(channel_->SetOptions(options));
755
756 // Send side.
757 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
758 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
759 FakeVideoSendStream* send_stream = AddSendStream(
760 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
761
762 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
763 for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
764 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
765
766 // Receiver side.
767 FakeVideoReceiveStream* recv_stream = AddRecvStream(
768 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
769 ASSERT_GT(recv_stream->GetConfig().rtp.rtx.size(), 0u)
770 << "No SSRCs for RTX configured by AddRecvStream.";
771 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size())
772 << "This test only works with one receive codec. Please update the test.";
773 EXPECT_EQ(rtx_ssrcs[0],
774 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
775 // TODO(pbos): Make sure we set the RTX for correct payloads etc.
776}
777
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000778TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
779 // Setup one channel with an associated RTX stream.
780 cricket::StreamParams params =
781 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
782 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
783 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
784 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
785 EXPECT_EQ(kRtxSsrcs1[0],
786 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000787}
788
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000789TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
790 // Setup one channel without an associated RTX stream.
791 cricket::StreamParams params =
792 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
793 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
794 ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000795}
796
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000797TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
798 FakeVideoSendStream* send_stream =
799 AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
800 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
801
802 FakeVideoReceiveStream* recv_stream =
803 AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
804 ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000805}
806
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000807// Test support for RTP timestamp offset header extension.
808TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
809 TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
810 webrtc::RtpExtension::kTOffset);
811}
812TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
813 TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
814 webrtc::RtpExtension::kTOffset);
815}
816
817// Test support for absolute send time header extension.
818TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
819 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
820 webrtc::RtpExtension::kAbsSendTime);
821}
822TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
823 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
824 webrtc::RtpExtension::kAbsSendTime);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000825}
826
pbos@webrtc.org3c107582014-07-20 15:27:35 +0000827TEST_F(WebRtcVideoChannel2Test,
828 SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
829 const int kUnsupportedId = 1;
830 const int kTOffsetId = 2;
831
832 std::vector<cricket::RtpHeaderExtension> extensions;
833 extensions.push_back(cricket::RtpHeaderExtension(
834 kUnsupportedExtensionName, kUnsupportedId));
835 extensions.push_back(cricket::RtpHeaderExtension(
836 webrtc::RtpExtension::kTOffset, kTOffsetId));
837 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
838 FakeVideoSendStream* send_stream =
839 AddSendStream(cricket::StreamParams::CreateLegacy(123));
840
841 // Only timestamp offset extension is set to send stream,
842 // unsupported rtp extension is ignored.
843 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
844 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
845 send_stream->GetConfig().rtp.extensions[0].name.c_str());
846}
847
848TEST_F(WebRtcVideoChannel2Test,
849 SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
850 const int kUnsupportedId = 1;
851 const int kTOffsetId = 2;
852
853 std::vector<cricket::RtpHeaderExtension> extensions;
854 extensions.push_back(cricket::RtpHeaderExtension(
855 kUnsupportedExtensionName, kUnsupportedId));
856 extensions.push_back(cricket::RtpHeaderExtension(
857 webrtc::RtpExtension::kTOffset, kTOffsetId));
858 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
859 FakeVideoReceiveStream* recv_stream =
860 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
861
862 // Only timestamp offset extension is set to receive stream,
863 // unsupported rtp extension is ignored.
864 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
865 EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
866 recv_stream->GetConfig().rtp.extensions[0].name.c_str());
867}
868
869TEST_F(WebRtcVideoChannel2Test,
870 SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
871 const size_t kNumIncorrectIds = 4;
872 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
873 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
874 std::vector<cricket::RtpHeaderExtension> extensions;
875 extensions.push_back(cricket::RtpHeaderExtension(
876 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
877 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions))
878 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
879 }
880}
881
882TEST_F(WebRtcVideoChannel2Test,
883 SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
884 const size_t kNumIncorrectIds = 4;
885 const int kIncorrectIds[kNumIncorrectIds] = {-2, -1, 15, 16};
886 for (size_t i = 0; i < kNumIncorrectIds; ++i) {
887 std::vector<cricket::RtpHeaderExtension> extensions;
888 extensions.push_back(cricket::RtpHeaderExtension(
889 webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
890 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions))
891 << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
892 }
893}
894
895TEST_F(WebRtcVideoChannel2Test,
896 SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
897 const int id = 1;
898 std::vector<cricket::RtpHeaderExtension> extensions;
899 extensions.push_back(cricket::RtpHeaderExtension(
900 webrtc::RtpExtension::kTOffset, id));
901 extensions.push_back(cricket::RtpHeaderExtension(
902 kRtpAbsoluteSenderTimeHeaderExtension, id));
903 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
904
905 // Duplicate entries are also not supported.
906 extensions.clear();
907 extensions.push_back(cricket::RtpHeaderExtension(
908 webrtc::RtpExtension::kTOffset, id));
909 extensions.push_back(extensions.back());
910 EXPECT_FALSE(channel_->SetSendRtpHeaderExtensions(extensions));
911}
912
913TEST_F(WebRtcVideoChannel2Test,
914 SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
915 const int id = 1;
916 std::vector<cricket::RtpHeaderExtension> extensions;
917 extensions.push_back(cricket::RtpHeaderExtension(
918 webrtc::RtpExtension::kTOffset, id));
919 extensions.push_back(cricket::RtpHeaderExtension(
920 kRtpAbsoluteSenderTimeHeaderExtension, id));
921 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
922
923 // Duplicate entries are also not supported.
924 extensions.clear();
925 extensions.push_back(cricket::RtpHeaderExtension(
926 webrtc::RtpExtension::kTOffset, id));
927 extensions.push_back(extensions.back());
928 EXPECT_FALSE(channel_->SetRecvRtpHeaderExtensions(extensions));
929}
930
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000931TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
932 FAIL() << "Not implemented."; // TODO(pbos): Implement.
933}
934
935TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
936 FAIL() << "Not implemented."; // TODO(pbos): Implement.
937}
938
939TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
940 FAIL() << "Not implemented."; // TODO(pbos): Implement.
941}
942
943TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
944 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
945 EXPECT_EQ(1u, fake_channel_->GetFakeCall()->GetVideoReceiveStreams().size());
946}
947
948TEST_F(WebRtcVideoChannel2Test, DISABLED_NoRembChangeAfterAddRecvStream) {
949 FAIL() << "Not implemented."; // TODO(pbos): Implement.
950}
951
952TEST_F(WebRtcVideoChannel2Test, DISABLED_RembOnOff) {
953 FAIL() << "Not implemented."; // TODO(pbos): Implement.
954}
955
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +0000956TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
957 VerifyCodecHasDefaultFeedbackParams(default_codec_);
958
pbos@webrtc.org19864742014-05-30 07:35:47 +0000959 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
960 EXPECT_TRUE(channel_->SetSend(true));
961
962 // Send side.
963 FakeVideoSendStream* send_stream =
964 AddSendStream(cricket::StreamParams::CreateLegacy(1));
965 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
966
967 // Receiver side.
968 FakeVideoReceiveStream* recv_stream =
969 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
970 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
971
972 // Nack history size should match between sender and receiver.
973 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
974 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000975}
976
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +0000977TEST_F(WebRtcVideoChannel2Test, NackCanBeDisabled) {
978 std::vector<VideoCodec> codecs;
979 codecs.push_back(kVp8Codec);
980
981 // Send side.
982 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
983 FakeVideoSendStream* send_stream =
984 AddSendStream(cricket::StreamParams::CreateLegacy(1));
985 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
986
987 // Receiver side.
988 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
989 FakeVideoReceiveStream* recv_stream =
990 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
991 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
992}
993
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000994TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
995 FAIL() << "Not implemented."; // TODO(pbos): Implement.
996}
997
998TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
999 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1000}
1001
1002TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
1003 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1004}
1005
1006TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
1007 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1008}
1009
1010TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
1011 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1012}
1013
1014TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
1015 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1016}
1017
1018TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
1019 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1020}
1021
1022TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
1023 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1024}
1025
1026TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
1027 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1028}
1029
1030TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthScreencast) {
1031 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1032}
1033
1034TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
1035 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1036}
1037
1038TEST_F(WebRtcVideoChannel2Test,
1039 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
1040 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1041}
1042
1043TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithDenoising) {
1044 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1045}
1046
1047TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
1048 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1049}
1050
1051TEST_F(WebRtcVideoChannel2Test, DISABLED_DISABLED_SendReceiveBitratesStats) {
1052 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1053}
1054
1055TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetAdaptInputToCpuUsage) {
1056 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1057}
1058
1059TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetCpuThreshold) {
1060 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1061}
1062
1063TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetInvalidCpuThreshold) {
1064 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1065}
1066
1067TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldLog) {
1068 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1069}
1070
1071TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldNotLog) {
1072 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1073}
1074
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001075TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001076 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001077
1078 VideoCodec codec;
1079 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001080 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001081
1082 // Using a RTX setup to verify that the default RTX payload type is good.
1083 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1084 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1085 FakeVideoSendStream* stream = AddSendStream(
1086 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1087 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001088
1089 // Make sure NACK and FEC are enabled on the correct payload types.
1090 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
1091 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
1092 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001093
1094 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
1095 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001096 EXPECT_EQ(static_cast<int>(default_rtx_codec_.id),
1097 config.rtp.rtx.payload_type);
1098 // TODO(juberti): Check RTCP, PLI, TMMBR.
1099}
1100
1101TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
1102 std::vector<VideoCodec> codecs;
1103 codecs.push_back(kVp8Codec);
1104 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1105
1106 FakeVideoSendStream* stream = AddSendStream();
1107 webrtc::VideoSendStream::Config config = stream->GetConfig();
1108
1109 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1110 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1111}
1112
1113TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001114 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1115 std::vector<VideoCodec> codecs;
1116 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1117 codecs.push_back(rtx_codec);
1118 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1119 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001120}
1121
1122TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001123 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1124 std::vector<VideoCodec> codecs;
1125 cricket::VideoCodec rtx_codec =
1126 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1127 codecs.push_back(kVp8Codec);
1128 codecs.push_back(rtx_codec);
1129 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1130
1131 cricket::VideoCodec rtx_codec2 =
1132 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1133 codecs.pop_back();
1134 codecs.push_back(rtx_codec2);
1135 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1136 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001137}
1138
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001139TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1140 std::vector<VideoCodec> codecs;
1141 codecs.push_back(kVp8Codec);
1142 codecs.push_back(kUlpfecCodec);
1143 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1144
1145 FakeVideoSendStream* stream = AddSendStream();
1146 webrtc::VideoSendStream::Config config = stream->GetConfig();
1147
1148 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1149
1150 codecs.pop_back();
1151 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1152 stream = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0];
1153 ASSERT_TRUE(stream != NULL);
1154 config = stream->GetConfig();
1155 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1156 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001157}
1158
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001159TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1160 std::vector<VideoCodec> codecs;
1161 codecs.push_back(kVp8Codec720p);
1162 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1163
1164 std::vector<webrtc::VideoStream> streams =
1165 AddSendStream()->GetVideoStreams();
1166 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1167 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1168
1169 codecs.clear();
1170 codecs.push_back(kVp8Codec360p);
1171 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1172 streams = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0]
1173 ->GetVideoStreams();
1174 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1175 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001176}
1177
1178TEST_F(WebRtcVideoChannel2Test,
1179 DISABLED_ConstrainsSetCodecsAccordingToEncoderConfig) {
1180 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1181}
1182
1183TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMinMaxBitrate) {
1184 SetSendCodecsShouldWorkForBitrates("10", "20");
1185}
1186
1187TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001188 std::vector<VideoCodec> video_codecs = engine_.codecs();
1189 video_codecs[0].params[kCodecParamMinBitrate] = "30";
1190 video_codecs[0].params[kCodecParamMaxBitrate] = "20";
1191 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001192}
1193
1194TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptLargeMinMaxBitrate) {
1195 SetSendCodecsShouldWorkForBitrates("1000", "2000");
1196}
1197
1198TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1199 static const char* kMaxQuantization = "21";
1200 std::vector<VideoCodec> codecs;
1201 codecs.push_back(kVp8Codec);
1202 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1203 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001204 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1205 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001206
1207 VideoCodec codec;
1208 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1209 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1210}
1211
1212TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1213 std::vector<cricket::VideoCodec> codecs;
1214 codecs.push_back(kVp8Codec);
1215
1216 codecs[0].width = 0;
1217 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1218 << "Codec set though codec width is zero.";
1219
1220 codecs[0].width = kVp8Codec.width;
1221 codecs[0].height = 0;
1222 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1223 << "Codec set though codec height is zero.";
1224}
1225
1226TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
1227 // TODO(pbos): Should we only allow the dynamic range?
1228 static const size_t kNumIncorrectPayloads = 4;
1229 static const int kIncorrectPayloads[kNumIncorrectPayloads] = {-2, -1, 128,
1230 129};
1231 std::vector<cricket::VideoCodec> codecs;
1232 codecs.push_back(kVp8Codec);
1233 for (size_t i = 0; i < kNumIncorrectPayloads; ++i) {
1234 int payload_type = kIncorrectPayloads[i];
1235 codecs[0].id = payload_type;
1236 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1237 << "Bad payload type '" << payload_type << "' accepted.";
1238 }
1239}
1240
1241TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
1242 std::vector<cricket::VideoCodec> codecs;
1243 codecs.push_back(kVp8Codec);
1244 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
1245 codecs[0].id = payload_type;
1246 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
1247 << "Payload type '" << payload_type << "' rejected.";
1248 }
1249}
1250
1251TEST_F(WebRtcVideoChannel2Test, DISABLED_ResetVieSendCodecOnNewFrameSize) {
1252 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1253}
1254
1255TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
1256 std::vector<cricket::VideoCodec> codecs;
1257 codecs.push_back(kVp8Codec);
1258 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1259}
1260
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001261// Test that we set our inbound RTX codecs properly.
1262TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
1263 std::vector<cricket::VideoCodec> codecs;
1264 codecs.push_back(kVp8Codec);
1265 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1266 codecs.push_back(rtx_codec);
1267 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1268 << "RTX codec without associated payload should be rejected.";
1269
1270 codecs[1].SetParam("apt", kVp8Codec.id + 1);
1271 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1272 << "RTX codec with invalid associated payload type should be rejected.";
1273
1274 codecs[1].SetParam("apt", kVp8Codec.id);
1275 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1276
1277 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
1278 rtx_codec2.SetParam("apt", rtx_codec.id);
1279 codecs.push_back(rtx_codec2);
1280
1281 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
1282 "as associated payload type "
1283 "should be rejected.";
1284}
1285
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001286TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
1287 std::vector<cricket::VideoCodec> codecs;
1288 codecs.push_back(kVp8Codec);
1289 codecs[0].id = 99;
1290 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1291}
1292
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001293TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001294 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001295
1296 FakeVideoReceiveStream* stream = AddRecvStream();
1297 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1298 EXPECT_STREQ(engine_.codecs()[0].name.c_str(), config.codecs[0].plName);
1299 EXPECT_EQ(engine_.codecs()[0].id, config.codecs[0].plType);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001300}
1301
1302TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
1303 std::vector<VideoCodec> codecs;
1304 codecs.push_back(kVp8Codec);
1305 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
1306 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1307}
1308
1309// TODO(pbos): Enable VP9 through external codec support
1310TEST_F(WebRtcVideoChannel2Test,
1311 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
1312 std::vector<VideoCodec> codecs;
1313 codecs.push_back(kVp8Codec);
1314 codecs.push_back(kVp9Codec);
1315 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1316}
1317
1318TEST_F(WebRtcVideoChannel2Test,
1319 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
1320 std::vector<VideoCodec> codecs;
1321 codecs.push_back(kVp8Codec);
1322 codecs.push_back(kVp9Codec);
1323 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1324 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
1325}
1326
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001327TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
1328 std::vector<VideoCodec> codecs;
1329 codecs.push_back(kVp8Codec);
1330 codecs.push_back(kUlpfecCodec);
1331 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1332
1333 FakeVideoReceiveStream* stream = AddRecvStream();
1334 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1335
1336 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1337
1338 codecs.pop_back();
1339 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1340 stream = fake_channel_->GetFakeCall()->GetVideoReceiveStreams()[0];
1341 ASSERT_TRUE(stream != NULL);
1342 config = stream->GetConfig();
1343 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1344 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001345}
1346
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001347TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
1348 std::vector<VideoCodec> codecs;
1349 codecs.push_back(kVp8Codec);
1350 codecs.push_back(kRedCodec);
1351 codecs[1].id = codecs[0].id;
1352 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1353}
1354
1355TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
1356 std::vector<VideoCodec> codecs;
1357 codecs.push_back(kVp8Codec);
1358 codecs.push_back(kVp9Codec);
1359 codecs[1].id = codecs[0].id;
1360 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1361}
1362
1363TEST_F(WebRtcVideoChannel2Test,
1364 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
1365 std::vector<VideoCodec> codecs;
1366 codecs.push_back(kVp8Codec);
1367 codecs.push_back(kVp8Codec);
1368 codecs[1].id += 1;
1369 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1370}
1371
1372TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
1373 EXPECT_FALSE(AddSendStream()->IsSending());
1374}
1375
1376TEST_F(WebRtcVideoChannel2Test, DISABLED_ReceiveStreamReceivingByDefault) {
1377 // Is this test correct though? Auto-receive? Enable receive on first packet?
1378 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1379}
1380
1381TEST_F(WebRtcVideoChannel2Test, SetSend) {
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +00001382 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001383 EXPECT_FALSE(stream->IsSending());
1384
1385 // false->true
1386 EXPECT_TRUE(channel_->SetSend(true));
1387 EXPECT_TRUE(stream->IsSending());
1388 // true->true
1389 EXPECT_TRUE(channel_->SetSend(true));
1390 EXPECT_TRUE(stream->IsSending());
1391 // true->false
1392 EXPECT_TRUE(channel_->SetSend(false));
1393 EXPECT_FALSE(stream->IsSending());
1394 // false->false
1395 EXPECT_TRUE(channel_->SetSend(false));
1396 EXPECT_FALSE(stream->IsSending());
1397
1398 EXPECT_TRUE(channel_->SetSend(true));
1399 FakeVideoSendStream* new_stream = AddSendStream();
1400 EXPECT_TRUE(new_stream->IsSending())
1401 << "Send stream created after SetSend(true) not sending initially.";
1402}
1403
1404TEST_F(WebRtcVideoChannel2Test, DISABLED_SendAndReceiveVp8Vga) {
1405 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1406}
1407
1408TEST_F(WebRtcVideoChannel2Test, DISABLED_SendAndReceiveVp8Qvga) {
1409 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1410}
1411
1412TEST_F(WebRtcVideoChannel2Test, DISABLED_SendAndReceiveH264SvcQqvga) {
1413 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1414}
1415
1416TEST_F(WebRtcVideoChannel2Test, DISABLED_SendManyResizeOnce) {
1417 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1418}
1419
1420TEST_F(WebRtcVideoChannel2Test, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
1421 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1422}
1423
1424TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetDscpOptions) {
1425 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1426}
1427
1428TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithMaxBitrate) {
1429 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1430}
1431
1432TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithLoweredBitrate) {
1433 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1434}
1435
1436TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsSucceedsWhenSending) {
1437 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1438}
1439
1440TEST_F(WebRtcVideoChannel2Test, DISABLED_ResetCodecOnScreencast) {
1441 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1442}
1443
1444TEST_F(WebRtcVideoChannel2Test, DISABLED_DontResetCodecOnSendFrame) {
1445 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1446}
1447
1448TEST_F(WebRtcVideoChannel2Test,
1449 DISABLED_DontRegisterDecoderIfFactoryIsNotGiven) {
1450 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1451}
1452
1453TEST_F(WebRtcVideoChannel2Test, DISABLED_RegisterDecoderIfFactoryIsGiven) {
1454 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1455}
1456
1457TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterDecoderMultipleTimes) {
1458 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1459}
1460
1461TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterDecoderForNonVP8) {
1462 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1463}
1464
1465TEST_F(WebRtcVideoChannel2Test,
1466 DISABLED_DontRegisterEncoderIfFactoryIsNotGiven) {
1467 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1468}
1469
1470TEST_F(WebRtcVideoChannel2Test, DISABLED_RegisterEncoderIfFactoryIsGiven) {
1471 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1472}
1473
1474TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterEncoderMultipleTimes) {
1475 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1476}
1477
1478TEST_F(WebRtcVideoChannel2Test,
1479 DISABLED_RegisterEncoderWithMultipleSendStreams) {
1480 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1481}
1482
1483TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterEncoderForNonVP8) {
1484 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1485}
1486
1487TEST_F(WebRtcVideoChannel2Test, DISABLED_FeedbackParamsForNonVP8) {
1488 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1489}
1490
1491TEST_F(WebRtcVideoChannel2Test, DISABLED_ExternalCodecAddedToTheEnd) {
1492 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1493}
1494
1495TEST_F(WebRtcVideoChannel2Test, DISABLED_ExternalCodecIgnored) {
1496 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1497}
1498
1499TEST_F(WebRtcVideoChannel2Test, DISABLED_UpdateEncoderCodecsAfterSetFactory) {
1500 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1501}
1502
1503TEST_F(WebRtcVideoChannel2Test, DISABLED_OnReadyToSend) {
1504 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1505}
1506
1507TEST_F(WebRtcVideoChannel2Test, DISABLED_CaptureFrameTimestampToNtpTimestamp) {
1508 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1509}
1510} // namespace cricket