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