1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/tb_video_channel.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
14c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/test/channel_transport/include/channel_transport.h"
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTbVideoChannel::TbVideoChannel(TbInterfaces& Engine,
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               webrtc::VideoCodecType sendCodec, int width,
18c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org                               int height, int frameRate, int startBitrate)
19c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    : videoChannel(-1),
20c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org      ViE(Engine) {
21c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  EXPECT_EQ(0, ViE.base->CreateChannel(videoChannel));
22c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  channel_transport_.reset(new webrtc::test::VideoChannelTransport(
23c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org      ViE.network, videoChannel));
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
25c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  webrtc::VideoCodec videoCodec;
26c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  memset(&videoCodec, 0, sizeof(webrtc::VideoCodec));
27c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  bool sendCodecSet = false;
28c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  for (int idx = 0; idx < ViE.codec->NumberOfCodecs(); idx++) {
29c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    EXPECT_EQ(0, ViE.codec->GetCodec(idx, videoCodec));
30c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    videoCodec.width = width;
31c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    videoCodec.height = height;
32c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    videoCodec.maxFramerate = frameRate;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
34c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    if (videoCodec.codecType == sendCodec && sendCodecSet == false) {
35c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org      if (videoCodec.codecType != webrtc::kVideoCodecI420) {
36c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org        videoCodec.startBitrate = startBitrate;
37c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org        videoCodec.maxBitrate = startBitrate * 3;
38c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org      }
39c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org      EXPECT_EQ(0, ViE.codec->SetSendCodec(videoChannel, videoCodec));
40c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org      sendCodecSet = true;
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
42c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    if (videoCodec.codecType == webrtc::kVideoCodecVP8) {
43c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org      videoCodec.width = 352;
44c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org      videoCodec.height = 288;
45c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    }
46c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    EXPECT_EQ(0, ViE.codec->SetReceiveCodec(videoChannel, videoCodec));
47c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  }
48c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  EXPECT_TRUE(sendCodecSet);
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
51c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.orgTbVideoChannel::~TbVideoChannel() {
52c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  EXPECT_EQ(0, ViE.base->DeleteChannel(videoChannel));
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.orgvoid TbVideoChannel::StartSend(const unsigned short rtp_port,
56c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org                               const char* ip_address) {
57c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  EXPECT_EQ(0, channel_transport_->SetSendDestination(ip_address, rtp_port));
58c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  EXPECT_EQ(0, ViE.base->StartSend(videoChannel));
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.orgvoid TbVideoChannel::SetFrameSettings(int width, int height, int frameRate) {
62c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  webrtc::VideoCodec videoCodec;
63c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  EXPECT_EQ(0, ViE.codec->GetSendCodec(videoChannel, videoCodec));
64c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  videoCodec.width = width;
65c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  videoCodec.height = height;
66c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  videoCodec.maxFramerate = frameRate;
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
68c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  EXPECT_EQ(0, ViE.codec->SetSendCodec(videoChannel, videoCodec));
69c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  EXPECT_EQ(0, ViE.codec->SetReceiveCodec(videoChannel, videoCodec));
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
72c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.orgvoid TbVideoChannel::StopSend() {
73c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  EXPECT_EQ(0, ViE.base->StopSend(videoChannel));
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
76c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.orgvoid TbVideoChannel::StartReceive(unsigned short rtp_port) {
77c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  EXPECT_EQ(0, channel_transport_->SetLocalReceiver(rtp_port));
78c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  EXPECT_EQ(0, ViE.base->StartReceive(videoChannel));
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
81c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.orgvoid TbVideoChannel::StopReceive() {
82c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  EXPECT_EQ(0, ViE.base->StopReceive(videoChannel));
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
84