1/* 2 * libjingle 3 * Copyright 2004 Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28#ifndef TALK_MEDIA_BASE_MEDIACHANNEL_H_ 29#define TALK_MEDIA_BASE_MEDIACHANNEL_H_ 30 31#include <string> 32#include <vector> 33 34#include "talk/media/base/codec.h" 35#include "talk/media/base/constants.h" 36#include "talk/media/base/streamparams.h" 37#include "webrtc/base/basictypes.h" 38#include "webrtc/base/buffer.h" 39#include "webrtc/base/dscp.h" 40#include "webrtc/base/logging.h" 41#include "webrtc/base/optional.h" 42#include "webrtc/base/sigslot.h" 43#include "webrtc/base/socket.h" 44#include "webrtc/base/window.h" 45// TODO(juberti): re-evaluate this include 46#include "talk/session/media/audiomonitor.h" 47 48namespace rtc { 49class Buffer; 50class RateLimiter; 51class Timing; 52} 53 54namespace webrtc { 55class AudioSinkInterface; 56} 57 58namespace cricket { 59 60class AudioRenderer; 61class ScreencastId; 62class VideoCapturer; 63class VideoRenderer; 64struct RtpHeader; 65struct VideoFormat; 66 67const int kMinRtpHeaderExtensionId = 1; 68const int kMaxRtpHeaderExtensionId = 255; 69const int kScreencastDefaultFps = 5; 70 71template <class T> 72static std::string ToStringIfSet(const char* key, const rtc::Optional<T>& val) { 73 std::string str; 74 if (val) { 75 str = key; 76 str += ": "; 77 str += val ? rtc::ToString(*val) : ""; 78 str += ", "; 79 } 80 return str; 81} 82 83template <class T> 84static std::string VectorToString(const std::vector<T>& vals) { 85 std::ostringstream ost; 86 ost << "["; 87 for (size_t i = 0; i < vals.size(); ++i) { 88 if (i > 0) { 89 ost << ", "; 90 } 91 ost << vals[i].ToString(); 92 } 93 ost << "]"; 94 return ost.str(); 95} 96 97// Options that can be applied to a VoiceMediaChannel or a VoiceMediaEngine. 98// Used to be flags, but that makes it hard to selectively apply options. 99// We are moving all of the setting of options to structs like this, 100// but some things currently still use flags. 101struct AudioOptions { 102 void SetAll(const AudioOptions& change) { 103 SetFrom(&echo_cancellation, change.echo_cancellation); 104 SetFrom(&auto_gain_control, change.auto_gain_control); 105 SetFrom(&noise_suppression, change.noise_suppression); 106 SetFrom(&highpass_filter, change.highpass_filter); 107 SetFrom(&stereo_swapping, change.stereo_swapping); 108 SetFrom(&audio_jitter_buffer_max_packets, 109 change.audio_jitter_buffer_max_packets); 110 SetFrom(&audio_jitter_buffer_fast_accelerate, 111 change.audio_jitter_buffer_fast_accelerate); 112 SetFrom(&typing_detection, change.typing_detection); 113 SetFrom(&aecm_generate_comfort_noise, change.aecm_generate_comfort_noise); 114 SetFrom(&conference_mode, change.conference_mode); 115 SetFrom(&adjust_agc_delta, change.adjust_agc_delta); 116 SetFrom(&experimental_agc, change.experimental_agc); 117 SetFrom(&extended_filter_aec, change.extended_filter_aec); 118 SetFrom(&delay_agnostic_aec, change.delay_agnostic_aec); 119 SetFrom(&experimental_ns, change.experimental_ns); 120 SetFrom(&aec_dump, change.aec_dump); 121 SetFrom(&tx_agc_target_dbov, change.tx_agc_target_dbov); 122 SetFrom(&tx_agc_digital_compression_gain, 123 change.tx_agc_digital_compression_gain); 124 SetFrom(&tx_agc_limiter, change.tx_agc_limiter); 125 SetFrom(&recording_sample_rate, change.recording_sample_rate); 126 SetFrom(&playout_sample_rate, change.playout_sample_rate); 127 SetFrom(&dscp, change.dscp); 128 SetFrom(&combined_audio_video_bwe, change.combined_audio_video_bwe); 129 } 130 131 bool operator==(const AudioOptions& o) const { 132 return echo_cancellation == o.echo_cancellation && 133 auto_gain_control == o.auto_gain_control && 134 noise_suppression == o.noise_suppression && 135 highpass_filter == o.highpass_filter && 136 stereo_swapping == o.stereo_swapping && 137 audio_jitter_buffer_max_packets == o.audio_jitter_buffer_max_packets && 138 audio_jitter_buffer_fast_accelerate == 139 o.audio_jitter_buffer_fast_accelerate && 140 typing_detection == o.typing_detection && 141 aecm_generate_comfort_noise == o.aecm_generate_comfort_noise && 142 conference_mode == o.conference_mode && 143 experimental_agc == o.experimental_agc && 144 extended_filter_aec == o.extended_filter_aec && 145 delay_agnostic_aec == o.delay_agnostic_aec && 146 experimental_ns == o.experimental_ns && 147 adjust_agc_delta == o.adjust_agc_delta && 148 aec_dump == o.aec_dump && 149 tx_agc_target_dbov == o.tx_agc_target_dbov && 150 tx_agc_digital_compression_gain == o.tx_agc_digital_compression_gain && 151 tx_agc_limiter == o.tx_agc_limiter && 152 recording_sample_rate == o.recording_sample_rate && 153 playout_sample_rate == o.playout_sample_rate && 154 dscp == o.dscp && 155 combined_audio_video_bwe == o.combined_audio_video_bwe; 156 } 157 158 std::string ToString() const { 159 std::ostringstream ost; 160 ost << "AudioOptions {"; 161 ost << ToStringIfSet("aec", echo_cancellation); 162 ost << ToStringIfSet("agc", auto_gain_control); 163 ost << ToStringIfSet("ns", noise_suppression); 164 ost << ToStringIfSet("hf", highpass_filter); 165 ost << ToStringIfSet("swap", stereo_swapping); 166 ost << ToStringIfSet("audio_jitter_buffer_max_packets", 167 audio_jitter_buffer_max_packets); 168 ost << ToStringIfSet("audio_jitter_buffer_fast_accelerate", 169 audio_jitter_buffer_fast_accelerate); 170 ost << ToStringIfSet("typing", typing_detection); 171 ost << ToStringIfSet("comfort_noise", aecm_generate_comfort_noise); 172 ost << ToStringIfSet("conference", conference_mode); 173 ost << ToStringIfSet("agc_delta", adjust_agc_delta); 174 ost << ToStringIfSet("experimental_agc", experimental_agc); 175 ost << ToStringIfSet("extended_filter_aec", extended_filter_aec); 176 ost << ToStringIfSet("delay_agnostic_aec", delay_agnostic_aec); 177 ost << ToStringIfSet("experimental_ns", experimental_ns); 178 ost << ToStringIfSet("aec_dump", aec_dump); 179 ost << ToStringIfSet("tx_agc_target_dbov", tx_agc_target_dbov); 180 ost << ToStringIfSet("tx_agc_digital_compression_gain", 181 tx_agc_digital_compression_gain); 182 ost << ToStringIfSet("tx_agc_limiter", tx_agc_limiter); 183 ost << ToStringIfSet("recording_sample_rate", recording_sample_rate); 184 ost << ToStringIfSet("playout_sample_rate", playout_sample_rate); 185 ost << ToStringIfSet("dscp", dscp); 186 ost << ToStringIfSet("combined_audio_video_bwe", combined_audio_video_bwe); 187 ost << "}"; 188 return ost.str(); 189 } 190 191 // Audio processing that attempts to filter away the output signal from 192 // later inbound pickup. 193 rtc::Optional<bool> echo_cancellation; 194 // Audio processing to adjust the sensitivity of the local mic dynamically. 195 rtc::Optional<bool> auto_gain_control; 196 // Audio processing to filter out background noise. 197 rtc::Optional<bool> noise_suppression; 198 // Audio processing to remove background noise of lower frequencies. 199 rtc::Optional<bool> highpass_filter; 200 // Audio processing to swap the left and right channels. 201 rtc::Optional<bool> stereo_swapping; 202 // Audio receiver jitter buffer (NetEq) max capacity in number of packets. 203 rtc::Optional<int> audio_jitter_buffer_max_packets; 204 // Audio receiver jitter buffer (NetEq) fast accelerate mode. 205 rtc::Optional<bool> audio_jitter_buffer_fast_accelerate; 206 // Audio processing to detect typing. 207 rtc::Optional<bool> typing_detection; 208 rtc::Optional<bool> aecm_generate_comfort_noise; 209 rtc::Optional<bool> conference_mode; 210 rtc::Optional<int> adjust_agc_delta; 211 rtc::Optional<bool> experimental_agc; 212 rtc::Optional<bool> extended_filter_aec; 213 rtc::Optional<bool> delay_agnostic_aec; 214 rtc::Optional<bool> experimental_ns; 215 rtc::Optional<bool> aec_dump; 216 // Note that tx_agc_* only applies to non-experimental AGC. 217 rtc::Optional<uint16_t> tx_agc_target_dbov; 218 rtc::Optional<uint16_t> tx_agc_digital_compression_gain; 219 rtc::Optional<bool> tx_agc_limiter; 220 rtc::Optional<uint32_t> recording_sample_rate; 221 rtc::Optional<uint32_t> playout_sample_rate; 222 // Set DSCP value for packet sent from audio channel. 223 rtc::Optional<bool> dscp; 224 // Enable combined audio+bandwidth BWE. 225 rtc::Optional<bool> combined_audio_video_bwe; 226 227 private: 228 template <typename T> 229 static void SetFrom(rtc::Optional<T>* s, const rtc::Optional<T>& o) { 230 if (o) { 231 *s = o; 232 } 233 } 234}; 235 236// Options that can be applied to a VideoMediaChannel or a VideoMediaEngine. 237// Used to be flags, but that makes it hard to selectively apply options. 238// We are moving all of the setting of options to structs like this, 239// but some things currently still use flags. 240struct VideoOptions { 241 VideoOptions() 242 : process_adaptation_threshhold(kProcessCpuThreshold), 243 system_low_adaptation_threshhold(kLowSystemCpuThreshold), 244 system_high_adaptation_threshhold(kHighSystemCpuThreshold), 245 unsignalled_recv_stream_limit(kNumDefaultUnsignalledVideoRecvStreams) {} 246 247 void SetAll(const VideoOptions& change) { 248 SetFrom(&adapt_input_to_cpu_usage, change.adapt_input_to_cpu_usage); 249 SetFrom(&adapt_cpu_with_smoothing, change.adapt_cpu_with_smoothing); 250 SetFrom(&video_adapt_third, change.video_adapt_third); 251 SetFrom(&video_noise_reduction, change.video_noise_reduction); 252 SetFrom(&video_start_bitrate, change.video_start_bitrate); 253 SetFrom(&cpu_overuse_detection, change.cpu_overuse_detection); 254 SetFrom(&cpu_underuse_threshold, change.cpu_underuse_threshold); 255 SetFrom(&cpu_overuse_threshold, change.cpu_overuse_threshold); 256 SetFrom(&cpu_underuse_encode_rsd_threshold, 257 change.cpu_underuse_encode_rsd_threshold); 258 SetFrom(&cpu_overuse_encode_rsd_threshold, 259 change.cpu_overuse_encode_rsd_threshold); 260 SetFrom(&cpu_overuse_encode_usage, change.cpu_overuse_encode_usage); 261 SetFrom(&conference_mode, change.conference_mode); 262 SetFrom(&process_adaptation_threshhold, 263 change.process_adaptation_threshhold); 264 SetFrom(&system_low_adaptation_threshhold, 265 change.system_low_adaptation_threshhold); 266 SetFrom(&system_high_adaptation_threshhold, 267 change.system_high_adaptation_threshhold); 268 SetFrom(&dscp, change.dscp); 269 SetFrom(&suspend_below_min_bitrate, change.suspend_below_min_bitrate); 270 SetFrom(&unsignalled_recv_stream_limit, 271 change.unsignalled_recv_stream_limit); 272 SetFrom(&use_simulcast_adapter, change.use_simulcast_adapter); 273 SetFrom(&screencast_min_bitrate, change.screencast_min_bitrate); 274 SetFrom(&disable_prerenderer_smoothing, 275 change.disable_prerenderer_smoothing); 276 } 277 278 bool operator==(const VideoOptions& o) const { 279 return adapt_input_to_cpu_usage == o.adapt_input_to_cpu_usage && 280 adapt_cpu_with_smoothing == o.adapt_cpu_with_smoothing && 281 video_adapt_third == o.video_adapt_third && 282 video_noise_reduction == o.video_noise_reduction && 283 video_start_bitrate == o.video_start_bitrate && 284 cpu_overuse_detection == o.cpu_overuse_detection && 285 cpu_underuse_threshold == o.cpu_underuse_threshold && 286 cpu_overuse_threshold == o.cpu_overuse_threshold && 287 cpu_underuse_encode_rsd_threshold == 288 o.cpu_underuse_encode_rsd_threshold && 289 cpu_overuse_encode_rsd_threshold == 290 o.cpu_overuse_encode_rsd_threshold && 291 cpu_overuse_encode_usage == o.cpu_overuse_encode_usage && 292 conference_mode == o.conference_mode && 293 process_adaptation_threshhold == o.process_adaptation_threshhold && 294 system_low_adaptation_threshhold == 295 o.system_low_adaptation_threshhold && 296 system_high_adaptation_threshhold == 297 o.system_high_adaptation_threshhold && 298 dscp == o.dscp && 299 suspend_below_min_bitrate == o.suspend_below_min_bitrate && 300 unsignalled_recv_stream_limit == o.unsignalled_recv_stream_limit && 301 use_simulcast_adapter == o.use_simulcast_adapter && 302 screencast_min_bitrate == o.screencast_min_bitrate && 303 disable_prerenderer_smoothing == o.disable_prerenderer_smoothing; 304 } 305 306 std::string ToString() const { 307 std::ostringstream ost; 308 ost << "VideoOptions {"; 309 ost << ToStringIfSet("cpu adaption", adapt_input_to_cpu_usage); 310 ost << ToStringIfSet("cpu adaptation smoothing", adapt_cpu_with_smoothing); 311 ost << ToStringIfSet("video adapt third", video_adapt_third); 312 ost << ToStringIfSet("noise reduction", video_noise_reduction); 313 ost << ToStringIfSet("start bitrate", video_start_bitrate); 314 ost << ToStringIfSet("cpu overuse detection", cpu_overuse_detection); 315 ost << ToStringIfSet("cpu underuse threshold", cpu_underuse_threshold); 316 ost << ToStringIfSet("cpu overuse threshold", cpu_overuse_threshold); 317 ost << ToStringIfSet("cpu underuse encode rsd threshold", 318 cpu_underuse_encode_rsd_threshold); 319 ost << ToStringIfSet("cpu overuse encode rsd threshold", 320 cpu_overuse_encode_rsd_threshold); 321 ost << ToStringIfSet("cpu overuse encode usage", 322 cpu_overuse_encode_usage); 323 ost << ToStringIfSet("conference mode", conference_mode); 324 ost << ToStringIfSet("process", process_adaptation_threshhold); 325 ost << ToStringIfSet("low", system_low_adaptation_threshhold); 326 ost << ToStringIfSet("high", system_high_adaptation_threshhold); 327 ost << ToStringIfSet("dscp", dscp); 328 ost << ToStringIfSet("suspend below min bitrate", 329 suspend_below_min_bitrate); 330 ost << ToStringIfSet("num channels for early receive", 331 unsignalled_recv_stream_limit); 332 ost << ToStringIfSet("use simulcast adapter", use_simulcast_adapter); 333 ost << ToStringIfSet("screencast min bitrate", screencast_min_bitrate); 334 ost << "}"; 335 return ost.str(); 336 } 337 338 // Enable CPU adaptation? 339 rtc::Optional<bool> adapt_input_to_cpu_usage; 340 // Enable CPU adaptation smoothing? 341 rtc::Optional<bool> adapt_cpu_with_smoothing; 342 // Enable video adapt third? 343 rtc::Optional<bool> video_adapt_third; 344 // Enable denoising? 345 rtc::Optional<bool> video_noise_reduction; 346 // Experimental: Enable WebRtc higher start bitrate? 347 rtc::Optional<int> video_start_bitrate; 348 // Enable WebRTC Cpu Overuse Detection, which is a new version of the CPU 349 // adaptation algorithm. So this option will override the 350 // |adapt_input_to_cpu_usage|. 351 rtc::Optional<bool> cpu_overuse_detection; 352 // Low threshold (t1) for cpu overuse adaptation. (Adapt up) 353 // Metric: encode usage (m1). m1 < t1 => underuse. 354 rtc::Optional<int> cpu_underuse_threshold; 355 // High threshold (t1) for cpu overuse adaptation. (Adapt down) 356 // Metric: encode usage (m1). m1 > t1 => overuse. 357 rtc::Optional<int> cpu_overuse_threshold; 358 // Low threshold (t2) for cpu overuse adaptation. (Adapt up) 359 // Metric: relative standard deviation of encode time (m2). 360 // Optional threshold. If set, (m1 < t1 && m2 < t2) => underuse. 361 // Note: t2 will have no effect if t1 is not set. 362 rtc::Optional<int> cpu_underuse_encode_rsd_threshold; 363 // High threshold (t2) for cpu overuse adaptation. (Adapt down) 364 // Metric: relative standard deviation of encode time (m2). 365 // Optional threshold. If set, (m1 > t1 || m2 > t2) => overuse. 366 // Note: t2 will have no effect if t1 is not set. 367 rtc::Optional<int> cpu_overuse_encode_rsd_threshold; 368 // Use encode usage for cpu detection. 369 rtc::Optional<bool> cpu_overuse_encode_usage; 370 // Use conference mode? 371 rtc::Optional<bool> conference_mode; 372 // Threshhold for process cpu adaptation. (Process limit) 373 rtc::Optional<float> process_adaptation_threshhold; 374 // Low threshhold for cpu adaptation. (Adapt up) 375 rtc::Optional<float> system_low_adaptation_threshhold; 376 // High threshhold for cpu adaptation. (Adapt down) 377 rtc::Optional<float> system_high_adaptation_threshhold; 378 // Set DSCP value for packet sent from video channel. 379 rtc::Optional<bool> dscp; 380 // Enable WebRTC suspension of video. No video frames will be sent when the 381 // bitrate is below the configured minimum bitrate. 382 rtc::Optional<bool> suspend_below_min_bitrate; 383 // Limit on the number of early receive channels that can be created. 384 rtc::Optional<int> unsignalled_recv_stream_limit; 385 // Enable use of simulcast adapter. 386 rtc::Optional<bool> use_simulcast_adapter; 387 // Force screencast to use a minimum bitrate 388 rtc::Optional<int> screencast_min_bitrate; 389 // Set to true if the renderer has an algorithm of frame selection. 390 // If the value is true, then WebRTC will hand over a frame as soon as 391 // possible without delay, and rendering smoothness is completely the duty 392 // of the renderer; 393 // If the value is false, then WebRTC is responsible to delay frame release 394 // in order to increase rendering smoothness. 395 rtc::Optional<bool> disable_prerenderer_smoothing; 396 397 private: 398 template <typename T> 399 static void SetFrom(rtc::Optional<T>* s, const rtc::Optional<T>& o) { 400 if (o) { 401 *s = o; 402 } 403 } 404}; 405 406struct RtpHeaderExtension { 407 RtpHeaderExtension() : id(0) {} 408 RtpHeaderExtension(const std::string& u, int i) : uri(u), id(i) {} 409 410 bool operator==(const RtpHeaderExtension& ext) const { 411 // id is a reserved word in objective-c. Therefore the id attribute has to 412 // be a fully qualified name in order to compile on IOS. 413 return this->id == ext.id && 414 uri == ext.uri; 415 } 416 417 std::string ToString() const { 418 std::ostringstream ost; 419 ost << "{"; 420 ost << "uri: " << uri; 421 ost << ", id: " << id; 422 ost << "}"; 423 return ost.str(); 424 } 425 426 std::string uri; 427 int id; 428 // TODO(juberti): SendRecv direction; 429}; 430 431// Returns the named header extension if found among all extensions, NULL 432// otherwise. 433inline const RtpHeaderExtension* FindHeaderExtension( 434 const std::vector<RtpHeaderExtension>& extensions, 435 const std::string& name) { 436 for (std::vector<RtpHeaderExtension>::const_iterator it = extensions.begin(); 437 it != extensions.end(); ++it) { 438 if (it->uri == name) 439 return &(*it); 440 } 441 return NULL; 442} 443 444enum MediaChannelOptions { 445 // Tune the stream for conference mode. 446 OPT_CONFERENCE = 0x0001 447}; 448 449enum VoiceMediaChannelOptions { 450 // Tune the audio stream for vcs with different target levels. 451 OPT_AGC_MINUS_10DB = 0x80000000 452}; 453 454class MediaChannel : public sigslot::has_slots<> { 455 public: 456 class NetworkInterface { 457 public: 458 enum SocketType { ST_RTP, ST_RTCP }; 459 virtual bool SendPacket(rtc::Buffer* packet, 460 const rtc::PacketOptions& options) = 0; 461 virtual bool SendRtcp(rtc::Buffer* packet, 462 const rtc::PacketOptions& options) = 0; 463 virtual int SetOption(SocketType type, rtc::Socket::Option opt, 464 int option) = 0; 465 virtual ~NetworkInterface() {} 466 }; 467 468 MediaChannel() : network_interface_(NULL) {} 469 virtual ~MediaChannel() {} 470 471 // Sets the abstract interface class for sending RTP/RTCP data. 472 virtual void SetInterface(NetworkInterface *iface) { 473 rtc::CritScope cs(&network_interface_crit_); 474 network_interface_ = iface; 475 } 476 477 // Called when a RTP packet is received. 478 virtual void OnPacketReceived(rtc::Buffer* packet, 479 const rtc::PacketTime& packet_time) = 0; 480 // Called when a RTCP packet is received. 481 virtual void OnRtcpReceived(rtc::Buffer* packet, 482 const rtc::PacketTime& packet_time) = 0; 483 // Called when the socket's ability to send has changed. 484 virtual void OnReadyToSend(bool ready) = 0; 485 // Creates a new outgoing media stream with SSRCs and CNAME as described 486 // by sp. 487 virtual bool AddSendStream(const StreamParams& sp) = 0; 488 // Removes an outgoing media stream. 489 // ssrc must be the first SSRC of the media stream if the stream uses 490 // multiple SSRCs. 491 virtual bool RemoveSendStream(uint32_t ssrc) = 0; 492 // Creates a new incoming media stream with SSRCs and CNAME as described 493 // by sp. 494 virtual bool AddRecvStream(const StreamParams& sp) = 0; 495 // Removes an incoming media stream. 496 // ssrc must be the first SSRC of the media stream if the stream uses 497 // multiple SSRCs. 498 virtual bool RemoveRecvStream(uint32_t ssrc) = 0; 499 500 // Returns the absoulte sendtime extension id value from media channel. 501 virtual int GetRtpSendTimeExtnId() const { 502 return -1; 503 } 504 505 // Base method to send packet using NetworkInterface. 506 bool SendPacket(rtc::Buffer* packet, const rtc::PacketOptions& options) { 507 return DoSendPacket(packet, false, options); 508 } 509 510 bool SendRtcp(rtc::Buffer* packet, const rtc::PacketOptions& options) { 511 return DoSendPacket(packet, true, options); 512 } 513 514 int SetOption(NetworkInterface::SocketType type, 515 rtc::Socket::Option opt, 516 int option) { 517 rtc::CritScope cs(&network_interface_crit_); 518 if (!network_interface_) 519 return -1; 520 521 return network_interface_->SetOption(type, opt, option); 522 } 523 524 protected: 525 // This method sets DSCP |value| on both RTP and RTCP channels. 526 int SetDscp(rtc::DiffServCodePoint value) { 527 int ret; 528 ret = SetOption(NetworkInterface::ST_RTP, 529 rtc::Socket::OPT_DSCP, 530 value); 531 if (ret == 0) { 532 ret = SetOption(NetworkInterface::ST_RTCP, 533 rtc::Socket::OPT_DSCP, 534 value); 535 } 536 return ret; 537 } 538 539 private: 540 bool DoSendPacket(rtc::Buffer* packet, 541 bool rtcp, 542 const rtc::PacketOptions& options) { 543 rtc::CritScope cs(&network_interface_crit_); 544 if (!network_interface_) 545 return false; 546 547 return (!rtcp) ? network_interface_->SendPacket(packet, options) 548 : network_interface_->SendRtcp(packet, options); 549 } 550 551 // |network_interface_| can be accessed from the worker_thread and 552 // from any MediaEngine threads. This critical section is to protect accessing 553 // of network_interface_ object. 554 rtc::CriticalSection network_interface_crit_; 555 NetworkInterface* network_interface_; 556}; 557 558enum SendFlags { 559 SEND_NOTHING, 560 SEND_MICROPHONE 561}; 562 563// The stats information is structured as follows: 564// Media are represented by either MediaSenderInfo or MediaReceiverInfo. 565// Media contains a vector of SSRC infos that are exclusively used by this 566// media. (SSRCs shared between media streams can't be represented.) 567 568// Information about an SSRC. 569// This data may be locally recorded, or received in an RTCP SR or RR. 570struct SsrcSenderInfo { 571 SsrcSenderInfo() 572 : ssrc(0), 573 timestamp(0) { 574 } 575 uint32_t ssrc; 576 double timestamp; // NTP timestamp, represented as seconds since epoch. 577}; 578 579struct SsrcReceiverInfo { 580 SsrcReceiverInfo() 581 : ssrc(0), 582 timestamp(0) { 583 } 584 uint32_t ssrc; 585 double timestamp; 586}; 587 588struct MediaSenderInfo { 589 MediaSenderInfo() 590 : bytes_sent(0), 591 packets_sent(0), 592 packets_lost(0), 593 fraction_lost(0.0), 594 rtt_ms(0) { 595 } 596 void add_ssrc(const SsrcSenderInfo& stat) { 597 local_stats.push_back(stat); 598 } 599 // Temporary utility function for call sites that only provide SSRC. 600 // As more info is added into SsrcSenderInfo, this function should go away. 601 void add_ssrc(uint32_t ssrc) { 602 SsrcSenderInfo stat; 603 stat.ssrc = ssrc; 604 add_ssrc(stat); 605 } 606 // Utility accessor for clients that are only interested in ssrc numbers. 607 std::vector<uint32_t> ssrcs() const { 608 std::vector<uint32_t> retval; 609 for (std::vector<SsrcSenderInfo>::const_iterator it = local_stats.begin(); 610 it != local_stats.end(); ++it) { 611 retval.push_back(it->ssrc); 612 } 613 return retval; 614 } 615 // Utility accessor for clients that make the assumption only one ssrc 616 // exists per media. 617 // This will eventually go away. 618 uint32_t ssrc() const { 619 if (local_stats.size() > 0) { 620 return local_stats[0].ssrc; 621 } else { 622 return 0; 623 } 624 } 625 int64_t bytes_sent; 626 int packets_sent; 627 int packets_lost; 628 float fraction_lost; 629 int64_t rtt_ms; 630 std::string codec_name; 631 std::vector<SsrcSenderInfo> local_stats; 632 std::vector<SsrcReceiverInfo> remote_stats; 633}; 634 635template<class T> 636struct VariableInfo { 637 VariableInfo() 638 : min_val(), 639 mean(0.0), 640 max_val(), 641 variance(0.0) { 642 } 643 T min_val; 644 double mean; 645 T max_val; 646 double variance; 647}; 648 649struct MediaReceiverInfo { 650 MediaReceiverInfo() 651 : bytes_rcvd(0), 652 packets_rcvd(0), 653 packets_lost(0), 654 fraction_lost(0.0) { 655 } 656 void add_ssrc(const SsrcReceiverInfo& stat) { 657 local_stats.push_back(stat); 658 } 659 // Temporary utility function for call sites that only provide SSRC. 660 // As more info is added into SsrcSenderInfo, this function should go away. 661 void add_ssrc(uint32_t ssrc) { 662 SsrcReceiverInfo stat; 663 stat.ssrc = ssrc; 664 add_ssrc(stat); 665 } 666 std::vector<uint32_t> ssrcs() const { 667 std::vector<uint32_t> retval; 668 for (std::vector<SsrcReceiverInfo>::const_iterator it = local_stats.begin(); 669 it != local_stats.end(); ++it) { 670 retval.push_back(it->ssrc); 671 } 672 return retval; 673 } 674 // Utility accessor for clients that make the assumption only one ssrc 675 // exists per media. 676 // This will eventually go away. 677 uint32_t ssrc() const { 678 if (local_stats.size() > 0) { 679 return local_stats[0].ssrc; 680 } else { 681 return 0; 682 } 683 } 684 685 int64_t bytes_rcvd; 686 int packets_rcvd; 687 int packets_lost; 688 float fraction_lost; 689 std::string codec_name; 690 std::vector<SsrcReceiverInfo> local_stats; 691 std::vector<SsrcSenderInfo> remote_stats; 692}; 693 694struct VoiceSenderInfo : public MediaSenderInfo { 695 VoiceSenderInfo() 696 : ext_seqnum(0), 697 jitter_ms(0), 698 audio_level(0), 699 aec_quality_min(0.0), 700 echo_delay_median_ms(0), 701 echo_delay_std_ms(0), 702 echo_return_loss(0), 703 echo_return_loss_enhancement(0), 704 typing_noise_detected(false) { 705 } 706 707 int ext_seqnum; 708 int jitter_ms; 709 int audio_level; 710 float aec_quality_min; 711 int echo_delay_median_ms; 712 int echo_delay_std_ms; 713 int echo_return_loss; 714 int echo_return_loss_enhancement; 715 bool typing_noise_detected; 716}; 717 718struct VoiceReceiverInfo : public MediaReceiverInfo { 719 VoiceReceiverInfo() 720 : ext_seqnum(0), 721 jitter_ms(0), 722 jitter_buffer_ms(0), 723 jitter_buffer_preferred_ms(0), 724 delay_estimate_ms(0), 725 audio_level(0), 726 expand_rate(0), 727 speech_expand_rate(0), 728 secondary_decoded_rate(0), 729 accelerate_rate(0), 730 preemptive_expand_rate(0), 731 decoding_calls_to_silence_generator(0), 732 decoding_calls_to_neteq(0), 733 decoding_normal(0), 734 decoding_plc(0), 735 decoding_cng(0), 736 decoding_plc_cng(0), 737 capture_start_ntp_time_ms(-1) {} 738 739 int ext_seqnum; 740 int jitter_ms; 741 int jitter_buffer_ms; 742 int jitter_buffer_preferred_ms; 743 int delay_estimate_ms; 744 int audio_level; 745 // fraction of synthesized audio inserted through expansion. 746 float expand_rate; 747 // fraction of synthesized speech inserted through expansion. 748 float speech_expand_rate; 749 // fraction of data out of secondary decoding, including FEC and RED. 750 float secondary_decoded_rate; 751 // Fraction of data removed through time compression. 752 float accelerate_rate; 753 // Fraction of data inserted through time stretching. 754 float preemptive_expand_rate; 755 int decoding_calls_to_silence_generator; 756 int decoding_calls_to_neteq; 757 int decoding_normal; 758 int decoding_plc; 759 int decoding_cng; 760 int decoding_plc_cng; 761 // Estimated capture start time in NTP time in ms. 762 int64_t capture_start_ntp_time_ms; 763}; 764 765struct VideoSenderInfo : public MediaSenderInfo { 766 VideoSenderInfo() 767 : packets_cached(0), 768 firs_rcvd(0), 769 plis_rcvd(0), 770 nacks_rcvd(0), 771 input_frame_width(0), 772 input_frame_height(0), 773 send_frame_width(0), 774 send_frame_height(0), 775 framerate_input(0), 776 framerate_sent(0), 777 nominal_bitrate(0), 778 preferred_bitrate(0), 779 adapt_reason(0), 780 adapt_changes(0), 781 avg_encode_ms(0), 782 encode_usage_percent(0) { 783 } 784 785 std::vector<SsrcGroup> ssrc_groups; 786 std::string encoder_implementation_name; 787 int packets_cached; 788 int firs_rcvd; 789 int plis_rcvd; 790 int nacks_rcvd; 791 int input_frame_width; 792 int input_frame_height; 793 int send_frame_width; 794 int send_frame_height; 795 int framerate_input; 796 int framerate_sent; 797 int nominal_bitrate; 798 int preferred_bitrate; 799 int adapt_reason; 800 int adapt_changes; 801 int avg_encode_ms; 802 int encode_usage_percent; 803 VariableInfo<int> adapt_frame_drops; 804 VariableInfo<int> effects_frame_drops; 805 VariableInfo<double> capturer_frame_time; 806}; 807 808struct VideoReceiverInfo : public MediaReceiverInfo { 809 VideoReceiverInfo() 810 : packets_concealed(0), 811 firs_sent(0), 812 plis_sent(0), 813 nacks_sent(0), 814 frame_width(0), 815 frame_height(0), 816 framerate_rcvd(0), 817 framerate_decoded(0), 818 framerate_output(0), 819 framerate_render_input(0), 820 framerate_render_output(0), 821 decode_ms(0), 822 max_decode_ms(0), 823 jitter_buffer_ms(0), 824 min_playout_delay_ms(0), 825 render_delay_ms(0), 826 target_delay_ms(0), 827 current_delay_ms(0), 828 capture_start_ntp_time_ms(-1) { 829 } 830 831 std::vector<SsrcGroup> ssrc_groups; 832 std::string decoder_implementation_name; 833 int packets_concealed; 834 int firs_sent; 835 int plis_sent; 836 int nacks_sent; 837 int frame_width; 838 int frame_height; 839 int framerate_rcvd; 840 int framerate_decoded; 841 int framerate_output; 842 // Framerate as sent to the renderer. 843 int framerate_render_input; 844 // Framerate that the renderer reports. 845 int framerate_render_output; 846 847 // All stats below are gathered per-VideoReceiver, but some will be correlated 848 // across MediaStreamTracks. NOTE(hta): when sinking stats into per-SSRC 849 // structures, reflect this in the new layout. 850 851 // Current frame decode latency. 852 int decode_ms; 853 // Maximum observed frame decode latency. 854 int max_decode_ms; 855 // Jitter (network-related) latency. 856 int jitter_buffer_ms; 857 // Requested minimum playout latency. 858 int min_playout_delay_ms; 859 // Requested latency to account for rendering delay. 860 int render_delay_ms; 861 // Target overall delay: network+decode+render, accounting for 862 // min_playout_delay_ms. 863 int target_delay_ms; 864 // Current overall delay, possibly ramping towards target_delay_ms. 865 int current_delay_ms; 866 867 // Estimated capture start time in NTP time in ms. 868 int64_t capture_start_ntp_time_ms; 869}; 870 871struct DataSenderInfo : public MediaSenderInfo { 872 DataSenderInfo() 873 : ssrc(0) { 874 } 875 876 uint32_t ssrc; 877}; 878 879struct DataReceiverInfo : public MediaReceiverInfo { 880 DataReceiverInfo() 881 : ssrc(0) { 882 } 883 884 uint32_t ssrc; 885}; 886 887struct BandwidthEstimationInfo { 888 BandwidthEstimationInfo() 889 : available_send_bandwidth(0), 890 available_recv_bandwidth(0), 891 target_enc_bitrate(0), 892 actual_enc_bitrate(0), 893 retransmit_bitrate(0), 894 transmit_bitrate(0), 895 bucket_delay(0) { 896 } 897 898 int available_send_bandwidth; 899 int available_recv_bandwidth; 900 int target_enc_bitrate; 901 int actual_enc_bitrate; 902 int retransmit_bitrate; 903 int transmit_bitrate; 904 int64_t bucket_delay; 905}; 906 907struct VoiceMediaInfo { 908 void Clear() { 909 senders.clear(); 910 receivers.clear(); 911 } 912 std::vector<VoiceSenderInfo> senders; 913 std::vector<VoiceReceiverInfo> receivers; 914}; 915 916struct VideoMediaInfo { 917 void Clear() { 918 senders.clear(); 919 receivers.clear(); 920 bw_estimations.clear(); 921 } 922 std::vector<VideoSenderInfo> senders; 923 std::vector<VideoReceiverInfo> receivers; 924 std::vector<BandwidthEstimationInfo> bw_estimations; 925}; 926 927struct DataMediaInfo { 928 void Clear() { 929 senders.clear(); 930 receivers.clear(); 931 } 932 std::vector<DataSenderInfo> senders; 933 std::vector<DataReceiverInfo> receivers; 934}; 935 936struct RtcpParameters { 937 bool reduced_size = false; 938}; 939 940template <class Codec> 941struct RtpParameters { 942 virtual std::string ToString() const { 943 std::ostringstream ost; 944 ost << "{"; 945 ost << "codecs: " << VectorToString(codecs) << ", "; 946 ost << "extensions: " << VectorToString(extensions); 947 ost << "}"; 948 return ost.str(); 949 } 950 951 std::vector<Codec> codecs; 952 std::vector<RtpHeaderExtension> extensions; 953 // TODO(pthatcher): Add streams. 954 RtcpParameters rtcp; 955}; 956 957template <class Codec, class Options> 958struct RtpSendParameters : RtpParameters<Codec> { 959 std::string ToString() const override { 960 std::ostringstream ost; 961 ost << "{"; 962 ost << "codecs: " << VectorToString(this->codecs) << ", "; 963 ost << "extensions: " << VectorToString(this->extensions) << ", "; 964 ost << "max_bandiwidth_bps: " << max_bandwidth_bps << ", "; 965 ost << "options: " << options.ToString(); 966 ost << "}"; 967 return ost.str(); 968 } 969 970 int max_bandwidth_bps = -1; 971 Options options; 972}; 973 974struct AudioSendParameters : RtpSendParameters<AudioCodec, AudioOptions> { 975}; 976 977struct AudioRecvParameters : RtpParameters<AudioCodec> { 978}; 979 980class VoiceMediaChannel : public MediaChannel { 981 public: 982 enum Error { 983 ERROR_NONE = 0, // No error. 984 ERROR_OTHER, // Other errors. 985 ERROR_REC_DEVICE_OPEN_FAILED = 100, // Could not open mic. 986 ERROR_REC_DEVICE_MUTED, // Mic was muted by OS. 987 ERROR_REC_DEVICE_SILENT, // No background noise picked up. 988 ERROR_REC_DEVICE_SATURATION, // Mic input is clipping. 989 ERROR_REC_DEVICE_REMOVED, // Mic was removed while active. 990 ERROR_REC_RUNTIME_ERROR, // Processing is encountering errors. 991 ERROR_REC_SRTP_ERROR, // Generic SRTP failure. 992 ERROR_REC_SRTP_AUTH_FAILED, // Failed to authenticate packets. 993 ERROR_REC_TYPING_NOISE_DETECTED, // Typing noise is detected. 994 ERROR_PLAY_DEVICE_OPEN_FAILED = 200, // Could not open playout. 995 ERROR_PLAY_DEVICE_MUTED, // Playout muted by OS. 996 ERROR_PLAY_DEVICE_REMOVED, // Playout removed while active. 997 ERROR_PLAY_RUNTIME_ERROR, // Errors in voice processing. 998 ERROR_PLAY_SRTP_ERROR, // Generic SRTP failure. 999 ERROR_PLAY_SRTP_AUTH_FAILED, // Failed to authenticate packets. 1000 ERROR_PLAY_SRTP_REPLAY, // Packet replay detected. 1001 }; 1002 1003 VoiceMediaChannel() {} 1004 virtual ~VoiceMediaChannel() {} 1005 virtual bool SetSendParameters(const AudioSendParameters& params) = 0; 1006 virtual bool SetRecvParameters(const AudioRecvParameters& params) = 0; 1007 // Starts or stops playout of received audio. 1008 virtual bool SetPlayout(bool playout) = 0; 1009 // Starts or stops sending (and potentially capture) of local audio. 1010 virtual bool SetSend(SendFlags flag) = 0; 1011 // Configure stream for sending. 1012 virtual bool SetAudioSend(uint32_t ssrc, 1013 bool enable, 1014 const AudioOptions* options, 1015 AudioRenderer* renderer) = 0; 1016 // Gets current energy levels for all incoming streams. 1017 virtual bool GetActiveStreams(AudioInfo::StreamList* actives) = 0; 1018 // Get the current energy level of the stream sent to the speaker. 1019 virtual int GetOutputLevel() = 0; 1020 // Get the time in milliseconds since last recorded keystroke, or negative. 1021 virtual int GetTimeSinceLastTyping() = 0; 1022 // Temporarily exposed field for tuning typing detect options. 1023 virtual void SetTypingDetectionParameters(int time_window, 1024 int cost_per_typing, int reporting_threshold, int penalty_decay, 1025 int type_event_delay) = 0; 1026 // Set speaker output volume of the specified ssrc. 1027 virtual bool SetOutputVolume(uint32_t ssrc, double volume) = 0; 1028 // Returns if the telephone-event has been negotiated. 1029 virtual bool CanInsertDtmf() = 0; 1030 // Send a DTMF |event|. The DTMF out-of-band signal will be used. 1031 // The |ssrc| should be either 0 or a valid send stream ssrc. 1032 // The valid value for the |event| are 0 to 15 which corresponding to 1033 // DTMF event 0-9, *, #, A-D. 1034 virtual bool InsertDtmf(uint32_t ssrc, int event, int duration) = 0; 1035 // Gets quality stats for the channel. 1036 virtual bool GetStats(VoiceMediaInfo* info) = 0; 1037 1038 virtual void SetRawAudioSink( 1039 uint32_t ssrc, 1040 rtc::scoped_ptr<webrtc::AudioSinkInterface> sink) = 0; 1041}; 1042 1043struct VideoSendParameters : RtpSendParameters<VideoCodec, VideoOptions> { 1044}; 1045 1046struct VideoRecvParameters : RtpParameters<VideoCodec> { 1047}; 1048 1049class VideoMediaChannel : public MediaChannel { 1050 public: 1051 enum Error { 1052 ERROR_NONE = 0, // No error. 1053 ERROR_OTHER, // Other errors. 1054 ERROR_REC_DEVICE_OPEN_FAILED = 100, // Could not open camera. 1055 ERROR_REC_DEVICE_NO_DEVICE, // No camera. 1056 ERROR_REC_DEVICE_IN_USE, // Device is in already use. 1057 ERROR_REC_DEVICE_REMOVED, // Device is removed. 1058 ERROR_REC_SRTP_ERROR, // Generic sender SRTP failure. 1059 ERROR_REC_SRTP_AUTH_FAILED, // Failed to authenticate packets. 1060 ERROR_REC_CPU_MAX_CANT_DOWNGRADE, // Can't downgrade capture anymore. 1061 ERROR_PLAY_SRTP_ERROR = 200, // Generic receiver SRTP failure. 1062 ERROR_PLAY_SRTP_AUTH_FAILED, // Failed to authenticate packets. 1063 ERROR_PLAY_SRTP_REPLAY, // Packet replay detected. 1064 }; 1065 1066 VideoMediaChannel() : renderer_(NULL) {} 1067 virtual ~VideoMediaChannel() {} 1068 1069 virtual bool SetSendParameters(const VideoSendParameters& params) = 0; 1070 virtual bool SetRecvParameters(const VideoRecvParameters& params) = 0; 1071 // Gets the currently set codecs/payload types to be used for outgoing media. 1072 virtual bool GetSendCodec(VideoCodec* send_codec) = 0; 1073 // Sets the format of a specified outgoing stream. 1074 virtual bool SetSendStreamFormat(uint32_t ssrc, 1075 const VideoFormat& format) = 0; 1076 // Starts or stops transmission (and potentially capture) of local video. 1077 virtual bool SetSend(bool send) = 0; 1078 // Configure stream for sending. 1079 virtual bool SetVideoSend(uint32_t ssrc, 1080 bool enable, 1081 const VideoOptions* options) = 0; 1082 // Sets the renderer object to be used for the specified stream. 1083 // If SSRC is 0, the renderer is used for the 'default' stream. 1084 virtual bool SetRenderer(uint32_t ssrc, VideoRenderer* renderer) = 0; 1085 // If |ssrc| is 0, replace the default capturer (engine capturer) with 1086 // |capturer|. If |ssrc| is non zero create a new stream with |ssrc| as SSRC. 1087 virtual bool SetCapturer(uint32_t ssrc, VideoCapturer* capturer) = 0; 1088 // Gets quality stats for the channel. 1089 virtual bool GetStats(VideoMediaInfo* info) = 0; 1090 // Send an intra frame to the receivers. 1091 virtual bool SendIntraFrame() = 0; 1092 // Reuqest each of the remote senders to send an intra frame. 1093 virtual bool RequestIntraFrame() = 0; 1094 virtual void UpdateAspectRatio(int ratio_w, int ratio_h) = 0; 1095 1096 protected: 1097 VideoRenderer *renderer_; 1098}; 1099 1100enum DataMessageType { 1101 // Chrome-Internal use only. See SctpDataMediaChannel for the actual PPID 1102 // values. 1103 DMT_NONE = 0, 1104 DMT_CONTROL = 1, 1105 DMT_BINARY = 2, 1106 DMT_TEXT = 3, 1107}; 1108 1109// Info about data received in DataMediaChannel. For use in 1110// DataMediaChannel::SignalDataReceived and in all of the signals that 1111// signal fires, on up the chain. 1112struct ReceiveDataParams { 1113 // The in-packet stream indentifier. 1114 // For SCTP, this is really SID, not SSRC. 1115 uint32_t ssrc; 1116 // The type of message (binary, text, or control). 1117 DataMessageType type; 1118 // A per-stream value incremented per packet in the stream. 1119 int seq_num; 1120 // A per-stream value monotonically increasing with time. 1121 int timestamp; 1122 1123 ReceiveDataParams() : 1124 ssrc(0), 1125 type(DMT_TEXT), 1126 seq_num(0), 1127 timestamp(0) { 1128 } 1129}; 1130 1131struct SendDataParams { 1132 // The in-packet stream indentifier. 1133 // For SCTP, this is really SID, not SSRC. 1134 uint32_t ssrc; 1135 // The type of message (binary, text, or control). 1136 DataMessageType type; 1137 1138 // For SCTP, whether to send messages flagged as ordered or not. 1139 // If false, messages can be received out of order. 1140 bool ordered; 1141 // For SCTP, whether the messages are sent reliably or not. 1142 // If false, messages may be lost. 1143 bool reliable; 1144 // For SCTP, if reliable == false, provide partial reliability by 1145 // resending up to this many times. Either count or millis 1146 // is supported, not both at the same time. 1147 int max_rtx_count; 1148 // For SCTP, if reliable == false, provide partial reliability by 1149 // resending for up to this many milliseconds. Either count or millis 1150 // is supported, not both at the same time. 1151 int max_rtx_ms; 1152 1153 SendDataParams() : 1154 ssrc(0), 1155 type(DMT_TEXT), 1156 // TODO(pthatcher): Make these true by default? 1157 ordered(false), 1158 reliable(false), 1159 max_rtx_count(0), 1160 max_rtx_ms(0) { 1161 } 1162}; 1163 1164enum SendDataResult { SDR_SUCCESS, SDR_ERROR, SDR_BLOCK }; 1165 1166struct DataOptions { 1167 std::string ToString() const { 1168 return "{}"; 1169 } 1170}; 1171 1172struct DataSendParameters : RtpSendParameters<DataCodec, DataOptions> { 1173 std::string ToString() const { 1174 std::ostringstream ost; 1175 // Options and extensions aren't used. 1176 ost << "{"; 1177 ost << "codecs: " << VectorToString(codecs) << ", "; 1178 ost << "max_bandiwidth_bps: " << max_bandwidth_bps; 1179 ost << "}"; 1180 return ost.str(); 1181 } 1182}; 1183 1184struct DataRecvParameters : RtpParameters<DataCodec> { 1185}; 1186 1187class DataMediaChannel : public MediaChannel { 1188 public: 1189 enum Error { 1190 ERROR_NONE = 0, // No error. 1191 ERROR_OTHER, // Other errors. 1192 ERROR_SEND_SRTP_ERROR = 200, // Generic SRTP failure. 1193 ERROR_SEND_SRTP_AUTH_FAILED, // Failed to authenticate packets. 1194 ERROR_RECV_SRTP_ERROR, // Generic SRTP failure. 1195 ERROR_RECV_SRTP_AUTH_FAILED, // Failed to authenticate packets. 1196 ERROR_RECV_SRTP_REPLAY, // Packet replay detected. 1197 }; 1198 1199 virtual ~DataMediaChannel() {} 1200 1201 virtual bool SetSendParameters(const DataSendParameters& params) = 0; 1202 virtual bool SetRecvParameters(const DataRecvParameters& params) = 0; 1203 1204 // TODO(pthatcher): Implement this. 1205 virtual bool GetStats(DataMediaInfo* info) { return true; } 1206 1207 virtual bool SetSend(bool send) = 0; 1208 virtual bool SetReceive(bool receive) = 0; 1209 1210 virtual bool SendData( 1211 const SendDataParams& params, 1212 const rtc::Buffer& payload, 1213 SendDataResult* result = NULL) = 0; 1214 // Signals when data is received (params, data, len) 1215 sigslot::signal3<const ReceiveDataParams&, 1216 const char*, 1217 size_t> SignalDataReceived; 1218 // Signal when the media channel is ready to send the stream. Arguments are: 1219 // writable(bool) 1220 sigslot::signal1<bool> SignalReadyToSend; 1221 // Signal for notifying that the remote side has closed the DataChannel. 1222 sigslot::signal1<uint32_t> SignalStreamClosedRemotely; 1223}; 1224 1225} // namespace cricket 1226 1227#endif // TALK_MEDIA_BASE_MEDIACHANNEL_H_ 1228