mediachannel.h revision b0ecc1c6fb107b9032611870eeae8afde3e0a5d2
128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/* 228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle 328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Copyright 2004 Google Inc. 428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer. 1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * and/or other materials provided with the distribution. 1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * derived from this software without specific prior written permission. 1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */ 2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#ifndef TALK_MEDIA_BASE_MEDIACHANNEL_H_ 2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#define TALK_MEDIA_BASE_MEDIACHANNEL_H_ 3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <string> 3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <vector> 3328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/base/basictypes.h" 3528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/base/buffer.h" 361112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org#include "talk/base/dscp.h" 3728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/base/logging.h" 3828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/base/sigslot.h" 3928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/base/socket.h" 4028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/base/window.h" 4128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/codec.h" 4228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/constants.h" 4328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/streamparams.h" 4428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// TODO(juberti): re-evaluate this include 4528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/session/media/audiomonitor.h" 4628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 4728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace talk_base { 4828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass Buffer; 4928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass RateLimiter; 5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass Timing; 5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket { 5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass AudioRenderer; 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstruct RtpHeader; 5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass ScreencastId; 5828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstruct VideoFormat; 5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass VideoCapturer; 6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass VideoRenderer; 6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst int kMinRtpHeaderExtensionId = 1; 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst int kMaxRtpHeaderExtensionId = 255; 6428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst int kScreencastDefaultFps = 5; 6528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Used in AudioOptions and VideoOptions to signify "unset" values. 6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgtemplate <class T> 6828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass Settable { 6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable() : set_(false), val_() {} 7128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org explicit Settable(T val) : set_(true), val_(val) {} 7228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool IsSet() const { 7428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return set_; 7528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool Get(T* out) const { 7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *out = val_; 7928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return set_; 8028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 8128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org T GetWithDefaultIfUnset(const T& default_value) const { 8328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return set_ ? val_ : default_value; 8428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void Set(T val) { 8728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org set_ = true; 8828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org val_ = val; 8928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 9028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void Clear() { 9228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Set(T()); 9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org set_ = false; 9428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void SetFrom(const Settable<T>& o) { 9728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set this value based on the value of o, iff o is set. If this value is 9828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // set and o is unset, the current value will be unchanged. 9928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org T val; 10028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (o.Get(&val)) { 10128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Set(val); 10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 10328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 10428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ToString() const { 10628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return set_ ? talk_base::ToString(val_) : ""; 10728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 10828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool operator==(const Settable<T>& o) const { 11028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Equal if both are unset with any value or both set with the same value. 11128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return (set_ == o.set_) && (!set_ || (val_ == o.val_)); 11228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 11328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool operator!=(const Settable<T>& o) const { 11528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return !operator==(o); 11628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 11728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 11928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void InitializeValue(const T &val) { 12028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org val_ = val; 12128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 12228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 12328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org private: 12428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool set_; 12528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org T val_; 12628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 12728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 12828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass SettablePercent : public Settable<float> { 12928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 13028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void Set(float val) { 13128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (val < 0) { 13228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org val = 0; 13328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 13428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (val > 1.0) { 13528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org val = 1.0; 13628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 13728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<float>::Set(val); 13828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 13928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 14028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 14128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgtemplate <class T> 14228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstatic std::string ToStringIfSet(const char* key, const Settable<T>& val) { 14328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string str; 14428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (val.IsSet()) { 14528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org str = key; 14628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org str += ": "; 14728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org str += val.ToString(); 14828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org str += ", "; 14928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 15028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return str; 15128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 15228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 15328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Options that can be applied to a VoiceMediaChannel or a VoiceMediaEngine. 15428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Used to be flags, but that makes it hard to selectively apply options. 15528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// We are moving all of the setting of options to structs like this, 15628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// but some things currently still use flags. 15728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstruct AudioOptions { 15828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void SetAll(const AudioOptions& change) { 15928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org echo_cancellation.SetFrom(change.echo_cancellation); 16028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org auto_gain_control.SetFrom(change.auto_gain_control); 16197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org rx_auto_gain_control.SetFrom(change.rx_auto_gain_control); 16228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org noise_suppression.SetFrom(change.noise_suppression); 16328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org highpass_filter.SetFrom(change.highpass_filter); 16428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stereo_swapping.SetFrom(change.stereo_swapping); 16528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org typing_detection.SetFrom(change.typing_detection); 16697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org aecm_generate_comfort_noise.SetFrom(change.aecm_generate_comfort_noise); 16728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org conference_mode.SetFrom(change.conference_mode); 16828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org adjust_agc_delta.SetFrom(change.adjust_agc_delta); 16928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org experimental_agc.SetFrom(change.experimental_agc); 17028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org experimental_aec.SetFrom(change.experimental_aec); 1719cf037b83184374230c6825e4aa407cdafaba434sergeyu@chromium.org experimental_ns.SetFrom(change.experimental_ns); 17228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org aec_dump.SetFrom(change.aec_dump); 1735bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org experimental_acm.SetFrom(change.experimental_acm); 17497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org tx_agc_target_dbov.SetFrom(change.tx_agc_target_dbov); 17597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org tx_agc_digital_compression_gain.SetFrom( 17697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org change.tx_agc_digital_compression_gain); 17797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org tx_agc_limiter.SetFrom(change.tx_agc_limiter); 17897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org rx_agc_target_dbov.SetFrom(change.rx_agc_target_dbov); 17997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org rx_agc_digital_compression_gain.SetFrom( 18097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org change.rx_agc_digital_compression_gain); 18197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org rx_agc_limiter.SetFrom(change.rx_agc_limiter); 18297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org recording_sample_rate.SetFrom(change.recording_sample_rate); 18397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org playout_sample_rate.SetFrom(change.playout_sample_rate); 184de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org dscp.SetFrom(change.dscp); 18528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 18628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 18728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool operator==(const AudioOptions& o) const { 18828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return echo_cancellation == o.echo_cancellation && 18928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org auto_gain_control == o.auto_gain_control && 19097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org rx_auto_gain_control == o.rx_auto_gain_control && 19128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org noise_suppression == o.noise_suppression && 19228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org highpass_filter == o.highpass_filter && 19328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stereo_swapping == o.stereo_swapping && 19428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org typing_detection == o.typing_detection && 19597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org aecm_generate_comfort_noise == o.aecm_generate_comfort_noise && 19628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org conference_mode == o.conference_mode && 19728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org experimental_agc == o.experimental_agc && 19828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org experimental_aec == o.experimental_aec && 1999cf037b83184374230c6825e4aa407cdafaba434sergeyu@chromium.org experimental_ns == o.experimental_ns && 20028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org adjust_agc_delta == o.adjust_agc_delta && 20197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org aec_dump == o.aec_dump && 2025bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org experimental_acm == o.experimental_acm && 20397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org tx_agc_target_dbov == o.tx_agc_target_dbov && 20497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org tx_agc_digital_compression_gain == o.tx_agc_digital_compression_gain && 20597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org tx_agc_limiter == o.tx_agc_limiter && 20697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org rx_agc_target_dbov == o.rx_agc_target_dbov && 20797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org rx_agc_digital_compression_gain == o.rx_agc_digital_compression_gain && 20897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org rx_agc_limiter == o.rx_agc_limiter && 20997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org recording_sample_rate == o.recording_sample_rate && 210de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org playout_sample_rate == o.playout_sample_rate && 211de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org dscp == o.dscp; 21228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 21328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 21428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ToString() const { 21528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::ostringstream ost; 21628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << "AudioOptions {"; 21728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("aec", echo_cancellation); 21828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("agc", auto_gain_control); 21997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org ost << ToStringIfSet("rx_agc", rx_auto_gain_control); 22028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("ns", noise_suppression); 22128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("hf", highpass_filter); 22228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("swap", stereo_swapping); 22328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("typing", typing_detection); 22497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org ost << ToStringIfSet("comfort_noise", aecm_generate_comfort_noise); 22528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("conference", conference_mode); 22628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("agc_delta", adjust_agc_delta); 22728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("experimental_agc", experimental_agc); 22828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("experimental_aec", experimental_aec); 2299cf037b83184374230c6825e4aa407cdafaba434sergeyu@chromium.org ost << ToStringIfSet("experimental_ns", experimental_ns); 23028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("aec_dump", aec_dump); 2315bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org ost << ToStringIfSet("experimental_acm", experimental_acm); 23297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org ost << ToStringIfSet("tx_agc_target_dbov", tx_agc_target_dbov); 23397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org ost << ToStringIfSet("tx_agc_digital_compression_gain", 23497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org tx_agc_digital_compression_gain); 23597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org ost << ToStringIfSet("tx_agc_limiter", tx_agc_limiter); 23697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org ost << ToStringIfSet("rx_agc_target_dbov", rx_agc_target_dbov); 23797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org ost << ToStringIfSet("rx_agc_digital_compression_gain", 23897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org rx_agc_digital_compression_gain); 23997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org ost << ToStringIfSet("rx_agc_limiter", rx_agc_limiter); 24097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org ost << ToStringIfSet("recording_sample_rate", recording_sample_rate); 24197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org ost << ToStringIfSet("playout_sample_rate", playout_sample_rate); 242de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org ost << ToStringIfSet("dscp", dscp); 24328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << "}"; 24428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ost.str(); 24528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 24628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 24728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Audio processing that attempts to filter away the output signal from 24828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // later inbound pickup. 24928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> echo_cancellation; 25028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Audio processing to adjust the sensitivity of the local mic dynamically. 25128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> auto_gain_control; 25297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Audio processing to apply gain to the remote audio. 25397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Settable<bool> rx_auto_gain_control; 25428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Audio processing to filter out background noise. 25528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> noise_suppression; 25628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Audio processing to remove background noise of lower frequencies. 25728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> highpass_filter; 25828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Audio processing to swap the left and right channels. 25928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> stereo_swapping; 26028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Audio processing to detect typing. 26128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> typing_detection; 26297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Settable<bool> aecm_generate_comfort_noise; 26328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> conference_mode; 26428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<int> adjust_agc_delta; 26528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> experimental_agc; 26628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> experimental_aec; 2679cf037b83184374230c6825e4aa407cdafaba434sergeyu@chromium.org Settable<bool> experimental_ns; 26828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> aec_dump; 2695bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org Settable<bool> experimental_acm; 27097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Note that tx_agc_* only applies to non-experimental AGC. 27197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Settable<uint16> tx_agc_target_dbov; 27297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Settable<uint16> tx_agc_digital_compression_gain; 27397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Settable<bool> tx_agc_limiter; 27497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Settable<uint16> rx_agc_target_dbov; 27597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Settable<uint16> rx_agc_digital_compression_gain; 27697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Settable<bool> rx_agc_limiter; 27797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Settable<uint32> recording_sample_rate; 27897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Settable<uint32> playout_sample_rate; 279de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org // Set DSCP value for packet sent from audio channel. 280de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org Settable<bool> dscp; 28128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 28228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 28328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Options that can be applied to a VideoMediaChannel or a VideoMediaEngine. 28428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Used to be flags, but that makes it hard to selectively apply options. 28528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// We are moving all of the setting of options to structs like this, 28628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// but some things currently still use flags. 28728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstruct VideoOptions { 288f45a55083fbbcb3f3104368c9b611114a7fd1031henrike@webrtc.org enum HighestBitrate { 289f45a55083fbbcb3f3104368c9b611114a7fd1031henrike@webrtc.org NORMAL, 290f45a55083fbbcb3f3104368c9b611114a7fd1031henrike@webrtc.org HIGH, 291f45a55083fbbcb3f3104368c9b611114a7fd1031henrike@webrtc.org VERY_HIGH 292f45a55083fbbcb3f3104368c9b611114a7fd1031henrike@webrtc.org }; 293f45a55083fbbcb3f3104368c9b611114a7fd1031henrike@webrtc.org 29428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org VideoOptions() { 29528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org process_adaptation_threshhold.Set(kProcessCpuThreshold); 29628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org system_low_adaptation_threshhold.Set(kLowSystemCpuThreshold); 29728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org system_high_adaptation_threshhold.Set(kHighSystemCpuThreshold); 298704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org unsignalled_recv_stream_limit.Set(kNumDefaultUnsignalledVideoRecvStreams); 29928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 30028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 30128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void SetAll(const VideoOptions& change) { 30228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org adapt_input_to_encoder.SetFrom(change.adapt_input_to_encoder); 30328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org adapt_input_to_cpu_usage.SetFrom(change.adapt_input_to_cpu_usage); 30428654cbc2256230c978f41cbaf550bc2e9c2f2dbhenrike@webrtc.org adapt_cpu_with_smoothing.SetFrom(change.adapt_cpu_with_smoothing); 30528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org adapt_view_switch.SetFrom(change.adapt_view_switch); 306cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org video_adapt_third.SetFrom(change.video_adapt_third); 30728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_noise_reduction.SetFrom(change.video_noise_reduction); 30828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_one_layer_screencast.SetFrom(change.video_one_layer_screencast); 30928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_high_bitrate.SetFrom(change.video_high_bitrate); 3101e6cb2c5d21d778437e650170de397ace4b39b08wu@webrtc.org video_start_bitrate.SetFrom(change.video_start_bitrate); 31128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_temporal_layer_screencast.SetFrom( 31228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org change.video_temporal_layer_screencast); 31397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_temporal_layer_realtime.SetFrom( 31497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org change.video_temporal_layer_realtime); 31528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_leaky_bucket.SetFrom(change.video_leaky_bucket); 316f45a55083fbbcb3f3104368c9b611114a7fd1031henrike@webrtc.org video_highest_bitrate.SetFrom(change.video_highest_bitrate); 317cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org cpu_overuse_detection.SetFrom(change.cpu_overuse_detection); 318e9793ab8b872098c241a1c0bc08836e9e78607cehenrike@webrtc.org cpu_underuse_threshold.SetFrom(change.cpu_underuse_threshold); 319e9793ab8b872098c241a1c0bc08836e9e78607cehenrike@webrtc.org cpu_overuse_threshold.SetFrom(change.cpu_overuse_threshold); 320b0ecc1c6fb107b9032611870eeae8afde3e0a5d2henrike@webrtc.org cpu_overuse_encode_usage.SetFrom(change.cpu_overuse_encode_usage); 32128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org conference_mode.SetFrom(change.conference_mode); 32228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org process_adaptation_threshhold.SetFrom(change.process_adaptation_threshhold); 32328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org system_low_adaptation_threshhold.SetFrom( 32428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org change.system_low_adaptation_threshhold); 32528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org system_high_adaptation_threshhold.SetFrom( 32628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org change.system_high_adaptation_threshhold); 32728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org buffered_mode_latency.SetFrom(change.buffered_mode_latency); 328cecfd1832dc375225da3f5f18ecac63006ed06bfwu@webrtc.org lower_min_bitrate.SetFrom(change.lower_min_bitrate); 329de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org dscp.SetFrom(change.dscp); 3305bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org suspend_below_min_bitrate.SetFrom(change.suspend_below_min_bitrate); 331704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org unsignalled_recv_stream_limit.SetFrom(change.unsignalled_recv_stream_limit); 33210bd88e2b52e8175f396cd7b1e6b1f5422c2cd0fhenrike@webrtc.org use_simulcast_adapter.SetFrom(change.use_simulcast_adapter); 333dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org skip_encoding_unused_streams.SetFrom(change.skip_encoding_unused_streams); 334dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org screencast_min_bitrate.SetFrom(change.screencast_min_bitrate); 335dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org use_improved_wifi_bandwidth_estimator.SetFrom( 336dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org change.use_improved_wifi_bandwidth_estimator); 33728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 33828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 33928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool operator==(const VideoOptions& o) const { 34028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return adapt_input_to_encoder == o.adapt_input_to_encoder && 34128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org adapt_input_to_cpu_usage == o.adapt_input_to_cpu_usage && 34228654cbc2256230c978f41cbaf550bc2e9c2f2dbhenrike@webrtc.org adapt_cpu_with_smoothing == o.adapt_cpu_with_smoothing && 34328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org adapt_view_switch == o.adapt_view_switch && 344cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org video_adapt_third == o.video_adapt_third && 34528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_noise_reduction == o.video_noise_reduction && 34628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_one_layer_screencast == o.video_one_layer_screencast && 34728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_high_bitrate == o.video_high_bitrate && 3481e6cb2c5d21d778437e650170de397ace4b39b08wu@webrtc.org video_start_bitrate == o.video_start_bitrate && 34928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_temporal_layer_screencast == o.video_temporal_layer_screencast && 35097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_temporal_layer_realtime == o.video_temporal_layer_realtime && 35128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_leaky_bucket == o.video_leaky_bucket && 352f45a55083fbbcb3f3104368c9b611114a7fd1031henrike@webrtc.org video_highest_bitrate == o.video_highest_bitrate && 353cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org cpu_overuse_detection == o.cpu_overuse_detection && 354e9793ab8b872098c241a1c0bc08836e9e78607cehenrike@webrtc.org cpu_underuse_threshold == o.cpu_underuse_threshold && 355e9793ab8b872098c241a1c0bc08836e9e78607cehenrike@webrtc.org cpu_overuse_threshold == o.cpu_overuse_threshold && 356b0ecc1c6fb107b9032611870eeae8afde3e0a5d2henrike@webrtc.org cpu_overuse_encode_usage == o.cpu_overuse_encode_usage && 35728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org conference_mode == o.conference_mode && 35828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org process_adaptation_threshhold == o.process_adaptation_threshhold && 35928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org system_low_adaptation_threshhold == 36028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org o.system_low_adaptation_threshhold && 36128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org system_high_adaptation_threshhold == 36228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org o.system_high_adaptation_threshhold && 363cecfd1832dc375225da3f5f18ecac63006ed06bfwu@webrtc.org buffered_mode_latency == o.buffered_mode_latency && 364de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org lower_min_bitrate == o.lower_min_bitrate && 3655bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org dscp == o.dscp && 366704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org suspend_below_min_bitrate == o.suspend_below_min_bitrate && 36710bd88e2b52e8175f396cd7b1e6b1f5422c2cd0fhenrike@webrtc.org unsignalled_recv_stream_limit == o.unsignalled_recv_stream_limit && 368dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org use_simulcast_adapter == o.use_simulcast_adapter && 369dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org skip_encoding_unused_streams == o.skip_encoding_unused_streams && 3705fb7428496d5bf6e0ef15ce15832057051f9312bhenrike@webrtc.org screencast_min_bitrate == o.screencast_min_bitrate && 371dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org use_improved_wifi_bandwidth_estimator == 372dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org o.use_improved_wifi_bandwidth_estimator; 37328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 37428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 37528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ToString() const { 37628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::ostringstream ost; 37728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << "VideoOptions {"; 37828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("encoder adaption", adapt_input_to_encoder); 37928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("cpu adaption", adapt_input_to_cpu_usage); 38028654cbc2256230c978f41cbaf550bc2e9c2f2dbhenrike@webrtc.org ost << ToStringIfSet("cpu adaptation smoothing", adapt_cpu_with_smoothing); 38128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("adapt view switch", adapt_view_switch); 382cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org ost << ToStringIfSet("video adapt third", video_adapt_third); 38328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("noise reduction", video_noise_reduction); 384cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org ost << ToStringIfSet("1 layer screencast", video_one_layer_screencast); 38528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("high bitrate", video_high_bitrate); 3861e6cb2c5d21d778437e650170de397ace4b39b08wu@webrtc.org ost << ToStringIfSet("start bitrate", video_start_bitrate); 38728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("video temporal layer screencast", 38828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_temporal_layer_screencast); 38997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org ost << ToStringIfSet("video temporal layer realtime", 39097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_temporal_layer_realtime); 39128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("leaky bucket", video_leaky_bucket); 392f45a55083fbbcb3f3104368c9b611114a7fd1031henrike@webrtc.org ost << ToStringIfSet("highest video bitrate", video_highest_bitrate); 393cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org ost << ToStringIfSet("cpu overuse detection", cpu_overuse_detection); 394e9793ab8b872098c241a1c0bc08836e9e78607cehenrike@webrtc.org ost << ToStringIfSet("cpu underuse threshold", cpu_underuse_threshold); 395e9793ab8b872098c241a1c0bc08836e9e78607cehenrike@webrtc.org ost << ToStringIfSet("cpu overuse threshold", cpu_overuse_threshold); 396b0ecc1c6fb107b9032611870eeae8afde3e0a5d2henrike@webrtc.org ost << ToStringIfSet("cpu overuse encode usage", 397b0ecc1c6fb107b9032611870eeae8afde3e0a5d2henrike@webrtc.org cpu_overuse_encode_usage); 39828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("conference mode", conference_mode); 39928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("process", process_adaptation_threshhold); 40028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("low", system_low_adaptation_threshhold); 40128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("high", system_high_adaptation_threshhold); 40228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << ToStringIfSet("buffered mode latency", buffered_mode_latency); 403cecfd1832dc375225da3f5f18ecac63006ed06bfwu@webrtc.org ost << ToStringIfSet("lower min bitrate", lower_min_bitrate); 404de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org ost << ToStringIfSet("dscp", dscp); 4055bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org ost << ToStringIfSet("suspend below min bitrate", 4065bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org suspend_below_min_bitrate); 407704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org ost << ToStringIfSet("num channels for early receive", 408704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org unsignalled_recv_stream_limit); 40910bd88e2b52e8175f396cd7b1e6b1f5422c2cd0fhenrike@webrtc.org ost << ToStringIfSet("use simulcast adapter", use_simulcast_adapter); 410dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org ost << ToStringIfSet("skip encoding unused streams", 411dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org skip_encoding_unused_streams); 412dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org ost << ToStringIfSet("screencast min bitrate", screencast_min_bitrate); 413dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org ost << ToStringIfSet("improved wifi bwe", 414dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org use_improved_wifi_bandwidth_estimator); 41528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ost << "}"; 41628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ost.str(); 41728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 41828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 41928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Encoder adaption, which is the gd callback in LMI, and TBA in WebRTC. 42028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> adapt_input_to_encoder; 42128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Enable CPU adaptation? 42228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> adapt_input_to_cpu_usage; 42328654cbc2256230c978f41cbaf550bc2e9c2f2dbhenrike@webrtc.org // Enable CPU adaptation smoothing? 42428654cbc2256230c978f41cbaf550bc2e9c2f2dbhenrike@webrtc.org Settable<bool> adapt_cpu_with_smoothing; 42528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Enable Adapt View Switch? 42628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> adapt_view_switch; 427cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org // Enable video adapt third? 428cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org Settable<bool> video_adapt_third; 42928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Enable denoising? 43028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> video_noise_reduction; 43128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Experimental: Enable one layer screencast? 43228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> video_one_layer_screencast; 43328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Experimental: Enable WebRtc higher bitrate? 43428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> video_high_bitrate; 4351e6cb2c5d21d778437e650170de397ace4b39b08wu@webrtc.org // Experimental: Enable WebRtc higher start bitrate? 4361e6cb2c5d21d778437e650170de397ace4b39b08wu@webrtc.org Settable<int> video_start_bitrate; 43728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Experimental: Enable WebRTC layered screencast. 43828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> video_temporal_layer_screencast; 43997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Experimental: Enable WebRTC temporal layer strategy for realtime video. 44097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Settable<bool> video_temporal_layer_realtime; 44128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Enable WebRTC leaky bucket when sending media packets. 44228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> video_leaky_bucket; 443f45a55083fbbcb3f3104368c9b611114a7fd1031henrike@webrtc.org // Set highest bitrate mode for video. 444f45a55083fbbcb3f3104368c9b611114a7fd1031henrike@webrtc.org Settable<int> video_highest_bitrate; 445cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org // Enable WebRTC Cpu Overuse Detection, which is a new version of the CPU 446cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org // adaptation algorithm. So this option will override the 447cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org // |adapt_input_to_cpu_usage|. 448cadf9040cbb9e7bb1b73a95e43e7d228fe6b2bdbwu@webrtc.org Settable<bool> cpu_overuse_detection; 449e9793ab8b872098c241a1c0bc08836e9e78607cehenrike@webrtc.org // Low threshold for cpu overuse adaptation in ms. (Adapt up) 450e9793ab8b872098c241a1c0bc08836e9e78607cehenrike@webrtc.org Settable<int> cpu_underuse_threshold; 451e9793ab8b872098c241a1c0bc08836e9e78607cehenrike@webrtc.org // High threshold for cpu overuse adaptation in ms. (Adapt down) 452e9793ab8b872098c241a1c0bc08836e9e78607cehenrike@webrtc.org Settable<int> cpu_overuse_threshold; 453b0ecc1c6fb107b9032611870eeae8afde3e0a5d2henrike@webrtc.org // Use encode usage for cpu detection. 454b0ecc1c6fb107b9032611870eeae8afde3e0a5d2henrike@webrtc.org Settable<bool> cpu_overuse_encode_usage; 45528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Use conference mode? 45628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<bool> conference_mode; 45728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Threshhold for process cpu adaptation. (Process limit) 45828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SettablePercent process_adaptation_threshhold; 45928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Low threshhold for cpu adaptation. (Adapt up) 46028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SettablePercent system_low_adaptation_threshhold; 46128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // High threshhold for cpu adaptation. (Adapt down) 46228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SettablePercent system_high_adaptation_threshhold; 46328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Specify buffered mode latency in milliseconds. 46428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Settable<int> buffered_mode_latency; 465cecfd1832dc375225da3f5f18ecac63006ed06bfwu@webrtc.org // Make minimum configured send bitrate even lower than usual, at 30kbit. 466cecfd1832dc375225da3f5f18ecac63006ed06bfwu@webrtc.org Settable<bool> lower_min_bitrate; 467de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org // Set DSCP value for packet sent from video channel. 468de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org Settable<bool> dscp; 4695bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // Enable WebRTC suspension of video. No video frames will be sent when the 4705bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // bitrate is below the configured minimum bitrate. 4715bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org Settable<bool> suspend_below_min_bitrate; 472704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org // Limit on the number of early receive channels that can be created. 473704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org Settable<int> unsignalled_recv_stream_limit; 47410bd88e2b52e8175f396cd7b1e6b1f5422c2cd0fhenrike@webrtc.org // Enable use of simulcast adapter. 47510bd88e2b52e8175f396cd7b1e6b1f5422c2cd0fhenrike@webrtc.org Settable<bool> use_simulcast_adapter; 476dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org // Enables the encoder to skip encoding stream not actually sent due to too 477dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org // low available bit rate. 478dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org Settable<bool> skip_encoding_unused_streams; 479dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org // Force screencast to use a minimum bitrate 480dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org Settable<int> screencast_min_bitrate; 481dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org // Enable improved bandwidth estiamtor on wifi. 482dce3feb0b02bf1b7809f6247943979094de88593henrike@webrtc.org Settable<bool> use_improved_wifi_bandwidth_estimator; 48328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 48428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 48528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// A class for playing out soundclips. 48628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass SoundclipMedia { 48728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 48828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org enum SoundclipFlags { 48928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SF_LOOP = 1, 49028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org }; 49128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 49228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual ~SoundclipMedia() {} 49328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 49428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Plays a sound out to the speakers with the given audio stream. The stream 49528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // must be 16-bit little-endian 16 kHz PCM. If a stream is already playing 49628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // on this SoundclipMedia, it is stopped. If clip is NULL, nothing is played. 49728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Returns whether it was successful. 49828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool PlaySound(const char *clip, int len, int flags) = 0; 49928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 50028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 50128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstruct RtpHeaderExtension { 50228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org RtpHeaderExtension() : id(0) {} 50328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org RtpHeaderExtension(const std::string& u, int i) : uri(u), id(i) {} 50428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string uri; 50528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int id; 50628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // TODO(juberti): SendRecv direction; 50728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 50828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool operator==(const RtpHeaderExtension& ext) const { 50928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // id is a reserved word in objective-c. Therefore the id attribute has to 51028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // be a fully qualified name in order to compile on IOS. 51128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return this->id == ext.id && 51228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org uri == ext.uri; 51328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 51428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 51528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 51628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Returns the named header extension if found among all extensions, NULL 51728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// otherwise. 51828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orginline const RtpHeaderExtension* FindHeaderExtension( 51928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::vector<RtpHeaderExtension>& extensions, 52028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& name) { 52128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (std::vector<RtpHeaderExtension>::const_iterator it = extensions.begin(); 52228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org it != extensions.end(); ++it) { 52328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (it->uri == name) 52428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return &(*it); 52528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 52628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 52728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 52828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 52928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgenum MediaChannelOptions { 53028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Tune the stream for conference mode. 53128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org OPT_CONFERENCE = 0x0001 53228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 53328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 53428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgenum VoiceMediaChannelOptions { 53528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Tune the audio stream for vcs with different target levels. 53628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org OPT_AGC_MINUS_10DB = 0x80000000 53728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 53828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 53928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// DTMF flags to control if a DTMF tone should be played and/or sent. 54028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgenum DtmfFlags { 54128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org DF_PLAY = 0x01, 54228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org DF_SEND = 0x02, 54328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 54428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 54528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MediaChannel : public sigslot::has_slots<> { 54628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 54728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org class NetworkInterface { 54828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 54928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org enum SocketType { ST_RTP, ST_RTCP }; 5501112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org virtual bool SendPacket( 5511112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org talk_base::Buffer* packet, 5521112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org talk_base::DiffServCodePoint dscp = talk_base::DSCP_NO_CHANGE) = 0; 5531112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org virtual bool SendRtcp( 5541112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org talk_base::Buffer* packet, 5551112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org talk_base::DiffServCodePoint dscp = talk_base::DSCP_NO_CHANGE) = 0; 55628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual int SetOption(SocketType type, talk_base::Socket::Option opt, 55728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int option) = 0; 55828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual ~NetworkInterface() {} 55928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org }; 56028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 56128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MediaChannel() : network_interface_(NULL) {} 56228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual ~MediaChannel() {} 56328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5641e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org // Sets the abstract interface class for sending RTP/RTCP data. 56528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void SetInterface(NetworkInterface *iface) { 5661e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org talk_base::CritScope cs(&network_interface_crit_); 56728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org network_interface_ = iface; 56828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 56928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 57028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Called when a RTP packet is received. 571a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org virtual void OnPacketReceived(talk_base::Buffer* packet, 572a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org const talk_base::PacketTime& packet_time) = 0; 57328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Called when a RTCP packet is received. 574a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org virtual void OnRtcpReceived(talk_base::Buffer* packet, 575a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org const talk_base::PacketTime& packet_time) = 0; 57628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Called when the socket's ability to send has changed. 57728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void OnReadyToSend(bool ready) = 0; 57828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Creates a new outgoing media stream with SSRCs and CNAME as described 57928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // by sp. 58028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool AddSendStream(const StreamParams& sp) = 0; 58128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Removes an outgoing media stream. 58228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // ssrc must be the first SSRC of the media stream if the stream uses 58328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // multiple SSRCs. 58428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool RemoveSendStream(uint32 ssrc) = 0; 58528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Creates a new incoming media stream with SSRCs and CNAME as described 58628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // by sp. 58728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool AddRecvStream(const StreamParams& sp) = 0; 58828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Removes an incoming media stream. 58928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // ssrc must be the first SSRC of the media stream if the stream uses 59028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // multiple SSRCs. 59128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool RemoveRecvStream(uint32 ssrc) = 0; 59228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 59328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Mutes the channel. 59428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool MuteStream(uint32 ssrc, bool on) = 0; 59528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 59628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Sets the RTP extension headers and IDs to use when sending RTP. 59728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetRecvRtpHeaderExtensions( 59828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::vector<RtpHeaderExtension>& extensions) = 0; 59928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetSendRtpHeaderExtensions( 60028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::vector<RtpHeaderExtension>& extensions) = 0; 60192fdfebeddc5a1152d6c089df56a8ae4e9d9207cmallinath@webrtc.org // Returns the absoulte sendtime extension id value from media channel. 60292fdfebeddc5a1152d6c089df56a8ae4e9d9207cmallinath@webrtc.org virtual int GetRtpSendTimeExtnId() const { 60392fdfebeddc5a1152d6c089df56a8ae4e9d9207cmallinath@webrtc.org return -1; 60492fdfebeddc5a1152d6c089df56a8ae4e9d9207cmallinath@webrtc.org } 6054b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org // Sets the initial bandwidth to use when sending starts. 6064b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org virtual bool SetStartSendBandwidth(int bps) = 0; 6074b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org // Sets the maximum allowed bandwidth to use when sending data. 6084b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org virtual bool SetMaxSendBandwidth(int bps) = 0; 60928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6101e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org // Base method to send packet using NetworkInterface. 6111e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org bool SendPacket(talk_base::Buffer* packet) { 6121e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org return DoSendPacket(packet, false); 6131e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org } 6141e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org 6151e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org bool SendRtcp(talk_base::Buffer* packet) { 6161e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org return DoSendPacket(packet, true); 6171e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org } 6181e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org 6191e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org int SetOption(NetworkInterface::SocketType type, 6201e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org talk_base::Socket::Option opt, 6211e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org int option) { 6221e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org talk_base::CritScope cs(&network_interface_crit_); 6231e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org if (!network_interface_) 6241e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org return -1; 6251e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org 6261e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org return network_interface_->SetOption(type, opt, option); 6271e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org } 6281e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org 629de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org protected: 630de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org // This method sets DSCP |value| on both RTP and RTCP channels. 631de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org int SetDscp(talk_base::DiffServCodePoint value) { 632de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org int ret; 633de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org ret = SetOption(NetworkInterface::ST_RTP, 634de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org talk_base::Socket::OPT_DSCP, 635de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org value); 636de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org if (ret == 0) { 637de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org ret = SetOption(NetworkInterface::ST_RTCP, 638de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org talk_base::Socket::OPT_DSCP, 639de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org value); 640de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org } 641de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org return ret; 642de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org } 643de305014c62832a382d38144a9dc518cf1d02f88wu@webrtc.org 6441e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org private: 6451e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org bool DoSendPacket(talk_base::Buffer* packet, bool rtcp) { 6461e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org talk_base::CritScope cs(&network_interface_crit_); 6471e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org if (!network_interface_) 6481e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org return false; 6491e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org 6501e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org return (!rtcp) ? network_interface_->SendPacket(packet) : 6511e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org network_interface_->SendRtcp(packet); 6521e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org } 6531e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org 6541e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org // |network_interface_| can be accessed from the worker_thread and 6551e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org // from any MediaEngine threads. This critical section is to protect accessing 6561e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org // of network_interface_ object. 6571e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org talk_base::CriticalSection network_interface_crit_; 6581e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org NetworkInterface* network_interface_; 65928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 66028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 66128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgenum SendFlags { 66228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SEND_NOTHING, 66328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SEND_RINGBACKTONE, 66428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SEND_MICROPHONE 66528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 66628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 66797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// The stats information is structured as follows: 66897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// Media are represented by either MediaSenderInfo or MediaReceiverInfo. 66997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// Media contains a vector of SSRC infos that are exclusively used by this 67097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// media. (SSRCs shared between media streams can't be represented.) 67197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 67297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// Information about an SSRC. 67397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This data may be locally recorded, or received in an RTCP SR or RR. 67497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgstruct SsrcSenderInfo { 67597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org SsrcSenderInfo() 67697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org : ssrc(0), 67797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org timestamp(0) { 67897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 67997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org uint32 ssrc; 68097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org double timestamp; // NTP timestamp, represented as seconds since epoch. 68197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org}; 68297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 68397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgstruct SsrcReceiverInfo { 68497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org SsrcReceiverInfo() 68528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : ssrc(0), 68697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org timestamp(0) { 68797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 68897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org uint32 ssrc; 68997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org double timestamp; 69097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org}; 69197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 69297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgstruct MediaSenderInfo { 69397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org MediaSenderInfo() 69497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org : bytes_sent(0), 69528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org packets_sent(0), 69628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org packets_lost(0), 69728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org fraction_lost(0.0), 69897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org rtt_ms(0) { 69997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 7005bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org void add_ssrc(const SsrcSenderInfo& stat) { 7015bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org local_stats.push_back(stat); 7025bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } 7035bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // Temporary utility function for call sites that only provide SSRC. 7045bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // As more info is added into SsrcSenderInfo, this function should go away. 7055bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org void add_ssrc(uint32 ssrc) { 7065bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org SsrcSenderInfo stat; 7075bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org stat.ssrc = ssrc; 7085bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org add_ssrc(stat); 7095bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } 7105bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // Utility accessor for clients that are only interested in ssrc numbers. 7115bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org std::vector<uint32> ssrcs() const { 7125bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org std::vector<uint32> retval; 7135bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org for (std::vector<SsrcSenderInfo>::const_iterator it = local_stats.begin(); 7145bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org it != local_stats.end(); ++it) { 7155bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org retval.push_back(it->ssrc); 7165bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } 7175bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org return retval; 7185bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } 7195bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // Utility accessor for clients that make the assumption only one ssrc 7205bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // exists per media. 7215bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // This will eventually go away. 7225bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org uint32 ssrc() const { 7235bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org if (local_stats.size() > 0) { 7245bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org return local_stats[0].ssrc; 7255bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } else { 7265bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org return 0; 7275bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } 7285bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } 72997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int64 bytes_sent; 73097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int packets_sent; 73197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int packets_lost; 73297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org float fraction_lost; 73397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int rtt_ms; 73497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org std::string codec_name; 73597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org std::vector<SsrcSenderInfo> local_stats; 73697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org std::vector<SsrcReceiverInfo> remote_stats; 73797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org}; 73897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 739704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.orgtemplate<class T> 740704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.orgstruct VariableInfo { 741704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org VariableInfo() 742704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org : min_val(), 743704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org mean(0.0), 744704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org max_val(), 745704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org variance(0.0) { 746704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org } 747704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org T min_val; 748704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org double mean; 749704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org T max_val; 750704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org double variance; 751704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org}; 752704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org 75397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgstruct MediaReceiverInfo { 75497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org MediaReceiverInfo() 75597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org : bytes_rcvd(0), 75697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org packets_rcvd(0), 75797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org packets_lost(0), 75897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org fraction_lost(0.0) { 75997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 7605bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org void add_ssrc(const SsrcReceiverInfo& stat) { 7615bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org local_stats.push_back(stat); 7625bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } 7635bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // Temporary utility function for call sites that only provide SSRC. 7645bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // As more info is added into SsrcSenderInfo, this function should go away. 7655bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org void add_ssrc(uint32 ssrc) { 7665bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org SsrcReceiverInfo stat; 7675bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org stat.ssrc = ssrc; 7685bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org add_ssrc(stat); 7695bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } 7705bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org std::vector<uint32> ssrcs() const { 7715bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org std::vector<uint32> retval; 7725bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org for (std::vector<SsrcReceiverInfo>::const_iterator it = local_stats.begin(); 7735bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org it != local_stats.end(); ++it) { 7745bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org retval.push_back(it->ssrc); 7755bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } 7765bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org return retval; 7775bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } 7785bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // Utility accessor for clients that make the assumption only one ssrc 7795bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // exists per media. 7805bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org // This will eventually go away. 7815bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org uint32 ssrc() const { 7825bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org if (local_stats.size() > 0) { 7835bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org return local_stats[0].ssrc; 7845bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } else { 7855bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org return 0; 7865bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } 7875bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org } 7885bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org 78997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int64 bytes_rcvd; 79097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int packets_rcvd; 79197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int packets_lost; 79297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org float fraction_lost; 79397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org std::vector<SsrcReceiverInfo> local_stats; 79497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org std::vector<SsrcSenderInfo> remote_stats; 79597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org}; 79697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 79797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgstruct VoiceSenderInfo : public MediaSenderInfo { 79897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org VoiceSenderInfo() 7995bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org : ext_seqnum(0), 80028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org jitter_ms(0), 80128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org audio_level(0), 80228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org aec_quality_min(0.0), 80328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org echo_delay_median_ms(0), 80428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org echo_delay_std_ms(0), 80528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org echo_return_loss(0), 806967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org echo_return_loss_enhancement(0), 807967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org typing_noise_detected(false) { 80828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 80928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 81028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int ext_seqnum; 81128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int jitter_ms; 81228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int audio_level; 81328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org float aec_quality_min; 81428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int echo_delay_median_ms; 81528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int echo_delay_std_ms; 81628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int echo_return_loss; 81728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int echo_return_loss_enhancement; 818967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org bool typing_noise_detected; 81928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 82028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 82197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgstruct VoiceReceiverInfo : public MediaReceiverInfo { 82228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org VoiceReceiverInfo() 8235bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org : ext_seqnum(0), 82428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org jitter_ms(0), 82528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org jitter_buffer_ms(0), 82628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org jitter_buffer_preferred_ms(0), 82728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org delay_estimate_ms(0), 82828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org audio_level(0), 829b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org expand_rate(0), 830b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org decoding_calls_to_silence_generator(0), 831b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org decoding_calls_to_neteq(0), 832b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org decoding_normal(0), 833b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org decoding_plc(0), 834b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org decoding_cng(0), 835b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org decoding_plc_cng(0) { 83628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 83728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 83828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int ext_seqnum; 83928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int jitter_ms; 84028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int jitter_buffer_ms; 84128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int jitter_buffer_preferred_ms; 84228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int delay_estimate_ms; 84328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int audio_level; 84428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // fraction of synthesized speech inserted through pre-emptive expansion 84528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org float expand_rate; 846b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org int decoding_calls_to_silence_generator; 847b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org int decoding_calls_to_neteq; 848b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org int decoding_normal; 849b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org int decoding_plc; 850b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org int decoding_cng; 851b8c254abd6fa784294277e2baa8298c3352faf78henrike@webrtc.org int decoding_plc_cng; 85228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 85328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 85497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgstruct VideoSenderInfo : public MediaSenderInfo { 85528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org VideoSenderInfo() 85697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org : packets_cached(0), 85728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org firs_rcvd(0), 858704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org plis_rcvd(0), 85928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org nacks_rcvd(0), 8609cf037b83184374230c6825e4aa407cdafaba434sergeyu@chromium.org input_frame_width(0), 8619cf037b83184374230c6825e4aa407cdafaba434sergeyu@chromium.org input_frame_height(0), 8629cf037b83184374230c6825e4aa407cdafaba434sergeyu@chromium.org send_frame_width(0), 8639cf037b83184374230c6825e4aa407cdafaba434sergeyu@chromium.org send_frame_height(0), 86428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org framerate_input(0), 86528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org framerate_sent(0), 86628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org nominal_bitrate(0), 86728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org preferred_bitrate(0), 8685bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org adapt_reason(0), 8695bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org capture_jitter_ms(0), 8709caf2765b285f7511d8355177c2d55209d7573e4wu@webrtc.org avg_encode_ms(0), 8719caf2765b285f7511d8355177c2d55209d7573e4wu@webrtc.org encode_usage_percent(0), 8729caf2765b285f7511d8355177c2d55209d7573e4wu@webrtc.org capture_queue_delay_ms_per_s(0) { 87328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 87428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 87528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::vector<SsrcGroup> ssrc_groups; 87628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int packets_cached; 87728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int firs_rcvd; 878704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org int plis_rcvd; 87928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int nacks_rcvd; 8809cf037b83184374230c6825e4aa407cdafaba434sergeyu@chromium.org int input_frame_width; 8819cf037b83184374230c6825e4aa407cdafaba434sergeyu@chromium.org int input_frame_height; 8829cf037b83184374230c6825e4aa407cdafaba434sergeyu@chromium.org int send_frame_width; 8839cf037b83184374230c6825e4aa407cdafaba434sergeyu@chromium.org int send_frame_height; 88428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int framerate_input; 88528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int framerate_sent; 88628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int nominal_bitrate; 88728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int preferred_bitrate; 88828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int adapt_reason; 8895bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org int capture_jitter_ms; 8905bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org int avg_encode_ms; 8919caf2765b285f7511d8355177c2d55209d7573e4wu@webrtc.org int encode_usage_percent; 8929caf2765b285f7511d8355177c2d55209d7573e4wu@webrtc.org int capture_queue_delay_ms_per_s; 893704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org VariableInfo<int> adapt_frame_drops; 894704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org VariableInfo<int> effects_frame_drops; 895704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org VariableInfo<double> capturer_frame_time; 89628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 89728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 89897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgstruct VideoReceiverInfo : public MediaReceiverInfo { 89928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org VideoReceiverInfo() 90097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org : packets_concealed(0), 90128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org firs_sent(0), 902704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org plis_sent(0), 90328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org nacks_sent(0), 90428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org frame_width(0), 90528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org frame_height(0), 90628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org framerate_rcvd(0), 90728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org framerate_decoded(0), 90828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org framerate_output(0), 90928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org framerate_render_input(0), 91097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org framerate_render_output(0), 91197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org decode_ms(0), 91297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org max_decode_ms(0), 91397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org jitter_buffer_ms(0), 91497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org min_playout_delay_ms(0), 91597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org render_delay_ms(0), 91697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org target_delay_ms(0), 91797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org current_delay_ms(0) { 91828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 91928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 92028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::vector<SsrcGroup> ssrc_groups; 92128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int packets_concealed; 92228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int firs_sent; 923704bf9ebec9c9425e1898f6c3f15eff685175b23henrike@webrtc.org int plis_sent; 92428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int nacks_sent; 92528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int frame_width; 92628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int frame_height; 92728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int framerate_rcvd; 92828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int framerate_decoded; 92928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int framerate_output; 93028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Framerate as sent to the renderer. 93128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int framerate_render_input; 93228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Framerate that the renderer reports. 93328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int framerate_render_output; 93497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 93597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // All stats below are gathered per-VideoReceiver, but some will be correlated 93697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // across MediaStreamTracks. NOTE(hta): when sinking stats into per-SSRC 93797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // structures, reflect this in the new layout. 93897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 93997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Current frame decode latency. 94097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int decode_ms; 94197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Maximum observed frame decode latency. 94297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int max_decode_ms; 94397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Jitter (network-related) latency. 94497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int jitter_buffer_ms; 94597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Requested minimum playout latency. 94697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int min_playout_delay_ms; 94797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Requested latency to account for rendering delay. 94897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int render_delay_ms; 94997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Target overall delay: network+decode+render, accounting for 95097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // min_playout_delay_ms. 95197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int target_delay_ms; 95297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Current overall delay, possibly ramping towards target_delay_ms. 95397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org int current_delay_ms; 95428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 95528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 95697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgstruct DataSenderInfo : public MediaSenderInfo { 95728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org DataSenderInfo() 95897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org : ssrc(0) { 95928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 96028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 96128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org uint32 ssrc; 96228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 96328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 96497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgstruct DataReceiverInfo : public MediaReceiverInfo { 96528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org DataReceiverInfo() 96697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org : ssrc(0) { 96728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 96828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 96928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org uint32 ssrc; 97028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 97128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 97228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstruct BandwidthEstimationInfo { 97328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org BandwidthEstimationInfo() 97428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : available_send_bandwidth(0), 97528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org available_recv_bandwidth(0), 97628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org target_enc_bitrate(0), 97728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org actual_enc_bitrate(0), 97828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org retransmit_bitrate(0), 97928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org transmit_bitrate(0), 980b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bucket_delay(0), 981b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org total_received_propagation_delta_ms(0) { 98228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 98328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 98428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int available_send_bandwidth; 98528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int available_recv_bandwidth; 98628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int target_enc_bitrate; 98728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int actual_enc_bitrate; 98828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int retransmit_bitrate; 98928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int transmit_bitrate; 99028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int bucket_delay; 991b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // The following stats are only valid when 992b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // StatsOptions::include_received_propagation_stats is true. 993b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org int total_received_propagation_delta_ms; 994b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::vector<int> recent_received_propagation_delta_ms; 995b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::vector<int64> recent_received_packet_group_arrival_time_ms; 99628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 99728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 99828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstruct VoiceMediaInfo { 99928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void Clear() { 100028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org senders.clear(); 100128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org receivers.clear(); 100228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 100328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::vector<VoiceSenderInfo> senders; 100428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::vector<VoiceReceiverInfo> receivers; 100528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 100628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 100728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstruct VideoMediaInfo { 100828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void Clear() { 100928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org senders.clear(); 101028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org receivers.clear(); 101128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bw_estimations.clear(); 101228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 101328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::vector<VideoSenderInfo> senders; 101428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::vector<VideoReceiverInfo> receivers; 101528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::vector<BandwidthEstimationInfo> bw_estimations; 101628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 101728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 101828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstruct DataMediaInfo { 101928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org void Clear() { 102028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org senders.clear(); 102128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org receivers.clear(); 102228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 102328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::vector<DataSenderInfo> senders; 102428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::vector<DataReceiverInfo> receivers; 102528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 102628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1027b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgstruct StatsOptions { 1028b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org StatsOptions() : include_received_propagation_stats(false) {} 1029b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1030b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bool include_received_propagation_stats; 1031b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org}; 1032b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 103328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass VoiceMediaChannel : public MediaChannel { 103428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 103528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org enum Error { 103628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_NONE = 0, // No error. 103728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_OTHER, // Other errors. 103828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_DEVICE_OPEN_FAILED = 100, // Could not open mic. 103928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_DEVICE_MUTED, // Mic was muted by OS. 104028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_DEVICE_SILENT, // No background noise picked up. 104128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_DEVICE_SATURATION, // Mic input is clipping. 104228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_DEVICE_REMOVED, // Mic was removed while active. 104328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_RUNTIME_ERROR, // Processing is encountering errors. 104428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_SRTP_ERROR, // Generic SRTP failure. 104528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_SRTP_AUTH_FAILED, // Failed to authenticate packets. 104628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_TYPING_NOISE_DETECTED, // Typing noise is detected. 104728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_PLAY_DEVICE_OPEN_FAILED = 200, // Could not open playout. 104828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_PLAY_DEVICE_MUTED, // Playout muted by OS. 104928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_PLAY_DEVICE_REMOVED, // Playout removed while active. 105028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_PLAY_RUNTIME_ERROR, // Errors in voice processing. 105128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_PLAY_SRTP_ERROR, // Generic SRTP failure. 105228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_PLAY_SRTP_AUTH_FAILED, // Failed to authenticate packets. 105328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_PLAY_SRTP_REPLAY, // Packet replay detected. 105428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org }; 105528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 105628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org VoiceMediaChannel() {} 105728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual ~VoiceMediaChannel() {} 105828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Sets the codecs/payload types to be used for incoming media. 105928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetRecvCodecs(const std::vector<AudioCodec>& codecs) = 0; 106028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Sets the codecs/payload types to be used for outgoing media. 106128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetSendCodecs(const std::vector<AudioCodec>& codecs) = 0; 106228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Starts or stops playout of received audio. 106328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetPlayout(bool playout) = 0; 106428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Starts or stops sending (and potentially capture) of local audio. 106528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetSend(SendFlags flag) = 0; 10661e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org // Sets the renderer object to be used for the specified remote audio stream. 10671e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org virtual bool SetRemoteRenderer(uint32 ssrc, AudioRenderer* renderer) = 0; 10681e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org // Sets the renderer object to be used for the specified local audio stream. 10691e09a711263dd105e6f7a03812250084c64e5fd8henrike@webrtc.org virtual bool SetLocalRenderer(uint32 ssrc, AudioRenderer* renderer) = 0; 107028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Gets current energy levels for all incoming streams. 107128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool GetActiveStreams(AudioInfo::StreamList* actives) = 0; 107228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Get the current energy level of the stream sent to the speaker. 107328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual int GetOutputLevel() = 0; 107428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Get the time in milliseconds since last recorded keystroke, or negative. 107528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual int GetTimeSinceLastTyping() = 0; 107628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Temporarily exposed field for tuning typing detect options. 107728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void SetTypingDetectionParameters(int time_window, 107828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int cost_per_typing, int reporting_threshold, int penalty_decay, 107928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int type_event_delay) = 0; 108028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set left and right scale for speaker output volume of the specified ssrc. 108128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetOutputScaling(uint32 ssrc, double left, double right) = 0; 108228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Get left and right scale for speaker output volume of the specified ssrc. 108328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool GetOutputScaling(uint32 ssrc, double* left, double* right) = 0; 108428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Specifies a ringback tone to be played during call setup. 108528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetRingbackTone(const char *buf, int len) = 0; 108628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Plays or stops the aforementioned ringback tone 108728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool PlayRingbackTone(uint32 ssrc, bool play, bool loop) = 0; 108828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Returns if the telephone-event has been negotiated. 108928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool CanInsertDtmf() { return false; } 109028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Send and/or play a DTMF |event| according to the |flags|. 109128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The DTMF out-of-band signal will be used on sending. 109228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The |ssrc| should be either 0 or a valid send stream ssrc. 10939de257d00f1f805af28f15fd814a8a84460028e5henrike@webrtc.org // The valid value for the |event| are 0 to 15 which corresponding to 10949de257d00f1f805af28f15fd814a8a84460028e5henrike@webrtc.org // DTMF event 0-9, *, #, A-D. 109528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool InsertDtmf(uint32 ssrc, int event, int duration, int flags) = 0; 109628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Gets quality stats for the channel. 109728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool GetStats(VoiceMediaInfo* info) = 0; 109828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Gets last reported error for this media channel. 109928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void GetLastMediaError(uint32* ssrc, 110028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org VoiceMediaChannel::Error* error) { 110128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT(error != NULL); 110228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org *error = ERROR_NONE; 110328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 110428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Sets the media options to use. 110528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetOptions(const AudioOptions& options) = 0; 110628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool GetOptions(AudioOptions* options) const = 0; 110728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 110828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Signal errors from MediaChannel. Arguments are: 110928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // ssrc(uint32), and error(VoiceMediaChannel::Error). 111028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sigslot::signal2<uint32, VoiceMediaChannel::Error> SignalMediaError; 111128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 111228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 111328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass VideoMediaChannel : public MediaChannel { 111428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 111528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org enum Error { 111628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_NONE = 0, // No error. 111728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_OTHER, // Other errors. 111828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_DEVICE_OPEN_FAILED = 100, // Could not open camera. 111928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_DEVICE_NO_DEVICE, // No camera. 112028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_DEVICE_IN_USE, // Device is in already use. 112128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_DEVICE_REMOVED, // Device is removed. 112228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_SRTP_ERROR, // Generic sender SRTP failure. 112328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_SRTP_AUTH_FAILED, // Failed to authenticate packets. 112428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_REC_CPU_MAX_CANT_DOWNGRADE, // Can't downgrade capture anymore. 112528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_PLAY_SRTP_ERROR = 200, // Generic receiver SRTP failure. 112628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_PLAY_SRTP_AUTH_FAILED, // Failed to authenticate packets. 112728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_PLAY_SRTP_REPLAY, // Packet replay detected. 112828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org }; 112928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 113028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org VideoMediaChannel() : renderer_(NULL) {} 113128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual ~VideoMediaChannel() {} 113228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Sets the codecs/payload types to be used for incoming media. 113328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetRecvCodecs(const std::vector<VideoCodec>& codecs) = 0; 113428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Sets the codecs/payload types to be used for outgoing media. 113528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetSendCodecs(const std::vector<VideoCodec>& codecs) = 0; 113628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Gets the currently set codecs/payload types to be used for outgoing media. 113728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool GetSendCodec(VideoCodec* send_codec) = 0; 113828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Sets the format of a specified outgoing stream. 113928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetSendStreamFormat(uint32 ssrc, const VideoFormat& format) = 0; 114028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Starts or stops playout of received video. 114128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetRender(bool render) = 0; 114228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Starts or stops transmission (and potentially capture) of local video. 114328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetSend(bool send) = 0; 114428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Sets the renderer object to be used for the specified stream. 114528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // If SSRC is 0, the renderer is used for the 'default' stream. 114628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetRenderer(uint32 ssrc, VideoRenderer* renderer) = 0; 114728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // If |ssrc| is 0, replace the default capturer (engine capturer) with 114828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // |capturer|. If |ssrc| is non zero create a new stream with |ssrc| as SSRC. 114928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetCapturer(uint32 ssrc, VideoCapturer* capturer) = 0; 115028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Gets quality stats for the channel. 1151b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org virtual bool GetStats(const StatsOptions& options, VideoMediaInfo* info) = 0; 1152b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // This is needed for MediaMonitor to use the same template for voice, video 1153b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // and data MediaChannels. 1154b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bool GetStats(VideoMediaInfo* info) { 1155b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org return GetStats(StatsOptions(), info); 1156b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 115728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 115828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Send an intra frame to the receivers. 115928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SendIntraFrame() = 0; 116028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Reuqest each of the remote senders to send an intra frame. 116128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool RequestIntraFrame() = 0; 116228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Sets the media options to use. 116328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetOptions(const VideoOptions& options) = 0; 116428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool GetOptions(VideoOptions* options) const = 0; 116528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual void UpdateAspectRatio(int ratio_w, int ratio_h) = 0; 116628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 116728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Signal errors from MediaChannel. Arguments are: 116828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // ssrc(uint32), and error(VideoMediaChannel::Error). 116928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sigslot::signal2<uint32, Error> SignalMediaError; 117028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 117128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 117228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org VideoRenderer *renderer_; 117328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 117428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 117528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgenum DataMessageType { 11761112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org // Chrome-Internal use only. See SctpDataMediaChannel for the actual PPID 11771112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org // values. 11781112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org DMT_NONE = 0, 11791112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org DMT_CONTROL = 1, 11801112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org DMT_BINARY = 2, 11811112c30e1e5f5c7b4b517c4954ef3f15b989a996mallinath@webrtc.org DMT_TEXT = 3, 118228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 118328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 118428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Info about data received in DataMediaChannel. For use in 118528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// DataMediaChannel::SignalDataReceived and in all of the signals that 118628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// signal fires, on up the chain. 118728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstruct ReceiveDataParams { 118828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The in-packet stream indentifier. 118928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // For SCTP, this is really SID, not SSRC. 119028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org uint32 ssrc; 119128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The type of message (binary, text, or control). 119228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org DataMessageType type; 119328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // A per-stream value incremented per packet in the stream. 119428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int seq_num; 119528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // A per-stream value monotonically increasing with time. 119628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int timestamp; 119728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 119828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ReceiveDataParams() : 119928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ssrc(0), 120028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org type(DMT_TEXT), 120128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org seq_num(0), 120228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org timestamp(0) { 120328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 120428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 120528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 120628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstruct SendDataParams { 120728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The in-packet stream indentifier. 120828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // For SCTP, this is really SID, not SSRC. 120928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org uint32 ssrc; 121028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The type of message (binary, text, or control). 121128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org DataMessageType type; 121228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 121328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // For SCTP, whether to send messages flagged as ordered or not. 121428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // If false, messages can be received out of order. 121528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool ordered; 121628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // For SCTP, whether the messages are sent reliably or not. 121728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // If false, messages may be lost. 121828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bool reliable; 121928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // For SCTP, if reliable == false, provide partial reliability by 122028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // resending up to this many times. Either count or millis 122128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // is supported, not both at the same time. 122228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int max_rtx_count; 122328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // For SCTP, if reliable == false, provide partial reliability by 122428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // resending for up to this many milliseconds. Either count or millis 122528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // is supported, not both at the same time. 122628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org int max_rtx_ms; 122728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 122828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SendDataParams() : 122928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ssrc(0), 123028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org type(DMT_TEXT), 123128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // TODO(pthatcher): Make these true by default? 123228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ordered(false), 123328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reliable(false), 123428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org max_rtx_count(0), 123528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org max_rtx_ms(0) { 123628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 123728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 123828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 123928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgenum SendDataResult { SDR_SUCCESS, SDR_ERROR, SDR_BLOCK }; 124028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 124128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass DataMediaChannel : public MediaChannel { 124228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 124328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org enum Error { 124428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_NONE = 0, // No error. 124528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_OTHER, // Other errors. 124628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_SEND_SRTP_ERROR = 200, // Generic SRTP failure. 124728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_SEND_SRTP_AUTH_FAILED, // Failed to authenticate packets. 124828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_RECV_SRTP_ERROR, // Generic SRTP failure. 124928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_RECV_SRTP_AUTH_FAILED, // Failed to authenticate packets. 125028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ERROR_RECV_SRTP_REPLAY, // Packet replay detected. 125128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org }; 125228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 125328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual ~DataMediaChannel() {} 125428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 125528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetSendCodecs(const std::vector<DataCodec>& codecs) = 0; 125628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetRecvCodecs(const std::vector<DataCodec>& codecs) = 0; 1257a9890800e078105f21f0a21358ee59a0b3736af6wu@webrtc.org 125828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool MuteStream(uint32 ssrc, bool on) { return false; } 125928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // TODO(pthatcher): Implement this. 126028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool GetStats(DataMediaInfo* info) { return true; } 126128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 126228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetSend(bool send) = 0; 126328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SetReceive(bool receive) = 0; 126428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 126528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org virtual bool SendData( 126628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const SendDataParams& params, 126728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const talk_base::Buffer& payload, 126828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org SendDataResult* result = NULL) = 0; 126928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Signals when data is received (params, data, len) 127028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sigslot::signal3<const ReceiveDataParams&, 127128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const char*, 127228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org size_t> SignalDataReceived; 127328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Signal errors from MediaChannel. Arguments are: 127428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // ssrc(uint32), and error(DataMediaChannel::Error). 127528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org sigslot::signal2<uint32, DataMediaChannel::Error> SignalMediaError; 1276d64719d8954262fee94e7615422f3d027dc1ae6bwu@webrtc.org // Signal when the media channel is ready to send the stream. Arguments are: 1277d64719d8954262fee94e7615422f3d027dc1ae6bwu@webrtc.org // writable(bool) 1278d64719d8954262fee94e7615422f3d027dc1ae6bwu@webrtc.org sigslot::signal1<bool> SignalReadyToSend; 127928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 128028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 128128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace cricket 128228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 128328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#endif // TALK_MEDIA_BASE_MEDIACHANNEL_H_ 1284