1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2011 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// 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// vie_autotest_loopback.cc 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This code is also used as sample code for ViE 3.0 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// =================================================================== 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// BEGIN: VideoEngine 3.0 Sample Code 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <iostream> 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 24e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/common_types.h" 25e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" 26281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 27281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/test/channel_transport/include/channel_transport.h" 28e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/video_engine/include/vie_base.h" 29e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/video_engine/include/vie_capture.h" 30e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/video_engine/include/vie_codec.h" 31e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/video_engine/include/vie_external_codec.h" 32e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/video_engine/include/vie_network.h" 33e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/video_engine/include/vie_render.h" 34e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/video_engine/include/vie_rtp_rtcp.h" 35e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h" 36e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h" 37e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/tb_external_transport.h" 38e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org#include "webrtc/voice_engine/include/voe_base.h" 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 40db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.orgconst uint32_t kSsrc = 0x01234567; 41db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.orgconst uint32_t kRtxSsrc = 0x01234568; 42db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.orgconst int kRtxPayloadType = 98; 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define VCM_RED_PAYLOAD_TYPE 96 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define VCM_ULPFEC_PAYLOAD_TYPE 97 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 469b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.orgint VideoEngineSampleCode(void* window1, void* window2) 479b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org{ 489b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org //******************************************************** 499b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Begin create/initialize Video Engine for testing 509b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org //******************************************************** 519b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 529b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org int error = 0; 539b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 549b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 559b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Create a VideoEngine instance 569b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 579b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::VideoEngine* ptrViE = NULL; 589b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ptrViE = webrtc::VideoEngine::Create(); 599b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (ptrViE == NULL) 609b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 619b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in VideoEngine::Create\n"); 629b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 639b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 649b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 659b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViE->SetTraceFilter(webrtc::kTraceAll); 669b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 679b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 689b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in VideoEngine::SetTraceFilter\n"); 699b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 709b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 719b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 729b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org std::string trace_file = 739b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ViETest::GetResultOutputPath() + "ViELoopbackCall_trace.txt"; 749b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViE->SetTraceFile(trace_file.c_str()); 759b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 769b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 779b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in VideoEngine::SetTraceFile\n"); 789b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 799b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 809b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 819b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 829b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Init VideoEngine and create a channel 839b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 849b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::ViEBase* ptrViEBase = webrtc::ViEBase::GetInterface(ptrViE); 859b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (ptrViEBase == NULL) 869b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 879b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViEBase::GetInterface\n"); 889b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 899b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 909b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 919b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViEBase->Init(); 929b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 939b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 949b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViEBase::Init\n"); 959b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 969b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 979b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 989b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::ViERTP_RTCP* ptrViERtpRtcp = 999b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::ViERTP_RTCP::GetInterface(ptrViE); 1009b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (ptrViERtpRtcp == NULL) 1019b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 1029b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERTP_RTCP::GetInterface\n"); 1039b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 1049b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 1059b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 1069b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org int videoChannel = -1; 1079b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViEBase->CreateChannel(videoChannel); 1089b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 1099b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 1109b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViEBase::CreateChannel\n"); 1119b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 1129b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 1139b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 1149b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 1159b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // List available capture devices, allocate and connect. 1169b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 1179b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::ViECapture* ptrViECapture = 1189b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::ViECapture::GetInterface(ptrViE); 1199b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (ptrViEBase == NULL) 1209b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 1219b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECapture::GetInterface\n"); 1229b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 1239b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 1249b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 1259b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org const unsigned int KMaxDeviceNameLength = 128; 1269b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org const unsigned int KMaxUniqueIdLength = 256; 1279b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org char deviceName[KMaxDeviceNameLength]; 1289b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org memset(deviceName, 0, KMaxDeviceNameLength); 1299b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org char uniqueId[KMaxUniqueIdLength]; 1309b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org memset(uniqueId, 0, KMaxUniqueIdLength); 1319b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Available capture devices:\n"); 1339b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org int captureIdx = 0; 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (captureIdx = 0; 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org captureIdx < ptrViECapture->NumberOfCaptureDevices(); 1369b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org captureIdx++) 1379b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 1389b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org memset(deviceName, 0, KMaxDeviceNameLength); 1399b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org memset(uniqueId, 0, KMaxUniqueIdLength); 1409b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 1419b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECapture->GetCaptureDevice(captureIdx, deviceName, 1429b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org KMaxDeviceNameLength, uniqueId, 1439b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org KMaxUniqueIdLength); 1449b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 1459b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 1469b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECapture::GetCaptureDevice\n"); 1479b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 1489b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 1499b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("\t %d. %s\n", captureIdx + 1, deviceName); 150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("\nChoose capture device: "); 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ANDROID 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org captureIdx = 0; 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("0\n"); 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 1569b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (scanf("%d", &captureIdx) != 1) 1579b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 1589b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("Error in scanf()\n"); 1599b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org getchar(); 1629b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org captureIdx = captureIdx - 1; // Compensate for idx start at 1. 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 1649b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECapture->GetCaptureDevice(captureIdx, deviceName, 1659b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org KMaxDeviceNameLength, uniqueId, 1669b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org KMaxUniqueIdLength); 1679b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 1689b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 1699b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECapture::GetCaptureDevice\n"); 170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 1719b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1739b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org int captureId = 0; 1749b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECapture->AllocateCaptureDevice(uniqueId, KMaxUniqueIdLength, 1759b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org captureId); 1769b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 1779b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 1789b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECapture::AllocateCaptureDevice\n"); 1799b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 1809b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1829b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECapture->ConnectCaptureDevice(captureId, videoChannel); 1839b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 1849b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 1859b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECapture::ConnectCaptureDevice\n"); 1869b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 1879b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 1889b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 1899b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECapture->StartCapture(captureId); 1909b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 1919b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 1929b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECapture::StartCapture\n"); 1939b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 1949b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 1959b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 1969b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 1979b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // RTP/RTCP settings 1989b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 1999b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 2009b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERtpRtcp->SetRTCPStatus(videoChannel, 2019b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::kRtcpCompound_RFC4585); 2029b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 2039b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 2049b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERTP_RTCP::SetRTCPStatus\n"); 2059b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 2069b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 2079b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 2089b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERtpRtcp->SetKeyFrameRequestMethod( 2099b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoChannel, webrtc::kViEKeyFrameRequestPliRtcp); 2109b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 2119b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 2129b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERTP_RTCP::SetKeyFrameRequestMethod\n"); 2139b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 2149b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 2159b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 2169b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERtpRtcp->SetRembStatus(videoChannel, true, true); 2179b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 2189b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 2199b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERTP_RTCP::SetTMMBRStatus\n"); 2209b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 2219b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 2229b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 2239b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Setting SSRC manually (arbitrary value), as otherwise we will get a clash 2249b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // (loopback), and a new SSRC will be set, which will reset the receiver. 225db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org error = ptrViERtpRtcp->SetLocalSSRC(videoChannel, kSsrc); 226db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org if (error == -1) { 227db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org printf("ERROR in ViERTP_RTCP::SetLocalSSRC\n"); 228db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org return -1; 2299b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 2309b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 231db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org error = ptrViERtpRtcp->SetLocalSSRC(videoChannel, kRtxSsrc, 232db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org webrtc::kViEStreamTypeRtx, 0); 233db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org if (error == -1) { 234db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org printf("ERROR in ViERTP_RTCP::SetLocalSSRC\n"); 235db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org return -1; 236db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org } 237db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org 238db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org error = ptrViERtpRtcp->SetRemoteSSRCType(videoChannel, 239db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org webrtc::kViEStreamTypeRtx, 240db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org kRtxSsrc); 241db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org 242db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org if (error == -1) { 243db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org printf("ERROR in ViERTP_RTCP::SetRtxReceivePayloadType\n"); 244db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org return -1; 245db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org } 246db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org 247db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org error = ptrViERtpRtcp->SetRtxSendPayloadType(videoChannel, kRtxPayloadType); 248db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org if (error == -1) { 249db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org printf("ERROR in ViERTP_RTCP::SetRtxSendPayloadType\n"); 250db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org return -1; 251db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org } 252db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org 253db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org error = ptrViERtpRtcp->SetRtxReceivePayloadType(videoChannel, 254db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org kRtxPayloadType); 255db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org if (error == -1) { 256db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org printf("ERROR in ViERTP_RTCP::SetRtxReceivePayloadType\n"); 257db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org return -1; 258db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org } 2599b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 2609b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Set up rendering 2619b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 2629b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::ViERender* ptrViERender = webrtc::ViERender::GetInterface(ptrViE); 263db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org if (ptrViERender == NULL) { 264db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org printf("ERROR in ViERender::GetInterface\n"); 265db74c61ddfa26c23d3e392b241c983010e10b1c5stefan@webrtc.org return -1; 2669b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 2679b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 2689b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error 2699b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org = ptrViERender->AddRenderer(captureId, window1, 0, 0.0, 0.0, 1.0, 1.0); 2709b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 2719b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 2729b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERender::AddRenderer\n"); 2739b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 2749b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 2759b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 2769b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERender->StartRender(captureId); 2779b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 2789b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 2799b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERender::StartRender\n"); 2809b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 2819b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 2829b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 2839b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERender->AddRenderer(videoChannel, window2, 1, 0.0, 0.0, 1.0, 2849b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 1.0); 2859b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 2869b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 2879b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERender::AddRenderer\n"); 2889b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 2899b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 2909b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 2919b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERender->StartRender(videoChannel); 2929b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 2939b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 2949b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERender::StartRender\n"); 2959b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 2969b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 2979b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 2989b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 2999b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Setup codecs 3009b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 3019b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::ViECodec* ptrViECodec = webrtc::ViECodec::GetInterface(ptrViE); 3029b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (ptrViECodec == NULL) 3039b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 3049b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECodec::GetInterface\n"); 305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 3069b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 3079b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 3089b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Check available codecs and prepare receive codecs 3099b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("\nAvailable codecs:\n"); 3109b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::VideoCodec videoCodec; 3119b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org memset(&videoCodec, 0, sizeof(webrtc::VideoCodec)); 3129b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org int codecIdx = 0; 3139b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org for (codecIdx = 0; codecIdx < ptrViECodec->NumberOfCodecs(); codecIdx++) 3149b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 3159b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECodec->GetCodec(codecIdx, videoCodec); 3169b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 3179b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 3189b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECodec::GetCodec\n"); 3199b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 3209b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 3219b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 3229b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // try to keep the test frame size small when I420 3239b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (videoCodec.codecType == webrtc::kVideoCodecI420) 3249b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 3259b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.width = 176; 3269b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.height = 144; 3279b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 3289b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 3299b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECodec->SetReceiveCodec(videoChannel, videoCodec); 3309b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 3319b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 3329b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECodec::SetReceiveCodec\n"); 3339b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 3349b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 3359b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (videoCodec.codecType != webrtc::kVideoCodecRED 3369b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org && videoCodec.codecType != webrtc::kVideoCodecULPFEC) 3379b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 3389b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("\t %d. %s\n", codecIdx + 1, videoCodec.plName); 3399b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 341e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org printf("%d. VP8 over Generic.\n", ptrViECodec->NumberOfCodecs() + 1); 342e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org 343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Choose codec: "); 344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ANDROID 345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org codecIdx = 0; 346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("0\n"); 347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 3489b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (scanf("%d", &codecIdx) != 1) 3499b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 3509b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("Error in scanf()\n"); 3519b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org getchar(); 3549b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org codecIdx = codecIdx - 1; // Compensate for idx start at 1. 355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 3569b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // VP8 over generic transport gets this special one. 3579b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (codecIdx == ptrViECodec->NumberOfCodecs()) { 3589b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org for (codecIdx = 0; codecIdx < ptrViECodec->NumberOfCodecs(); ++codecIdx) { 3599b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECodec->GetCodec(codecIdx, videoCodec); 3609b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org assert(error != -1); 3619b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (videoCodec.codecType == webrtc::kVideoCodecVP8) 3629b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org break; 3639b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 3649b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org assert(videoCodec.codecType == webrtc::kVideoCodecVP8); 3659b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.codecType = webrtc::kVideoCodecGeneric; 3669b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 3679b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Any plName should work with generic 3689b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org strcpy(videoCodec.plName, "VP8-GENERIC"); 3699b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org uint8_t pl_type = 127; 3709b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.plType = pl_type; 3719b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::ViEExternalCodec* external_codec = webrtc::ViEExternalCodec 3729b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ::GetInterface(ptrViE); 3739b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org assert(external_codec != NULL); 3749b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = external_codec->RegisterExternalSendCodec(videoChannel, pl_type, 3759b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::VP8Encoder::Create(), false); 376ece3d353d49e6099043927c1fa721c0618480715agalusza@google.com assert(error != -1); 3779b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = external_codec->RegisterExternalReceiveCodec(videoChannel, 3789b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org pl_type, webrtc::VP8Decoder::Create(), false); 3799b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org assert(error != -1); 3809b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } else { 3819b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECodec->GetCodec(codecIdx, videoCodec); 3829b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) { 3839b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECodec::GetCodec\n"); 3849b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 3859b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 3869b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 3879b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 3889b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Set spatial resolution option 3890425392858172d13eb65a1143a12c2787cea4b1bandresp@webrtc.org std::string str; 390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << std::endl; 391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "Enter frame size option (default is CIF):" << std::endl; 392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "1. QCIF (176X144) " << std::endl; 393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "2. CIF (352X288) " << std::endl; 394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "3. VGA (640X480) " << std::endl; 395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "4. 4CIF (704X576) " << std::endl; 396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "5. WHD (1280X720) " << std::endl; 397e3339fcb0795bf0e6fbf148133c8b79bcecc5edepbos@webrtc.org std::cout << "6. FHD (1920X1080) " << std::endl; 398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::getline(std::cin, str); 3999b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org int resolnOption = atoi(str.c_str()); 4009b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org switch (resolnOption) 4019b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 4029b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org case 1: 4039b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.width = 176; 4049b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.height = 144; 4059b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org break; 4069b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org case 2: 4079b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.width = 352; 4089b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.height = 288; 4099b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org break; 4109b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org case 3: 4119b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.width = 640; 4129b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.height = 480; 4139b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org break; 4149b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org case 4: 4159b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.width = 704; 4169b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.height = 576; 4179b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org break; 4189b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org case 5: 4199b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.width = 1280; 4209b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.height = 720; 4219b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org break; 4229b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org case 6: 4239b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.width = 1920; 4249b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.height = 1080; 4259b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org break; 4269b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 4279b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 4289b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Set number of temporal layers. 429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << std::endl; 430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "Choose number of temporal layers (1 to 4)."; 431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "Press enter for default: \n"; 432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::getline(std::cin, str); 4339b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org int numTemporalLayers = atoi(str.c_str()); 4349b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if(numTemporalLayers != 0) 4359b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 4369b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.codecSpecific.VP8.numberOfTemporalLayers = numTemporalLayers; 4379b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 4389b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 4399b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Set start bit rate 440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << std::endl; 441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "Choose start rate (in kbps). Press enter for default: "; 442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::getline(std::cin, str); 4439b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org int startRate = atoi(str.c_str()); 4449b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if(startRate != 0) 4459b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 4469b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoCodec.startBitrate=startRate; 4479b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 4489b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 4499b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECodec->SetSendCodec(videoChannel, videoCodec); 4509b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org assert(error != -1); 4519b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECodec->SetReceiveCodec(videoChannel, videoCodec); 4529b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org assert(error != -1); 4539b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 4549b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 4559b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Choose Protection Mode 4569b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << std::endl; 458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "Enter Protection Method:" << std::endl; 459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "0. None" << std::endl; 460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "1. FEC" << std::endl; 461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "2. NACK" << std::endl; 462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "3. NACK+FEC" << std::endl; 463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::getline(std::cin, str); 4649b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org int protectionMethod = atoi(str.c_str()); 4659b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = 0; 4669b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org bool temporalToggling = true; 4679b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org switch (protectionMethod) 4689b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 4699b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org case 0: // None: default is no protection 4709b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org break; 4719b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 4729b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org case 1: // FEC only 4739b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERtpRtcp->SetFECStatus(videoChannel, 4749b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org true, 4759b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org VCM_RED_PAYLOAD_TYPE, 4769b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org VCM_ULPFEC_PAYLOAD_TYPE); 4779b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org temporalToggling = false; 4789b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org break; 4799b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 4809b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org case 2: // Nack only 4819b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERtpRtcp->SetNACKStatus(videoChannel, true); 4829b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 4839b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org break; 4849b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 4859b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org case 3: // Hybrid NAck and FEC 4869b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERtpRtcp->SetHybridNACKFECStatus( 4879b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org videoChannel, 4889b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org true, 4899b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org VCM_RED_PAYLOAD_TYPE, 4909b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org VCM_ULPFEC_PAYLOAD_TYPE); 4919b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org temporalToggling = false; 4929b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org break; 4939b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 4949b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 4959b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error < 0) 4969b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 4979b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERTP_RTCP::SetProtectionStatus\n"); 4989b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 4999b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 5009b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Set up buffering delay. 5016ed1c8c24144555c6c41a5a29542eafc7e202505mikhal@webrtc.org std::cout << std::endl; 5026ed1c8c24144555c6c41a5a29542eafc7e202505mikhal@webrtc.org std::cout << "Set buffering delay (mS). Press enter for default(0mS): "; 5036ed1c8c24144555c6c41a5a29542eafc7e202505mikhal@webrtc.org std::getline(std::cin, str); 5049b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org int buffering_delay = atoi(str.c_str()); 5059b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (buffering_delay != 0) { 5069b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERtpRtcp->SetSenderBufferingMode(videoChannel, 507ece3d353d49e6099043927c1fa721c0618480715agalusza@google.com buffering_delay); 5089b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error < 0) 5099b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERTP_RTCP::SetSenderBufferingMode\n"); 5109b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 5119b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERtpRtcp->SetReceiverBufferingMode(videoChannel, 5129b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org buffering_delay); 5139b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error < 0) 5149b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERTP_RTCP::SetReceiverBufferingMode\n"); 5159b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 5169b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 5179b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 5189b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Address settings 5199b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 5209b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::ViENetwork* ptrViENetwork = 5219b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::ViENetwork::GetInterface(ptrViE); 5229b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (ptrViENetwork == NULL) 5239b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 5249b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViENetwork::GetInterface\n"); 5259b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 5269b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 5279b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 5289b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Setup transport. 5299b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org TbExternalTransport* extTransport = NULL; 5309b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org webrtc::test::VideoChannelTransport* video_channel_transport = NULL; 5319b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 5329b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org int testMode = 0; 533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << std::endl; 534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "Enter 1 for testing packet loss and delay with " 535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "external transport: "; 536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string test_str; 537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::getline(std::cin, test_str); 538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org testMode = atoi(test_str.c_str()); 5399b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (testMode == 1) 5409b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 5419b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Avoid changing SSRC due to collision. 5429b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERtpRtcp->SetLocalSSRC(videoChannel, 1); 5439b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 5449b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org extTransport = new TbExternalTransport(*ptrViENetwork, videoChannel, 5459b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org NULL); 5469b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 5479b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViENetwork->RegisterSendTransport(videoChannel, 5489b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org *extTransport); 5499b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 5509b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 5519b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECodec::RegisterSendTransport \n"); 5529b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 5539b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 5549b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 5559b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Setting uniform loss. Actual values will be set by user. 5569b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org NetworkParameters network; 5579b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org network.loss_model = kUniformLoss; 5589b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Set up packet loss value 5599b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org std::cout << "Enter Packet Loss Percentage" << std::endl; 5609b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org std::string rate_str; 5619b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org std::getline(std::cin, rate_str); 5629b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org network.packet_loss_rate = atoi(rate_str.c_str()); 5639b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (network.packet_loss_rate > 0) { 5649b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org temporalToggling = false; 5659b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 5669b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 5679b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Set network delay value 5689b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org std::cout << "Enter network delay value [mS]" << std::endl; 5699b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org std::string delay_str; 5709b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org std::getline(std::cin, delay_str); 5719b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org network.mean_one_way_delay = atoi(delay_str.c_str()); 5729b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org extTransport->SetNetworkParameters(network); 5739b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (numTemporalLayers > 1 && temporalToggling) { 5749b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org extTransport->SetTemporalToggle(numTemporalLayers); 5759b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } else { 5769b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Disabled 5779b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org extTransport->SetTemporalToggle(0); 5789b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 5809b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org else 5819b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 5829b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org video_channel_transport = new webrtc::test::VideoChannelTransport( 5839b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ptrViENetwork, videoChannel); 5849b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 5859b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org const char* ipAddress = "127.0.0.1"; 5869b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org const unsigned short rtpPort = 6000; 5879b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org std::cout << std::endl; 5889b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org std::cout << "Using rtp port: " << rtpPort << std::endl; 5899b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org std::cout << std::endl; 5909b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 5919b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = video_channel_transport->SetLocalReceiver(rtpPort); 5929b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 5939b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 5949b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in SetLocalReceiver\n"); 5959b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 5969b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 5979b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = video_channel_transport->SetSendDestination(ipAddress, rtpPort); 5989b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 5999b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 6009b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in SetSendDestination\n"); 6019b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 6029b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 6059b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViEBase->StartReceive(videoChannel); 6069b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 6079b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 6089b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViENetwork::StartReceive\n"); 6099b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 6129b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViEBase->StartSend(videoChannel); 6139b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 6149b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 6159b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViENetwork::StartSend\n"); 6169b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 6179b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 6189b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6199b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org //******************************************************** 6209b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Engine started 6219b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org //******************************************************** 6229b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6239b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6249b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Call started 6259b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("\nLoopback call started\n\n"); 6269b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("Press enter to stop..."); 6279b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org while ((getchar()) != '\n') 6289b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ; 629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 6309b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org //******************************************************** 6319b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // Testing finished. Tear down Video Engine 6329b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org //******************************************************** 6339b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6349b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViEBase->StopReceive(videoChannel); 6359b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 6369b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 6379b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViEBase::StopReceive\n"); 6389b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 6399b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 6409b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6419b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViEBase->StopSend(videoChannel); 6429b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 6439b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 6449b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViEBase::StopSend\n"); 6459b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 6469b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 6479b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6489b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERender->StopRender(captureId); 6499b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 6509b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 6519b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERender::StopRender\n"); 6529b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 6539b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 6549b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6559b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERender->RemoveRenderer(captureId); 6569b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 6579b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 6589b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERender::RemoveRenderer\n"); 6599b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 6609b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 6619b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6629b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERender->StopRender(videoChannel); 6639b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 6649b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 6659b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERender::StopRender\n"); 6669b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 6679b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 6689b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6699b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViERender->RemoveRenderer(videoChannel); 6709b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 6719b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 6729b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViERender::RemoveRenderer\n"); 6739b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 6749b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 6759b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6769b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECapture->StopCapture(captureId); 6779b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 6789b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 6799b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECapture::StopCapture\n"); 6809b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 6819b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 6829b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6839b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECapture->DisconnectCaptureDevice(videoChannel); 6849b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 6859b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 6869b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECapture::DisconnectCaptureDevice\n"); 6879b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 6889b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 6899b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6909b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViECapture->ReleaseCaptureDevice(captureId); 6919b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 6929b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 6939b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViECapture::ReleaseCaptureDevice\n"); 6949b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 6959b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 6969b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 6979b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org error = ptrViEBase->DeleteChannel(videoChannel); 6989b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (error == -1) 6999b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 7009b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in ViEBase::DeleteChannel\n"); 7019b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 7029b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 7039b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 7049b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org delete video_channel_transport; 7059b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org delete extTransport; 7069b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 7079b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org int remainingInterfaces = 0; 7089b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org remainingInterfaces = ptrViECodec->Release(); 7099b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org remainingInterfaces += ptrViECapture->Release(); 7109b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org remainingInterfaces += ptrViERtpRtcp->Release(); 7119b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org remainingInterfaces += ptrViERender->Release(); 7129b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org remainingInterfaces += ptrViENetwork->Release(); 7139b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org remainingInterfaces += ptrViEBase->Release(); 7149b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (remainingInterfaces > 0) 7159b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 7169b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR: Could not release all interfaces\n"); 7179b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 7189b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 7199b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 7209b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org bool deleted = webrtc::VideoEngine::Delete(ptrViE); 7219b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (deleted == false) 7229b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 7239b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org printf("ERROR in VideoEngine::Delete\n"); 7249b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return -1; 7259b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 7269b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 7279b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return 0; 7289b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 7299b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 7309b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // END: VideoEngine 3.0 Sample Code 7319b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // 7329b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org // =================================================================== 733b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 734b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 7359b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.orgint ViEAutoTest::ViELoopbackCall() 7369b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org{ 7379b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ViETest::Log(" "); 7389b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ViETest::Log("========================================"); 7399b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ViETest::Log(" ViE Autotest Loopback Call\n"); 7409b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 7419b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org if (VideoEngineSampleCode(_window1, _window2) == 0) 7429b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org { 7439b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ViETest::Log(" "); 7449b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ViETest::Log(" ViE Autotest Loopback Call Done"); 7459b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ViETest::Log("========================================"); 7469b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ViETest::Log(" "); 7479b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org 7489b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return 0; 7499b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org } 750b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 751b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log(" "); 7529b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org ViETest::Log(" ViE Autotest Loopback Call Failed"); 753b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("========================================"); 754b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log(" "); 7559b7bdee24668d19ad2b0bd6d8b2a2f4bc6e0dbebelham@webrtc.org return 1; 756b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 757b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 758