blob: a58ed93c6b135cea9e582c53ff4e7d3352866e68 [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.orgb5a22b12014-05-13 11:07:01 +0000416class WebRtcVideoChannel2BaseTest
417 : public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
418 protected:
419 virtual cricket::VideoCodec DefaultCodec() OVERRIDE { return kVp8Codec; }
420 typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
421};
422
423// TODO(pbos): Fix WebRtcVideoEngine2BaseTest, where we want CheckCoInitialize.
424#if 0
425// TODO(juberti): Figure out why ViE is munging the COM refcount.
426#ifdef WIN32
427TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_CheckCoInitialize) {
428 Base::CheckCoInitialize();
429}
430#endif
431#endif
432
433TEST_F(WebRtcVideoChannel2BaseTest, SetSend) { Base::SetSend(); }
434
435TEST_F(WebRtcVideoChannel2BaseTest, SetSendWithoutCodecs) {
436 Base::SetSendWithoutCodecs();
437}
438
439TEST_F(WebRtcVideoChannel2BaseTest, SetSendSetsTransportBufferSizes) {
440 Base::SetSendSetsTransportBufferSizes();
441}
442
443// TODO(juberti): Fix this test to tolerate missing stats.
444TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_GetStats) { Base::GetStats(); }
445
446// TODO(juberti): Fix this test to tolerate missing stats.
447TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_GetStatsMultipleRecvStreams) {
448 Base::GetStatsMultipleRecvStreams();
449}
450
451TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_GetStatsMultipleSendStreams) {
452 Base::GetStatsMultipleSendStreams();
453}
454
455TEST_F(WebRtcVideoChannel2BaseTest, SetSendBandwidth) {
456 Base::SetSendBandwidth();
457}
458TEST_F(WebRtcVideoChannel2BaseTest, SetSendSsrc) { Base::SetSendSsrc(); }
459TEST_F(WebRtcVideoChannel2BaseTest, SetSendSsrcAfterSetCodecs) {
460 Base::SetSendSsrcAfterSetCodecs();
461}
462
463TEST_F(WebRtcVideoChannel2BaseTest, SetRenderer) { Base::SetRenderer(); }
464
465TEST_F(WebRtcVideoChannel2BaseTest, AddRemoveRecvStreams) {
466 Base::AddRemoveRecvStreams();
467}
468
469TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_AddRemoveRecvStreamAndRender) {
470 Base::AddRemoveRecvStreamAndRender();
471}
472
473TEST_F(WebRtcVideoChannel2BaseTest, AddRemoveRecvStreamsNoConference) {
474 Base::AddRemoveRecvStreamsNoConference();
475}
476
477TEST_F(WebRtcVideoChannel2BaseTest, AddRemoveSendStreams) {
478 Base::AddRemoveSendStreams();
479}
480
481TEST_F(WebRtcVideoChannel2BaseTest, SimulateConference) {
482 Base::SimulateConference();
483}
484
485TEST_F(WebRtcVideoChannel2BaseTest, AddRemoveCapturer) {
486 Base::AddRemoveCapturer();
487}
488
489TEST_F(WebRtcVideoChannel2BaseTest, RemoveCapturerWithoutAdd) {
490 Base::RemoveCapturerWithoutAdd();
491}
492
493TEST_F(WebRtcVideoChannel2BaseTest, AddRemoveCapturerMultipleSources) {
494 Base::AddRemoveCapturerMultipleSources();
495}
496
497// TODO(pbos): Figure out why this fails so often.
498TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_HighAspectHighHeightCapturer) {
499 Base::HighAspectHighHeightCapturer();
500}
501
502TEST_F(WebRtcVideoChannel2BaseTest, RejectEmptyStreamParams) {
503 Base::RejectEmptyStreamParams();
504}
505
506TEST_F(WebRtcVideoChannel2BaseTest, AdaptResolution16x10) {
507 Base::AdaptResolution16x10();
508}
509
510TEST_F(WebRtcVideoChannel2BaseTest, AdaptResolution4x3) {
511 Base::AdaptResolution4x3();
512}
513
514TEST_F(WebRtcVideoChannel2BaseTest, MuteStream) { Base::MuteStream(); }
515
516TEST_F(WebRtcVideoChannel2BaseTest, MultipleSendStreams) {
517 Base::MultipleSendStreams();
518}
519
520// TODO(juberti): Restore this test once we support sending 0 fps.
521TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_AdaptDropAllFrames) {
522 Base::AdaptDropAllFrames();
523}
524// TODO(juberti): Understand why we get decode errors on this test.
525TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_AdaptFramerate) {
526 Base::AdaptFramerate();
527}
528
529TEST_F(WebRtcVideoChannel2BaseTest, SetSendStreamFormat0x0) {
530 Base::SetSendStreamFormat0x0();
531}
532
533// TODO(zhurunz): Fix the flakey test.
534TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_SetSendStreamFormat) {
535 Base::SetSendStreamFormat();
536}
537
538TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
539 Base::TwoStreamsSendAndReceive(kVp8Codec);
540}
541
542TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsReUseFirstStream) {
543 Base::TwoStreamsReUseFirstStream(kVp8Codec);
544}
545
546class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test {
547 public:
548 virtual void SetUp() OVERRIDE {
549 channel_.reset(engine_.CreateChannel(NULL));
550 fake_channel_ = factory_.GetFakeChannel(channel_.get());
551 last_ssrc_ = 123;
552 ASSERT_TRUE(fake_channel_ != NULL)
553 << "Channel not created through factory.";
554 }
555
556 protected:
557 FakeVideoSendStream* AddSendStream() {
558 return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
559 }
560
561 FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
562 size_t num_streams =
563 fake_channel_->GetFakeCall()->GetVideoSendStreams().size();
564 EXPECT_TRUE(channel_->AddSendStream(sp));
565 std::vector<FakeVideoSendStream*> streams =
566 fake_channel_->GetFakeCall()->GetVideoSendStreams();
567 EXPECT_EQ(num_streams + 1, streams.size());
568 return streams[streams.size() - 1];
569 }
570
571 std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
572 return fake_channel_->GetFakeCall()->GetVideoSendStreams();
573 }
574
575 FakeVideoReceiveStream* AddRecvStream() {
576 return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
577 }
578
579 FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
580 size_t num_streams =
581 fake_channel_->GetFakeCall()->GetVideoReceiveStreams().size();
582 EXPECT_TRUE(channel_->AddRecvStream(sp));
583 std::vector<FakeVideoReceiveStream*> streams =
584 fake_channel_->GetFakeCall()->GetVideoReceiveStreams();
585 EXPECT_EQ(num_streams + 1, streams.size());
586 return streams[streams.size() - 1];
587 }
588
589 void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate,
590 const char* max_bitrate) {
591 std::vector<VideoCodec> codecs;
592 codecs.push_back(kVp8Codec);
593 codecs[0].params[kCodecParamMinBitrate] = min_bitrate;
594 codecs[0].params[kCodecParamMaxBitrate] = max_bitrate;
595 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
596
597 FakeVideoSendStream* stream = AddSendStream();
598
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000599 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
600 ASSERT_EQ(1u, video_streams.size());
601 EXPECT_EQ(atoi(min_bitrate), video_streams.back().min_bitrate_bps / 1000);
602 EXPECT_EQ(atoi(max_bitrate), video_streams.back().max_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000603
604 VideoCodec codec;
605 EXPECT_TRUE(channel_->GetSendCodec(&codec));
606 EXPECT_EQ(min_bitrate, codec.params[kCodecParamMinBitrate]);
607 EXPECT_EQ(max_bitrate, codec.params[kCodecParamMaxBitrate]);
608 }
609
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000610 void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
611 const std::string& webrtc_ext) {
612 // Enable extension.
613 const int id = 1;
614 std::vector<cricket::RtpHeaderExtension> extensions;
615 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
616 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
617
618 FakeVideoSendStream* send_stream =
619 AddSendStream(cricket::StreamParams::CreateLegacy(123));
620
621 // Verify the send extension id.
622 ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
623 EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
624 EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
625 // Verify call with same set of extensions returns true.
626 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(extensions));
627 // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
628 // receivers.
629 EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
630 ->GetConfig()
631 .rtp.extensions.empty());
632
633 // Remove the extension id, verify that this doesn't reset extensions as
634 // they should be set before creating channels.
635 std::vector<cricket::RtpHeaderExtension> empty_extensions;
636 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
637 EXPECT_FALSE(send_stream->GetConfig().rtp.extensions.empty());
638 }
639
640 void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
641 const std::string& webrtc_ext) {
642 // Enable extension.
643 const int id = 1;
644 std::vector<cricket::RtpHeaderExtension> extensions;
645 extensions.push_back(cricket::RtpHeaderExtension(cricket_ext, id));
646 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
647
648 FakeVideoReceiveStream* recv_stream =
649 AddRecvStream(cricket::StreamParams::CreateLegacy(123));
650
651 // Verify the recv extension id.
652 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
653 EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
654 EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
655 // Verify call with same set of extensions returns true.
656 EXPECT_TRUE(channel_->SetRecvRtpHeaderExtensions(extensions));
657 // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
658 // senders.
659 EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
660 ->GetConfig()
661 .rtp.extensions.empty());
662
663 // Remove the extension id, verify that this doesn't reset extensions as
664 // they should be set before creating channels.
665 std::vector<cricket::RtpHeaderExtension> empty_extensions;
666 EXPECT_TRUE(channel_->SetSendRtpHeaderExtensions(empty_extensions));
667 EXPECT_FALSE(recv_stream->GetConfig().rtp.extensions.empty());
668 }
669
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000670 talk_base::scoped_ptr<VideoMediaChannel> channel_;
671 FakeWebRtcVideoChannel2* fake_channel_;
672 uint32 last_ssrc_;
673};
674
675TEST_F(WebRtcVideoChannel2Test, DISABLED_MaxBitrateResetsWithConferenceMode) {
676 FAIL() << "Not implemented."; // TODO(pbos): Implement.
677}
678
679TEST_F(WebRtcVideoChannel2Test, DISABLED_StartSendBitrate) {
680 // TODO(pbos): Is this test testing vie_ ? this is confusing. No API to set
681 // start send bitrate from outside? Add defaults here that should be kept?
682 std::vector<cricket::VideoCodec> codec_list;
683 codec_list.push_back(kVp8Codec);
684 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
685 const unsigned int kVideoMinSendBitrateKbps = 50;
686 const unsigned int kVideoTargetSendBitrateKbps = 300;
687 const unsigned int kVideoMaxSendBitrateKbps = 2000;
688 FakeVideoSendStream* stream = AddSendStream();
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000689 std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
690 ASSERT_EQ(1u, video_streams.size());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000691 EXPECT_EQ(kVideoMinSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000692 video_streams.back().min_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000693 EXPECT_EQ(kVideoTargetSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000694 video_streams.back().target_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000695 EXPECT_EQ(kVideoMaxSendBitrateKbps,
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +0000696 video_streams.back().max_bitrate_bps / 1000);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000697#if 0
698 // TODO(pbos): un-#if
699 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
700 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
701 kVideoDefaultStartSendBitrateKbps);
702 EXPECT_EQ(0, vie_.StartSend(send_channel));
703
704 // Increase the send bitrate and verify it is used as start bitrate.
705 const unsigned int kVideoSendBitrateBps = 768000;
706 vie_.SetSendBitrates(send_channel, kVideoSendBitrateBps, 0, 0);
707 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
708 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
709 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
710 kVideoSendBitrateBps / 1000);
711
712 // Never set a start bitrate higher than the max bitrate.
713 vie_.SetSendBitrates(send_channel, kVideoMaxSendBitrateKbps + 500, 0, 0);
714 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
715 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
716 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
717 kVideoDefaultStartSendBitrateKbps);
718
719 // Use the default start bitrate if the send bitrate is lower.
720 vie_.SetSendBitrates(send_channel, kVideoDefaultStartSendBitrateKbps - 50, 0,
721 0);
722 EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
723 VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0,
724 kVideoMaxSendBitrateKbps, kVideoMinSendBitrateKbps,
725 kVideoDefaultStartSendBitrateKbps);
726#endif
727}
728
729TEST_F(WebRtcVideoChannel2Test, DISABLED_RtcpEnabled) {
730 // Note(pbos): This is a receiver-side setting, dumbo.
731 FAIL() << "Not implemented."; // TODO(pbos): Implement.
732}
733
734TEST_F(WebRtcVideoChannel2Test, DISABLED_KeyFrameRequestEnabled) {
735 FAIL() << "Not implemented."; // TODO(pbos): Implement.
736}
737
738TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
739 FakeVideoReceiveStream* stream = AddRecvStream();
740 EXPECT_TRUE(stream->GetConfig().rtp.remb);
741}
742
743TEST_F(WebRtcVideoChannel2Test, DISABLED_RembEnabledOnReceiveChannels) {
744 FAIL() << "Not implemented."; // TODO(pbos): Implement.
745}
746
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000747TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000748 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
749 EXPECT_TRUE(channel_->SetSend(true));
750 cricket::VideoOptions options;
751 options.conference_mode.Set(true);
752 EXPECT_TRUE(channel_->SetOptions(options));
753
754 // Send side.
755 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
756 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
757 FakeVideoSendStream* send_stream = AddSendStream(
758 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
759
760 ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
761 for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
762 EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
763
764 // Receiver side.
765 FakeVideoReceiveStream* recv_stream = AddRecvStream(
766 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
767 ASSERT_GT(recv_stream->GetConfig().rtp.rtx.size(), 0u)
768 << "No SSRCs for RTX configured by AddRecvStream.";
769 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size())
770 << "This test only works with one receive codec. Please update the test.";
771 EXPECT_EQ(rtx_ssrcs[0],
772 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
773 // TODO(pbos): Make sure we set the RTX for correct payloads etc.
774}
775
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000776TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
777 // Setup one channel with an associated RTX stream.
778 cricket::StreamParams params =
779 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
780 params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
781 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
782 ASSERT_EQ(1u, recv_stream->GetConfig().rtp.rtx.size());
783 EXPECT_EQ(kRtxSsrcs1[0],
784 recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000785}
786
pbos@webrtc.orge322a172014-06-13 11:47:28 +0000787TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
788 // Setup one channel without an associated RTX stream.
789 cricket::StreamParams params =
790 cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
791 FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
792 ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000793}
794
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000795TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
796 FakeVideoSendStream* send_stream =
797 AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
798 ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
799
800 FakeVideoReceiveStream* recv_stream =
801 AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
802 ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000803}
804
pbos@webrtc.org587ef602014-06-16 17:32:02 +0000805// Test support for RTP timestamp offset header extension.
806TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
807 TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
808 webrtc::RtpExtension::kTOffset);
809}
810TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
811 TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
812 webrtc::RtpExtension::kTOffset);
813}
814
815// Test support for absolute send time header extension.
816TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
817 TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
818 webrtc::RtpExtension::kAbsSendTime);
819}
820TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
821 TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
822 webrtc::RtpExtension::kAbsSendTime);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000823}
824
825TEST_F(WebRtcVideoChannel2Test, DISABLED_LeakyBucketTest) {
826 FAIL() << "Not implemented."; // TODO(pbos): Implement.
827}
828
829TEST_F(WebRtcVideoChannel2Test, DISABLED_BufferedModeLatency) {
830 FAIL() << "Not implemented."; // TODO(pbos): Implement.
831}
832
833TEST_F(WebRtcVideoChannel2Test, DISABLED_AdditiveVideoOptions) {
834 FAIL() << "Not implemented."; // TODO(pbos): Implement.
835}
836
837TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
838 EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
839 EXPECT_EQ(1u, fake_channel_->GetFakeCall()->GetVideoReceiveStreams().size());
840}
841
842TEST_F(WebRtcVideoChannel2Test, DISABLED_NoRembChangeAfterAddRecvStream) {
843 FAIL() << "Not implemented."; // TODO(pbos): Implement.
844}
845
846TEST_F(WebRtcVideoChannel2Test, DISABLED_RembOnOff) {
847 FAIL() << "Not implemented."; // TODO(pbos): Implement.
848}
849
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +0000850TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
851 VerifyCodecHasDefaultFeedbackParams(default_codec_);
852
pbos@webrtc.org19864742014-05-30 07:35:47 +0000853 EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
854 EXPECT_TRUE(channel_->SetSend(true));
855
856 // Send side.
857 FakeVideoSendStream* send_stream =
858 AddSendStream(cricket::StreamParams::CreateLegacy(1));
859 EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
860
861 // Receiver side.
862 FakeVideoReceiveStream* recv_stream =
863 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
864 EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
865
866 // Nack history size should match between sender and receiver.
867 EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
868 recv_stream->GetConfig().rtp.nack.rtp_history_ms);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000869}
870
pbos@webrtc.orgf99c2f22014-06-13 12:27:38 +0000871TEST_F(WebRtcVideoChannel2Test, NackCanBeDisabled) {
872 std::vector<VideoCodec> codecs;
873 codecs.push_back(kVp8Codec);
874
875 // Send side.
876 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
877 FakeVideoSendStream* send_stream =
878 AddSendStream(cricket::StreamParams::CreateLegacy(1));
879 EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
880
881 // Receiver side.
882 ASSERT_TRUE(channel_->SetRecvCodecs(codecs));
883 FakeVideoReceiveStream* recv_stream =
884 AddRecvStream(cricket::StreamParams::CreateLegacy(1));
885 EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
886}
887
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000888TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInterop) {
889 FAIL() << "Not implemented."; // TODO(pbos): Implement.
890}
891
892TEST_F(WebRtcVideoChannel2Test, DISABLED_VideoProtectionInteropReversed) {
893 FAIL() << "Not implemented."; // TODO(pbos): Implement.
894}
895
896TEST_F(WebRtcVideoChannel2Test, DISABLED_HybridNackFecConference) {
897 FAIL() << "Not implemented."; // TODO(pbos): Implement.
898}
899
900TEST_F(WebRtcVideoChannel2Test, DISABLED_AddRemoveRecvStreamConference) {
901 FAIL() << "Not implemented."; // TODO(pbos): Implement.
902}
903
904TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRender) {
905 FAIL() << "Not implemented."; // TODO(pbos): Implement.
906}
907
908TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAuto) {
909 FAIL() << "Not implemented."; // TODO(pbos): Implement.
910}
911
912TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthAutoCapped) {
913 FAIL() << "Not implemented."; // TODO(pbos): Implement.
914}
915
916TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthFixed) {
917 FAIL() << "Not implemented."; // TODO(pbos): Implement.
918}
919
920TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthInConference) {
921 FAIL() << "Not implemented."; // TODO(pbos): Implement.
922}
923
924TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthScreencast) {
925 FAIL() << "Not implemented."; // TODO(pbos): Implement.
926}
927
928TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
929 FAIL() << "Not implemented."; // TODO(pbos): Implement.
930}
931
932TEST_F(WebRtcVideoChannel2Test,
933 DISABLED_SetSendSsrcAfterCreatingReceiveChannel) {
934 FAIL() << "Not implemented."; // TODO(pbos): Implement.
935}
936
937TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithDenoising) {
938 FAIL() << "Not implemented."; // TODO(pbos): Implement.
939}
940
941TEST_F(WebRtcVideoChannel2Test, DISABLED_MultipleSendStreamsWithOneCapturer) {
942 FAIL() << "Not implemented."; // TODO(pbos): Implement.
943}
944
945TEST_F(WebRtcVideoChannel2Test, DISABLED_DISABLED_SendReceiveBitratesStats) {
946 FAIL() << "Not implemented."; // TODO(pbos): Implement.
947}
948
949TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetAdaptInputToCpuUsage) {
950 FAIL() << "Not implemented."; // TODO(pbos): Implement.
951}
952
953TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetCpuThreshold) {
954 FAIL() << "Not implemented."; // TODO(pbos): Implement.
955}
956
957TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetInvalidCpuThreshold) {
958 FAIL() << "Not implemented."; // TODO(pbos): Implement.
959}
960
961TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldLog) {
962 FAIL() << "Not implemented."; // TODO(pbos): Implement.
963}
964
965TEST_F(WebRtcVideoChannel2Test, DISABLED_WebRtcShouldNotLog) {
966 FAIL() << "Not implemented."; // TODO(pbos): Implement.
967}
968
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000969TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000970 ASSERT_TRUE(channel_->SetSendCodecs(engine_.codecs()));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000971
972 VideoCodec codec;
973 EXPECT_TRUE(channel_->GetSendCodec(&codec));
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +0000974 EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000975
976 // Using a RTX setup to verify that the default RTX payload type is good.
977 const std::vector<uint32> ssrcs = MAKE_VECTOR(kSsrcs1);
978 const std::vector<uint32> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
979 FakeVideoSendStream* stream = AddSendStream(
980 cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
981 webrtc::VideoSendStream::Config config = stream->GetConfig();
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000982
983 // Make sure NACK and FEC are enabled on the correct payload types.
984 EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
985 EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
986 EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
pbos@webrtc.org269605c2014-06-26 08:49:03 +0000987
988 EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
989 EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +0000990 EXPECT_EQ(static_cast<int>(default_rtx_codec_.id),
991 config.rtp.rtx.payload_type);
992 // TODO(juberti): Check RTCP, PLI, TMMBR.
993}
994
995TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
996 std::vector<VideoCodec> codecs;
997 codecs.push_back(kVp8Codec);
998 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
999
1000 FakeVideoSendStream* stream = AddSendStream();
1001 webrtc::VideoSendStream::Config config = stream->GetConfig();
1002
1003 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
1004 EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
1005}
1006
1007TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001008 SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
1009 std::vector<VideoCodec> codecs;
1010 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1011 codecs.push_back(rtx_codec);
1012 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1013 << "RTX codec without associated payload type should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001014}
1015
1016TEST_F(WebRtcVideoChannel2Test,
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001017 SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
1018 std::vector<VideoCodec> codecs;
1019 cricket::VideoCodec rtx_codec =
1020 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
1021 codecs.push_back(kVp8Codec);
1022 codecs.push_back(rtx_codec);
1023 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1024
1025 cricket::VideoCodec rtx_codec2 =
1026 cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
1027 codecs.pop_back();
1028 codecs.push_back(rtx_codec2);
1029 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1030 << "RTX without matching video codec should be rejected.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001031}
1032
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001033TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
1034 std::vector<VideoCodec> codecs;
1035 codecs.push_back(kVp8Codec);
1036 codecs.push_back(kUlpfecCodec);
1037 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1038
1039 FakeVideoSendStream* stream = AddSendStream();
1040 webrtc::VideoSendStream::Config config = stream->GetConfig();
1041
1042 EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
1043
1044 codecs.pop_back();
1045 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1046 stream = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0];
1047 ASSERT_TRUE(stream != NULL);
1048 config = stream->GetConfig();
1049 EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
1050 << "SetSendCodec without FEC should disable current FEC.";
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001051}
1052
pbos@webrtc.org38ce7d02014-07-16 08:01:38 +00001053TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
1054 std::vector<VideoCodec> codecs;
1055 codecs.push_back(kVp8Codec720p);
1056 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1057
1058 std::vector<webrtc::VideoStream> streams =
1059 AddSendStream()->GetVideoStreams();
1060 EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
1061 EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
1062
1063 codecs.clear();
1064 codecs.push_back(kVp8Codec360p);
1065 ASSERT_TRUE(channel_->SetSendCodecs(codecs));
1066 streams = fake_channel_->GetFakeCall()->GetVideoSendStreams()[0]
1067 ->GetVideoStreams();
1068 EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
1069 EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001070}
1071
1072TEST_F(WebRtcVideoChannel2Test,
1073 DISABLED_ConstrainsSetCodecsAccordingToEncoderConfig) {
1074 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1075}
1076
1077TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMinMaxBitrate) {
1078 SetSendCodecsShouldWorkForBitrates("10", "20");
1079}
1080
1081TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
pbos@webrtc.org9fbb7172014-06-13 09:34:13 +00001082 std::vector<VideoCodec> video_codecs = engine_.codecs();
1083 video_codecs[0].params[kCodecParamMinBitrate] = "30";
1084 video_codecs[0].params[kCodecParamMaxBitrate] = "20";
1085 EXPECT_FALSE(channel_->SetSendCodecs(video_codecs));
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001086}
1087
1088TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptLargeMinMaxBitrate) {
1089 SetSendCodecsShouldWorkForBitrates("1000", "2000");
1090}
1091
1092TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
1093 static const char* kMaxQuantization = "21";
1094 std::vector<VideoCodec> codecs;
1095 codecs.push_back(kVp8Codec);
1096 codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
1097 EXPECT_TRUE(channel_->SetSendCodecs(codecs));
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +00001098 EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
1099 AddSendStream()->GetVideoStreams().back().max_qp);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001100
1101 VideoCodec codec;
1102 EXPECT_TRUE(channel_->GetSendCodec(&codec));
1103 EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
1104}
1105
1106TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
1107 std::vector<cricket::VideoCodec> codecs;
1108 codecs.push_back(kVp8Codec);
1109
1110 codecs[0].width = 0;
1111 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1112 << "Codec set though codec width is zero.";
1113
1114 codecs[0].width = kVp8Codec.width;
1115 codecs[0].height = 0;
1116 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1117 << "Codec set though codec height is zero.";
1118}
1119
1120TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
1121 // TODO(pbos): Should we only allow the dynamic range?
1122 static const size_t kNumIncorrectPayloads = 4;
1123 static const int kIncorrectPayloads[kNumIncorrectPayloads] = {-2, -1, 128,
1124 129};
1125 std::vector<cricket::VideoCodec> codecs;
1126 codecs.push_back(kVp8Codec);
1127 for (size_t i = 0; i < kNumIncorrectPayloads; ++i) {
1128 int payload_type = kIncorrectPayloads[i];
1129 codecs[0].id = payload_type;
1130 EXPECT_FALSE(channel_->SetSendCodecs(codecs))
1131 << "Bad payload type '" << payload_type << "' accepted.";
1132 }
1133}
1134
1135TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
1136 std::vector<cricket::VideoCodec> codecs;
1137 codecs.push_back(kVp8Codec);
1138 for (int payload_type = 0; payload_type <= 127; ++payload_type) {
1139 codecs[0].id = payload_type;
1140 EXPECT_TRUE(channel_->SetSendCodecs(codecs))
1141 << "Payload type '" << payload_type << "' rejected.";
1142 }
1143}
1144
1145TEST_F(WebRtcVideoChannel2Test, DISABLED_ResetVieSendCodecOnNewFrameSize) {
1146 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1147}
1148
1149TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
1150 std::vector<cricket::VideoCodec> codecs;
1151 codecs.push_back(kVp8Codec);
1152 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1153}
1154
pbos@webrtc.orge322a172014-06-13 11:47:28 +00001155// Test that we set our inbound RTX codecs properly.
1156TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
1157 std::vector<cricket::VideoCodec> codecs;
1158 codecs.push_back(kVp8Codec);
1159 cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0, 0);
1160 codecs.push_back(rtx_codec);
1161 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1162 << "RTX codec without associated payload should be rejected.";
1163
1164 codecs[1].SetParam("apt", kVp8Codec.id + 1);
1165 EXPECT_FALSE(channel_->SetRecvCodecs(codecs))
1166 << "RTX codec with invalid associated payload type should be rejected.";
1167
1168 codecs[1].SetParam("apt", kVp8Codec.id);
1169 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1170
1171 cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0, 0);
1172 rtx_codec2.SetParam("apt", rtx_codec.id);
1173 codecs.push_back(rtx_codec2);
1174
1175 EXPECT_FALSE(channel_->SetRecvCodecs(codecs)) << "RTX codec with another RTX "
1176 "as associated payload type "
1177 "should be rejected.";
1178}
1179
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001180TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
1181 std::vector<cricket::VideoCodec> codecs;
1182 codecs.push_back(kVp8Codec);
1183 codecs[0].id = 99;
1184 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1185}
1186
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001187TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001188 EXPECT_TRUE(channel_->SetRecvCodecs(engine_.codecs()));
pbos@webrtc.orgccbed3b2014-07-11 13:02:54 +00001189
1190 FakeVideoReceiveStream* stream = AddRecvStream();
1191 webrtc::VideoReceiveStream::Config config = stream->GetConfig();
1192 EXPECT_STREQ(engine_.codecs()[0].name.c_str(), config.codecs[0].plName);
1193 EXPECT_EQ(engine_.codecs()[0].id, config.codecs[0].plType);
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001194}
1195
1196TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
1197 std::vector<VideoCodec> codecs;
1198 codecs.push_back(kVp8Codec);
1199 codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30, 0));
1200 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1201}
1202
1203// TODO(pbos): Enable VP9 through external codec support
1204TEST_F(WebRtcVideoChannel2Test,
1205 DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
1206 std::vector<VideoCodec> codecs;
1207 codecs.push_back(kVp8Codec);
1208 codecs.push_back(kVp9Codec);
1209 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1210}
1211
1212TEST_F(WebRtcVideoChannel2Test,
1213 DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
1214 std::vector<VideoCodec> codecs;
1215 codecs.push_back(kVp8Codec);
1216 codecs.push_back(kVp9Codec);
1217 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1218 FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
1219}
1220
pbos@webrtc.org269605c2014-06-26 08:49:03 +00001221TEST_F(WebRtcVideoChannel2Test, DISABLED_SetRecvCodecsWithoutFecDisablesFec) {
1222 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1223}
1224
pbos@webrtc.orgb5a22b12014-05-13 11:07:01 +00001225TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
1226 std::vector<VideoCodec> codecs;
1227 codecs.push_back(kVp8Codec);
1228 codecs.push_back(kRedCodec);
1229 codecs[1].id = codecs[0].id;
1230 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1231}
1232
1233TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
1234 std::vector<VideoCodec> codecs;
1235 codecs.push_back(kVp8Codec);
1236 codecs.push_back(kVp9Codec);
1237 codecs[1].id = codecs[0].id;
1238 EXPECT_FALSE(channel_->SetRecvCodecs(codecs));
1239}
1240
1241TEST_F(WebRtcVideoChannel2Test,
1242 SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
1243 std::vector<VideoCodec> codecs;
1244 codecs.push_back(kVp8Codec);
1245 codecs.push_back(kVp8Codec);
1246 codecs[1].id += 1;
1247 EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
1248}
1249
1250TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
1251 EXPECT_FALSE(AddSendStream()->IsSending());
1252}
1253
1254TEST_F(WebRtcVideoChannel2Test, DISABLED_ReceiveStreamReceivingByDefault) {
1255 // Is this test correct though? Auto-receive? Enable receive on first packet?
1256 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1257}
1258
1259TEST_F(WebRtcVideoChannel2Test, SetSend) {
1260 AddSendStream();
1261 EXPECT_FALSE(channel_->SetSend(true))
1262 << "Channel should not start without codecs.";
1263 EXPECT_TRUE(channel_->SetSend(false))
1264 << "Channel should be stoppable even without set codecs.";
1265
1266 std::vector<cricket::VideoCodec> codecs;
1267 codecs.push_back(kVp8Codec);
1268 channel_->SetSendCodecs(codecs);
1269 std::vector<FakeVideoSendStream*> streams = GetFakeSendStreams();
1270 ASSERT_EQ(1u, streams.size());
1271 FakeVideoSendStream* stream = streams.back();
1272
1273 EXPECT_FALSE(stream->IsSending());
1274
1275 // false->true
1276 EXPECT_TRUE(channel_->SetSend(true));
1277 EXPECT_TRUE(stream->IsSending());
1278 // true->true
1279 EXPECT_TRUE(channel_->SetSend(true));
1280 EXPECT_TRUE(stream->IsSending());
1281 // true->false
1282 EXPECT_TRUE(channel_->SetSend(false));
1283 EXPECT_FALSE(stream->IsSending());
1284 // false->false
1285 EXPECT_TRUE(channel_->SetSend(false));
1286 EXPECT_FALSE(stream->IsSending());
1287
1288 EXPECT_TRUE(channel_->SetSend(true));
1289 FakeVideoSendStream* new_stream = AddSendStream();
1290 EXPECT_TRUE(new_stream->IsSending())
1291 << "Send stream created after SetSend(true) not sending initially.";
1292}
1293
1294TEST_F(WebRtcVideoChannel2Test, DISABLED_SendAndReceiveVp8Vga) {
1295 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1296}
1297
1298TEST_F(WebRtcVideoChannel2Test, DISABLED_SendAndReceiveVp8Qvga) {
1299 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1300}
1301
1302TEST_F(WebRtcVideoChannel2Test, DISABLED_SendAndReceiveH264SvcQqvga) {
1303 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1304}
1305
1306TEST_F(WebRtcVideoChannel2Test, DISABLED_SendManyResizeOnce) {
1307 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1308}
1309
1310TEST_F(WebRtcVideoChannel2Test, DISABLED_SendVp8HdAndReceiveAdaptedVp8Vga) {
1311 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1312}
1313
1314TEST_F(WebRtcVideoChannel2Test, DISABLED_TestSetDscpOptions) {
1315 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1316}
1317
1318TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithMaxBitrate) {
1319 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1320}
1321
1322TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsWithLoweredBitrate) {
1323 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1324}
1325
1326TEST_F(WebRtcVideoChannel2Test, DISABLED_SetOptionsSucceedsWhenSending) {
1327 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1328}
1329
1330TEST_F(WebRtcVideoChannel2Test, DISABLED_ResetCodecOnScreencast) {
1331 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1332}
1333
1334TEST_F(WebRtcVideoChannel2Test, DISABLED_DontResetCodecOnSendFrame) {
1335 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1336}
1337
1338TEST_F(WebRtcVideoChannel2Test,
1339 DISABLED_DontRegisterDecoderIfFactoryIsNotGiven) {
1340 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1341}
1342
1343TEST_F(WebRtcVideoChannel2Test, DISABLED_RegisterDecoderIfFactoryIsGiven) {
1344 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1345}
1346
1347TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterDecoderMultipleTimes) {
1348 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1349}
1350
1351TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterDecoderForNonVP8) {
1352 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1353}
1354
1355TEST_F(WebRtcVideoChannel2Test,
1356 DISABLED_DontRegisterEncoderIfFactoryIsNotGiven) {
1357 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1358}
1359
1360TEST_F(WebRtcVideoChannel2Test, DISABLED_RegisterEncoderIfFactoryIsGiven) {
1361 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1362}
1363
1364TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterEncoderMultipleTimes) {
1365 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1366}
1367
1368TEST_F(WebRtcVideoChannel2Test,
1369 DISABLED_RegisterEncoderWithMultipleSendStreams) {
1370 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1371}
1372
1373TEST_F(WebRtcVideoChannel2Test, DISABLED_DontRegisterEncoderForNonVP8) {
1374 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1375}
1376
1377TEST_F(WebRtcVideoChannel2Test, DISABLED_FeedbackParamsForNonVP8) {
1378 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1379}
1380
1381TEST_F(WebRtcVideoChannel2Test, DISABLED_ExternalCodecAddedToTheEnd) {
1382 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1383}
1384
1385TEST_F(WebRtcVideoChannel2Test, DISABLED_ExternalCodecIgnored) {
1386 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1387}
1388
1389TEST_F(WebRtcVideoChannel2Test, DISABLED_UpdateEncoderCodecsAfterSetFactory) {
1390 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1391}
1392
1393TEST_F(WebRtcVideoChannel2Test, DISABLED_OnReadyToSend) {
1394 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1395}
1396
1397TEST_F(WebRtcVideoChannel2Test, DISABLED_CaptureFrameTimestampToNtpTimestamp) {
1398 FAIL() << "Not implemented."; // TODO(pbos): Implement.
1399}
1400} // namespace cricket