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