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