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
113f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <limits.h>
123f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stdarg.h>
133f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stdio.h>
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <algorithm>
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17bb6bef544d450c0c70f5569243b6ce07a56d9462pbos@webrtc.org#include "gflags/gflags.h"
18c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
19c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/test/channel_transport/include/channel_transport.h"
20c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h"
21c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
22c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/video_engine/test/auto_test/primitives/choice_helpers.h"
23c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/video_engine/test/auto_test/primitives/general_primitives.h"
24c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/video_engine/test/auto_test/primitives/input_helpers.h"
25c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/video_engine/test/libvietest/include/vie_to_file_renderer.h"
26c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org#include "webrtc/voice_engine/include/voe_network.h"
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define VCM_RED_PAYLOAD_TYPE                            96
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define VCM_ULPFEC_PAYLOAD_TYPE                         97
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_SEND_IP                                 "127.0.0.1"
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_VIDEO_PORT                              "11111"
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_VIDEO_CODEC                             "VP8"
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_VIDEO_CODEC_WIDTH                       "640"
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_VIDEO_CODEC_HEIGHT                      "480"
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_VIDEO_CODEC_BITRATE                     "300"
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_VIDEO_CODEC_MIN_BITRATE                 "100"
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_VIDEO_CODEC_MAX_BITRATE                 "1000"
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_AUDIO_PORT                              "11113"
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_AUDIO_CODEC                             "ISAC"
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_VIDEO_CODEC_MAX_FRAMERATE               "30"
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_VIDEO_PROTECTION_METHOD                 "None"
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define DEFAULT_TEMPORAL_LAYER                          "0"
439d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org#define DEFAULT_BUFFERING_DELAY_MS                      "0"
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
45b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.orgDEFINE_string(render_custom_call_remote_to, "", "Specify to render the remote "
46b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org    "stream of a custom call to the provided filename instead of showing it in "
47b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org    "window 2. The file will end up in the default output directory (out/).");
48b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum StatisticsType {
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kSendStatistic,
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kReceivedStatistic
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum VideoProtectionMethod {
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kProtectionMethodNone = 1,
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kProtectionMethodFecOnly,
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kProtectionMethodNackOnly,
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  kProtectionMethodHybridNackAndFec,
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgusing webrtc::FromChoices;
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgusing webrtc::TypedInput;
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEAutotestEncoderObserver : public webrtc::ViEEncoderObserver {
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEAutotestEncoderObserver() {}
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ~ViEAutotestEncoderObserver() {}
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void OutgoingRate(const int video_channel,
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    const unsigned int framerate,
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    const unsigned int bitrate) {
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::cout << "Send FR: " << framerate
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              << " BR: " << bitrate << std::endl;
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
7539079d1ee84faab899c8af92bce984c20e60fd29henrik.lundin@webrtc.org
7682b883c27168fa801aef8e0530db298e6128eb5chenrik.lundin@webrtc.org  virtual void SuspendChange(int video_channel, bool is_suspended) OVERRIDE {
7782b883c27168fa801aef8e0530db298e6128eb5chenrik.lundin@webrtc.org    std::cout << "SuspendChange: " << is_suspended << std::endl;
7839079d1ee84faab899c8af92bce984c20e60fd29henrik.lundin@webrtc.org  }
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass ViEAutotestDecoderObserver : public webrtc::ViEDecoderObserver {
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org public:
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEAutotestDecoderObserver() {}
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ~ViEAutotestDecoderObserver() {}
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void IncomingRate(const int video_channel,
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    const unsigned int framerate,
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    const unsigned int bitrate) {
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::cout << "Received FR: " << framerate
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              << " BR: " << bitrate << std::endl;
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
92ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org
93ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org  virtual void DecoderTiming(int decode_ms,
94ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org                             int max_decode_ms,
95ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org                             int current_delay_ms,
96ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org                             int target_delay_ms,
97ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org                             int jitter_buffer_ms,
98ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org                             int min_playout_delay_ms,
99ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org                             int render_delay_ms) {
100ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org    std::cout << "Decoder timing: DecodeMS: " << decode_ms
101ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org              << ", MaxDecodeMS: " << max_decode_ms
102ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org              << ", CurrentDelayMS: " << current_delay_ms
103ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org              << ", TargetDelayMS: " << target_delay_ms
104ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org              << ", JitterBufferMS: " << jitter_buffer_ms
105ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org              << ", MinPlayoutDelayMS: " << min_playout_delay_ms
106ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org              << ", RenderDelayMS: " << render_delay_ms;
107ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org  }
108ecfef1930d59e5b7dc14e71b1ac3ed892980d151fischman@webrtc.org
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void IncomingCodecChanged(const int video_channel,
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                            const webrtc::VideoCodec& codec) {}
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void RequestNewKeyFrame(const int video_channel) {
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::cout << "Decoder requesting a new key frame." << std::endl;
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The following are general helper functions.
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool GetVideoDevice(webrtc::ViEBase* vie_base,
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    webrtc::ViECapture* vie_capture,
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    char* capture_device_name, char* capture_device_unique_id);
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string GetIPAddress();
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool ValidateIP(std::string i_str);
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The following are Print to stdout functions.
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintCallInformation(const char* IP,
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          const char* video_capture_device_name,
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          const char* video_capture_unique_id,
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          webrtc::VideoCodec video_codec,
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int video_tx_port,
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int video_rx_port,
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          const char* audio_capture_device_name,
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          const char* audio_playbackDeviceName,
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          webrtc::CodecInst audio_codec,
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int audio_tx_port,
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int audio_rx_port,
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int protection_method);
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintRTCCPStatistics(webrtc::ViERTP_RTCP* vie_rtp_rtcp,
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int video_channel,
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          StatisticsType stat_type);
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintRTPStatistics(webrtc::ViERTP_RTCP* vie_rtp_rtcp,
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        int video_channel);
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintBandwidthUsage(webrtc::ViERTP_RTCP* vie_rtp_rtcp,
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         int video_channel);
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintCodecStatistics(webrtc::ViECodec* vie_codec,
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int video_channel,
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          StatisticsType stat_type);
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintGetDiscardedPackets(webrtc::ViECodec* vie_codec,
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                              int video_channel);
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintVideoStreamInformation(webrtc::ViECodec* vie_codec,
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int video_channel);
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintVideoCodec(webrtc::VideoCodec video_codec);
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The following are video functions.
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid GetVideoPorts(int* tx_port, int* rx_port);
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecType(webrtc::ViECodec* vie_codec,
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                       webrtc::VideoCodec* video_codec);
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecResolution(webrtc::VideoCodec* video_codec);
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecSize(webrtc::VideoCodec* video_codec);
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecBitrate(webrtc::VideoCodec* video_codec);
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecMinBitrate(webrtc::VideoCodec* video_codec);
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecMaxBitrate(webrtc::VideoCodec* video_codec);
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecMaxFramerate(webrtc::VideoCodec* video_codec);
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecTemporalLayer(webrtc::VideoCodec* video_codec);
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoProtectionMethod GetVideoProtection();
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool SetVideoProtection(webrtc::ViECodec* vie_codec,
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        webrtc::ViERTP_RTCP* vie_rtp_rtcp,
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        int video_channel,
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        VideoProtectionMethod protection_method);
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool GetBitrateSignaling();
1699d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.orgint GetBufferingDelay();
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The following are audio helper functions.
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool GetAudioDevices(webrtc::VoEBase* voe_base,
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     webrtc::VoEHardware* voe_hardware,
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     char* recording_device_name, int& recording_device_index,
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     char* playback_device_name, int& playback_device_index);
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool GetAudioDevices(webrtc::VoEBase* voe_base,
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     webrtc::VoEHardware* voe_hardware,
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     int& recording_device_index, int& playback_device_index);
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid GetAudioPorts(int* tx_port, int* rx_port);
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool GetAudioCodec(webrtc::VoECodec* voe_codec,
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                   webrtc::CodecInst& audio_codec);
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViEAutoTest::ViECustomCall() {
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViETest::Log(" ");
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViETest::Log("========================================");
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViETest::Log(" Enter values to use custom settings\n");
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int error = 0;
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int number_of_errors = 0;
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string str;
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Create the VoE and get the VoE interfaces.
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::VoiceEngine* voe = webrtc::VoiceEngine::Create();
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(voe != NULL, "ERROR: %s at line %d",
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __FUNCTION__, __LINE__);
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::VoEBase* voe_base = webrtc::VoEBase::GetInterface(voe);
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(voe_base != NULL,
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d", __FUNCTION__,
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __LINE__);
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = voe_base->Init();
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __FUNCTION__, __LINE__);
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::VoECodec* voe_codec = webrtc::VoECodec::GetInterface(voe);
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(voe_codec != NULL,
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d", __FUNCTION__,
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __LINE__);
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::VoEHardware* voe_hardware =
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      webrtc::VoEHardware::GetInterface(voe);
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(voe_hardware != NULL,
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d", __FUNCTION__,
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __LINE__);
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
217c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  webrtc::VoENetwork* voe_network=
218c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org      webrtc::VoENetwork::GetInterface(voe);
219c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  number_of_errors += ViETest::TestError(voe_network != NULL,
220c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org                                         "ERROR: %s at line %d", __FUNCTION__,
221c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org                                         __LINE__);
222c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::VoEAudioProcessing* voe_apm =
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      webrtc::VoEAudioProcessing::GetInterface(voe);
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(voe_apm != NULL,
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d", __FUNCTION__,
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __LINE__);
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Create the ViE and get the ViE Interfaces.
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::VideoEngine* vie = webrtc::VideoEngine::Create();
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(vie != NULL,
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d", __FUNCTION__,
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __LINE__);
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::ViEBase* vie_base = webrtc::ViEBase::GetInterface(vie);
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(vie_base != NULL,
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d", __FUNCTION__,
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __LINE__);
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_base->Init();
241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __FUNCTION__, __LINE__);
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::ViECapture* vie_capture =
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      webrtc::ViECapture::GetInterface(vie);
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(vie_capture != NULL,
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d", __FUNCTION__,
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __LINE__);
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::ViERender* vie_renderer = webrtc::ViERender::GetInterface(vie);
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(vie_renderer != NULL,
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d", __FUNCTION__,
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __LINE__);
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::ViECodec* vie_codec = webrtc::ViECodec::GetInterface(vie);
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(vie_codec != NULL,
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d", __FUNCTION__,
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __LINE__);
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::ViENetwork* vie_network = webrtc::ViENetwork::GetInterface(vie);
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(vie_network != NULL,
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d", __FUNCTION__,
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __LINE__);
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool start_call = false;
266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string ip_address;
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const unsigned int KMaxUniqueIdLength = 256;
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char unique_id[KMaxUniqueIdLength] = "";
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char device_name[KMaxUniqueIdLength] = "";
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int video_tx_port = 0;
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int video_rx_port = 0;
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int video_channel = -1;
273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::VideoCodec video_send_codec;
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char audio_capture_device_name[KMaxUniqueIdLength] = "";
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char audio_playbackDeviceName[KMaxUniqueIdLength] = "";
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int audio_capture_device_index = -1;
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int audio_playback_device_index = -1;
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int audio_tx_port = 0;
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int audio_rx_port = 0;
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::CodecInst audio_codec;
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int audio_channel = -1;
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoProtectionMethod protection_method = kProtectionMethodNone;
2839d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org  int buffer_delay_ms = 0;
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool is_image_scale_enabled = false;
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool remb = true;
286c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  webrtc::scoped_ptr<webrtc::test::VideoChannelTransport>
287c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org      video_channel_transport;
288c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org  webrtc::scoped_ptr<webrtc::test::VoiceChannelTransport>
289c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org      voice_channel_transport;
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  while (!start_call) {
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Get the IP address to use from call.
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ip_address = GetIPAddress();
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Get the video device to use for call.
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memset(device_name, 0, KMaxUniqueIdLength);
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memset(unique_id, 0, KMaxUniqueIdLength);
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!GetVideoDevice(vie_base, vie_capture, device_name, unique_id))
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return number_of_errors;
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Get and set the video ports for the call.
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    video_tx_port = 0;
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    video_rx_port = 0;
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    GetVideoPorts(&video_tx_port, &video_rx_port);
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Get and set the video codec parameters for the call.
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memset(&video_send_codec, 0, sizeof(webrtc::VideoCodec));
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetVideoCodecType(vie_codec, &video_send_codec);
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetVideoCodecSize(&video_send_codec);
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetVideoCodecBitrate(&video_send_codec);
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetVideoCodecMinBitrate(&video_send_codec);
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetVideoCodecMaxBitrate(&video_send_codec);
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetVideoCodecMaxFramerate(&video_send_codec);
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetVideoCodecTemporalLayer(&video_send_codec);
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    remb = GetBitrateSignaling();
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Get the video protection method for the call.
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    protection_method = GetVideoProtection();
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
3209d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org    // Get the call mode (Real-Time/Buffered).
3219d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org    buffer_delay_ms = GetBufferingDelay();
3229d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Get the audio device for the call.
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memset(audio_capture_device_name, 0, KMaxUniqueIdLength);
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memset(audio_playbackDeviceName, 0, KMaxUniqueIdLength);
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    GetAudioDevices(voe_base, voe_hardware, audio_capture_device_name,
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    audio_capture_device_index, audio_playbackDeviceName,
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    audio_playback_device_index);
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Get the audio port for the call.
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    audio_tx_port = 0;
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    audio_rx_port = 0;
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    GetAudioPorts(&audio_tx_port, &audio_rx_port);
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Get the audio codec for the call.
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memset(static_cast<void*>(&audio_codec), 0, sizeof(audio_codec));
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    GetAudioCodec(voe_codec, audio_codec);
338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Now ready to start the call.  Check user wants to continue.
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PrintCallInformation(ip_address.c_str(), device_name, unique_id,
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         video_send_codec, video_tx_port, video_rx_port,
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         audio_capture_device_name, audio_playbackDeviceName,
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         audio_codec, audio_tx_port, audio_rx_port,
344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         protection_method);
345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("\n");
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int selection =
3488969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org        FromChoices("Ready to start:",
3498969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org                    "Start the call\n"
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    "Reconfigure call settings\n")
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        .WithDefault("Start the call").Choose();
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    start_call = (selection == 1);
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /// **************************************************************
355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Begin create/initialize WebRTC Video Engine for testing.
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  /// **************************************************************
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (start_call == true) {
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Configure audio channel first.
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    audio_channel = voe_base->CreateChannel();
360c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org
361c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    voice_channel_transport.reset(
362c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org        new webrtc::test::VoiceChannelTransport(voe_network, audio_channel));
363c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org
364c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    error = voice_channel_transport->SetSendDestination(ip_address.c_str(),
365c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org                                                        audio_tx_port);
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
370c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    error = voice_channel_transport->SetLocalReceiver(audio_rx_port);
371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_hardware->SetRecordingDevice(audio_capture_device_index);
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_hardware->SetPlayoutDevice(audio_playback_device_index);
381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_codec->SetSendCodec(audio_channel, audio_codec);
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_apm->SetAgcStatus(true, webrtc::kAgcDefault);
391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_apm->SetNsStatus(true, webrtc::kNsHighSuppression);
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Now configure the video channel.
400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie->SetTraceFilter(webrtc::kTraceAll);
401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::string trace_file =
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        ViETest::GetResultOutputPath() + "ViECustomCall_trace.txt";
407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie->SetTraceFile(trace_file.c_str());
408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->SetVoiceEngine(voe);
413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->CreateChannel(video_channel);
418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->ConnectAudioChannel(video_channel, audio_channel);
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int capture_id = 0;
428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_capture->AllocateCaptureDevice(unique_id,
429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                               KMaxUniqueIdLength,
430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                               capture_id);
431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_capture->ConnectCaptureDevice(capture_id, video_channel);
436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_capture->StartCapture(capture_id);
441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::ViERTP_RTCP* vie_rtp_rtcp =
446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        webrtc::ViERTP_RTCP::GetInterface(vie);
447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(vie != NULL,
448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_rtp_rtcp->SetRTCPStatus(video_channel,
452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                        webrtc::kRtcpCompound_RFC4585);
453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_rtp_rtcp->SetKeyFrameRequestMethod(
458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        video_channel, webrtc::kViEKeyFrameRequestPliRtcp);
459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (remb) {
464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      error = vie_rtp_rtcp->SetRembStatus(video_channel, true, true);
465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      number_of_errors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             __FUNCTION__, __LINE__);
467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else  {
468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      error = vie_rtp_rtcp->SetTMMBRStatus(video_channel, true);
469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      number_of_errors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             __FUNCTION__, __LINE__);
471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_renderer->AddRenderer(capture_id, _window1, 0, 0.0, 0.0, 1.0,
474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      1.0);
475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
479b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org
480b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org    ViEToFileRenderer file_renderer;
481b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org    if (FLAGS_render_custom_call_remote_to == "") {
482b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org      error = vie_renderer->AddRenderer(video_channel, _window2, 1, 0.0, 0.0,
483b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org                                        1.0, 1.0);
484b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org      number_of_errors += ViETest::TestError(error == 0,
485b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org                                             "ERROR: %s at line %d",
486b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org                                             __FUNCTION__, __LINE__);
487b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org    } else {
488b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org      std::string output_path = ViETest::GetResultOutputPath();
489b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org      std::string filename = FLAGS_render_custom_call_remote_to;
490b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org      ViETest::Log("Rendering remote stream to %s: you will not see any output "
491b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org          "in the second window.", (output_path + filename).c_str());
492b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org
493b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org      file_renderer.PrepareForRendering(output_path, filename);
494b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org      RenderToFile(vie_renderer, video_channel, &file_renderer);
495b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org    }
496c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org
497c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    video_channel_transport.reset(
498c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org        new webrtc::test::VideoChannelTransport(vie_network, video_channel));
499c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org
500c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    error = video_channel_transport->SetSendDestination(ip_address.c_str(),
501c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org                                                        video_tx_port);
502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
506c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    error = video_channel_transport->SetLocalReceiver(video_rx_port);
507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_codec->SetSendCodec(video_channel, video_send_codec);
512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_codec->SetReceiveCodec(video_channel, video_send_codec);
517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
5209d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org
5219d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org    // Set the call mode (conferencing/buffering)
5229d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org    error = vie_rtp_rtcp->SetSenderBufferingMode(video_channel,
5239d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org                                                    buffer_delay_ms);
5249d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org    number_of_errors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
5259d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org                                           __FUNCTION__, __LINE__);
5269d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org    error = vie_rtp_rtcp->SetReceiverBufferingMode(video_channel,
5279d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org                                                      buffer_delay_ms);
5289d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org    number_of_errors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
5299d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org                                           __FUNCTION__, __LINE__);
530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Set the Video Protection before start send and receive.
531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetVideoProtection(vie_codec, vie_rtp_rtcp,
532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                       video_channel, protection_method);
533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Start Voice Playout and Receive.
535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_base->StartReceive(audio_channel);
536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_base->StartPlayout(audio_channel);
541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_base->StartSend(audio_channel);
546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Now start the Video Send & Receive.
551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->StartSend(video_channel);
552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->StartReceive(video_channel);
557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_renderer->StartRender(capture_id);
562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_renderer->StartRender(video_channel);
567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViEAutotestEncoderObserver* codec_encoder_observer = NULL;
572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViEAutotestDecoderObserver* codec_decoder_observer = NULL;
573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //  Engine ready, wait for input.
575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Call started.
577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::cout << std::endl;
578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::cout << "Custom call started" << std::endl;
579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Modify call or stop call.
581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("\n");
582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int selection = FromChoices(
5838969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org        "And now?",
584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "Stop the call\n"
58589b36e984e3bd1cf3c5dba0e76232dbe191b89afkjellander@webrtc.org        "Modify the call\n"
58689b36e984e3bd1cf3c5dba0e76232dbe191b89afkjellander@webrtc.org        "Keep the call running indefinitely\n")
58789b36e984e3bd1cf3c5dba0e76232dbe191b89afkjellander@webrtc.org            .WithDefault("Keep the call running indefinitely").Choose();
58889b36e984e3bd1cf3c5dba0e76232dbe191b89afkjellander@webrtc.org    if (selection == 3) {
5897ab726855f2ceb9ff6365e3240668d58f45e6761andrew@webrtc.org        AutoTestSleep(std::numeric_limits<int>::max());
59089b36e984e3bd1cf3c5dba0e76232dbe191b89afkjellander@webrtc.org    }
591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    while (selection == 2) {
593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      // Keep on modifying the call until user stops the call.
594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      int modify_selection = FromChoices(
5958969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org          "Modify the call:",
596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "Stop call\n"
597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "Change Video Send Codec\n"
598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "Change Video Send Size by Common Resolutions\n"
599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "Change Video Send Size by Width & Height\n"
600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "Change Video Capture Device\n"
601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "Change Video Protection Method\n"
602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "Toggle Encoder Observer\n"
603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "Toggle Decoder Observer\n"
604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "Print Call Information\n"
605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "Print Call Statistics\n"
606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "Toggle Image Scaling (Warning: high CPU usage when enabled)\n")
607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              .WithDefault("Stop call")
608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              .Choose();
609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      switch (modify_selection) {
611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case 1:
612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          selection = 1;
613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          break;
614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case 2:
615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          // Change video codec.
616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          SetVideoCodecType(vie_codec, &video_send_codec);
617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          SetVideoCodecSize(&video_send_codec);
618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          SetVideoCodecBitrate(&video_send_codec);
619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          SetVideoCodecMinBitrate(&video_send_codec);
620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          SetVideoCodecMaxBitrate(&video_send_codec);
621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          SetVideoCodecMaxFramerate(&video_send_codec);
622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          SetVideoCodecTemporalLayer(&video_send_codec);
623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          PrintCallInformation(ip_address.c_str(), device_name,
624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               unique_id, video_send_codec,
625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               video_tx_port, video_rx_port,
626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_capture_device_name,
627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_playbackDeviceName, audio_codec,
628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_tx_port, audio_rx_port, protection_method);
629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_codec->SetSendCodec(video_channel, video_send_codec);
630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_codec->SetReceiveCodec(video_channel, video_send_codec);
634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          break;
638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case 3:
639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          // Change Video codec size by common resolution.
640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          SetVideoCodecResolution(&video_send_codec);
641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          PrintCallInformation(ip_address.c_str(), device_name,
642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               unique_id, video_send_codec,
643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               video_tx_port, video_rx_port,
644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_capture_device_name,
645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_playbackDeviceName, audio_codec,
646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_tx_port, audio_rx_port, protection_method);
647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_codec->SetSendCodec(video_channel, video_send_codec);
648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_codec->SetReceiveCodec(video_channel, video_send_codec);
652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          break;
656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case 4:
657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          // Change video codec by size height and width.
658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          SetVideoCodecSize(&video_send_codec);
659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          PrintCallInformation(ip_address.c_str(), device_name,
660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               unique_id, video_send_codec,
661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               video_tx_port, video_rx_port,
662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_capture_device_name,
663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_playbackDeviceName, audio_codec,
664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_tx_port, audio_rx_port, protection_method);
665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_codec->SetSendCodec(video_channel, video_send_codec);
666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_codec->SetReceiveCodec(video_channel, video_send_codec);
670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          break;
674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case 5:
675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_renderer->StopRender(capture_id);
676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_renderer->RemoveRenderer(capture_id);
680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_capture->StopCapture(capture_id);
684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_capture->DisconnectCaptureDevice(video_channel);
688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_capture->ReleaseCaptureDevice(capture_id);
692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          memset(device_name, 0, KMaxUniqueIdLength);
696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          memset(unique_id, 0, KMaxUniqueIdLength);
697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          if (!GetVideoDevice(vie_base, vie_capture, device_name, unique_id))
698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            return number_of_errors;
699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          capture_id = 0;
700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_capture->AllocateCaptureDevice(unique_id,
701b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                     KMaxUniqueIdLength,
702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                     capture_id);
703b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
704b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
705b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
706b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_capture->ConnectCaptureDevice(capture_id,
707b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                    video_channel);
708b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
709b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
710b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
711b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org
712b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org          assert(FLAGS_render_custom_call_remote_to == "" &&
713b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org                 "Not implemented to change video capture device when "
714b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org                 "rendering to file!");
715b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org
716b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_capture->StartCapture(capture_id);
717b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
718b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
719b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
720b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_renderer->AddRenderer(capture_id, _window1, 0, 0.0, 0.0,
721b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                            1.0, 1.0);
722b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
723b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
724b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
725b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          error = vie_renderer->StartRender(capture_id);
726b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          number_of_errors += ViETest::TestError(error == 0,
727b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 "ERROR: %s at line %d",
728b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 __FUNCTION__, __LINE__);
729b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          break;
730b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        case 6:
731b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          // Change the Video Protection.
732b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          protection_method = GetVideoProtection();
733b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          SetVideoProtection(vie_codec, vie_rtp_rtcp,
734b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                             video_channel, protection_method);
735b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          break;
7361a58dd79e8f119cde5ad26343fd11fba46e30630mikhal@webrtc.org        case 7:
737b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          // Toggle Encoder Observer.
738b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          if (!codec_encoder_observer) {
739b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            std::cout << "Registering Encoder Observer" << std::endl;
740b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            codec_encoder_observer = new ViEAutotestEncoderObserver();
741b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            error = vie_codec->RegisterEncoderObserver(video_channel,
742b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                       *codec_encoder_observer);
743b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            number_of_errors += ViETest::TestError(error == 0,
744b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                   "ERROR: %s at line %d",
745b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                   __FUNCTION__, __LINE__);
746b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          } else {
747b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            std::cout << "Deregistering Encoder Observer" << std::endl;
748b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            error = vie_codec->DeregisterEncoderObserver(video_channel);
749b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            delete codec_encoder_observer;
750b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            codec_encoder_observer = NULL;
751b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            number_of_errors += ViETest::TestError(error == 0,
752b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                   "ERROR: %s at line %d",
753b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                   __FUNCTION__, __LINE__);
754b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
755b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          break;
7561a58dd79e8f119cde5ad26343fd11fba46e30630mikhal@webrtc.org        case 8:
757b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          // Toggle Decoder Observer.
758b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          if (!codec_decoder_observer) {
759b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            std::cout << "Registering Decoder Observer" << std::endl;
760b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            codec_decoder_observer = new ViEAutotestDecoderObserver();
761b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            error = vie_codec->RegisterDecoderObserver(video_channel,
762b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                       *codec_decoder_observer);
763b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            number_of_errors += ViETest::TestError(error == 0,
764b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                   "ERROR: %s at line %d",
765b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                   __FUNCTION__, __LINE__);
766b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          } else {
767b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            std::cout << "Deregistering Decoder Observer" << std::endl;
768b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            error = vie_codec->DeregisterDecoderObserver(video_channel);
769b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            delete codec_decoder_observer;
770b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            codec_decoder_observer = NULL;
771b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            number_of_errors += ViETest::TestError(error == 0,
772b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                   "ERROR: %s at line %d",
773b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                   __FUNCTION__, __LINE__);
774b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
775b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          break;
7761a58dd79e8f119cde5ad26343fd11fba46e30630mikhal@webrtc.org        case 9:
777b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          // Print Call information..
778b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          PrintCallInformation(ip_address.c_str(), device_name,
779b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               unique_id, video_send_codec,
780b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               video_tx_port, video_rx_port,
781b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_capture_device_name,
782b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_playbackDeviceName,
783b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_codec, audio_tx_port,
784b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               audio_rx_port, protection_method);
785b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          PrintVideoStreamInformation(vie_codec,
786b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                      video_channel);
787b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          break;
7881a58dd79e8f119cde5ad26343fd11fba46e30630mikhal@webrtc.org        case 10:
789b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          // Print Call statistics.
790b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          PrintRTCCPStatistics(vie_rtp_rtcp, video_channel,
791b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               kSendStatistic);
792b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          PrintRTCCPStatistics(vie_rtp_rtcp, video_channel,
793b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               kReceivedStatistic);
794b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          PrintRTPStatistics(vie_rtp_rtcp, video_channel);
795b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          PrintBandwidthUsage(vie_rtp_rtcp, video_channel);
796b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          PrintCodecStatistics(vie_codec, video_channel,
797b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               kSendStatistic);
798b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          PrintCodecStatistics(vie_codec, video_channel,
799b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               kReceivedStatistic);
800b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          PrintGetDiscardedPackets(vie_codec, video_channel);
801b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          break;
8021a58dd79e8f119cde5ad26343fd11fba46e30630mikhal@webrtc.org        case 11:
803b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          is_image_scale_enabled = !is_image_scale_enabled;
804b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          vie_codec->SetImageScaleStatus(video_channel, is_image_scale_enabled);
805b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          if (is_image_scale_enabled) {
806b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            std::cout << "Image Scale is now enabled" << std::endl;
807b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          } else {
808b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            std::cout << "Image Scale is now disabled" << std::endl;
809b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          }
810b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          break;
811b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        default:
812b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          assert(false);
813b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          break;
814b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
815b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
816b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
817b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org    if (FLAGS_render_custom_call_remote_to != "")
818b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org      file_renderer.StopRendering();
819b2feb571c36a7d058358e7a7e4e5f21c2c313a74phoglund@webrtc.org
820b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Testing finished. Tear down Voice and Video Engine.
821b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Tear down the VoE first.
822b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_base->StopReceive(audio_channel);
823b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
824b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
825b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
826b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
827b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_base->StopPlayout(audio_channel);
828b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
829b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
830b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
831b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
832b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_base->DeleteChannel(audio_channel);
833b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
834b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
835b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
836b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Now tear down the ViE engine.
837b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->DisconnectAudioChannel(video_channel);
838b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
839c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org    voice_channel_transport.reset(NULL);
840c075e2547e9da14bb80fb16c07fd64052d10dd9bpwestin@webrtc.org
841b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // If Encoder/Decoder Observer is running, delete them.
842b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (codec_encoder_observer) {
843b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      error = vie_codec->DeregisterEncoderObserver(video_channel);
844b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      delete codec_encoder_observer;
845b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      number_of_errors += ViETest::TestError(error == 0,
846b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             "ERROR: %s at line %d",
847b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             __FUNCTION__, __LINE__);
848b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
849b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (codec_decoder_observer) {
850b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      error = vie_codec->DeregisterDecoderObserver(video_channel);
851b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      delete codec_decoder_observer;
852b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      number_of_errors += ViETest::TestError(error == 0,
853b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             "ERROR: %s at line %d",
854b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             __FUNCTION__, __LINE__);
855b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
856b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
857b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->StopReceive(video_channel);
858b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
859b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
860b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
861b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
862b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->StopSend(video_channel);
863b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
864b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
865b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
866b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
867b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_renderer->StopRender(capture_id);
868b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
869b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
870b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
871b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
872b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_renderer->StopRender(video_channel);
873b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
874b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
875b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
876b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
877b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_renderer->RemoveRenderer(capture_id);
878b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
879b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
880b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
881b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
882b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_renderer->RemoveRenderer(video_channel);
883b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
884b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
885b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
886b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
887b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_capture->StopCapture(capture_id);
888b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
889b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
890b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
891b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
892b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_capture->DisconnectCaptureDevice(video_channel);
893b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
894b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
895b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
896b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
897b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_capture->ReleaseCaptureDevice(capture_id);
898b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
899b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
900b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
901b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
902422a12490e5c19dc2b49a168c084289aa2e70124pwestin@webrtc.org    video_channel_transport.reset(NULL);
903422a12490e5c19dc2b49a168c084289aa2e70124pwestin@webrtc.org
904b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_base->DeleteChannel(video_channel);
905b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
906b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
907b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
908b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
909b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int remaining_interfaces = 0;
910b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    remaining_interfaces = vie_codec->Release();
911b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(remaining_interfaces == 0,
912b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
913b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
914b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
915b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    remaining_interfaces = vie_capture->Release();
916b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(remaining_interfaces == 0,
917b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
918b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
919b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
920b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    remaining_interfaces = vie_rtp_rtcp->Release();
921b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(remaining_interfaces == 0,
922b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
923b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
924b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
925b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    remaining_interfaces = vie_renderer->Release();
926b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(remaining_interfaces == 0,
927b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
928b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
929b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
930b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    remaining_interfaces = vie_network->Release();
931b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(remaining_interfaces == 0,
932b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
933b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
934b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
935b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    remaining_interfaces = vie_base->Release();
936b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(remaining_interfaces == 0,
937b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
938b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
939b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
940b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool deleted = webrtc::VideoEngine::Delete(vie);
941b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(deleted == true,
942b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
943b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
944b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
945b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViETest::Log(" ");
946b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViETest::Log(" ViE Autotest Custom Call Started");
947b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViETest::Log("========================================");
948b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViETest::Log(" ");
949b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
950b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return number_of_errors;
951b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
952b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
953b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool GetVideoDevice(webrtc::ViEBase* vie_base,
954b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    webrtc::ViECapture* vie_capture,
955b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    char* capture_device_name,
956b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                    char* capture_device_unique_id) {
957b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int error = 0;
958b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int number_of_errors = 0;
959b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
960b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const unsigned int KMaxDeviceNameLength = 128;
961b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const unsigned int KMaxUniqueIdLength = 256;
962b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char device_name[KMaxDeviceNameLength];
963b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char unique_id[KMaxUniqueIdLength];
964b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
965b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_capture->NumberOfCaptureDevices() == 0) {
966b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("You have no capture devices plugged into your system.\n");
967b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
968b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
969b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
970b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string capture_choices;
971b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string first_device;
972b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < vie_capture->NumberOfCaptureDevices(); i++) {
973b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memset(device_name, 0, KMaxDeviceNameLength);
974b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memset(unique_id, 0, KMaxUniqueIdLength);
975b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
976b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_capture->GetCaptureDevice(i, device_name,
977b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        KMaxDeviceNameLength,
978b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        unique_id,
979b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        KMaxUniqueIdLength);
980b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
981b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "ERROR: %s at line %d",
982b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        __FUNCTION__, __LINE__);
983b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const int kCaptureLineLength =
984b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        KMaxDeviceNameLength + KMaxUniqueIdLength + 8;
985b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char capture_line[kCaptureLineLength];
986b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sprintf(capture_line, "%s (%s)", device_name, unique_id);
987b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    capture_choices += capture_line;
988b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    capture_choices += "\n";
989b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (first_device.empty())
990b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      first_device = capture_line;
991b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
992b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
9938969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  int choice = FromChoices("Available Video Capture Devices", capture_choices)
994b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(first_device)
995b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .Choose();
996b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
997b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_capture->GetCaptureDevice(
998b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      choice - 1, device_name, KMaxDeviceNameLength, unique_id,
999b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      KMaxUniqueIdLength);
1000b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(error == 0,
1001b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "ERROR: %s at line %d",
1002b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      __FUNCTION__, __LINE__);
1003b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  strcpy(capture_device_unique_id, unique_id);
1004b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  strcpy(capture_device_name, device_name);
1005b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return true;
1006b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1007b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1008b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool GetAudioDevices(webrtc::VoEBase* voe_base,
1009b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     webrtc::VoEHardware* voe_hardware,
1010b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     char* recording_device_name,
1011b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     int& recording_device_index,
1012b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     char* playback_device_name,
1013b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                     int& playback_device_index) {
1014b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int error = 0;
1015b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int number_of_errors = 0;
1016b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1017b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const unsigned int KMaxDeviceNameLength = 128;
1018b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  const unsigned int KMaxUniqueIdLength = 128;
1019b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char recording_device_unique_name[KMaxDeviceNameLength];
1020b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  char playback_device_unique_name[KMaxUniqueIdLength];
1021b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1022b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int number_of_recording_devices = -1;
1023b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = voe_hardware->GetNumOfRecordingDevices(number_of_recording_devices);
1024b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
1025b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __FUNCTION__, __LINE__);
1026b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1027b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  recording_device_index = -1;
1028b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  playback_device_index = -1;
1029b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1030b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string device_choices;
1031b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string default_recording_line;
1032b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < number_of_recording_devices; ++i) {
1033b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_hardware->GetRecordingDeviceName(
1034b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        i, recording_device_name, recording_device_unique_name);
1035b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
1036b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "ERROR: %s at line %d",
1037b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        __FUNCTION__, __LINE__);
1038b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1039b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    device_choices += recording_device_name;
1040b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    device_choices += "\n";
1041b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (default_recording_line.empty())
1042b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      default_recording_line = recording_device_name;
1043b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1044b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
10458969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  int choice = FromChoices("Available audio capture devices:", device_choices)
1046b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(default_recording_line)
1047b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .Choose();
1048b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1049b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  recording_device_index = choice - 1;
1050b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = voe_hardware->GetRecordingDeviceName(
1051b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      recording_device_index, recording_device_name,
1052b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      recording_device_unique_name);
1053b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(
1054b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      error == 0, "ERROR: %s at line %d", __FUNCTION__, __LINE__);
1055b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1056b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int number_of_playback_devices = -1;
1057b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = voe_hardware->GetNumOfPlayoutDevices(number_of_playback_devices);
1058b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(error == 0, "ERROR: %s at line %d",
1059b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __FUNCTION__, __LINE__);
1060b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1061b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1062b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string playback_choices;
1063b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string default_playback_line;
1064b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < number_of_playback_devices; i++) {
1065b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_hardware->GetPlayoutDeviceName(i,
1066b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        playback_device_name,
1067b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        playback_device_unique_name);
1068b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(
1069b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        error == 0, "ERROR: %s at line %d", __FUNCTION__, __LINE__);
1070b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    playback_choices += playback_device_name;
1071b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    playback_choices += "\n";
1072b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (default_playback_line.empty())
1073b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      default_playback_line = playback_device_name;
1074b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1075b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
10768969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  choice = FromChoices("Available audio playout devices:", playback_choices)
1077b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(default_playback_line)
1078b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .Choose();
1079b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1080b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  playback_device_index = choice - 1;
1081b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = voe_hardware->GetPlayoutDeviceName(playback_device_index,
1082b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      playback_device_name,
1083b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      playback_device_unique_name);
1084b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(error == 0,
1085b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "ERROR: %s at line %d",
1086b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      __FUNCTION__, __LINE__);
1087b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return true;
1088b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1089b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1090b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// General helper functions.
1091b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1092b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string GetIPAddress() {
1093b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  class IpValidator : public webrtc::InputValidator {
1094b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org   public:
1095b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool InputOk(const std::string& input) const {
1096b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      // Just check quickly that it's on the form x.y.z.w
1097b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return std::count(input.begin(), input.end(), '.') == 3;
1098b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1099b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  };
11008969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  return TypedInput("Enter destination IP.")
1101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(DEFAULT_SEND_IP)
1102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithInputValidator(new IpValidator())
1103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .AskForInput();
1104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Video settings functions.
1107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid GetVideoPorts(int* tx_port, int* rx_port) {
11098969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  std::string tx_input = TypedInput("Enter video send port.")
1110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(DEFAULT_VIDEO_PORT)
1111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithInputValidator(new webrtc::IntegerWithinRangeValidator(1, 65536))
1112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .AskForInput();
1113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  *tx_port = atoi(tx_input.c_str());
1114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11158969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  std::string rx_input = TypedInput("Enter video receive port.")
1116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(DEFAULT_VIDEO_PORT)
1117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithInputValidator(new webrtc::IntegerWithinRangeValidator(1, 65536))
1118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .AskForInput();
1119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  *rx_port = atoi(rx_input.c_str());
1120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Audio settings functions.
1123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid GetAudioPorts(int* tx_port, int* rx_port) {
11258969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  std::string tx_input = TypedInput("Enter audio send port.")
1126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(DEFAULT_AUDIO_PORT)
1127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithInputValidator(new webrtc::IntegerWithinRangeValidator(1, 65536))
1128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .AskForInput();
1129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  *tx_port = atoi(tx_input.c_str());
1130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11318969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  std::string rx_input = TypedInput("Enter audio receive port.")
1132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(DEFAULT_AUDIO_PORT)
1133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithInputValidator(new webrtc::IntegerWithinRangeValidator(1, 65536))
1134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .AskForInput();
1135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  *rx_port = atoi(rx_input.c_str());
1136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool GetAudioCodec(webrtc::VoECodec* voe_codec,
1139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                   webrtc::CodecInst& audio_codec) {
1140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int error = 0;
1141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  memset(&audio_codec, 0, sizeof(webrtc::CodecInst));
1142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string default_codec_line;
1144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string codec_choices;
1145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int codec_idx = 0; codec_idx < voe_codec->NumOfCodecs(); codec_idx++) {
1146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = voe_codec->GetCodec(codec_idx, audio_codec);
1147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViETest::TestError(error == 0,
1148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "ERROR: %s at line %d",
1149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        __FUNCTION__, __LINE__);
1150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char codec_line[128];
1152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    sprintf(codec_line, "%s type: %d freq: %d chan: %d",
1153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        audio_codec.plname, audio_codec.pltype, audio_codec.plfreq,
1154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        audio_codec.channels);
1155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    codec_choices += codec_line;
1156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    codec_choices += "\n";
1157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (strcmp(audio_codec.plname, DEFAULT_AUDIO_CODEC) == 0) {
1159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      default_codec_line = codec_line;
1160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
1161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  assert(!default_codec_line.empty() && "Default codec doesn't exist.");
1163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11648969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  int codec_selection = FromChoices("Available Audio Codecs:", codec_choices)
1165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            .WithDefault(default_codec_line)
1166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            .Choose();
1167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = voe_codec->GetCodec(codec_selection - 1, audio_codec);
1169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViETest::TestError(error == 0,
1170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "ERROR: %s at line %d",
1171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      __FUNCTION__, __LINE__);
1172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return true;
1173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintCallInformation(const char* IP, const char* video_capture_device_name,
1176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          const char* video_capture_unique_id,
1177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          webrtc::VideoCodec video_codec,
1178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int video_tx_port, int video_rx_port,
1179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          const char* audio_capture_device_name,
1180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          const char* audio_playbackDeviceName,
1181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          webrtc::CodecInst audio_codec,
1182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int audio_tx_port, int audio_rx_port,
1183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int protection_method) {
1184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string str;
1185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "************************************************"
1187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "The call has the following settings: " << std::endl;
1189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tIP: " << IP << std::endl;
1190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tVideo Capture Device: " << video_capture_device_name
1191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t\tName: " << video_capture_device_name << std::endl;
1193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t\tUniqueId: " << video_capture_unique_id << std::endl;
1194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  PrintVideoCodec(video_codec);
1195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t Video Tx Port: " << video_tx_port << std::endl;
1196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t Video Rx Port: " << video_rx_port << std::endl;
1197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t Video Protection Method (NOTE: Starts at 1 now): "
1198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << protection_method  << std::endl;
1199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tAudio Capture Device: " << audio_capture_device_name
1200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tAudio Playback Device: " << audio_playbackDeviceName
1202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tAudio Codec: " << std::endl;
1204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t\tplname: " << audio_codec.plname << std::endl;
1205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t\tpltype: " << static_cast<int>(audio_codec.pltype)
1206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t Audio Tx Port: " << audio_tx_port << std::endl;
1208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t Audio Rx Port: " << audio_rx_port << std::endl;
1209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "************************************************"
1210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecType(webrtc::ViECodec* vie_codec,
1214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                       webrtc::VideoCodec* video_codec) {
1215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int error = 0;
1216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int number_of_errors = 0;
1217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  memset(video_codec, 0, sizeof(webrtc::VideoCodec));
1218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string codec_choices;
1220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::string default_codec_line;
1221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < vie_codec->NumberOfCodecs(); i++) {
1222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_codec->GetCodec(i, *video_codec);
1223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(
1224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        error == 0, "ERROR: %s at line %d", __FUNCTION__, __LINE__);
1225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    codec_choices += video_codec->plName;
1227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    codec_choices += "\n";
1228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (strcmp(video_codec->plName, DEFAULT_VIDEO_CODEC) == 0)
1229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      default_codec_line = video_codec->plName;
1230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  assert(!default_codec_line.empty() && "Default does not exist.");
1232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
12338969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  int choice = FromChoices("Available Video Codecs", codec_choices)
1234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(default_codec_line)
1235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .Choose();
1236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_codec->GetCodec(choice - 1, *video_codec);
1237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(
1238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      error == 0, "ERROR: %s at line %d", __FUNCTION__, __LINE__);
1239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (video_codec->codecType == webrtc::kVideoCodecI420) {
1241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    video_codec->width = 176;
1242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    video_codec->height = 144;
1243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecResolution(webrtc::VideoCodec* video_codec) {
1247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (video_codec->codecType != webrtc::kVideoCodecVP8) {
1248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("Can only change codec size if it's VP8\n");
1249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return;
1250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int choice = FromChoices(
12538969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org      "Available Common Resolutions:",
1254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SQCIF (128X96)\n"
1255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "QQVGA (160X120)\n"
1256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "QCIF  (176X144)\n"
1257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "CIF   (352X288)\n"
1258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "VGA   (640X480)\n"
1259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "WVGA  (800x480)\n"
1260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "4CIF  (704X576)\n"
1261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SVGA  (800X600)\n"
1262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "HD    (1280X720)\n"
1263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "XGA   (1024x768)\n")
1264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          .Choose();
1265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  switch (choice) {
1267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case 1:
1268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->width = 128;
1269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->height = 96;
1270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case 2:
1272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->width = 160;
1273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->height = 120;
1274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case 3:
1276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->width = 176;
1277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->height = 144;
1278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case 4:
1280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->width = 352;
1281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->height = 288;
1282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case 5:
1284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->width = 640;
1285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->height = 480;
1286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case 6:
1288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->width = 800;
1289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->height = 480;
1290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case 7:
1292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->width = 704;
1293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->height = 576;
1294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case 8:
1296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->width = 800;
1297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->height = 600;
1298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case 9:
1300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->width = 1280;
1301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->height = 720;
1302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case 10:
1304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->width = 1024;
1305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec->height = 768;
1306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecSize(webrtc::VideoCodec* video_codec) {
1311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (video_codec->codecType != webrtc::kVideoCodecVP8) {
1312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    printf("Can only change codec size if it's VP8\n");
1313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return;
1314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13168969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  std::string input = TypedInput("Choose video width.")
1317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(DEFAULT_VIDEO_CODEC_WIDTH)
1318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithInputValidator(new webrtc::IntegerWithinRangeValidator(1, INT_MAX))
1319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .AskForInput();
1320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->width = atoi(input.c_str());
1321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13228969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  input = TypedInput("Choose video height.")
1323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(DEFAULT_VIDEO_CODEC_HEIGHT)
1324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithInputValidator(new webrtc::IntegerWithinRangeValidator(1, INT_MAX))
1325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .AskForInput();
1326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->height = atoi(input.c_str());
1327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecBitrate(webrtc::VideoCodec* video_codec) {
13308969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  std::string input = TypedInput("Choose start rate (in kbps).")
1331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(DEFAULT_VIDEO_CODEC_BITRATE)
1332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithInputValidator(new webrtc::IntegerWithinRangeValidator(1, INT_MAX))
1333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .AskForInput();
1334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->startBitrate = atoi(input.c_str());
1336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecMaxBitrate(webrtc::VideoCodec* video_codec) {
13398969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  std::string input = TypedInput("Choose max bitrate (in kbps).")
1340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(DEFAULT_VIDEO_CODEC_MAX_BITRATE)
1341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithInputValidator(new webrtc::IntegerWithinRangeValidator(1, INT_MAX))
1342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .AskForInput();
1343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->maxBitrate = atoi(input.c_str());
1345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecMinBitrate(webrtc::VideoCodec* video_codec) {
13488969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  std::string input = TypedInput("Choose min bitrate (in kbps).")
1349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(DEFAULT_VIDEO_CODEC_MIN_BITRATE)
1350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithInputValidator(new webrtc::IntegerWithinRangeValidator(1, INT_MAX))
1351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .AskForInput();
1352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->minBitrate = atoi(input.c_str());
1354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecMaxFramerate(webrtc::VideoCodec* video_codec) {
13578969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  std::string input = TypedInput("Choose max framerate (in fps).")
1358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(DEFAULT_VIDEO_CODEC_MAX_FRAMERATE)
1359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithInputValidator(new webrtc::IntegerWithinRangeValidator(1, INT_MAX))
1360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .AskForInput();
1361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->maxFramerate = atoi(input.c_str());
1362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetVideoCodecTemporalLayer(webrtc::VideoCodec* video_codec) {
1365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (video_codec->codecType != webrtc::kVideoCodecVP8)
1366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return;
1367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13688969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org  std::string input = TypedInput("Choose number of temporal layers (0 to 4).")
1369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithDefault(DEFAULT_TEMPORAL_LAYER)
1370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WithInputValidator(new webrtc::IntegerWithinRangeValidator(0, 4))
1371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .AskForInput();
1372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_codec->codecSpecific.VP8.numberOfTemporalLayers = atoi(input.c_str());
1373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// GetVideoProtection only prints the prompt to get a number
1376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// that SetVideoProtection method uses.
1377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVideoProtectionMethod GetVideoProtection() {
1378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int choice = FromChoices(
13798969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org      "Available Video Protection Methods:",
1380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "None\n"
1381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "FEC\n"
1382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "NACK\n"
1383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "NACK+FEC\n")
1384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          .WithDefault(DEFAULT_VIDEO_PROTECTION_METHOD)
1385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          .Choose();
1386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  assert(choice >= kProtectionMethodNone &&
1388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org         choice <= kProtectionMethodHybridNackAndFec);
1389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return static_cast<VideoProtectionMethod>(choice);
1390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool SetVideoProtection(webrtc::ViECodec* vie_codec,
1393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        webrtc::ViERTP_RTCP* vie_rtp_rtcp,
1394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        int video_channel,
1395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        VideoProtectionMethod protection_method) {
1396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int error = 0;
1397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int number_of_errors = 0;
1398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::VideoCodec video_codec;
1399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  memset(&video_codec, 0, sizeof(webrtc::VideoCodec));
1401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Set all video protection to false initially
1403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_rtp_rtcp->SetHybridNACKFECStatus(video_channel, false,
1404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                               VCM_RED_PAYLOAD_TYPE,
1405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                               VCM_ULPFEC_PAYLOAD_TYPE);
1406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(error == 0,
1407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d",
1408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __FUNCTION__, __LINE__);
1409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_rtp_rtcp->SetFECStatus(video_channel, false,
1410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     VCM_RED_PAYLOAD_TYPE,
1411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     VCM_ULPFEC_PAYLOAD_TYPE);
1412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(error == 0,
1413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d",
1414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __FUNCTION__, __LINE__);
1415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_rtp_rtcp->SetNACKStatus(video_channel, false);
1416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(error == 0,
1417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d",
1418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __FUNCTION__, __LINE__);
1419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Set video protection for FEC, NACK or Hybrid.
1420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  switch (protection_method) {
1421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kProtectionMethodNone:
1422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      // No protection selected, all protection already at false.
1423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      std::cout << "Call using None protection Method" << std::endl;
1424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kProtectionMethodFecOnly:
1426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      std::cout << "Call using FEC protection Method" << std::endl;
1427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      error = vie_rtp_rtcp->SetFECStatus(video_channel, true,
1428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         VCM_RED_PAYLOAD_TYPE,
1429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         VCM_ULPFEC_PAYLOAD_TYPE);
1430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      number_of_errors += ViETest::TestError(error == 0,
1431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             "ERROR: %s at line %d",
1432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             __FUNCTION__, __LINE__);
1433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kProtectionMethodNackOnly:
1435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      std::cout << "Call using NACK protection Method" << std::endl;
1436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      error = vie_rtp_rtcp->SetNACKStatus(video_channel, true);
1437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      number_of_errors += ViETest::TestError(error == 0,
1438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             "ERROR: %s at line %d",
1439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             __FUNCTION__, __LINE__);
1440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kProtectionMethodHybridNackAndFec:
1442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      std::cout << "Call using Hybrid NACK and FEC protection Method"
1443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                << std::endl;
1444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      error = vie_rtp_rtcp->SetHybridNACKFECStatus(video_channel, true,
1445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                   VCM_RED_PAYLOAD_TYPE,
1446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                   VCM_ULPFEC_PAYLOAD_TYPE);
1447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      number_of_errors += ViETest::TestError(error == 0,
1448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             "ERROR: %s at line %d",
1449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             __FUNCTION__, __LINE__);
1450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Set receive codecs for FEC and hybrid NACK/FEC.
1454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (protection_method == kProtectionMethodFecOnly ||
1455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      protection_method == kProtectionMethodHybridNackAndFec) {
1456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // RED.
1457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_codec->GetCodec(vie_codec->NumberOfCodecs() - 2,
1458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                video_codec);
1459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
1460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
1461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
1462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    video_codec.plType = VCM_RED_PAYLOAD_TYPE;
1463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_codec->SetReceiveCodec(video_channel, video_codec);
1464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
1465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
1466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
1467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::cout << "RED Codec Information:" << std::endl;
1468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PrintVideoCodec(video_codec);
1469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // ULPFEC.
1470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_codec->GetCodec(vie_codec->NumberOfCodecs() - 1,
1471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                video_codec);
1472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
1473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
1474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
1475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    video_codec.plType = VCM_ULPFEC_PAYLOAD_TYPE;
1476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    error = vie_codec->SetReceiveCodec(video_channel, video_codec);
1477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    number_of_errors += ViETest::TestError(error == 0,
1478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           "ERROR: %s at line %d",
1479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           __FUNCTION__, __LINE__);
1480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::cout << "ULPFEC Codec Information:" << std::endl;
1481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    PrintVideoCodec(video_codec);
1482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return true;
1485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Returns true if REMB, false if TMMBR.
1488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool GetBitrateSignaling() {
1489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int choice = FromChoices(
14908969e9378a0ee22cf5601f7eaac5dd1b9546977cphoglund@webrtc.org      "Available Bitrate Signaling Methods:",
1491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "REMB\n"
1492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "TMMBR\n")
1493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          .WithDefault("REMB")
1494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          .Choose();
1495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return choice == 1;
1496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14989d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.orgint GetBufferingDelay() {
14999d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org  std::string input = TypedInput("Choose buffering delay (mS).")
15009d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org      .WithDefault(DEFAULT_BUFFERING_DELAY_MS)
15019d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org      .WithInputValidator(new webrtc::IntegerWithinRangeValidator(0, 10000))
15029d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org      .AskForInput();
15039d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org  std::string delay_ms = input;
15049d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org  return atoi(delay_ms.c_str());
15059d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org}
15069d6fcb37be4c9f49e1bb0b32bb01314c31f5e1ddmikhal@webrtc.org
1507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintRTCCPStatistics(webrtc::ViERTP_RTCP* vie_rtp_rtcp,
1508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int video_channel,
1509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          StatisticsType stat_type) {
1510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int error = 0;
1511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int number_of_errors = 0;
15124673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org  webrtc::RtcpStatistics rtcp_stats;
1513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int rtt_ms = 0;
1514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  switch (stat_type) {
1516b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kReceivedStatistic:
1517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      std::cout << "RTCP Received statistics"
1518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                << std::endl;
1519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      // Get and print the Received RTCP Statistics
15204673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org      error = vie_rtp_rtcp->GetReceiveChannelRtcpStatistics(video_channel,
15214673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org                                                      rtcp_stats,
15224673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org                                                      rtt_ms);
1523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      number_of_errors += ViETest::TestError(error == 0,
1524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             "ERROR: %s at line %d",
1525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             __FUNCTION__, __LINE__);
1526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kSendStatistic:
1528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      std::cout << "RTCP Sent statistics"
1529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                << std::endl;
1530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      // Get and print the Sent RTCP Statistics
15314673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org      error = vie_rtp_rtcp->GetSendChannelRtcpStatistics(video_channel,
15324673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org                                                  rtcp_stats,
15334673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org                                                  rtt_ms);
1534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      number_of_errors += ViETest::TestError(error == 0,
1535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             "ERROR: %s at line %d",
1536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             __FUNCTION__, __LINE__);
1537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tRTCP fraction of lost packets: "
15404673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org            << rtcp_stats.fraction_lost << std::endl;
1541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tRTCP cumulative number of lost packets: "
15424673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org            << rtcp_stats.cumulative_lost << std::endl;
1543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tRTCP max received sequence number "
15444673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org            << rtcp_stats.extended_max_sequence_number << std::endl;
1545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tRTCP jitter: "
15464673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org            << rtcp_stats.jitter << std::endl;
1547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tRTCP round trip (ms): "
1548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << rtt_ms << std::endl;
1549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintRTPStatistics(webrtc::ViERTP_RTCP* vie_rtp_rtcp,
1552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                        int video_channel) {
1553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int error = 0;
1554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int number_of_errors = 0;
15554673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org  webrtc::StreamDataCounters sent;
15564673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org  webrtc::StreamDataCounters received;
1557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "RTP statistics"
1559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Get and print the RTP Statistics
15624673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org  error = vie_rtp_rtcp->GetRtpStatistics(video_channel, sent, received);
1563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(error == 0,
1564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d",
1565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __FUNCTION__, __LINE__);
1566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tRTP bytes sent: "
15674673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org            << sent.bytes << std::endl;
1568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tRTP packets sent: "
15694673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org            << sent.packets << std::endl;
1570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tRTP bytes received: "
15714673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org            << received.bytes << std::endl;
1572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tRTP packets received: "
15734673674e7fc7768f78bfc90f698ccf14a874fce1sprang@webrtc.org            << received.packets << std::endl;
1574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintBandwidthUsage(webrtc::ViERTP_RTCP* vie_rtp_rtcp,
1577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                         int video_channel) {
1578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int error = 0;
1579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int number_of_errors = 0;
1580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  unsigned int total_bitrate_sent = 0;
1581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  unsigned int video_bitrate_sent = 0;
1582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  unsigned int fec_bitrate_sent = 0;
1583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  unsigned int nack_bitrate_sent = 0;
1584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  double percentage_fec = 0;
1585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  double percentage_nack = 0;
1586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "Bandwidth Usage" << std::endl;
1588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Get and print Bandwidth usage
1590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  error = vie_rtp_rtcp->GetBandwidthUsage(video_channel, total_bitrate_sent,
1591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          video_bitrate_sent, fec_bitrate_sent,
1592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          nack_bitrate_sent);
1593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  number_of_errors += ViETest::TestError(error == 0,
1594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         "ERROR: %s at line %d",
1595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                         __FUNCTION__, __LINE__);
1596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tTotal bitrate sent (Kbit/s): "
1597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << total_bitrate_sent << std::endl;
1598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tVideo bitrate sent (Kbit/s): "
1599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << video_bitrate_sent << std::endl;
1600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tFEC bitrate sent (Kbit/s): "
1601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << fec_bitrate_sent << std::endl;
1602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  percentage_fec =
1603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      (static_cast<double>(fec_bitrate_sent) /
1604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      static_cast<double>(total_bitrate_sent)) * 100;
1605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tPercentage FEC bitrate sent from total bitrate: "
1606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << percentage_fec << std::endl;
1607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tNACK bitrate sent (Kbit/s): "
1608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << nack_bitrate_sent << std::endl;
1609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  percentage_nack =
1610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      (static_cast<double>(nack_bitrate_sent) /
1611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      static_cast<double>(total_bitrate_sent)) * 100;
1612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tPercentage NACK bitrate sent from total bitrate: "
1613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << percentage_nack << std::endl;
1614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintCodecStatistics(webrtc::ViECodec* vie_codec,
1617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          int video_channel,
1618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          StatisticsType stat_type) {
1619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int error = 0;
1620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int number_of_errors = 0;
1621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  unsigned int key_frames = 0;
1622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  unsigned int delta_frames = 0;
1623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  switch (stat_type) {
1624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kReceivedStatistic:
1625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      std::cout << "Codec Receive statistics"
1626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                << std::endl;
1627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      // Get and print the Receive Codec Statistics
1628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      error = vie_codec->GetReceiveCodecStastistics(video_channel, key_frames,
1629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                    delta_frames);
1630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      number_of_errors += ViETest::TestError(error == 0,
1631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             "ERROR: %s at line %d",
1632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             __FUNCTION__, __LINE__);
1633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kSendStatistic:
1635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      std::cout << "Codec Send statistics"
1636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                << std::endl;
1637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      // Get and print the Send Codec Statistics
1638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      error = vie_codec->GetSendCodecStastistics(video_channel, key_frames,
1639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                 delta_frames);
1640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      number_of_errors += ViETest::TestError(error == 0,
1641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             "ERROR: %s at line %d",
1642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                             __FUNCTION__, __LINE__);
1643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
1644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tNumber of encoded key frames: "
1646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << key_frames << std::endl;
1647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tNumber of encoded delta frames: "
1648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << delta_frames << std::endl;
1649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintGetDiscardedPackets(webrtc::ViECodec* vie_codec, int video_channel) {
1652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "Discarded Packets" << std::endl;
1653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int discarded_packets = 0;
165466a45b1ce8380ffb3fffabebe1e49d1904c6bfc0asapersson@webrtc.org  discarded_packets = vie_codec->GetNumDiscardedPackets(video_channel);
1655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\tNumber of discarded packets: "
1656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << discarded_packets << std::endl;
1657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintVideoStreamInformation(webrtc::ViECodec* vie_codec,
1660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                 int video_channel) {
1661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::VideoCodec outgoing_codec;
1662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  webrtc::VideoCodec incoming_codec;
1663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  memset(&outgoing_codec, 0, sizeof(webrtc::VideoCodec));
1665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  memset(&incoming_codec, 0, sizeof(webrtc::VideoCodec));
1666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  vie_codec->GetSendCodec(video_channel, outgoing_codec);
1668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  vie_codec->GetReceiveCodec(video_channel, incoming_codec);
1669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "************************************************"
1671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "ChannelId: " << video_channel << std::endl;
1673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "Outgoing Stream information:" << std::endl;
1674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  PrintVideoCodec(outgoing_codec);
1675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "Incoming Stream information:" << std::endl;
1676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  PrintVideoCodec(incoming_codec);
1677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "************************************************"
1678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid PrintVideoCodec(webrtc::VideoCodec video_codec) {
1682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t\tplName: " << video_codec.plName << std::endl;
1683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t\tplType: " << static_cast<int>(video_codec.plType)
1684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t\twidth: " << video_codec.width << std::endl;
1686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t\theight: " << video_codec.height << std::endl;
1687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t\tstartBitrate: " << video_codec.startBitrate
1688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t\tminBitrate: " << video_codec.minBitrate
1690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t\tmaxBitrate: " << video_codec.maxBitrate
1692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << std::endl;
1693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  std::cout << "\t\tmaxFramerate: "
1694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            << static_cast<int>(video_codec.maxFramerate) << std::endl;
1695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (video_codec.codecType == webrtc::kVideoCodecVP8) {
1696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    int number_of_layers =
1697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        static_cast<int>(video_codec.codecSpecific.VP8.numberOfTemporalLayers);
1698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    std::cout << "\t\tVP8 Temporal Layer: " << number_of_layers << std::endl;
1699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1701