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