blob: 0954bcb95f3d98e4351311a5614d93b0c3f9b686 [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.orgf99c2f22014-06-13 12:27:38 +000052
53void VerifyCodecHasDefaultFeedbackParams(const cricket::VideoCodec& codec) {
54 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
55 cricket::kRtcpFbParamNack, cricket::kParamValueEmpty)));
56 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
57 cricket::kRtcpFbParamNack, cricket::kRtcpFbNackParamPli)));
58 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
59 cricket::kRtcpFbParamRemb, cricket::kParamValueEmpty)));
60 EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
61 cricket::kRtcpFbParamCcm, cricket::kRtcpFbCcmParamFir)));
62}
63
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000064} // namespace
65
66namespace cricket {
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000067FakeVideoSendStream::FakeVideoSendStream(
68 const webrtc::VideoSendStream::Config& config,
69 const std::vector<webrtc::VideoStream>& video_streams)
70 : sending_(false), config_(config), video_streams_(video_streams) {
71}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000072
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000073webrtc::VideoSendStream::Config FakeVideoSendStream::GetConfig() {
74 return config_;
75}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000076
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000077std::vector<webrtc::VideoStream> FakeVideoSendStream::GetVideoStreams() {
78 return video_streams_;
79}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000080
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000081bool FakeVideoSendStream::IsSending() {
82 return sending_;
83}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000084
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000085webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() const {
86 return webrtc::VideoSendStream::Stats();
87}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000088
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000089bool FakeVideoSendStream::ReconfigureVideoEncoder(
90 const std::vector<webrtc::VideoStream>& streams,
91 const void* encoder_specific) {
92 video_streams_ = streams;
93 return true;
94}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +000095
pbos@webrtc.org86f613d2014-06-10 08:53:05 +000096webrtc::VideoSendStreamInput* FakeVideoSendStream::Input() {
97 // TODO(pbos): Fix.
98 return NULL;
99}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000100
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000101void FakeVideoSendStream::Start() {
102 sending_ = true;
103}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000104
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000105void FakeVideoSendStream::Stop() {
106 sending_ = false;
107}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000108
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000109FakeVideoReceiveStream::FakeVideoReceiveStream(
110 const webrtc::VideoReceiveStream::Config& config)
111 : config_(config), receiving_(false) {
112}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000113
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000114webrtc::VideoReceiveStream::Config FakeVideoReceiveStream::GetConfig() {
115 return config_;
116}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000117
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000118webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const {
119 return webrtc::VideoReceiveStream::Stats();
120}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000121
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000122void FakeVideoReceiveStream::Start() {
123 receiving_ = true;
124}
125void FakeVideoReceiveStream::Stop() {
126 receiving_ = false;
127}
128void FakeVideoReceiveStream::GetCurrentReceiveCodec(webrtc::VideoCodec* codec) {
129}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000130
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000131FakeCall::FakeCall() { SetVideoCodecs(GetDefaultVideoCodecs()); }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000132
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000133FakeCall::~FakeCall() {
134 EXPECT_EQ(0u, video_send_streams_.size());
135 EXPECT_EQ(0u, video_receive_streams_.size());
136}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000137
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000138void FakeCall::SetVideoCodecs(const std::vector<webrtc::VideoCodec> codecs) {
139 codecs_ = codecs;
140}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000141
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000142std::vector<FakeVideoSendStream*> FakeCall::GetVideoSendStreams() {
143 return video_send_streams_;
144}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000145
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000146std::vector<FakeVideoReceiveStream*> FakeCall::GetVideoReceiveStreams() {
147 return video_receive_streams_;
148}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000149
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000150webrtc::VideoCodec FakeCall::GetEmptyVideoCodec() {
151 webrtc::VideoCodec codec;
152 codec.minBitrate = 300;
153 codec.startBitrate = 800;
154 codec.maxBitrate = 1500;
155 codec.maxFramerate = 10;
156 codec.width = 640;
157 codec.height = 480;
158 codec.qpMax = 56;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000159
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000160 return codec;
161}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000162
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000163webrtc::VideoCodec FakeCall::GetVideoCodecVp8() {
164 webrtc::VideoCodec vp8_codec = GetEmptyVideoCodec();
165 vp8_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.orgcb859ec2014-07-15 08:28:20 +0000166 talk_base::strcpyn(vp8_codec.plName, ARRAY_SIZE(vp8_codec.plName),
167 kVp8Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000168 vp8_codec.plType = kVp8Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000169
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000170 return vp8_codec;
171}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000172
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000173webrtc::VideoCodec FakeCall::GetVideoCodecVp9() {
174 webrtc::VideoCodec vp9_codec = GetEmptyVideoCodec();
175 // TODO(pbos): Add a correct codecType when webrtc has one.
176 vp9_codec.codecType = webrtc::kVideoCodecVP8;
pbos@webrtc.orgcb859ec2014-07-15 08:28:20 +0000177 talk_base::strcpyn(vp9_codec.plName, ARRAY_SIZE(vp9_codec.plName),
178 kVp9Codec.name.c_str());
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000179 vp9_codec.plType = kVp9Codec.id;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000180
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000181 return vp9_codec;
182}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000183
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000184std::vector<webrtc::VideoCodec> FakeCall::GetDefaultVideoCodecs() {
185 std::vector<webrtc::VideoCodec> codecs;
186 codecs.push_back(GetVideoCodecVp8());
187 // codecs.push_back(GetVideoCodecVp9());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000188
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000189 return codecs;
190}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000191
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000192webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
193 const webrtc::VideoSendStream::Config& config,
194 const std::vector<webrtc::VideoStream>& video_streams,
195 const void* encoder_settings) {
196 FakeVideoSendStream* fake_stream =
197 new FakeVideoSendStream(config, video_streams);
198 video_send_streams_.push_back(fake_stream);
199 return fake_stream;
200}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000201
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000202void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
203 FakeVideoSendStream* fake_stream =
204 static_cast<FakeVideoSendStream*>(send_stream);
205 for (size_t i = 0; i < video_send_streams_.size(); ++i) {
206 if (video_send_streams_[i] == fake_stream) {
207 delete video_send_streams_[i];
208 video_send_streams_.erase(video_send_streams_.begin() + i);
209 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000210 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000211 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000212 ADD_FAILURE() << "DestroyVideoSendStream called with unknown paramter.";
213}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000214
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000215webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
216 const webrtc::VideoReceiveStream::Config& config) {
217 video_receive_streams_.push_back(new FakeVideoReceiveStream(config));
218 return video_receive_streams_[video_receive_streams_.size() - 1];
219}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000220
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000221void FakeCall::DestroyVideoReceiveStream(
222 webrtc::VideoReceiveStream* receive_stream) {
223 FakeVideoReceiveStream* fake_stream =
224 static_cast<FakeVideoReceiveStream*>(receive_stream);
225 for (size_t i = 0; i < video_receive_streams_.size(); ++i) {
226 if (video_receive_streams_[i] == fake_stream) {
227 delete video_receive_streams_[i];
228 video_receive_streams_.erase(video_receive_streams_.begin() + i);
229 return;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000230 }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000231 }
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000232 ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown paramter.";
233}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000234
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000235webrtc::PacketReceiver* FakeCall::Receiver() {
236 // TODO(pbos): Fix this.
237 return NULL;
238}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000239
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000240uint32_t FakeCall::SendBitrateEstimate() {
241 return 0;
242}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000243
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000244uint32_t FakeCall::ReceiveBitrateEstimate() {
245 return 0;
246}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000247
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000248FakeWebRtcVideoChannel2::FakeWebRtcVideoChannel2(
249 FakeCall* call,
250 WebRtcVideoEngine2* engine,
251 VoiceMediaChannel* voice_channel)
252 : WebRtcVideoChannel2(call, engine, engine->GetVideoEncoderFactory()),
253 fake_call_(call),
254 voice_channel_(voice_channel) {
255}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000256
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000257FakeWebRtcVideoChannel2::~FakeWebRtcVideoChannel2() {
258}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000259
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000260VoiceMediaChannel* FakeWebRtcVideoChannel2::GetVoiceChannel() {
261 return voice_channel_;
262}
263FakeCall* FakeWebRtcVideoChannel2::GetFakeCall() {
264 return fake_call_;
265}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000266
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000267FakeWebRtcVideoChannel2* FakeWebRtcVideoMediaChannelFactory::GetFakeChannel(
268 VideoMediaChannel* channel) {
269 return channel_map_[channel];
270}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000271
pbos@webrtc.org86f613d2014-06-10 08:53:05 +0000272WebRtcVideoChannel2* FakeWebRtcVideoMediaChannelFactory::Create(
273 WebRtcVideoEngine2* engine,
274 VoiceMediaChannel* voice_channel) {
275 FakeWebRtcVideoChannel2* channel =
276 new FakeWebRtcVideoChannel2(new FakeCall(), engine, voice_channel);
277 channel_map_[channel] = channel;
278 return channel;
279}
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000280
281class WebRtcVideoEngine2Test : public testing::Test {
282 public:
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000283 WebRtcVideoEngine2Test() : engine_(&factory_) {
284 std::vector<VideoCodec> engine_codecs = engine_.codecs();
285 assert(!engine_codecs.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000286 bool codec_set = false;
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000287 for (size_t i = 0; i < engine_codecs.size(); ++i) {
288 if (engine_codecs[i].name == "red") {
289 default_red_codec_ = engine_codecs[i];
290 } else if (engine_codecs[i].name == "ulpfec") {
291 default_ulpfec_codec_ = engine_codecs[i];
292 } else if (engine_codecs[i].name == "rtx") {
293 default_rtx_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000294 } else if (!codec_set) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000295 default_codec_ = engine_codecs[i];
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000296 codec_set = true;
297 }
298 }
299
300 assert(codec_set);
301 }
302
303 protected:
304 FakeWebRtcVideoMediaChannelFactory factory_;
305 WebRtcVideoEngine2 engine_;
306 VideoCodec default_codec_;
307 VideoCodec default_red_codec_;
308 VideoCodec default_ulpfec_codec_;
309 VideoCodec default_rtx_codec_;
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000310};
311
312TEST_F(WebRtcVideoEngine2Test, CreateChannel) {
313 talk_base::scoped_ptr<VideoMediaChannel> channel(engine_.CreateChannel(NULL));
314 ASSERT_TRUE(channel.get() != NULL) << "Could not create channel.";
315 EXPECT_TRUE(factory_.GetFakeChannel(channel.get()) != NULL)
316 << "Channel not created through factory.";
317}
318
319TEST_F(WebRtcVideoEngine2Test, CreateChannelWithVoiceEngine) {
320 VoiceMediaChannel* voice_channel = reinterpret_cast<VoiceMediaChannel*>(0x42);
321 talk_base::scoped_ptr<VideoMediaChannel> channel(
322 engine_.CreateChannel(voice_channel));
323 ASSERT_TRUE(channel.get() != NULL) << "Could not create channel.";
324
325 FakeWebRtcVideoChannel2* fake_channel =
326 factory_.GetFakeChannel(channel.get());
327 ASSERT_TRUE(fake_channel != NULL) << "Channel not created through factory.";
328
329 EXPECT_TRUE(fake_channel->GetVoiceChannel() != NULL)
330 << "VoiceChannel not set.";
331 EXPECT_EQ(voice_channel, fake_channel->GetVoiceChannel())
332 << "Different VoiceChannel set than the provided one.";
333}
334
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000335TEST_F(WebRtcVideoEngine2Test, FindCodec) {
336 const std::vector<cricket::VideoCodec>& c = engine_.codecs();
337 EXPECT_EQ(4U, c.size());
338
339 cricket::VideoCodec vp8(104, "VP8", 320, 200, 30, 0);
340 EXPECT_TRUE(engine_.FindCodec(vp8));
341
342 cricket::VideoCodec vp8_ci(104, "vp8", 320, 200, 30, 0);
343 EXPECT_TRUE(engine_.FindCodec(vp8));
344
345 cricket::VideoCodec vp8_diff_fr_diff_pref(104, "VP8", 320, 200, 50, 50);
346 EXPECT_TRUE(engine_.FindCodec(vp8_diff_fr_diff_pref));
347
348 cricket::VideoCodec vp8_diff_id(95, "VP8", 320, 200, 30, 0);
349 EXPECT_FALSE(engine_.FindCodec(vp8_diff_id));
350 vp8_diff_id.id = 97;
351 EXPECT_TRUE(engine_.FindCodec(vp8_diff_id));
352
353 cricket::VideoCodec vp8_diff_res(104, "VP8", 320, 111, 30, 0);
354 EXPECT_FALSE(engine_.FindCodec(vp8_diff_res));
355
356 // PeerConnection doesn't negotiate the resolution at this point.
357 // Test that FindCodec can handle the case when width/height is 0.
358 cricket::VideoCodec vp8_zero_res(104, "VP8", 0, 0, 30, 0);
359 EXPECT_TRUE(engine_.FindCodec(vp8_zero_res));
360
361 cricket::VideoCodec red(101, "RED", 0, 0, 30, 0);
362 EXPECT_TRUE(engine_.FindCodec(red));
363
364 cricket::VideoCodec red_ci(101, "red", 0, 0, 30, 0);
365 EXPECT_TRUE(engine_.FindCodec(red));
366
367 cricket::VideoCodec fec(102, "ULPFEC", 0, 0, 30, 0);
368 EXPECT_TRUE(engine_.FindCodec(fec));
369
370 cricket::VideoCodec fec_ci(102, "ulpfec", 0, 0, 30, 0);
371 EXPECT_TRUE(engine_.FindCodec(fec));
372
373 cricket::VideoCodec rtx(96, "rtx", 0, 0, 30, 0);
374 EXPECT_TRUE(engine_.FindCodec(rtx));
375}
376
377TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
378 std::vector<VideoCodec> engine_codecs = engine_.codecs();
379 for (size_t i = 0; i < engine_codecs.size(); ++i) {
380 if (engine_codecs[i].name != kRtxCodecName)
381 continue;
382 int associated_payload_type;
383 EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
384 &associated_payload_type));
385 EXPECT_EQ(default_codec_.id, associated_payload_type);
386 return;
387 }
388 FAIL() << "No RTX codec found among default codecs.";
389}
390
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000391TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
392 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
393 ASSERT_FALSE(extensions.empty());
394 for (size_t i = 0; i < extensions.size(); ++i) {
395 if (extensions[i].uri == kRtpTimestampOffsetHeaderExtension) {
396 EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extensions[i].id);
397 return;
398 }
399 }
400 FAIL() << "Timestamp offset extension not in header-extension list.";
401}
402
403TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
404 std::vector<RtpHeaderExtension> extensions = engine_.rtp_header_extensions();
405 ASSERT_FALSE(extensions.empty());
406 for (size_t i = 0; i < extensions.size(); ++i) {
407 if (extensions[i].uri == kRtpAbsoluteSenderTimeHeaderExtension) {
408 EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId,
409 extensions[i].id);
410 return;
411 }
412 }
413 FAIL() << "Absolute Sender Time extension not in header-extension list.";
414}
415
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000416TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
417 talk_base::scoped_ptr<VideoMediaChannel> channel(engine_.CreateChannel(NULL));
418
419 EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
420
421 EXPECT_FALSE(channel->SetSend(true))
422 << "Channel should not start without codecs.";
423 EXPECT_TRUE(channel->SetSend(false))
424 << "Channel should be stoppable even without set codecs.";
425}
426
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000427class WebRtcVideoChannel2BaseTest
428 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
429 protected:
430 virtual cricket::VideoCodec DefaultCodec() OVERRIDE { return kVp8Codec; }
431 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
432};
433
434// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
435#if 0
436// TODO(juberti): Figure out why ViE is munging the COM refcount.
437#ifdef WIN32
438TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_CheckCoInitialize) {
439 Base::CheckCoInitialize();
440}
441#endif
442#endif
443
444TEST_F(WebRtcVideoChannel2BaseTest, SetSend) { Base::SetSend(); }
445
446TEST_F(WebRtcVideoChannel2BaseTest, SetSendWithoutCodecs) {
447 Base::SetSendWithoutCodecs();
448}
449
450TEST_F(WebRtcVideoChannel2BaseTest, SetSendSetsTransportBufferSizes) {
451 Base::SetSendSetsTransportBufferSizes();
452}
453
pbos@webrtc.orge6f84ae2014-07-18 11:11:55 +0000454TEST_F(WebRtcVideoChannel2BaseTest, GetStats) { Base::GetStats(); }
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000455
pbos@webrtc.orge6f84ae2014-07-18 11:11:55 +0000456TEST_F(WebRtcVideoChannel2BaseTest, GetStatsMultipleRecvStreams) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000457 Base::GetStatsMultipleRecvStreams();
458}
459
pbos@webrtc.orge6f84ae2014-07-18 11:11:55 +0000460TEST_F(WebRtcVideoChannel2BaseTest, GetStatsMultipleSendStreams) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000461 Base::GetStatsMultipleSendStreams();
462}
463
464TEST_F(WebRtcVideoChannel2BaseTest, SetSendBandwidth) {
465 Base::SetSendBandwidth();
466}
467TEST_F(WebRtcVideoChannel2BaseTest, SetSendSsrc) { Base::SetSendSsrc(); }
468TEST_F(WebRtcVideoChannel2BaseTest, SetSendSsrcAfterSetCodecs) {
469 Base::SetSendSsrcAfterSetCodecs();
470}
471
472TEST_F(WebRtcVideoChannel2BaseTest, SetRenderer) { Base::SetRenderer(); }
473
474TEST_F(WebRtcVideoChannel2BaseTest, AddRemoveRecvStreams) {
475 Base::AddRemoveRecvStreams();
476}
477
478TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_AddRemoveRecvStreamAndRender) {
479 Base::AddRemoveRecvStreamAndRender();
480}
481
482TEST_F(WebRtcVideoChannel2BaseTest, AddRemoveRecvStreamsNoConference) {
483 Base::AddRemoveRecvStreamsNoConference();
484}
485
486TEST_F(WebRtcVideoChannel2BaseTest, AddRemoveSendStreams) {
487 Base::AddRemoveSendStreams();
488}
489
490TEST_F(WebRtcVideoChannel2BaseTest, SimulateConference) {
491 Base::SimulateConference();
492}
493
494TEST_F(WebRtcVideoChannel2BaseTest, AddRemoveCapturer) {
495 Base::AddRemoveCapturer();
496}
497
498TEST_F(WebRtcVideoChannel2BaseTest, RemoveCapturerWithoutAdd) {
499 Base::RemoveCapturerWithoutAdd();
500}
501
502TEST_F(WebRtcVideoChannel2BaseTest, AddRemoveCapturerMultipleSources) {
503 Base::AddRemoveCapturerMultipleSources();
504}
505
506// TODO(pbos): Figure out why this fails so often.
507TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_HighAspectHighHeightCapturer) {
508 Base::HighAspectHighHeightCapturer();
509}
510
511TEST_F(WebRtcVideoChannel2BaseTest, RejectEmptyStreamParams) {
512 Base::RejectEmptyStreamParams();
513}
514
515TEST_F(WebRtcVideoChannel2BaseTest, AdaptResolution16x10) {
516 Base::AdaptResolution16x10();
517}
518
519TEST_F(WebRtcVideoChannel2BaseTest, AdaptResolution4x3) {
520 Base::AdaptResolution4x3();
521}
522
523TEST_F(WebRtcVideoChannel2BaseTest, MuteStream) { Base::MuteStream(); }
524
525TEST_F(WebRtcVideoChannel2BaseTest, MultipleSendStreams) {
526 Base::MultipleSendStreams();
527}
528
529// TODO(juberti): Restore this test once we support sending 0 fps.
530TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_AdaptDropAllFrames) {
531 Base::AdaptDropAllFrames();
532}
533// TODO(juberti): Understand why we get decode errors on this test.
534TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_AdaptFramerate) {
535 Base::AdaptFramerate();
536}
537
538TEST_F(WebRtcVideoChannel2BaseTest, SetSendStreamFormat0x0) {
539 Base::SetSendStreamFormat0x0();
540}
541
542// TODO(zhurunz): Fix the flakey test.
543TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_SetSendStreamFormat) {
544 Base::SetSendStreamFormat();
545}
546
547TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
548 Base::TwoStreamsSendAndReceive(kVp8Codec);
549}
550
551TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
552 Base::TwoStreamsReUseFirstStream(kVp8Codec);
553}
554
555class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test {
556 public:
557 virtual void SetUp() OVERRIDE {
558 channel_.reset(engine_.CreateChannel(NULL));
559 fake_channel_ = factory_.GetFakeChannel(channel_.get());
560 last_ssrc_ = 123;
561 ASSERT_TRUE(fake_channel_ != NULL)
562 << "Channel not created through factory.";
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +0000563 EXPECT_TRUE(fake_channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000564 }
565
566 protected:
567 FakeVideoSendStream* AddSendStream() {
568 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
569 }
570
571 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
572 size_t num_streams =
573 fake_channel_->GetFakeCall()->GetVideoSendStreams().size();
574 EXPECT_TRUE(channel_->AddSendStream(sp));
575 std::vector<FakeVideoSendStream*> streams =
576 fake_channel_->GetFakeCall()->GetVideoSendStreams();
577 EXPECT_EQ(num_streams + 1, streams.size());
578 return streams[streams.size() - 1];
579 }
580
581 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
582 return fake_channel_->GetFakeCall()->GetVideoSendStreams();
583 }
584
585 FakeVideoReceiveStream* AddRecvStream() {
586 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
587 }
588
589 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
590 size_t num_streams =
591 fake_channel_->GetFakeCall()->GetVideoReceiveStreams().size();
592 EXPECT_TRUE(channel_->AddRecvStream(sp));
593 std::vector<FakeVideoReceiveStream*> streams =
594 fake_channel_->GetFakeCall()->GetVideoReceiveStreams();
595 EXPECT_EQ(num_streams + 1, streams.size());
596 return streams[streams.size() - 1];
597 }
598
599 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate,
600 const char* max_bitrate) {
601 std::vector<VideoCodec> codecs;
602 codecs.push_back(kVp8Codec);
603 codecs[0].params[kCodecParamMinBitrate] = min_bitrate;
604 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate;
605 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
606
607 FakeVideoSendStream* stream = AddSendStream();
608
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000609 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
610 ASSERT_EQ(1u, video_streams.size());
611 EXPECT_EQ(atoi(min_bitrate), video_streams.back().min_bitrate_bps / 1000);
612 EXPECT_EQ(atoi(max_bitrate), video_streams.back().max_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000613
614 VideoCodec codec;
615 EXPECT_TRUE(channel_->GetSendCodec(&codec));
616 EXPECT_EQ(min_bitrate, codec.params[kCodecParamMinBitrate]);
617 EXPECT_EQ(max_bitrate, codec.params[kCodecParamMaxBitrate]);
618 }
619
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000620 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
621 const std::string& webrtc_ext) {
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000622 FakeCall* call = fake_channel_->GetFakeCall();
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000623 // Enable extension.
624 const int id = 1;
625 std::vector<cricket::RtpHeaderExtension> extensions;
626 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
627 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
628
629 FakeVideoSendStream* send_stream =
630 AddSendStream(cricket::StreamParams::CreateLegacy(123));
631
632 // Verify the send extension id.
633 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
634 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
635 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
636 // Verify call with same set of extensions returns true.
637 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
638 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
639 // receivers.
640 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
641 ->GetConfig()
642 .rtp.extensions.empty());
643
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000644 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000645 std::vector<cricket::RtpHeaderExtension> empty_extensions;
646 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000647 ASSERT_EQ(1u, call->GetVideoSendStreams().size());
648 send_stream = call->GetVideoSendStreams()[0];
649 EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
650
651 // Verify that adding receive RTP header extensions adds them for existing
652 // streams.
653 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
654 send_stream = call->GetVideoSendStreams()[0];
655 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
656 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
657 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000658 }
659
660 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
661 const std::string& webrtc_ext) {
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000662 FakeCall* call = fake_channel_->GetFakeCall();
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000663 // Enable extension.
664 const int id = 1;
665 std::vector<cricket::RtpHeaderExtension> extensions;
666 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
667 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
668
669 FakeVideoReceiveStream* recv_stream =
670 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
671
672 // Verify the recv extension id.
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);
676 // Verify call with same set of extensions returns true.
677 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000678
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000679 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
680 // senders.
681 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
682 ->GetConfig()
683 .rtp.extensions.empty());
684
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000685 // Verify that existing RTP header extensions can be removed.
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000686 std::vector<cricket::RtpHeaderExtension> empty_extensions;
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +0000687 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(empty_extensions));
688 ASSERT_EQ(1u, call->GetVideoReceiveStreams().size());
689 recv_stream = call->GetVideoReceiveStreams()[0];
690 EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
691
692 // Verify that adding receive RTP header extensions adds them for existing
693 // streams.
694 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
695 recv_stream = call->GetVideoReceiveStreams()[0];
696 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
697 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
698 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000699 }
700
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000701 talk_base::scoped_ptr<VideoMediaChannel> channel_;
702 FakeWebRtcVideoChannel2* fake_channel_;
703 uint32 last_ssrc_;
704};
705
706TEST_F(WebRtcVideoChannel2Test, DISABLED_MaxBitrateResetsWithConferenceMode) {
707 FAIL() << "Not implemented."; // TODO(pbos): Implement.
708}
709
710TEST_F(WebRtcVideoChannel2Test, DISABLED_StartSendBitrate) {
711 // TODO(pbos): Is this test testing vie_ ? this is confusing. No API to set
712 // start send bitrate from outside? Add defaults here that should be kept?
713 std::vector<cricket::VideoCodec> codec_list;
714 codec_list.push_back(kVp8Codec);
715 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
716 const unsigned int kVideoMinSendBitrateKbps = 50;
717 const unsigned int kVideoTargetSendBitrateKbps = 300;
718 const unsigned int kVideoMaxSendBitrateKbps = 2000;
719 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000720 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
721 ASSERT_EQ(1u, video_streams.size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000722 EXPECT_EQ(kVideoMinSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000723 video_streams.back().min_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000724 EXPECT_EQ(kVideoTargetSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000725 video_streams.back().target_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000726 EXPECT_EQ(kVideoMaxSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000727 video_streams.back().max_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000728#if 0
729 // TODO(pbos): un-#if
730 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
731 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
732 kVideoDefaultStartSendBitrateKbps);
733 EXPECT_EQ(0, vie_.StartSend(send_channel));
734
735 // Increase the send bitrate and verify it is used as start bitrate.
736 const unsigned int kVideoSendBitrateBps = 768000;
737 vie_.SetSendBitrates(send_channel, kVideoSendBitrateBps, 0, 0);
738 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
739 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
740 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
741 kVideoSendBitrateBps / 1000);
742
743 // Never set a start bitrate higher than the max bitrate.
744 vie_.SetSendBitrates(send_channel, kVideoMaxSendBitrateKbps + 500, 0, 0);
745 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
746 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
747 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
748 kVideoDefaultStartSendBitrateKbps);
749
750 // Use the default start bitrate if the send bitrate is lower.
751 vie_.SetSendBitrates(send_channel, kVideoDefaultStartSendBitrateKbps - 50, 0,
752 0);
753 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
754 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
755 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
756 kVideoDefaultStartSendBitrateKbps);
757#endif
758}
759
760TEST_F(WebRtcVideoChannel2Test, DISABLED_RtcpEnabled) {
761 // Note(pbos): This is a receiver-side setting, dumbo.
762 FAIL() << "Not implemented."; // TODO(pbos): Implement.
763}
764
765TEST_F(WebRtcVideoChannel2Test, DISABLED_KeyFrameRequestEnabled) {
766 FAIL() << "Not implemented."; // TODO(pbos): Implement.
767}
768
769TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
770 FakeVideoReceiveStream* stream = AddRecvStream();
771 EXPECT_TRUE(stream->GetConfig().rtp.remb);
772}
773
774TEST_F(WebRtcVideoChannel2Test, DISABLED_RembEnabledOnReceiveChannels) {
775 FAIL() << "Not implemented."; // TODO(pbos): Implement.
776}
777
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000778TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000779 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
780 EXPECT_TRUE(channel_->SetSend(true));
781 cricket::VideoOptions options;
782 options.conference_mode.Set(true);
783 EXPECT_TRUE(channel_->SetOptions(options));
784
785 // Send side.
786 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
787 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
788 FakeVideoSendStream* send_stream = AddSendStream(
789 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
790
791 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
792 for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
793 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
794
795 // Receiver side.
796 FakeVideoReceiveStream* recv_stream = AddRecvStream(
797 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
798 ASSERT_GT(recv_stream->GetConfig().rtp.rtx.size(), 0u)
799 << "No SSRCs for RTX configured by AddRecvStream.";
800 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size())
801 << "This test only works with one receive codec. Please update the test.";
802 EXPECT_EQ(rtx_ssrcs[0],
803 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
804 // TODO(pbos): Make sure we set the RTX for correct payloads etc.
805}
806
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000807TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
808 // Setup one channel with an associated RTX stream.
809 cricket::StreamParams params =
810 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
811 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
812 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
813 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
814 EXPECT_EQ(kRtxSsrcs1[0],
815 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000816}
817
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000818TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
819 // Setup one channel without an associated RTX stream.
820 cricket::StreamParams params =
821 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
822 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
823 ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000824}
825
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000826TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
827 FakeVideoSendStream* send_stream =
828 AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
829 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
830
831 FakeVideoReceiveStream* recv_stream =
832 AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
833 ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000834}
835
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000836// Test support for RTP timestamp offset header extension.
837TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
838 TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
839 webrtc::RtpExtension::kTOffset);
840}
841TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
842 TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
843 webrtc::RtpExtension::kTOffset);
844}
845
846// Test support for absolute send time header extension.
847TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
848 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
849 webrtc::RtpExtension::kAbsSendTime);
850}
851TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
852 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
853 webrtc::RtpExtension::kAbsSendTime);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000854}
855
856TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
857 FAIL() << "Not implemented."; // TODO(pbos): Implement.
858}
859
860TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
861 FAIL() << "Not implemented."; // TODO(pbos): Implement.
862}
863
864TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
865 FAIL() << "Not implemented."; // TODO(pbos): Implement.
866}
867
868TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
869 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
870 EXPECT_EQ(1u, fake_channel_->GetFakeCall()->GetVideoReceiveStreams().size());
871}
872
873TEST_F(WebRtcVideoChannel2Test, DISABLED_NoRembChangeAfterAddRecvStream) {
874 FAIL() << "Not implemented."; // TODO(pbos): Implement.
875}
876
877TEST_F(WebRtcVideoChannel2Test, DISABLED_RembOnOff) {
878 FAIL() << "Not implemented."; // TODO(pbos): Implement.
879}
880
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +0000881TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
882 VerifyCodecHasDefaultFeedbackParams(default_codec_);
883
pbos@webrtc.org19864742014-05-30 07:35:47 +0000884 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
885 EXPECT_TRUE(channel_->SetSend(true));
886
887 // Send side.
888 FakeVideoSendStream* send_stream =
889 AddSendStream(cricket::StreamParams::CreateLegacy(1));
890 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
891
892 // Receiver side.
893 FakeVideoReceiveStream* recv_stream =
894 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
895 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
896
897 // Nack history size should match between sender and receiver.
898 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
899 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000900}
901
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +0000902TEST_F(WebRtcVideoChannel2Test, NackCanBeDisabled) {
903 std::vector<VideoCodec> codecs;
904 codecs.push_back(kVp8Codec);
905
906 // Send side.
907 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
908 FakeVideoSendStream* send_stream =
909 AddSendStream(cricket::StreamParams::CreateLegacy(1));
910 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
911
912 // Receiver side.
913 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
914 FakeVideoReceiveStream* recv_stream =
915 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
916 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
917}
918
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000919TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
920 FAIL() << "Not implemented."; // TODO(pbos): Implement.
921}
922
923TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
924 FAIL() << "Not implemented."; // TODO(pbos): Implement.
925}
926
927TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
928 FAIL() << "Not implemented."; // TODO(pbos): Implement.
929}
930
931TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
932 FAIL() << "Not implemented."; // TODO(pbos): Implement.
933}
934
935TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
936 FAIL() << "Not implemented."; // TODO(pbos): Implement.
937}
938
939TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
940 FAIL() << "Not implemented."; // TODO(pbos): Implement.
941}
942
943TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
944 FAIL() << "Not implemented."; // TODO(pbos): Implement.
945}
946
947TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
948 FAIL() << "Not implemented."; // TODO(pbos): Implement.
949}
950
951TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
952 FAIL() << "Not implemented."; // TODO(pbos): Implement.
953}
954
955TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthScreencast) {
956 FAIL() << "Not implemented."; // TODO(pbos): Implement.
957}
958
959TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
960 FAIL() << "Not implemented."; // TODO(pbos): Implement.
961}
962
963TEST_F(WebRtcVideoChannel2Test,
964 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
965 FAIL() << "Not implemented."; // TODO(pbos): Implement.
966}
967
968TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithDenoising) {
969 FAIL() << "Not implemented."; // TODO(pbos): Implement.
970}
971
972TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
973 FAIL() << "Not implemented."; // TODO(pbos): Implement.
974}
975
976TEST_F(WebRtcVideoChannel2Test, DISABLED_DISABLED_SendReceiveBitratesStats) {
977 FAIL() << "Not implemented."; // TODO(pbos): Implement.
978}
979
980TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetAdaptInputToCpuUsage) {
981 FAIL() << "Not implemented."; // TODO(pbos): Implement.
982}
983
984TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetCpuThreshold) {
985 FAIL() << "Not implemented."; // TODO(pbos): Implement.
986}
987
988TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetInvalidCpuThreshold) {
989 FAIL() << "Not implemented."; // TODO(pbos): Implement.
990}
991
992TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldLog) {
993 FAIL() << "Not implemented."; // TODO(pbos): Implement.
994}
995
996TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldNotLog) {
997 FAIL() << "Not implemented."; // TODO(pbos): Implement.
998}
999
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001000TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001001 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001002
1003 VideoCodec codec;
1004 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001005 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001006
1007 // Using a RTX setup to verify that the default RTX payload type is good.
1008 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
1009 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
1010 FakeVideoSendStream* stream = AddSendStream(
1011 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
1012 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001013
1014 // Make sure NACK and FEC are enabled on the correct payload types.
1015 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
1016 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
1017 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001018
1019 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
1020 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001021 EXPECT_EQ(static_cast<int>(default_rtx_codec_.id),
1022 config.rtp.rtx.payload_type);
1023 // TODO(juberti): Check RTCP, PLI, TMMBR.
1024}
1025
1026TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
1027 std::vector<VideoCodec> codecs;
1028 codecs.push_back(kVp8Codec);
1029 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1030
1031 FakeVideoSendStream* stream = AddSendStream();
1032 webrtc::VideoSendStream::Config config = stream->GetConfig();
1033
1034 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1035 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1036}
1037
1038TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001039 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1040 std::vector<VideoCodec> codecs;
1041 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1042 codecs.push_back(rtx_codec);
1043 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1044 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001045}
1046
1047TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001048 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1049 std::vector<VideoCodec> codecs;
1050 cricket::VideoCodec rtx_codec =
1051 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1052 codecs.push_back(kVp8Codec);
1053 codecs.push_back(rtx_codec);
1054 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1055
1056 cricket::VideoCodec rtx_codec2 =
1057 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1058 codecs.pop_back();
1059 codecs.push_back(rtx_codec2);
1060 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1061 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001062}
1063
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001064TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1065 std::vector<VideoCodec> codecs;
1066 codecs.push_back(kVp8Codec);
1067 codecs.push_back(kUlpfecCodec);
1068 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1069
1070 FakeVideoSendStream* stream = AddSendStream();
1071 webrtc::VideoSendStream::Config config = stream->GetConfig();
1072
1073 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1074
1075 codecs.pop_back();
1076 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1077 stream = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0];
1078 ASSERT_TRUE(stream != NULL);
1079 config = stream->GetConfig();
1080 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1081 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001082}
1083
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001084TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1085 std::vector<VideoCodec> codecs;
1086 codecs.push_back(kVp8Codec720p);
1087 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1088
1089 std::vector<webrtc::VideoStream> streams =
1090 AddSendStream()->GetVideoStreams();
1091 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1092 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1093
1094 codecs.clear();
1095 codecs.push_back(kVp8Codec360p);
1096 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1097 streams = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0]
1098 ->GetVideoStreams();
1099 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1100 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001101}
1102
1103TEST_F(WebRtcVideoChannel2Test,
1104 DISABLED_ConstrainsSetCodecsAccordingToEncoderConfig) {
1105 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1106}
1107
1108TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMinMaxBitrate) {
1109 SetSendCodecsShouldWorkForBitrates("10", "20");
1110}
1111
1112TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001113 std::vector<VideoCodec> video_codecs = engine_.codecs();
1114 video_codecs[0].params[kCodecParamMinBitrate] = "30";
1115 video_codecs[0].params[kCodecParamMaxBitrate] = "20";
1116 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001117}
1118
1119TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptLargeMinMaxBitrate) {
1120 SetSendCodecsShouldWorkForBitrates("1000", "2000");
1121}
1122
1123TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1124 static const char* kMaxQuantization = "21";
1125 std::vector<VideoCodec> codecs;
1126 codecs.push_back(kVp8Codec);
1127 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1128 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001129 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1130 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001131
1132 VideoCodec codec;
1133 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1134 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1135}
1136
1137TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1138 std::vector<cricket::VideoCodec> codecs;
1139 codecs.push_back(kVp8Codec);
1140
1141 codecs[0].width = 0;
1142 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1143 << "Codec set though codec width is zero.";
1144
1145 codecs[0].width = kVp8Codec.width;
1146 codecs[0].height = 0;
1147 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1148 << "Codec set though codec height is zero.";
1149}
1150
1151TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
1152 // TODO(pbos): Should we only allow the dynamic range?
1153 static const size_t kNumIncorrectPayloads = 4;
1154 static const int kIncorrectPayloads[kNumIncorrectPayloads] = {-2, -1, 128,
1155 129};
1156 std::vector<cricket::VideoCodec> codecs;
1157 codecs.push_back(kVp8Codec);
1158 for (size_t i = 0; i < kNumIncorrectPayloads; ++i) {
1159 int payload_type = kIncorrectPayloads[i];
1160 codecs[0].id = payload_type;
1161 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1162 << "Bad payload type '" << payload_type << "' accepted.";
1163 }
1164}
1165
1166TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
1167 std::vector<cricket::VideoCodec> codecs;
1168 codecs.push_back(kVp8Codec);
1169 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
1170 codecs[0].id = payload_type;
1171 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
1172 << "Payload type '" << payload_type << "' rejected.";
1173 }
1174}
1175
1176TEST_F(WebRtcVideoChannel2Test, DISABLED_ResetVieSendCodecOnNewFrameSize) {
1177 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1178}
1179
1180TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
1181 std::vector<cricket::VideoCodec> codecs;
1182 codecs.push_back(kVp8Codec);
1183 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1184}
1185
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001186// Test that we set our inbound RTX codecs properly.
1187TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
1188 std::vector<cricket::VideoCodec> codecs;
1189 codecs.push_back(kVp8Codec);
1190 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1191 codecs.push_back(rtx_codec);
1192 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1193 << "RTX codec without associated payload should be rejected.";
1194
1195 codecs[1].SetParam("apt", kVp8Codec.id + 1);
1196 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1197 << "RTX codec with invalid associated payload type should be rejected.";
1198
1199 codecs[1].SetParam("apt", kVp8Codec.id);
1200 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1201
1202 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
1203 rtx_codec2.SetParam("apt", rtx_codec.id);
1204 codecs.push_back(rtx_codec2);
1205
1206 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
1207 "as associated payload type "
1208 "should be rejected.";
1209}
1210
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001211TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
1212 std::vector<cricket::VideoCodec> codecs;
1213 codecs.push_back(kVp8Codec);
1214 codecs[0].id = 99;
1215 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1216}
1217
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001218TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001219 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001220
1221 FakeVideoReceiveStream* stream = AddRecvStream();
1222 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1223 EXPECT_STREQ(engine_.codecs()[0].name.c_str(), config.codecs[0].plName);
1224 EXPECT_EQ(engine_.codecs()[0].id, config.codecs[0].plType);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001225}
1226
1227TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
1228 std::vector<VideoCodec> codecs;
1229 codecs.push_back(kVp8Codec);
1230 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
1231 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1232}
1233
1234// TODO(pbos): Enable VP9 through external codec support
1235TEST_F(WebRtcVideoChannel2Test,
1236 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
1237 std::vector<VideoCodec> codecs;
1238 codecs.push_back(kVp8Codec);
1239 codecs.push_back(kVp9Codec);
1240 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1241}
1242
1243TEST_F(WebRtcVideoChannel2Test,
1244 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
1245 std::vector<VideoCodec> codecs;
1246 codecs.push_back(kVp8Codec);
1247 codecs.push_back(kVp9Codec);
1248 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1249 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
1250}
1251
pbos@webrtc.orgd1ea06b2014-07-18 09:35:58 +00001252TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
1253 std::vector<VideoCodec> codecs;
1254 codecs.push_back(kVp8Codec);
1255 codecs.push_back(kUlpfecCodec);
1256 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1257
1258 FakeVideoReceiveStream* stream = AddRecvStream();
1259 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1260
1261 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1262
1263 codecs.pop_back();
1264 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
1265 stream = fake_channel_->GetFakeCall()->GetVideoReceiveStreams()[0];
1266 ASSERT_TRUE(stream != NULL);
1267 config = stream->GetConfig();
1268 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1269 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001270}
1271
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001272TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
1273 std::vector<VideoCodec> codecs;
1274 codecs.push_back(kVp8Codec);
1275 codecs.push_back(kRedCodec);
1276 codecs[1].id = codecs[0].id;
1277 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1278}
1279
1280TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
1281 std::vector<VideoCodec> codecs;
1282 codecs.push_back(kVp8Codec);
1283 codecs.push_back(kVp9Codec);
1284 codecs[1].id = codecs[0].id;
1285 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1286}
1287
1288TEST_F(WebRtcVideoChannel2Test,
1289 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
1290 std::vector<VideoCodec> codecs;
1291 codecs.push_back(kVp8Codec);
1292 codecs.push_back(kVp8Codec);
1293 codecs[1].id += 1;
1294 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1295}
1296
1297TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
1298 EXPECT_FALSE(AddSendStream()->IsSending());
1299}
1300
1301TEST_F(WebRtcVideoChannel2Test, DISABLED_ReceiveStreamReceivingByDefault) {
1302 // Is this test correct though? Auto-receive? Enable receive on first packet?
1303 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1304}
1305
1306TEST_F(WebRtcVideoChannel2Test, SetSend) {
pbos@webrtc.org5301b0f2014-07-17 08:51:46 +00001307 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001308 EXPECT_FALSE(stream->IsSending());
1309
1310 // false->true
1311 EXPECT_TRUE(channel_->SetSend(true));
1312 EXPECT_TRUE(stream->IsSending());
1313 // true->true
1314 EXPECT_TRUE(channel_->SetSend(true));
1315 EXPECT_TRUE(stream->IsSending());
1316 // true->false
1317 EXPECT_TRUE(channel_->SetSend(false));
1318 EXPECT_FALSE(stream->IsSending());
1319 // false->false
1320 EXPECT_TRUE(channel_->SetSend(false));
1321 EXPECT_FALSE(stream->IsSending());
1322
1323 EXPECT_TRUE(channel_->SetSend(true));
1324 FakeVideoSendStream* new_stream = AddSendStream();
1325 EXPECT_TRUE(new_stream->IsSending())
1326 << "Send stream created after SetSend(true) not sending initially.";
1327}
1328
1329TEST_F(WebRtcVideoChannel2Test, DISABLED_SendAndReceiveVp8Vga) {
1330 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1331}
1332
1333TEST_F(WebRtcVideoChannel2Test, DISABLED_SendAndReceiveVp8Qvga) {
1334 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1335}
1336
1337TEST_F(WebRtcVideoChannel2Test, DISABLED_SendAndReceiveH264SvcQqvga) {
1338 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1339}
1340
1341TEST_F(WebRtcVideoChannel2Test, DISABLED_SendManyResizeOnce) {
1342 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1343}
1344
1345TEST_F(WebRtcVideoChannel2Test, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
1346 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1347}
1348
1349TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetDscpOptions) {
1350 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1351}
1352
1353TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithMaxBitrate) {
1354 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1355}
1356
1357TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithLoweredBitrate) {
1358 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1359}
1360
1361TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsSucceedsWhenSending) {
1362 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1363}
1364
1365TEST_F(WebRtcVideoChannel2Test, DISABLED_ResetCodecOnScreencast) {
1366 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1367}
1368
1369TEST_F(WebRtcVideoChannel2Test, DISABLED_DontResetCodecOnSendFrame) {
1370 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1371}
1372
1373TEST_F(WebRtcVideoChannel2Test,
1374 DISABLED_DontRegisterDecoderIfFactoryIsNotGiven) {
1375 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1376}
1377
1378TEST_F(WebRtcVideoChannel2Test, DISABLED_RegisterDecoderIfFactoryIsGiven) {
1379 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1380}
1381
1382TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterDecoderMultipleTimes) {
1383 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1384}
1385
1386TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterDecoderForNonVP8) {
1387 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1388}
1389
1390TEST_F(WebRtcVideoChannel2Test,
1391 DISABLED_DontRegisterEncoderIfFactoryIsNotGiven) {
1392 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1393}
1394
1395TEST_F(WebRtcVideoChannel2Test, DISABLED_RegisterEncoderIfFactoryIsGiven) {
1396 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1397}
1398
1399TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterEncoderMultipleTimes) {
1400 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1401}
1402
1403TEST_F(WebRtcVideoChannel2Test,
1404 DISABLED_RegisterEncoderWithMultipleSendStreams) {
1405 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1406}
1407
1408TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterEncoderForNonVP8) {
1409 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1410}
1411
1412TEST_F(WebRtcVideoChannel2Test, DISABLED_FeedbackParamsForNonVP8) {
1413 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1414}
1415
1416TEST_F(WebRtcVideoChannel2Test, DISABLED_ExternalCodecAddedToTheEnd) {
1417 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1418}
1419
1420TEST_F(WebRtcVideoChannel2Test, DISABLED_ExternalCodecIgnored) {
1421 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1422}
1423
1424TEST_F(WebRtcVideoChannel2Test, DISABLED_UpdateEncoderCodecsAfterSetFactory) {
1425 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1426}
1427
1428TEST_F(WebRtcVideoChannel2Test, DISABLED_OnReadyToSend) {
1429 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1430}
1431
1432TEST_F(WebRtcVideoChannel2Test, DISABLED_CaptureFrameTimestampToNtpTimestamp) {
1433 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1434}
1435} // namespace cricket