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
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <iostream>  // NOLINT
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/common_types.h"
14281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/include/vie_base.h"
15281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/include/vie_capture.h"
16281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/include/vie_codec.h"
17281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/include/vie_network.h"
18281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/include/vie_render.h"
19281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/include/vie_rtp_rtcp.h"
20281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h"
21281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
22281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/tb_external_transport.h"
23281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/voice_engine/include/voe_base.h"
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum RelayMode {
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kRelayOneStream = 1,
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kRelayAllStreams = 2
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define VCM_RED_PAYLOAD_TYPE        96
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define VCM_ULPFEC_PAYLOAD_TYPE     97
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconst int kNumStreams = 3;
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid InitialSingleStreamSettings(webrtc::VideoCodec* video_codec) {
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->numberOfSimulcastStreams = 0;
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->width = 1200;
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->height = 800;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetSimulcastSettings(webrtc::VideoCodec* video_codec) {
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->width = 1280;
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->height = 720;
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Simulcast settings.
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->numberOfSimulcastStreams = kNumStreams;
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[0].width = 320;
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[0].height = 180;
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[0].numberOfTemporalLayers = 0;
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[0].maxBitrate = 100;
51e1198e6a143b46430fc999b074fa59c10e991863marpan@webrtc.org  video_codec->simulcastStream[0].targetBitrate = 100;
52e1198e6a143b46430fc999b074fa59c10e991863marpan@webrtc.org  video_codec->simulcastStream[0].minBitrate = 0;
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[0].qpMax = video_codec->qpMax;
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[1].width = 640;
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[1].height = 360;
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[1].numberOfTemporalLayers = 0;
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[1].maxBitrate = 500;
59e1198e6a143b46430fc999b074fa59c10e991863marpan@webrtc.org  video_codec->simulcastStream[1].targetBitrate = 500;
60e1198e6a143b46430fc999b074fa59c10e991863marpan@webrtc.org  video_codec->simulcastStream[1].minBitrate = 200;
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[1].qpMax = video_codec->qpMax;
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[2].width = 1280;
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[2].height = 720;
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[2].numberOfTemporalLayers = 0;
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[2].maxBitrate = 1200;
67e1198e6a143b46430fc999b074fa59c10e991863marpan@webrtc.org  video_codec->simulcastStream[2].targetBitrate = 1200;
68e1198e6a143b46430fc999b074fa59c10e991863marpan@webrtc.org  video_codec->simulcastStream[2].minBitrate = 900;
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[2].qpMax = video_codec->qpMax;
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid RuntimeSingleStreamSettings(webrtc::VideoCodec* video_codec) {
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  SetSimulcastSettings(video_codec);
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->width = 1200;
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->height = 800;
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->numberOfSimulcastStreams = kNumStreams;
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[0].maxBitrate = 0;
78e1198e6a143b46430fc999b074fa59c10e991863marpan@webrtc.org  video_codec->simulcastStream[0].targetBitrate = 0;
79e1198e6a143b46430fc999b074fa59c10e991863marpan@webrtc.org  video_codec->simulcastStream[0].minBitrate = 0;
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[1].maxBitrate = 0;
81e1198e6a143b46430fc999b074fa59c10e991863marpan@webrtc.org  video_codec->simulcastStream[1].targetBitrate = 0;
82e1198e6a143b46430fc999b074fa59c10e991863marpan@webrtc.org  video_codec->simulcastStream[1].minBitrate = 0;
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->simulcastStream[2].maxBitrate = 0;
84e1198e6a143b46430fc999b074fa59c10e991863marpan@webrtc.org  video_codec->simulcastStream[2].targetBitrate = 0;
85e1198e6a143b46430fc999b074fa59c10e991863marpan@webrtc.org  video_codec->simulcastStream[2].minBitrate = 0;
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoEngineSimulcastTest(void* window1, void* window2) {
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // *******************************************************
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  //  Begin create/initialize Video Engine for testing
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // *******************************************************
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int error = 0;
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int receive_channels[kNumStreams];
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Create a VideoEngine instance.
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::VideoEngine* video_engine = NULL;
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_engine = webrtc::VideoEngine::Create();
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (video_engine == NULL) {
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in VideoEngine::Create\n");
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = video_engine->SetTraceFilter(webrtc::kTraceAll);
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in VideoEngine::SetTraceLevel\n");
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string trace_file =
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViETest::GetResultOutputPath() + "ViESimulcast_trace.txt";
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = video_engine->SetTraceFile(trace_file.c_str());
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in VideoEngine::SetTraceFile\n");
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Init VideoEngine and create a channel.
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::ViEBase* vie_base = webrtc::ViEBase::GetInterface(video_engine);
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_base == NULL) {
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViEBase::GetInterface\n");
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_base->Init();
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViEBase::Init\n");
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  RelayMode relay_mode = kRelayOneStream;
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("Select relay mode:\n");
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("\t1. Relay one stream\n");
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("\t2. Relay all streams\n");
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (scanf("%d", reinterpret_cast<int*>(&relay_mode)) != 1) {
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("Error in scanf()\n");
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  getchar();
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::ViERTP_RTCP* vie_rtp_rtcp =
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      webrtc::ViERTP_RTCP::GetInterface(video_engine);
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_rtp_rtcp == NULL) {
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERTP_RTCP::GetInterface\n");
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int video_channel = -1;
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_base->CreateChannel(video_channel);
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViEBase::CreateChannel\n");
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < kNumStreams; ++i) {
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    receive_channels[i] = -1;
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->CreateReceiveChannel(receive_channels[i], video_channel);
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (error == -1) {
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      printf("ERROR in ViEBase::CreateChannel\n");
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // List available capture devices, allocate and connect.
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::ViECapture* vie_capture =
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      webrtc::ViECapture::GetInterface(video_engine);
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_base == NULL) {
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViECapture::GetInterface\n");
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const unsigned int KMaxDeviceNameLength = 128;
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const unsigned int KMaxUniqueIdLength = 256;
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char device_name[KMaxDeviceNameLength];
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  memset(device_name, 0, KMaxDeviceNameLength);
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char unique_id[KMaxUniqueIdLength];
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  memset(unique_id, 0, KMaxUniqueIdLength);
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("Available capture devices:\n");
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int capture_idx = 0;
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (capture_idx = 0; capture_idx < vie_capture->NumberOfCaptureDevices();
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org       capture_idx++) {
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memset(device_name, 0, KMaxDeviceNameLength);
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memset(unique_id, 0, KMaxUniqueIdLength);
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_capture->GetCaptureDevice(capture_idx, device_name,
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          KMaxDeviceNameLength, unique_id,
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          KMaxUniqueIdLength);
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (error == -1) {
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      printf("ERROR in ViECapture::GetCaptureDevice\n");
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("\t %d. %s\n", capture_idx + 1, device_name);
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("\nChoose capture device: ");
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ANDROID
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  capture_idx = 0;
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("0\n");
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (scanf("%d", &capture_idx) != 1) {
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("Error in scanf()\n");
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  getchar();
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Compensate for idx start at 1.
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  capture_idx = capture_idx - 1;
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_capture->GetCaptureDevice(capture_idx, device_name,
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        KMaxDeviceNameLength, unique_id,
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        KMaxUniqueIdLength);
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViECapture::GetCaptureDevice\n");
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int capture_id = 0;
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_capture->AllocateCaptureDevice(unique_id, KMaxUniqueIdLength,
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             capture_id);
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViECapture::AllocateCaptureDevice\n");
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_capture->ConnectCaptureDevice(capture_id, video_channel);
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViECapture::ConnectCaptureDevice\n");
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_capture->StartCapture(capture_id);
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViECapture::StartCapture\n");
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // RTP/RTCP settings.
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_rtp_rtcp->SetRTCPStatus(video_channel,
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      webrtc::kRtcpCompound_RFC4585);
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERTP_RTCP::SetRTCPStatus\n");
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  vie_rtp_rtcp->SetRembStatus(video_channel, true, false);
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERTP_RTCP::SetRTCPStatus\n");
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_rtp_rtcp->SetKeyFrameRequestMethod(
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            video_channel, webrtc::kViEKeyFrameRequestPliRtcp);
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERTP_RTCP::SetKeyFrameRequestMethod\n");
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < kNumStreams; ++i) {
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_rtp_rtcp->SetRTCPStatus(receive_channels[i],
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        webrtc::kRtcpCompound_RFC4585);
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (error == -1) {
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      printf("ERROR in ViERTP_RTCP::SetRTCPStatus\n");
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    vie_rtp_rtcp->SetRembStatus(receive_channels[i], false, true);
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (error == -1) {
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      printf("ERROR in ViERTP_RTCP::SetRTCPStatus\n");
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_rtp_rtcp->SetKeyFrameRequestMethod(
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        receive_channels[i], webrtc::kViEKeyFrameRequestPliRtcp);
273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (error == -1) {
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      printf("ERROR in ViERTP_RTCP::SetKeyFrameRequestMethod\n");
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Set up rendering.
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::ViERender* vie_render = webrtc::ViERender::GetInterface(video_engine);
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_render == NULL) {
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERender::GetInterface\n");
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_render->AddRenderer(capture_id, window1, 0, 0.0, 0.0, 1.0, 1.0);
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERender::AddRenderer\n");
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_render->StartRender(capture_id);
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERender::StartRender\n");
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Only rendering the thumbnail.
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int channel_to_render = video_channel;
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (relay_mode == kRelayAllStreams) {
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    channel_to_render = receive_channels[0];
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_render->AddRenderer(channel_to_render, window2, 1, 0.0, 0.0, 1.0,
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                  1.0);
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERender::AddRenderer\n");
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_render->StartRender(channel_to_render);
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERender::StartRender\n");
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Setup codecs.
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::ViECodec* vie_codec = webrtc::ViECodec::GetInterface(video_engine);
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_codec == NULL) {
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViECodec::GetInterface\n");
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Check available codecs and prepare receive codecs.
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("\nAvailable codecs:\n");
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::VideoCodec video_codec;
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  memset(&video_codec, 0, sizeof(webrtc::VideoCodec));
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int codec_idx = 0;
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (codec_idx = 0; codec_idx < vie_codec->NumberOfCodecs(); codec_idx++) {
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_codec->GetCodec(codec_idx, video_codec);
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (error == -1) {
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      printf("ERROR in ViECodec::GetCodec\n");
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Try to keep the test frame size small when I420.
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (video_codec.codecType != webrtc::kVideoCodecVP8) {
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      continue;
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (int i = 0; i < kNumStreams; ++i) {
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      error = vie_codec->SetReceiveCodec(receive_channels[i], video_codec);
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (error == -1) {
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        printf("ERROR in ViECodec::SetReceiveCodec\n");
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (video_codec.codecType != webrtc::kVideoCodecRED &&
346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        video_codec.codecType != webrtc::kVideoCodecULPFEC) {
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      printf("\t %d. %s\n", codec_idx + 1, video_codec.plName);
348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    break;
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_codec->GetCodec(codec_idx, video_codec);
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViECodec::GetCodec\n");
354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool simulcast_mode = true;
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int num_streams = 1;
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Set spatial resolution option.
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (simulcast_mode) {
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetSimulcastSettings(&video_codec);
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    num_streams = video_codec.numberOfSimulcastStreams;
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  } else {
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    InitialSingleStreamSettings(&video_codec);
365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    num_streams = 1;
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Set start bit rate.
3690425392858172d13eb65a1143a12c2787cea4b1bandresp@webrtc.org  std::string str;
370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << std::endl;
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "Choose start rate (in kbps). Press enter for default:  ";
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::getline(std::cin, str);
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int start_rate = atoi(str.c_str());
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (start_rate != 0) {
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    video_codec.startBitrate = start_rate;
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_codec->SetSendCodec(video_channel, video_codec);
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViECodec::SetSendCodec\n");
381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Address settings.
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::ViENetwork* vie_network =
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      webrtc::ViENetwork::GetInterface(video_engine);
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_network == NULL) {
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViENetwork::GetInterface\n");
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TbExternalTransport::SsrcChannelMap ssrc_channel_map;
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int idx = 0; idx < num_streams; idx++) {
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_rtp_rtcp->SetLocalSSRC(video_channel, idx + 1,  // SSRC
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                       webrtc::kViEStreamTypeNormal, idx);
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ssrc_channel_map[idx + 1] = receive_channels[idx];
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (error == -1) {
398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      printf("ERROR in ViERTP_RTCP::SetLocalSSRC(idx:%d)\n",
399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             idx);
400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TbExternalTransport::SsrcChannelMap* channel_map = &ssrc_channel_map;
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (relay_mode == kRelayOneStream) {
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    channel_map = NULL;
407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Setting External transport.
410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TbExternalTransport ext_transport(*vie_network, video_channel, channel_map);
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_network->RegisterSendTransport(video_channel, ext_transport);
413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViECodec::RegisterSendTransport \n");
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < kNumStreams; ++i) {
419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_network->RegisterSendTransport(receive_channels[i],
420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                               ext_transport);
421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (error == -1) {
422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      printf("ERROR in ViECodec::RegisterSendTransport \n");
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
427137ed6cceec64fbed8ac72fcbbf44b6e2bb15fa5stefan@webrtc.org  // Set network one-way delay value.
428067911cd4083bf5ac168baf7487cf3b16dc221b6mikhal@webrtc.org  // 10 ms one-way delay.
429067911cd4083bf5ac168baf7487cf3b16dc221b6mikhal@webrtc.org  NetworkParameters network;
430067911cd4083bf5ac168baf7487cf3b16dc221b6mikhal@webrtc.org  network.loss_model = kUniformLoss;
431067911cd4083bf5ac168baf7487cf3b16dc221b6mikhal@webrtc.org  network.mean_one_way_delay = 10;
432137ed6cceec64fbed8ac72fcbbf44b6e2bb15fa5stefan@webrtc.org  ext_transport.SetNetworkParameters(network);
433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (relay_mode == kRelayOneStream) {
435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ext_transport.SetSSRCFilter(num_streams);
436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_base->StartSend(video_channel);
439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViENetwork::StartSend\n");
441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_base->StartReceive(video_channel);
444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViENetwork::StartReceive\n");
446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < kNumStreams; ++i) {
450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->StartReceive(receive_channels[i]);
451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (error == -1) {
452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      printf("ERROR in ViENetwork::StartReceive\n");
453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Create a receive channel to verify that it doesn't mess up toggling
458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // between single stream and simulcast.
459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int video_channel2 = -1;
460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_base->CreateReceiveChannel(video_channel2, video_channel);
461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViEBase::CreateReceiveChannel\n");
463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // *******************************************************
467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  //  Engine started
468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // *******************************************************
469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  printf("\nSimulcast call started\n\n");
471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  do {
472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("Enter new SSRC filter 1,2 or 3\n");
473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("... or 0 to switch between simulcast and a single stream\n");
474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("Press enter to stop...");
475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    str.clear();
476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::getline(std::cin, str);
477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!str.empty()) {
478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      int ssrc = atoi(str.c_str());
479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (ssrc == 0) {
480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // Toggle between simulcast and a single stream with different
481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        // resolution.
482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (simulcast_mode) {
483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          RuntimeSingleStreamSettings(&video_codec);
484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          num_streams = 1;
485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          printf("Disabling simulcast\n");
486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        } else {
487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          SetSimulcastSettings(&video_codec);
488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          num_streams = video_codec.numberOfSimulcastStreams;
489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          printf("Enabling simulcast\n");
490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        simulcast_mode = !simulcast_mode;
492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (vie_codec->SetSendCodec(video_channel, video_codec) != 0) {
493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          printf("ERROR switching between simulcast and single stream\n");
494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          return -1;
495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        for (int idx = 0; idx < num_streams; idx++) {
497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_rtp_rtcp->SetLocalSSRC(video_channel, idx + 1,  // SSRC
498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             webrtc::kViEStreamTypeNormal, idx);
499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          if (error == -1) {
500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            printf("ERROR in ViERTP_RTCP::SetLocalSSRC(idx:%d)\n", idx);
501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return -1;
502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (relay_mode == kRelayOneStream) {
505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          ext_transport.SetSSRCFilter(num_streams);
506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      } else if (ssrc > 0 && ssrc < 4) {
508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (relay_mode == kRelayOneStream) {
509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          ext_transport.SetSSRCFilter(ssrc);
510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      } else {
512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        printf("Invalid SSRC\n");
513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else {
515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  } while (true);
518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // *******************************************************
520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  //  Testing finished. Tear down Video Engine
521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // *******************************************************
522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_base->DeleteChannel(video_channel2);
523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViEBase::DeleteChannel\n");
525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < kNumStreams; ++i) {
529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->StopReceive(receive_channels[i]);
530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (error == -1) {
531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      printf("ERROR in ViEBase::StopReceive\n");
532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_base->StopReceive(video_channel);
537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViEBase::StopReceive\n");
539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_base->StopSend(video_channel);
543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViEBase::StopSend\n");
545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_render->StopRender(capture_id);
549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERender::StopRender\n");
551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_render->RemoveRenderer(capture_id);
555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERender::RemoveRenderer\n");
557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_render->StopRender(channel_to_render);
561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERender::StopRender\n");
563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_render->RemoveRenderer(channel_to_render);
567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViERender::RemoveRenderer\n");
569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_capture->StopCapture(capture_id);
573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViECapture::StopCapture\n");
575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_capture->DisconnectCaptureDevice(video_channel);
579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViECapture::DisconnectCaptureDevice\n");
581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_capture->ReleaseCaptureDevice(capture_id);
585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViECapture::ReleaseCaptureDevice\n");
587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < kNumStreams; ++i) {
591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->DeleteChannel(receive_channels[i]);
592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (error == -1) {
593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      printf("ERROR in ViEBase::DeleteChannel\n");
594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_base->DeleteChannel(video_channel);
599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (error == -1) {
600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in ViEBase::DeleteChannel\n");
601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int remaining_interfaces = 0;
605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  remaining_interfaces = vie_codec->Release();
606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  remaining_interfaces += vie_capture->Release();
607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  remaining_interfaces += vie_rtp_rtcp->Release();
608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  remaining_interfaces += vie_render->Release();
609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  remaining_interfaces += vie_network->Release();
610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  remaining_interfaces += vie_base->Release();
611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (remaining_interfaces > 0) {
612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR: Could not release all interfaces\n");
613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool deleted = webrtc::VideoEngine::Delete(video_engine);
617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (deleted == false) {
618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("ERROR in VideoEngine::Delete\n");
619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViEAutoTest::ViESimulcastCall() {
625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViETest::Log(" ");
626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViETest::Log("========================================");
627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViETest::Log(" ViE Autotest Simulcast Call\n");
628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (VideoEngineSimulcastTest(_window1, _window2) == 0) {
630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViETest::Log(" ");
631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViETest::Log(" ViE Autotest Simulcast Call Done");
632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViETest::Log("========================================");
633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViETest::Log(" ");
634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViETest::Log(" ");
638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViETest::Log(" ViE Autotest Simulcast Call Failed");
639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViETest::Log("========================================");
640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViETest::Log(" ");
641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 1;
642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
643