1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// vie_autotest_record.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#include <fstream> 18281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include <stdio.h> 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/common_types.h" 21c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/system_wrappers/interface/tick_util.h" 22c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/test/channel_transport/include/channel_transport.h" 23c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/video_engine/include/vie_base.h" 24c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/video_engine/include/vie_capture.h" 25c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/video_engine/include/vie_codec.h" 26c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/video_engine/include/vie_network.h" 27c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/video_engine/include/vie_render.h" 28c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/video_engine/include/vie_rtp_rtcp.h" 29281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h" 30281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h" 31281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/tb_external_transport.h" 32281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/voice_engine/include/voe_base.h" 33c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/voice_engine/include/voe_network.h" 34c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/voice_engine/include/voe_rtp_rtcp.h" 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define VCM_RED_PAYLOAD_TYPE 96 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define VCM_ULPFEC_PAYLOAD_TYPE 97 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_AUDIO_PORT 11113 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_AUDIO_CODEC "ISAC" 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_VIDEO_CODEC_WIDTH 640 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_VIDEO_CODEC_HEIGHT 480 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_VIDEO_CODEC_START_RATE 1000 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_RECORDING_FOLDER "RECORDING" 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_RECORDING_AUDIO "/audio_debug.aec" 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_RECORDING_VIDEO "/video_debug.yuv" 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_RECORDING_AUDIO_RTP "/audio_rtpdump.rtp" 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_RECORDING_VIDEO_RTP "/video_rtpdump.rtp" 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool GetAudioDevices(webrtc::VoEBase* voe_base, 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VoEHardware* voe_hardware, 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char* recording_device_name, 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int& recording_device_index, 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char* playbackDeviceName, 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int& playback_device_index); 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool GetAudioCodecRecord(webrtc::VoECodec* voe_codec, 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::CodecInst& audio_codec); 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VideoEngineSampleRecordCode(void* window1, void* window2) { 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int error = 0; 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Audio settings. 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int audio_tx_port = DEFAULT_AUDIO_PORT; 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int audio_rx_port = DEFAULT_AUDIO_PORT; 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::CodecInst audio_codec; 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int audio_channel = -1; 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int audio_capture_device_index = -1; 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int audio_playback_device_index = -1; 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const unsigned int KMaxDeviceNameLength = 128; 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const unsigned int KMaxUniqueIdLength = 256; 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char deviceName[KMaxDeviceNameLength]; 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char audio_capture_device_name[KMaxUniqueIdLength] = ""; 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char audio_playbackDeviceName[KMaxUniqueIdLength] = ""; 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Network settings. 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const char* ipAddress = "127.0.0.1"; 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const int rtpPort = 6000; 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Create a VideoEngine instance 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VideoEngine* ptrViE = NULL; 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ptrViE = webrtc::VideoEngine::Create(); 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ptrViE == NULL) { 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in VideoEngine::Create\n"); 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViE->SetTraceFilter(webrtc::kTraceAll); 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in VideoEngine::SetTraceLevel\n"); 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string trace_file = 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::GetResultOutputPath() + "ViERecordCall_trace.txt"; 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViE->SetTraceFile(trace_file.c_str()); 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in VideoEngine::SetTraceFile\n"); 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Create a VoE instance 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VoiceEngine* voe = webrtc::VoiceEngine::Create(); 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Init VideoEngine and create a channel 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::ViEBase* ptrViEBase = webrtc::ViEBase::GetInterface(ptrViE); 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ptrViEBase == NULL) { 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViEBase::GetInterface\n"); 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViEBase->Init(); 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViEBase::Init\n"); 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VoEBase* voe_base = webrtc::VoEBase::GetInterface(voe); 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (voe_base == NULL) { 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in VoEBase::GetInterface\n"); 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = voe_base->Init(); 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in VoEBase::Init\n"); 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int videoChannel = -1; 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViEBase->CreateChannel(videoChannel); 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViEBase::CreateChannel\n"); 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VoEHardware* voe_hardware = 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VoEHardware::GetInterface(voe); 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VoECodec* voe_codec = webrtc::VoECodec::GetInterface(voe); 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VoEAudioProcessing* voe_apm = 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VoEAudioProcessing::GetInterface(voe); 143c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org webrtc::VoENetwork* voe_network = 144c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org webrtc::VoENetwork::GetInterface(voe); 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Get the audio device for the call. 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memset(audio_capture_device_name, 0, KMaxUniqueIdLength); 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memset(audio_playbackDeviceName, 0, KMaxUniqueIdLength); 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetAudioDevices(voe_base, voe_hardware, audio_capture_device_name, 150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org audio_capture_device_index, audio_playbackDeviceName, 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org audio_playback_device_index); 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Get the audio codec for the call. 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memset(static_cast<void*>(&audio_codec), 0, sizeof(audio_codec)); 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GetAudioCodecRecord(voe_codec, audio_codec); 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org audio_channel = voe_base->CreateChannel(); 158c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org 159c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org webrtc::scoped_ptr<webrtc::test::VoiceChannelTransport> 160c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org voice_channel_transport( 161c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org new webrtc::test::VoiceChannelTransport(voe_network, audio_channel)); 162c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org 163c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org voice_channel_transport->SetSendDestination(ipAddress, audio_tx_port); 164c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org voice_channel_transport->SetLocalReceiver(audio_rx_port); 165c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org 166c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org voe_hardware->SetRecordingDevice(audio_capture_device_index); 167c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org voe_hardware->SetPlayoutDevice(audio_playback_device_index); 168c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org voe_codec->SetSendCodec(audio_channel, audio_codec); 169c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org voe_apm->SetAgcStatus(true, webrtc::kAgcDefault); 170c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org voe_apm->SetNsStatus(true, webrtc::kNsHighSuppression); 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // List available capture devices, allocate and connect. 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::ViECapture* ptrViECapture = 176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::ViECapture::GetInterface(ptrViE); 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ptrViECapture == NULL) { 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViECapture::GetInterface\n"); 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VoERTP_RTCP* ptrVoERtpRtcp = 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VoERTP_RTCP::GetInterface(voe); 184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ptrVoERtpRtcp == NULL) { 185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in VoERTP_RTCP::GetInterface\n"); 186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memset(deviceName, 0, KMaxDeviceNameLength); 190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char uniqueId[KMaxUniqueIdLength]; 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memset(uniqueId, 0, KMaxUniqueIdLength); 192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Available capture devices:\n"); 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int captureIdx = 0; 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (captureIdx = 0; 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org captureIdx < ptrViECapture->NumberOfCaptureDevices(); 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org captureIdx++) { 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memset(deviceName, 0, KMaxDeviceNameLength); 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memset(uniqueId, 0, KMaxUniqueIdLength); 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViECapture->GetCaptureDevice(captureIdx, deviceName, 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org KMaxDeviceNameLength, uniqueId, 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org KMaxUniqueIdLength); 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViECapture::GetCaptureDevice\n"); 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("\t %d. %s\n", captureIdx + 1, deviceName); 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("\nChoose capture device: "); 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ANDROID 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org captureIdx = 0; 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("0\n"); 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (scanf("%d", &captureIdx) != 1) { 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Error in scanf()\n"); 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org getchar(); 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org captureIdx = captureIdx - 1; // Compensate for idx start at 1. 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViECapture->GetCaptureDevice(captureIdx, deviceName, 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org KMaxDeviceNameLength, uniqueId, 224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org KMaxUniqueIdLength); 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViECapture::GetCaptureDevice\n"); 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int captureId = 0; 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViECapture->AllocateCaptureDevice(uniqueId, KMaxUniqueIdLength, 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org captureId); 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViECapture::AllocateCaptureDevice\n"); 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViECapture->ConnectCaptureDevice(captureId, videoChannel); 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViECapture::ConnectCaptureDevice\n"); 241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViECapture->StartCapture(captureId); 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViECapture::StartCapture\n"); 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // RTP/RTCP settings 252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::ViERTP_RTCP* ptrViERtpRtcp = 254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::ViERTP_RTCP::GetInterface(ptrViE); 255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ptrViERtpRtcp == NULL) { 256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERTP_RTCP::GetInterface\n"); 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViERtpRtcp->SetRTCPStatus(videoChannel, 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::kRtcpCompound_RFC4585); 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERTP_RTCP::SetRTCPStatus\n"); 264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViERtpRtcp->SetKeyFrameRequestMethod( 268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org videoChannel, webrtc::kViEKeyFrameRequestPliRtcp); 269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERTP_RTCP::SetKeyFrameRequestMethod\n"); 271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViERtpRtcp->SetRembStatus(videoChannel, true, true); 275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERTP_RTCP::SetTMMBRStatus\n"); 277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Set up rendering 282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::ViERender* ptrViERender = webrtc::ViERender::GetInterface(ptrViE); 284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ptrViERender == NULL) { 285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERender::GetInterface\n"); 286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViERender->AddRenderer(captureId, window1, 0, 0.0, 0.0, 1.0, 1.0); 290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERender::AddRenderer\n"); 292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViERender->StartRender(captureId); 296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERender::StartRender\n"); 298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViERender->AddRenderer(videoChannel, window2, 1, 0.0, 0.0, 1.0, 302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1.0); 303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERender::AddRenderer\n"); 305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViERender->StartRender(videoChannel); 309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERender::StartRender\n"); 311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Setup codecs 316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::ViECodec* ptrViECodec = webrtc::ViECodec::GetInterface(ptrViE); 318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ptrViECodec == NULL) { 319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViECodec::GetInterface\n"); 320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::VideoCodec videoCodec; 324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memset(&videoCodec, 0, sizeof(webrtc::VideoCodec)); 325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int codecIdx = 0; 326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ANDROID 328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org codecIdx = 0; 329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("0\n"); 330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org codecIdx = 0; // Compensate for idx start at 1. 332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViECodec->GetCodec(codecIdx, videoCodec); 335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViECodec::GetCodec\n"); 337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Set spatial resolution option 341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org videoCodec.width = DEFAULT_VIDEO_CODEC_WIDTH; 342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org videoCodec.height = DEFAULT_VIDEO_CODEC_HEIGHT; 343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Set start bit rate 345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org videoCodec.startBitrate = DEFAULT_VIDEO_CODEC_START_RATE; 346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViECodec->SetSendCodec(videoChannel, videoCodec); 348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViECodec::SetSendCodec\n"); 350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Address settings 355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // 356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::ViENetwork* ptrViENetwork = 357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org webrtc::ViENetwork::GetInterface(ptrViE); 358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ptrViENetwork == NULL) { 359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViENetwork::GetInterface\n"); 360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 362c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org webrtc::test::VideoChannelTransport* video_channel_transport = 363c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org new webrtc::test::VideoChannelTransport(ptrViENetwork, videoChannel); 364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 365c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org error = video_channel_transport->SetSendDestination(ipAddress, rtpPort); 366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 367c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org printf("ERROR in SetSendDestination\n"); 368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 370c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org error = video_channel_transport->SetLocalReceiver(rtpPort); 371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 372c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org printf("ERROR in SetLocalReceiver\n"); 373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string str; 377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int enable_labeling = 0; 378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << std::endl; 379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "Do you want to label this recording?" << std::endl; 380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "0. No (default)." << std::endl; 381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "1. This call will be labeled on the fly." << std::endl; 382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::getline(std::cin, str); 383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org enable_labeling = atoi(str.c_str()); 384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org uint32_t folder_time = static_cast<uint32_t> 386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (webrtc::TickTime::MillisecondTimestamp()); 387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::stringstream folder_time_str; 388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org folder_time_str << folder_time; 389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const std::string folder_name = "recording" + folder_time_str.str(); 390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("recording name = %s\n", folder_name.c_str()); 391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // TODO(mikhal): use file_utils. 392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WIN32 393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _mkdir(folder_name.c_str()); 394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mkdir(folder_name.c_str(), 0777); 396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const std::string audio_filename = folder_name + DEFAULT_RECORDING_AUDIO; 398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const std::string video_filename = folder_name + DEFAULT_RECORDING_VIDEO; 399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const std::string audio_rtp_filename = folder_name + 400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DEFAULT_RECORDING_AUDIO_RTP; 401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const std::string video_rtp_filename = folder_name + 402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org DEFAULT_RECORDING_VIDEO_RTP; 403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::fstream timing; 404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (enable_labeling == 1) { 405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::cout << "Press enter to stamp current time."<< std::endl; 406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string timing_file = folder_name + "/labeling.txt"; 407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org timing.open(timing_file.c_str(), std::fstream::out | std::fstream::app); 408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("\nPress enter to start recording\n"); 410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::getline(std::cin, str); 411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("\nRecording started\n\n"); 412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViEBase->StartReceive(videoChannel); 414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViENetwork::StartReceive\n"); 416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViEBase->StartSend(videoChannel); 420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViENetwork::StartSend\n"); 422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = voe_base->StartSend(audio_channel); 425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in VoENetwork::StartSend\n"); 427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Engine started 431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org voe_apm->StartDebugRecording(audio_filename.c_str()); 4330291c803da147cf113e829562f281479be8f2c11mflodman@webrtc.org ptrViECodec->StartDebugRecording(videoChannel, video_filename.c_str()); 434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ptrViERtpRtcp->StartRTPDump(videoChannel, 435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org video_rtp_filename.c_str(), webrtc::kRtpOutgoing); 436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ptrVoERtpRtcp->StartRTPDump(audio_channel, 437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org audio_rtp_filename.c_str(), webrtc::kRtpOutgoing); 438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("Press s + enter to stop..."); 439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int64_t clock_time; 440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (enable_labeling == 1) { 441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org clock_time = webrtc::TickTime::MillisecondTimestamp(); 442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org timing << clock_time << std::endl; 443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char c = getchar(); 445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fflush(stdin); 446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while (c != 's') { 447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (c == '\n' && enable_labeling == 1) { 448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org clock_time = webrtc::TickTime::MillisecondTimestamp(); 449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org timing << clock_time << std::endl; 450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org c = getchar(); 452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (enable_labeling == 1) { 454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org clock_time = webrtc::TickTime::MillisecondTimestamp(); 455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org timing << clock_time << std::endl; 456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ptrViERtpRtcp->StopRTPDump(videoChannel, webrtc::kRtpOutgoing); 459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ptrVoERtpRtcp->StopRTPDump(audio_channel, webrtc::kRtpOutgoing); 460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org voe_apm->StopDebugRecording(); 4610291c803da147cf113e829562f281479be8f2c11mflodman@webrtc.org ptrViECodec->StopDebugRecording(videoChannel); 462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (enable_labeling == 1) 463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org timing.close(); 464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Recording finished. Tear down Video Engine. 466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViEBase->StopReceive(videoChannel); 468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViEBase::StopReceive\n"); 470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViEBase->StopSend(videoChannel); 474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViEBase::StopSend\n"); 476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = voe_base->StopSend(audio_channel); 479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViERender->StopRender(captureId); 481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERender::StopRender\n"); 483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViERender->RemoveRenderer(captureId); 487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERender::RemoveRenderer\n"); 489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViERender->StopRender(videoChannel); 493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERender::StopRender\n"); 495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViERender->RemoveRenderer(videoChannel); 499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViERender::RemoveRenderer\n"); 501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViECapture->StopCapture(captureId); 505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViECapture::StopCapture\n"); 507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViECapture->DisconnectCaptureDevice(videoChannel); 511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViECapture::DisconnectCaptureDevice\n"); 513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViECapture->ReleaseCaptureDevice(captureId); 517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViECapture::ReleaseCaptureDevice\n"); 519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = ptrViEBase->DeleteChannel(videoChannel); 523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (error == -1) { 524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in ViEBase::DeleteChannel\n"); 525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 527c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org delete video_channel_transport; 528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int remainingInterfaces = 0; 530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org remainingInterfaces = ptrViECodec->Release(); 531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org remainingInterfaces += ptrViECapture->Release(); 532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org remainingInterfaces += ptrViERtpRtcp->Release(); 533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org remainingInterfaces += ptrViERender->Release(); 534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org remainingInterfaces += ptrViENetwork->Release(); 535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org remainingInterfaces += ptrViEBase->Release(); 536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (remainingInterfaces > 0) { 537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR: Could not release all interfaces\n"); 538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool deleted = webrtc::VideoEngine::Delete(ptrViE); 541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (deleted == false) { 542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("ERROR in VideoEngine::Delete\n"); 543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return -1; 544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// TODO(mikhal): Place above functionality under this class. 550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViEAutoTest::ViERecordCall() { 551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log(" "); 552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("========================================"); 553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log(" ViE Record Call\n"); 554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (VideoEngineSampleRecordCode(_window1, _window2) == 0) { 556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log(" "); 557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log(" ViE Autotest Record Call Done"); 558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("========================================"); 559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log(" "); 560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 0; 561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log(" "); 564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log(" ViE Autotest Record Call Failed"); 565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log("========================================"); 566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ViETest::Log(" "); 567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return 1; 568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool GetAudioCodecRecord(webrtc::VoECodec* voe_codec, 571c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org webrtc::CodecInst& audio_codec) { 572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int error = 0; 573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int number_of_errors = 0; 574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org memset(&audio_codec, 0, sizeof(webrtc::CodecInst)); 575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while (1) { 577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int codec_idx = 0; 578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int default_codec_idx = 0; 579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (codec_idx = 0; codec_idx < voe_codec->NumOfCodecs(); codec_idx++) { 580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = voe_codec->GetCodec(codec_idx, audio_codec); 581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org number_of_errors += ViETest::TestError(error == 0, 582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "ERROR: %s at line %d", 583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org __FUNCTION__, __LINE__); 584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Test for default codec index. 586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (strcmp(audio_codec.plname, DEFAULT_AUDIO_CODEC) == 0) { 587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org default_codec_idx = codec_idx; 588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org error = voe_codec->GetCodec(default_codec_idx, audio_codec); 591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org number_of_errors += ViETest::TestError(error == 0, 592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "ERROR: %s at line %d", 593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org __FUNCTION__, __LINE__); 594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org assert(false); 597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return false; 598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 599