1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 // This sub-API supports the following functionalities: 12 // 13 // - Creating and deleting VideoEngine instances. 14 // - Creating and deleting channels. 15 // - Connect a video channel with a corresponding voice channel for audio/video 16 // synchronization. 17 // - Start and stop sending and receiving. 18 19 #ifndef WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_BASE_H_ 20 #define WEBRTC_VIDEO_ENGINE_INCLUDE_VIE_BASE_H_ 21 22 #include "webrtc/common_types.h" 23 24 #if defined(ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD) 25 #include <jni.h> 26 #endif 27 28 namespace webrtc { 29 30 class Config; 31 class VoiceEngine; 32 33 // CpuOveruseObserver is called when a system overuse is detected and 34 // VideoEngine cannot keep up the encoding frequency. 35 class CpuOveruseObserver { 36 public: 37 // Called as soon as an overuse is detected. 38 virtual void OveruseDetected() = 0; 39 // Called periodically when the system is not overused any longer. 40 virtual void NormalUsage() = 0; 41 42 protected: 43 virtual ~CpuOveruseObserver() {} 44 }; 45 46 // Limits on standard deviation for under/overuse. 47 #ifdef WEBRTC_ANDROID 48 const float kOveruseStdDevMs = 32.0f; 49 const float kNormalUseStdDevMs = 27.0f; 50 #elif WEBRTC_LINUX 51 const float kOveruseStdDevMs = 20.0f; 52 const float kNormalUseStdDevMs = 14.0f; 53 #elif WEBRTC_MAC 54 const float kOveruseStdDevMs = 27.0f; 55 const float kNormalUseStdDevMs = 21.0f; 56 #elif WEBRTC_WIN 57 const float kOveruseStdDevMs = 20.0f; 58 const float kNormalUseStdDevMs = 14.0f; 59 #else 60 const float kOveruseStdDevMs = 30.0f; 61 const float kNormalUseStdDevMs = 20.0f; 62 #endif 63 64 struct CpuOveruseOptions { 65 CpuOveruseOptions() 66 : enable_capture_jitter_method(true), 67 low_capture_jitter_threshold_ms(kNormalUseStdDevMs), 68 high_capture_jitter_threshold_ms(kOveruseStdDevMs), 69 enable_encode_usage_method(false), 70 low_encode_usage_threshold_percent(60), 71 high_encode_usage_threshold_percent(90), 72 low_encode_time_rsd_threshold(-1), 73 high_encode_time_rsd_threshold(-1), 74 frame_timeout_interval_ms(1500), 75 min_frame_samples(120), 76 min_process_count(3), 77 high_threshold_consecutive_count(2) {} 78 79 // Method based on inter-arrival jitter of captured frames. 80 bool enable_capture_jitter_method; 81 float low_capture_jitter_threshold_ms; // Threshold for triggering underuse. 82 float high_capture_jitter_threshold_ms; // Threshold for triggering overuse. 83 // Method based on encode time of frames. 84 bool enable_encode_usage_method; 85 int low_encode_usage_threshold_percent; // Threshold for triggering underuse. 86 int high_encode_usage_threshold_percent; // Threshold for triggering overuse. 87 int low_encode_time_rsd_threshold; // Additional threshold for triggering 88 // underuse (used in addition to 89 // threshold above if configured). 90 int high_encode_time_rsd_threshold; // Additional threshold for triggering 91 // overuse (used in addition to 92 // threshold above if configured). 93 // General settings. 94 int frame_timeout_interval_ms; // The maximum allowed interval between two 95 // frames before resetting estimations. 96 int min_frame_samples; // The minimum number of frames required. 97 int min_process_count; // The number of initial process times required before 98 // triggering an overuse/underuse. 99 int high_threshold_consecutive_count; // The number of consecutive checks 100 // above the high threshold before 101 // triggering an overuse. 102 103 bool Equals(const CpuOveruseOptions& o) const { 104 return enable_capture_jitter_method == o.enable_capture_jitter_method && 105 low_capture_jitter_threshold_ms == o.low_capture_jitter_threshold_ms && 106 high_capture_jitter_threshold_ms == 107 o.high_capture_jitter_threshold_ms && 108 enable_encode_usage_method == o.enable_encode_usage_method && 109 low_encode_usage_threshold_percent == 110 o.low_encode_usage_threshold_percent && 111 high_encode_usage_threshold_percent == 112 o.high_encode_usage_threshold_percent && 113 low_encode_time_rsd_threshold == o.low_encode_time_rsd_threshold && 114 high_encode_time_rsd_threshold == o.high_encode_time_rsd_threshold && 115 frame_timeout_interval_ms == o.frame_timeout_interval_ms && 116 min_frame_samples == o.min_frame_samples && 117 min_process_count == o.min_process_count && 118 high_threshold_consecutive_count == o.high_threshold_consecutive_count; 119 } 120 }; 121 122 struct CpuOveruseMetrics { 123 CpuOveruseMetrics() 124 : capture_jitter_ms(-1), 125 avg_encode_time_ms(-1), 126 encode_usage_percent(-1), 127 encode_rsd(-1), 128 capture_queue_delay_ms_per_s(-1) {} 129 130 int capture_jitter_ms; // The current estimated jitter in ms based on 131 // incoming captured frames. 132 int avg_encode_time_ms; // The average encode time in ms. 133 int encode_usage_percent; // The average encode time divided by the average 134 // time difference between incoming captured frames. 135 int encode_rsd; // The relative std dev of encode time of frames. 136 int capture_queue_delay_ms_per_s; // The current time delay between an 137 // incoming captured frame until the frame 138 // is being processed. The delay is 139 // expressed in ms delay per second. 140 }; 141 142 class WEBRTC_DLLEXPORT VideoEngine { 143 public: 144 // Creates a VideoEngine object, which can then be used to acquire subAPIs. 145 static VideoEngine* Create(); 146 static VideoEngine* Create(const Config& config); 147 148 // Deletes a VideoEngine instance. 149 static bool Delete(VideoEngine*& video_engine); 150 151 // Specifies the amount and type of trace information, which will be created 152 // by the VideoEngine. 153 static int SetTraceFilter(const unsigned int filter); 154 155 // Sets the name of the trace file and enables nonencrypted trace messages. 156 static int SetTraceFile(const char* file_nameUTF8, 157 const bool add_file_counter = false); 158 159 // Installs the TraceCallback implementation to ensure that the VideoEngine 160 // user receives callbacks for generated trace messages. 161 static int SetTraceCallback(TraceCallback* callback); 162 163 #if defined(ANDROID) && !defined(WEBRTC_CHROMIUM_BUILD) 164 // Android specific. 165 static int SetAndroidObjects(JavaVM* java_vm, jobject context); 166 #endif 167 168 protected: 169 VideoEngine() {} 170 virtual ~VideoEngine() {} 171 }; 172 173 class WEBRTC_DLLEXPORT ViEBase { 174 public: 175 // Factory for the ViEBase subAPI and increases an internal reference 176 // counter if successful. Returns NULL if the API is not supported or if 177 // construction fails. 178 static ViEBase* GetInterface(VideoEngine* video_engine); 179 180 // Releases the ViEBase sub-API and decreases an internal reference counter. 181 // Returns the new reference count. This value should be zero 182 // for all sub-API:s before the VideoEngine object can be safely deleted. 183 virtual int Release() = 0; 184 185 // Initiates all common parts of the VideoEngine. 186 virtual int Init() = 0; 187 188 // Connects a VideoEngine instance to a VoiceEngine instance for audio video 189 // synchronization. 190 virtual int SetVoiceEngine(VoiceEngine* voice_engine) = 0; 191 192 // Creates a new channel. 193 virtual int CreateChannel(int& video_channel) = 0; 194 195 // Creates a new channel grouped together with |original_channel|. The channel 196 // can both send and receive video. It is assumed the channel is sending 197 // and/or receiving video to the same end-point. 198 // Note: |CreateReceiveChannel| will give better performance and network 199 // properties for receive only channels. 200 virtual int CreateChannel(int& video_channel, 201 int original_channel) = 0; 202 203 // Creates a new channel grouped together with |original_channel|. The channel 204 // can only receive video and it is assumed the remote end-point is the same 205 // as for |original_channel|. 206 virtual int CreateReceiveChannel(int& video_channel, 207 int original_channel) = 0; 208 209 // Deletes an existing channel and releases the utilized resources. 210 virtual int DeleteChannel(const int video_channel) = 0; 211 212 // Registers an observer to be called when an overuse is detected, see 213 // 'CpuOveruseObserver' for details. 214 // NOTE: This is still very experimental functionality. 215 virtual int RegisterCpuOveruseObserver(int channel, 216 CpuOveruseObserver* observer) = 0; 217 218 // Sets options for cpu overuse detector. 219 // TODO(asapersson): Remove default implementation. 220 virtual int SetCpuOveruseOptions(int channel, 221 const CpuOveruseOptions& options) { 222 return -1; 223 } 224 225 // Gets cpu overuse measures. 226 // TODO(asapersson): Remove default implementation. 227 virtual int GetCpuOveruseMetrics(int channel, 228 CpuOveruseMetrics* metrics) { 229 return -1; 230 } 231 // TODO(asapersson): Remove this function when libjingle has been updated. 232 virtual int CpuOveruseMeasures(int channel, 233 int* capture_jitter_ms, 234 int* avg_encode_time_ms, 235 int* encode_usage_percent, 236 int* capture_queue_delay_ms_per_s) { 237 return -1; 238 } 239 240 // Specifies the VoiceEngine and VideoEngine channel pair to use for 241 // audio/video synchronization. 242 virtual int ConnectAudioChannel(const int video_channel, 243 const int audio_channel) = 0; 244 245 // Disconnects a previously paired VideoEngine and VoiceEngine channel pair. 246 virtual int DisconnectAudioChannel(const int video_channel) = 0; 247 248 // Starts sending packets to an already specified IP address and port number 249 // for a specified channel. 250 virtual int StartSend(const int video_channel) = 0; 251 252 // Stops packets from being sent for a specified channel. 253 virtual int StopSend(const int video_channel) = 0; 254 255 // Prepares VideoEngine for receiving packets on the specified channel. 256 virtual int StartReceive(const int video_channel) = 0; 257 258 // Stops receiving incoming RTP and RTCP packets on the specified channel. 259 virtual int StopReceive(const int video_channel) = 0; 260 261 // Retrieves the version information for VideoEngine and its components. 262 virtual int GetVersion(char version[1024]) = 0; 263 264 // Returns the last VideoEngine error code. 265 virtual int LastError() = 0; 266 267 protected: 268 ViEBase() {} 269 virtual ~ViEBase() {} 270 }; 271 272 } // namespace webrtc 273 274 #endif // #define WEBRTC_VIDEO_ENGINE_MAIN_INTERFACE_VIE_BASE_H_ 275