• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/base/basictypes.h"
35 #include "talk/base/buffer.h"
36 #include "talk/base/dscp.h"
37 #include "talk/base/logging.h"
38 #include "talk/base/sigslot.h"
39 #include "talk/base/socket.h"
40 #include "talk/base/window.h"
41 #include "talk/media/base/codec.h"
42 #include "talk/media/base/constants.h"
43 #include "talk/media/base/streamparams.h"
44 // TODO(juberti): re-evaluate this include
45 #include "talk/session/media/audiomonitor.h"
46 
47 namespace talk_base {
48 class Buffer;
49 class RateLimiter;
50 class Timing;
51 }
52 
53 namespace webrtc {
54 struct DataChannelInit;
55 }
56 
57 namespace cricket {
58 
59 class AudioRenderer;
60 struct RtpHeader;
61 class ScreencastId;
62 struct VideoFormat;
63 class VideoCapturer;
64 class VideoRenderer;
65 
66 const int kMinRtpHeaderExtensionId = 1;
67 const int kMaxRtpHeaderExtensionId = 255;
68 const int kScreencastDefaultFps = 5;
69 
70 // Used in AudioOptions and VideoOptions to signify "unset" values.
71 template <class T>
72 class Settable {
73  public:
Settable()74   Settable() : set_(false), val_() {}
Settable(T val)75   explicit Settable(T val) : set_(true), val_(val) {}
76 
IsSet()77   bool IsSet() const {
78     return set_;
79   }
80 
Get(T * out)81   bool Get(T* out) const {
82     *out = val_;
83     return set_;
84   }
85 
GetWithDefaultIfUnset(const T & default_value)86   T GetWithDefaultIfUnset(const T& default_value) const {
87     return set_ ? val_ : default_value;
88   }
89 
Set(T val)90   virtual void Set(T val) {
91     set_ = true;
92     val_ = val;
93   }
94 
Clear()95   void Clear() {
96     Set(T());
97     set_ = false;
98   }
99 
SetFrom(const Settable<T> & o)100   void SetFrom(const Settable<T>& o) {
101     // Set this value based on the value of o, iff o is set.  If this value is
102     // set and o is unset, the current value will be unchanged.
103     T val;
104     if (o.Get(&val)) {
105       Set(val);
106     }
107   }
108 
ToString()109   std::string ToString() const {
110     return set_ ? talk_base::ToString(val_) : "";
111   }
112 
113   bool operator==(const Settable<T>& o) const {
114     // Equal if both are unset with any value or both set with the same value.
115     return (set_ == o.set_) && (!set_ || (val_ == o.val_));
116   }
117 
118   bool operator!=(const Settable<T>& o) const {
119     return !operator==(o);
120   }
121 
122  protected:
InitializeValue(const T & val)123   void InitializeValue(const T &val) {
124     val_ = val;
125   }
126 
127  private:
128   bool set_;
129   T val_;
130 };
131 
132 class SettablePercent : public Settable<float> {
133  public:
Set(float val)134   virtual void Set(float val) {
135     if (val < 0) {
136       val = 0;
137     }
138     if (val >  1.0) {
139       val = 1.0;
140     }
141     Settable<float>::Set(val);
142   }
143 };
144 
145 template <class T>
ToStringIfSet(const char * key,const Settable<T> & val)146 static std::string ToStringIfSet(const char* key, const Settable<T>& val) {
147   std::string str;
148   if (val.IsSet()) {
149     str = key;
150     str += ": ";
151     str += val.ToString();
152     str += ", ";
153   }
154   return str;
155 }
156 
157 // Options that can be applied to a VoiceMediaChannel or a VoiceMediaEngine.
158 // Used to be flags, but that makes it hard to selectively apply options.
159 // We are moving all of the setting of options to structs like this,
160 // but some things currently still use flags.
161 struct AudioOptions {
SetAllAudioOptions162   void SetAll(const AudioOptions& change) {
163     echo_cancellation.SetFrom(change.echo_cancellation);
164     auto_gain_control.SetFrom(change.auto_gain_control);
165     rx_auto_gain_control.SetFrom(change.rx_auto_gain_control);
166     noise_suppression.SetFrom(change.noise_suppression);
167     highpass_filter.SetFrom(change.highpass_filter);
168     stereo_swapping.SetFrom(change.stereo_swapping);
169     typing_detection.SetFrom(change.typing_detection);
170     aecm_generate_comfort_noise.SetFrom(change.aecm_generate_comfort_noise);
171     conference_mode.SetFrom(change.conference_mode);
172     adjust_agc_delta.SetFrom(change.adjust_agc_delta);
173     experimental_agc.SetFrom(change.experimental_agc);
174     experimental_aec.SetFrom(change.experimental_aec);
175     aec_dump.SetFrom(change.aec_dump);
176     experimental_acm.SetFrom(change.experimental_acm);
177     tx_agc_target_dbov.SetFrom(change.tx_agc_target_dbov);
178     tx_agc_digital_compression_gain.SetFrom(
179         change.tx_agc_digital_compression_gain);
180     tx_agc_limiter.SetFrom(change.tx_agc_limiter);
181     rx_agc_target_dbov.SetFrom(change.rx_agc_target_dbov);
182     rx_agc_digital_compression_gain.SetFrom(
183         change.rx_agc_digital_compression_gain);
184     rx_agc_limiter.SetFrom(change.rx_agc_limiter);
185     recording_sample_rate.SetFrom(change.recording_sample_rate);
186     playout_sample_rate.SetFrom(change.playout_sample_rate);
187     dscp.SetFrom(change.dscp);
188   }
189 
190   bool operator==(const AudioOptions& o) const {
191     return echo_cancellation == o.echo_cancellation &&
192         auto_gain_control == o.auto_gain_control &&
193         rx_auto_gain_control == o.rx_auto_gain_control &&
194         noise_suppression == o.noise_suppression &&
195         highpass_filter == o.highpass_filter &&
196         stereo_swapping == o.stereo_swapping &&
197         typing_detection == o.typing_detection &&
198         aecm_generate_comfort_noise == o.aecm_generate_comfort_noise &&
199         conference_mode == o.conference_mode &&
200         experimental_agc == o.experimental_agc &&
201         experimental_aec == o.experimental_aec &&
202         adjust_agc_delta == o.adjust_agc_delta &&
203         aec_dump == o.aec_dump &&
204         experimental_acm == o.experimental_acm &&
205         tx_agc_target_dbov == o.tx_agc_target_dbov &&
206         tx_agc_digital_compression_gain == o.tx_agc_digital_compression_gain &&
207         tx_agc_limiter == o.tx_agc_limiter &&
208         rx_agc_target_dbov == o.rx_agc_target_dbov &&
209         rx_agc_digital_compression_gain == o.rx_agc_digital_compression_gain &&
210         rx_agc_limiter == o.rx_agc_limiter &&
211         recording_sample_rate == o.recording_sample_rate &&
212         playout_sample_rate == o.playout_sample_rate &&
213         dscp == o.dscp;
214   }
215 
ToStringAudioOptions216   std::string ToString() const {
217     std::ostringstream ost;
218     ost << "AudioOptions {";
219     ost << ToStringIfSet("aec", echo_cancellation);
220     ost << ToStringIfSet("agc", auto_gain_control);
221     ost << ToStringIfSet("rx_agc", rx_auto_gain_control);
222     ost << ToStringIfSet("ns", noise_suppression);
223     ost << ToStringIfSet("hf", highpass_filter);
224     ost << ToStringIfSet("swap", stereo_swapping);
225     ost << ToStringIfSet("typing", typing_detection);
226     ost << ToStringIfSet("comfort_noise", aecm_generate_comfort_noise);
227     ost << ToStringIfSet("conference", conference_mode);
228     ost << ToStringIfSet("agc_delta", adjust_agc_delta);
229     ost << ToStringIfSet("experimental_agc", experimental_agc);
230     ost << ToStringIfSet("experimental_aec", experimental_aec);
231     ost << ToStringIfSet("aec_dump", aec_dump);
232     ost << ToStringIfSet("experimental_acm", experimental_acm);
233     ost << ToStringIfSet("tx_agc_target_dbov", tx_agc_target_dbov);
234     ost << ToStringIfSet("tx_agc_digital_compression_gain",
235         tx_agc_digital_compression_gain);
236     ost << ToStringIfSet("tx_agc_limiter", tx_agc_limiter);
237     ost << ToStringIfSet("rx_agc_target_dbov", rx_agc_target_dbov);
238     ost << ToStringIfSet("rx_agc_digital_compression_gain",
239         rx_agc_digital_compression_gain);
240     ost << ToStringIfSet("rx_agc_limiter", rx_agc_limiter);
241     ost << ToStringIfSet("recording_sample_rate", recording_sample_rate);
242     ost << ToStringIfSet("playout_sample_rate", playout_sample_rate);
243     ost << ToStringIfSet("dscp", dscp);
244     ost << "}";
245     return ost.str();
246   }
247 
248   // Audio processing that attempts to filter away the output signal from
249   // later inbound pickup.
250   Settable<bool> echo_cancellation;
251   // Audio processing to adjust the sensitivity of the local mic dynamically.
252   Settable<bool> auto_gain_control;
253   // Audio processing to apply gain to the remote audio.
254   Settable<bool> rx_auto_gain_control;
255   // Audio processing to filter out background noise.
256   Settable<bool> noise_suppression;
257   // Audio processing to remove background noise of lower frequencies.
258   Settable<bool> highpass_filter;
259   // Audio processing to swap the left and right channels.
260   Settable<bool> stereo_swapping;
261   // Audio processing to detect typing.
262   Settable<bool> typing_detection;
263   Settable<bool> aecm_generate_comfort_noise;
264   Settable<bool> conference_mode;
265   Settable<int> adjust_agc_delta;
266   Settable<bool> experimental_agc;
267   Settable<bool> experimental_aec;
268   Settable<bool> aec_dump;
269   Settable<bool> experimental_acm;
270   // Note that tx_agc_* only applies to non-experimental AGC.
271   Settable<uint16> tx_agc_target_dbov;
272   Settable<uint16> tx_agc_digital_compression_gain;
273   Settable<bool> tx_agc_limiter;
274   Settable<uint16> rx_agc_target_dbov;
275   Settable<uint16> rx_agc_digital_compression_gain;
276   Settable<bool> rx_agc_limiter;
277   Settable<uint32> recording_sample_rate;
278   Settable<uint32> playout_sample_rate;
279   // Set DSCP value for packet sent from audio channel.
280   Settable<bool> dscp;
281 };
282 
283 // Options that can be applied to a VideoMediaChannel or a VideoMediaEngine.
284 // Used to be flags, but that makes it hard to selectively apply options.
285 // We are moving all of the setting of options to structs like this,
286 // but some things currently still use flags.
287 struct VideoOptions {
VideoOptionsVideoOptions288   VideoOptions() {
289     process_adaptation_threshhold.Set(kProcessCpuThreshold);
290     system_low_adaptation_threshhold.Set(kLowSystemCpuThreshold);
291     system_high_adaptation_threshhold.Set(kHighSystemCpuThreshold);
292   }
293 
SetAllVideoOptions294   void SetAll(const VideoOptions& change) {
295     adapt_input_to_encoder.SetFrom(change.adapt_input_to_encoder);
296     adapt_input_to_cpu_usage.SetFrom(change.adapt_input_to_cpu_usage);
297     adapt_cpu_with_smoothing.SetFrom(change.adapt_cpu_with_smoothing);
298     adapt_view_switch.SetFrom(change.adapt_view_switch);
299     video_adapt_third.SetFrom(change.video_adapt_third);
300     video_noise_reduction.SetFrom(change.video_noise_reduction);
301     video_one_layer_screencast.SetFrom(change.video_one_layer_screencast);
302     video_high_bitrate.SetFrom(change.video_high_bitrate);
303     video_watermark.SetFrom(change.video_watermark);
304     video_temporal_layer_screencast.SetFrom(
305         change.video_temporal_layer_screencast);
306     video_temporal_layer_realtime.SetFrom(
307         change.video_temporal_layer_realtime);
308     video_leaky_bucket.SetFrom(change.video_leaky_bucket);
309     cpu_overuse_detection.SetFrom(change.cpu_overuse_detection);
310     conference_mode.SetFrom(change.conference_mode);
311     process_adaptation_threshhold.SetFrom(change.process_adaptation_threshhold);
312     system_low_adaptation_threshhold.SetFrom(
313         change.system_low_adaptation_threshhold);
314     system_high_adaptation_threshhold.SetFrom(
315         change.system_high_adaptation_threshhold);
316     buffered_mode_latency.SetFrom(change.buffered_mode_latency);
317     lower_min_bitrate.SetFrom(change.lower_min_bitrate);
318     dscp.SetFrom(change.dscp);
319     suspend_below_min_bitrate.SetFrom(change.suspend_below_min_bitrate);
320   }
321 
322   bool operator==(const VideoOptions& o) const {
323     return adapt_input_to_encoder == o.adapt_input_to_encoder &&
324         adapt_input_to_cpu_usage == o.adapt_input_to_cpu_usage &&
325         adapt_cpu_with_smoothing == o.adapt_cpu_with_smoothing &&
326         adapt_view_switch == o.adapt_view_switch &&
327         video_adapt_third == o.video_adapt_third &&
328         video_noise_reduction == o.video_noise_reduction &&
329         video_one_layer_screencast == o.video_one_layer_screencast &&
330         video_high_bitrate == o.video_high_bitrate &&
331         video_watermark == o.video_watermark &&
332         video_temporal_layer_screencast == o.video_temporal_layer_screencast &&
333         video_temporal_layer_realtime == o.video_temporal_layer_realtime &&
334         video_leaky_bucket == o.video_leaky_bucket &&
335         cpu_overuse_detection == o.cpu_overuse_detection &&
336         conference_mode == o.conference_mode &&
337         process_adaptation_threshhold == o.process_adaptation_threshhold &&
338         system_low_adaptation_threshhold ==
339             o.system_low_adaptation_threshhold &&
340         system_high_adaptation_threshhold ==
341             o.system_high_adaptation_threshhold &&
342         buffered_mode_latency == o.buffered_mode_latency &&
343         lower_min_bitrate == o.lower_min_bitrate &&
344         dscp == o.dscp &&
345         suspend_below_min_bitrate == o.suspend_below_min_bitrate;
346   }
347 
ToStringVideoOptions348   std::string ToString() const {
349     std::ostringstream ost;
350     ost << "VideoOptions {";
351     ost << ToStringIfSet("encoder adaption", adapt_input_to_encoder);
352     ost << ToStringIfSet("cpu adaption", adapt_input_to_cpu_usage);
353     ost << ToStringIfSet("cpu adaptation smoothing", adapt_cpu_with_smoothing);
354     ost << ToStringIfSet("adapt view switch", adapt_view_switch);
355     ost << ToStringIfSet("video adapt third", video_adapt_third);
356     ost << ToStringIfSet("noise reduction", video_noise_reduction);
357     ost << ToStringIfSet("1 layer screencast", video_one_layer_screencast);
358     ost << ToStringIfSet("high bitrate", video_high_bitrate);
359     ost << ToStringIfSet("watermark", video_watermark);
360     ost << ToStringIfSet("video temporal layer screencast",
361                          video_temporal_layer_screencast);
362     ost << ToStringIfSet("video temporal layer realtime",
363                          video_temporal_layer_realtime);
364     ost << ToStringIfSet("leaky bucket", video_leaky_bucket);
365     ost << ToStringIfSet("cpu overuse detection", cpu_overuse_detection);
366     ost << ToStringIfSet("conference mode", conference_mode);
367     ost << ToStringIfSet("process", process_adaptation_threshhold);
368     ost << ToStringIfSet("low", system_low_adaptation_threshhold);
369     ost << ToStringIfSet("high", system_high_adaptation_threshhold);
370     ost << ToStringIfSet("buffered mode latency", buffered_mode_latency);
371     ost << ToStringIfSet("lower min bitrate", lower_min_bitrate);
372     ost << ToStringIfSet("dscp", dscp);
373     ost << ToStringIfSet("suspend below min bitrate",
374                          suspend_below_min_bitrate);
375     ost << "}";
376     return ost.str();
377   }
378 
379   // Encoder adaption, which is the gd callback in LMI, and TBA in WebRTC.
380   Settable<bool> adapt_input_to_encoder;
381   // Enable CPU adaptation?
382   Settable<bool> adapt_input_to_cpu_usage;
383   // Enable CPU adaptation smoothing?
384   Settable<bool> adapt_cpu_with_smoothing;
385   // Enable Adapt View Switch?
386   Settable<bool> adapt_view_switch;
387   // Enable video adapt third?
388   Settable<bool> video_adapt_third;
389   // Enable denoising?
390   Settable<bool> video_noise_reduction;
391   // Experimental: Enable one layer screencast?
392   Settable<bool> video_one_layer_screencast;
393   // Experimental: Enable WebRtc higher bitrate?
394   Settable<bool> video_high_bitrate;
395   // Experimental: Add watermark to the rendered video image.
396   Settable<bool> video_watermark;
397   // Experimental: Enable WebRTC layered screencast.
398   Settable<bool> video_temporal_layer_screencast;
399   // Experimental: Enable WebRTC temporal layer strategy for realtime video.
400   Settable<bool> video_temporal_layer_realtime;
401   // Enable WebRTC leaky bucket when sending media packets.
402   Settable<bool> video_leaky_bucket;
403   // Enable WebRTC Cpu Overuse Detection, which is a new version of the CPU
404   // adaptation algorithm. So this option will override the
405   // |adapt_input_to_cpu_usage|.
406   Settable<bool> cpu_overuse_detection;
407   // Use conference mode?
408   Settable<bool> conference_mode;
409   // Threshhold for process cpu adaptation.  (Process limit)
410   SettablePercent process_adaptation_threshhold;
411   // Low threshhold for cpu adaptation.  (Adapt up)
412   SettablePercent system_low_adaptation_threshhold;
413   // High threshhold for cpu adaptation.  (Adapt down)
414   SettablePercent system_high_adaptation_threshhold;
415   // Specify buffered mode latency in milliseconds.
416   Settable<int> buffered_mode_latency;
417   // Make minimum configured send bitrate even lower than usual, at 30kbit.
418   Settable<bool> lower_min_bitrate;
419   // Set DSCP value for packet sent from video channel.
420   Settable<bool> dscp;
421   // Enable WebRTC suspension of video. No video frames will be sent when the
422   // bitrate is below the configured minimum bitrate.
423   Settable<bool> suspend_below_min_bitrate;
424 };
425 
426 // A class for playing out soundclips.
427 class SoundclipMedia {
428  public:
429   enum SoundclipFlags {
430     SF_LOOP = 1,
431   };
432 
~SoundclipMedia()433   virtual ~SoundclipMedia() {}
434 
435   // Plays a sound out to the speakers with the given audio stream. The stream
436   // must be 16-bit little-endian 16 kHz PCM. If a stream is already playing
437   // on this SoundclipMedia, it is stopped. If clip is NULL, nothing is played.
438   // Returns whether it was successful.
439   virtual bool PlaySound(const char *clip, int len, int flags) = 0;
440 };
441 
442 struct RtpHeaderExtension {
RtpHeaderExtensionRtpHeaderExtension443   RtpHeaderExtension() : id(0) {}
RtpHeaderExtensionRtpHeaderExtension444   RtpHeaderExtension(const std::string& u, int i) : uri(u), id(i) {}
445   std::string uri;
446   int id;
447   // TODO(juberti): SendRecv direction;
448 
449   bool operator==(const RtpHeaderExtension& ext) const {
450     // id is a reserved word in objective-c. Therefore the id attribute has to
451     // be a fully qualified name in order to compile on IOS.
452     return this->id == ext.id &&
453         uri == ext.uri;
454   }
455 };
456 
457 // Returns the named header extension if found among all extensions, NULL
458 // otherwise.
FindHeaderExtension(const std::vector<RtpHeaderExtension> & extensions,const std::string & name)459 inline const RtpHeaderExtension* FindHeaderExtension(
460     const std::vector<RtpHeaderExtension>& extensions,
461     const std::string& name) {
462   for (std::vector<RtpHeaderExtension>::const_iterator it = extensions.begin();
463        it != extensions.end(); ++it) {
464     if (it->uri == name)
465       return &(*it);
466   }
467   return NULL;
468 }
469 
470 enum MediaChannelOptions {
471   // Tune the stream for conference mode.
472   OPT_CONFERENCE = 0x0001
473 };
474 
475 enum VoiceMediaChannelOptions {
476   // Tune the audio stream for vcs with different target levels.
477   OPT_AGC_MINUS_10DB = 0x80000000
478 };
479 
480 // DTMF flags to control if a DTMF tone should be played and/or sent.
481 enum DtmfFlags {
482   DF_PLAY = 0x01,
483   DF_SEND = 0x02,
484 };
485 
486 class MediaChannel : public sigslot::has_slots<> {
487  public:
488   class NetworkInterface {
489    public:
490     enum SocketType { ST_RTP, ST_RTCP };
491     virtual bool SendPacket(
492         talk_base::Buffer* packet,
493         talk_base::DiffServCodePoint dscp = talk_base::DSCP_NO_CHANGE) = 0;
494     virtual bool SendRtcp(
495         talk_base::Buffer* packet,
496         talk_base::DiffServCodePoint dscp = talk_base::DSCP_NO_CHANGE) = 0;
497     virtual int SetOption(SocketType type, talk_base::Socket::Option opt,
498                           int option) = 0;
~NetworkInterface()499     virtual ~NetworkInterface() {}
500   };
501 
MediaChannel()502   MediaChannel() : network_interface_(NULL) {}
~MediaChannel()503   virtual ~MediaChannel() {}
504 
505   // Sets the abstract interface class for sending RTP/RTCP data.
SetInterface(NetworkInterface * iface)506   virtual void SetInterface(NetworkInterface *iface) {
507     talk_base::CritScope cs(&network_interface_crit_);
508     network_interface_ = iface;
509   }
510 
511   // Called when a RTP packet is received.
512   virtual void OnPacketReceived(talk_base::Buffer* packet,
513                                 const talk_base::PacketTime& packet_time) = 0;
514   // Called when a RTCP packet is received.
515   virtual void OnRtcpReceived(talk_base::Buffer* packet,
516                               const talk_base::PacketTime& packet_time) = 0;
517   // Called when the socket's ability to send has changed.
518   virtual void OnReadyToSend(bool ready) = 0;
519   // Creates a new outgoing media stream with SSRCs and CNAME as described
520   // by sp.
521   virtual bool AddSendStream(const StreamParams& sp) = 0;
522   // Removes an outgoing media stream.
523   // ssrc must be the first SSRC of the media stream if the stream uses
524   // multiple SSRCs.
525   virtual bool RemoveSendStream(uint32 ssrc) = 0;
526   // Creates a new incoming media stream with SSRCs and CNAME as described
527   // by sp.
528   virtual bool AddRecvStream(const StreamParams& sp) = 0;
529   // Removes an incoming media stream.
530   // ssrc must be the first SSRC of the media stream if the stream uses
531   // multiple SSRCs.
532   virtual bool RemoveRecvStream(uint32 ssrc) = 0;
533 
534   // Mutes the channel.
535   virtual bool MuteStream(uint32 ssrc, bool on) = 0;
536 
537   // Sets the RTP extension headers and IDs to use when sending RTP.
538   virtual bool SetRecvRtpHeaderExtensions(
539       const std::vector<RtpHeaderExtension>& extensions) = 0;
540   virtual bool SetSendRtpHeaderExtensions(
541       const std::vector<RtpHeaderExtension>& extensions) = 0;
542   // Sets the rate control to use when sending data.
543   virtual bool SetSendBandwidth(bool autobw, int bps) = 0;
544 
545   // Base method to send packet using NetworkInterface.
SendPacket(talk_base::Buffer * packet)546   bool SendPacket(talk_base::Buffer* packet) {
547     return DoSendPacket(packet, false);
548   }
549 
SendRtcp(talk_base::Buffer * packet)550   bool SendRtcp(talk_base::Buffer* packet) {
551     return DoSendPacket(packet, true);
552   }
553 
SetOption(NetworkInterface::SocketType type,talk_base::Socket::Option opt,int option)554   int SetOption(NetworkInterface::SocketType type,
555                 talk_base::Socket::Option opt,
556                 int option) {
557     talk_base::CritScope cs(&network_interface_crit_);
558     if (!network_interface_)
559       return -1;
560 
561     return network_interface_->SetOption(type, opt, option);
562   }
563 
564  protected:
565   // This method sets DSCP |value| on both RTP and RTCP channels.
SetDscp(talk_base::DiffServCodePoint value)566   int SetDscp(talk_base::DiffServCodePoint value) {
567     int ret;
568     ret = SetOption(NetworkInterface::ST_RTP,
569                     talk_base::Socket::OPT_DSCP,
570                     value);
571     if (ret == 0) {
572       ret = SetOption(NetworkInterface::ST_RTCP,
573                       talk_base::Socket::OPT_DSCP,
574                       value);
575     }
576     return ret;
577   }
578 
579  private:
DoSendPacket(talk_base::Buffer * packet,bool rtcp)580   bool DoSendPacket(talk_base::Buffer* packet, bool rtcp) {
581     talk_base::CritScope cs(&network_interface_crit_);
582     if (!network_interface_)
583       return false;
584 
585     return (!rtcp) ? network_interface_->SendPacket(packet) :
586                      network_interface_->SendRtcp(packet);
587   }
588 
589   // |network_interface_| can be accessed from the worker_thread and
590   // from any MediaEngine threads. This critical section is to protect accessing
591   // of network_interface_ object.
592   talk_base::CriticalSection network_interface_crit_;
593   NetworkInterface* network_interface_;
594 };
595 
596 enum SendFlags {
597   SEND_NOTHING,
598   SEND_RINGBACKTONE,
599   SEND_MICROPHONE
600 };
601 
602 // The stats information is structured as follows:
603 // Media are represented by either MediaSenderInfo or MediaReceiverInfo.
604 // Media contains a vector of SSRC infos that are exclusively used by this
605 // media. (SSRCs shared between media streams can't be represented.)
606 
607 // Information about an SSRC.
608 // This data may be locally recorded, or received in an RTCP SR or RR.
609 struct SsrcSenderInfo {
SsrcSenderInfoSsrcSenderInfo610   SsrcSenderInfo()
611       : ssrc(0),
612     timestamp(0) {
613   }
614   uint32 ssrc;
615   double timestamp;  // NTP timestamp, represented as seconds since epoch.
616 };
617 
618 struct SsrcReceiverInfo {
SsrcReceiverInfoSsrcReceiverInfo619   SsrcReceiverInfo()
620       : ssrc(0),
621         timestamp(0) {
622   }
623   uint32 ssrc;
624   double timestamp;
625 };
626 
627 struct MediaSenderInfo {
MediaSenderInfoMediaSenderInfo628   MediaSenderInfo()
629       : bytes_sent(0),
630         packets_sent(0),
631         packets_lost(0),
632         fraction_lost(0.0),
633         rtt_ms(0) {
634   }
add_ssrcMediaSenderInfo635   void add_ssrc(const SsrcSenderInfo& stat) {
636     local_stats.push_back(stat);
637   }
638   // Temporary utility function for call sites that only provide SSRC.
639   // As more info is added into SsrcSenderInfo, this function should go away.
add_ssrcMediaSenderInfo640   void add_ssrc(uint32 ssrc) {
641     SsrcSenderInfo stat;
642     stat.ssrc = ssrc;
643     add_ssrc(stat);
644   }
645   // Utility accessor for clients that are only interested in ssrc numbers.
ssrcsMediaSenderInfo646   std::vector<uint32> ssrcs() const {
647     std::vector<uint32> retval;
648     for (std::vector<SsrcSenderInfo>::const_iterator it = local_stats.begin();
649          it != local_stats.end(); ++it) {
650       retval.push_back(it->ssrc);
651     }
652     return retval;
653   }
654   // Utility accessor for clients that make the assumption only one ssrc
655   // exists per media.
656   // This will eventually go away.
ssrcMediaSenderInfo657   uint32 ssrc() const {
658     if (local_stats.size() > 0) {
659       return local_stats[0].ssrc;
660     } else {
661       return 0;
662     }
663   }
664   int64 bytes_sent;
665   int packets_sent;
666   int packets_lost;
667   float fraction_lost;
668   int rtt_ms;
669   std::string codec_name;
670   std::vector<SsrcSenderInfo> local_stats;
671   std::vector<SsrcReceiverInfo> remote_stats;
672 };
673 
674 struct MediaReceiverInfo {
MediaReceiverInfoMediaReceiverInfo675   MediaReceiverInfo()
676       : bytes_rcvd(0),
677         packets_rcvd(0),
678         packets_lost(0),
679         fraction_lost(0.0) {
680   }
add_ssrcMediaReceiverInfo681   void add_ssrc(const SsrcReceiverInfo& stat) {
682     local_stats.push_back(stat);
683   }
684   // Temporary utility function for call sites that only provide SSRC.
685   // As more info is added into SsrcSenderInfo, this function should go away.
add_ssrcMediaReceiverInfo686   void add_ssrc(uint32 ssrc) {
687     SsrcReceiverInfo stat;
688     stat.ssrc = ssrc;
689     add_ssrc(stat);
690   }
ssrcsMediaReceiverInfo691   std::vector<uint32> ssrcs() const {
692     std::vector<uint32> retval;
693     for (std::vector<SsrcReceiverInfo>::const_iterator it = local_stats.begin();
694          it != local_stats.end(); ++it) {
695       retval.push_back(it->ssrc);
696     }
697     return retval;
698   }
699   // Utility accessor for clients that make the assumption only one ssrc
700   // exists per media.
701   // This will eventually go away.
ssrcMediaReceiverInfo702   uint32 ssrc() const {
703     if (local_stats.size() > 0) {
704       return local_stats[0].ssrc;
705     } else {
706       return 0;
707     }
708   }
709 
710   int64 bytes_rcvd;
711   int packets_rcvd;
712   int packets_lost;
713   float fraction_lost;
714   std::vector<SsrcReceiverInfo> local_stats;
715   std::vector<SsrcSenderInfo> remote_stats;
716 };
717 
718 struct VoiceSenderInfo : public MediaSenderInfo {
VoiceSenderInfoVoiceSenderInfo719   VoiceSenderInfo()
720       : ext_seqnum(0),
721         jitter_ms(0),
722         audio_level(0),
723         aec_quality_min(0.0),
724         echo_delay_median_ms(0),
725         echo_delay_std_ms(0),
726         echo_return_loss(0),
727         echo_return_loss_enhancement(0),
728         typing_noise_detected(false) {
729   }
730 
731   int ext_seqnum;
732   int jitter_ms;
733   int audio_level;
734   float aec_quality_min;
735   int echo_delay_median_ms;
736   int echo_delay_std_ms;
737   int echo_return_loss;
738   int echo_return_loss_enhancement;
739   bool typing_noise_detected;
740 };
741 
742 struct VoiceReceiverInfo : public MediaReceiverInfo {
VoiceReceiverInfoVoiceReceiverInfo743   VoiceReceiverInfo()
744       : ext_seqnum(0),
745         jitter_ms(0),
746         jitter_buffer_ms(0),
747         jitter_buffer_preferred_ms(0),
748         delay_estimate_ms(0),
749         audio_level(0),
750         expand_rate(0) {
751   }
752 
753   int ext_seqnum;
754   int jitter_ms;
755   int jitter_buffer_ms;
756   int jitter_buffer_preferred_ms;
757   int delay_estimate_ms;
758   int audio_level;
759   // fraction of synthesized speech inserted through pre-emptive expansion
760   float expand_rate;
761 };
762 
763 struct VideoSenderInfo : public MediaSenderInfo {
VideoSenderInfoVideoSenderInfo764   VideoSenderInfo()
765       : packets_cached(0),
766         firs_rcvd(0),
767         nacks_rcvd(0),
768         frame_width(0),
769         frame_height(0),
770         framerate_input(0),
771         framerate_sent(0),
772         nominal_bitrate(0),
773         preferred_bitrate(0),
774         adapt_reason(0),
775         capture_jitter_ms(0),
776         avg_encode_ms(0),
777         encode_usage_percent(0),
778         capture_queue_delay_ms_per_s(0) {
779   }
780 
781   std::vector<SsrcGroup> ssrc_groups;
782   int packets_cached;
783   int firs_rcvd;
784   int nacks_rcvd;
785   int frame_width;
786   int frame_height;
787   int framerate_input;
788   int framerate_sent;
789   int nominal_bitrate;
790   int preferred_bitrate;
791   int adapt_reason;
792   int capture_jitter_ms;
793   int avg_encode_ms;
794   int encode_usage_percent;
795   int capture_queue_delay_ms_per_s;
796 };
797 
798 struct VideoReceiverInfo : public MediaReceiverInfo {
VideoReceiverInfoVideoReceiverInfo799   VideoReceiverInfo()
800       : packets_concealed(0),
801         firs_sent(0),
802         nacks_sent(0),
803         frame_width(0),
804         frame_height(0),
805         framerate_rcvd(0),
806         framerate_decoded(0),
807         framerate_output(0),
808         framerate_render_input(0),
809         framerate_render_output(0),
810         decode_ms(0),
811         max_decode_ms(0),
812         jitter_buffer_ms(0),
813         min_playout_delay_ms(0),
814         render_delay_ms(0),
815         target_delay_ms(0),
816         current_delay_ms(0) {
817   }
818 
819   std::vector<SsrcGroup> ssrc_groups;
820   int packets_concealed;
821   int firs_sent;
822   int nacks_sent;
823   int frame_width;
824   int frame_height;
825   int framerate_rcvd;
826   int framerate_decoded;
827   int framerate_output;
828   // Framerate as sent to the renderer.
829   int framerate_render_input;
830   // Framerate that the renderer reports.
831   int framerate_render_output;
832 
833   // All stats below are gathered per-VideoReceiver, but some will be correlated
834   // across MediaStreamTracks.  NOTE(hta): when sinking stats into per-SSRC
835   // structures, reflect this in the new layout.
836 
837   // Current frame decode latency.
838   int decode_ms;
839   // Maximum observed frame decode latency.
840   int max_decode_ms;
841   // Jitter (network-related) latency.
842   int jitter_buffer_ms;
843   // Requested minimum playout latency.
844   int min_playout_delay_ms;
845   // Requested latency to account for rendering delay.
846   int render_delay_ms;
847   // Target overall delay: network+decode+render, accounting for
848   // min_playout_delay_ms.
849   int target_delay_ms;
850   // Current overall delay, possibly ramping towards target_delay_ms.
851   int current_delay_ms;
852 };
853 
854 struct DataSenderInfo : public MediaSenderInfo {
DataSenderInfoDataSenderInfo855   DataSenderInfo()
856       : ssrc(0) {
857   }
858 
859   uint32 ssrc;
860 };
861 
862 struct DataReceiverInfo : public MediaReceiverInfo {
DataReceiverInfoDataReceiverInfo863   DataReceiverInfo()
864       : ssrc(0) {
865   }
866 
867   uint32 ssrc;
868 };
869 
870 struct BandwidthEstimationInfo {
BandwidthEstimationInfoBandwidthEstimationInfo871   BandwidthEstimationInfo()
872       : available_send_bandwidth(0),
873         available_recv_bandwidth(0),
874         target_enc_bitrate(0),
875         actual_enc_bitrate(0),
876         retransmit_bitrate(0),
877         transmit_bitrate(0),
878         bucket_delay(0) {
879   }
880 
881   int available_send_bandwidth;
882   int available_recv_bandwidth;
883   int target_enc_bitrate;
884   int actual_enc_bitrate;
885   int retransmit_bitrate;
886   int transmit_bitrate;
887   int bucket_delay;
888 };
889 
890 struct VoiceMediaInfo {
ClearVoiceMediaInfo891   void Clear() {
892     senders.clear();
893     receivers.clear();
894   }
895   std::vector<VoiceSenderInfo> senders;
896   std::vector<VoiceReceiverInfo> receivers;
897 };
898 
899 struct VideoMediaInfo {
ClearVideoMediaInfo900   void Clear() {
901     senders.clear();
902     receivers.clear();
903     bw_estimations.clear();
904   }
905   std::vector<VideoSenderInfo> senders;
906   std::vector<VideoReceiverInfo> receivers;
907   std::vector<BandwidthEstimationInfo> bw_estimations;
908 };
909 
910 struct DataMediaInfo {
ClearDataMediaInfo911   void Clear() {
912     senders.clear();
913     receivers.clear();
914   }
915   std::vector<DataSenderInfo> senders;
916   std::vector<DataReceiverInfo> receivers;
917 };
918 
919 class VoiceMediaChannel : public MediaChannel {
920  public:
921   enum Error {
922     ERROR_NONE = 0,                       // No error.
923     ERROR_OTHER,                          // Other errors.
924     ERROR_REC_DEVICE_OPEN_FAILED = 100,   // Could not open mic.
925     ERROR_REC_DEVICE_MUTED,               // Mic was muted by OS.
926     ERROR_REC_DEVICE_SILENT,              // No background noise picked up.
927     ERROR_REC_DEVICE_SATURATION,          // Mic input is clipping.
928     ERROR_REC_DEVICE_REMOVED,             // Mic was removed while active.
929     ERROR_REC_RUNTIME_ERROR,              // Processing is encountering errors.
930     ERROR_REC_SRTP_ERROR,                 // Generic SRTP failure.
931     ERROR_REC_SRTP_AUTH_FAILED,           // Failed to authenticate packets.
932     ERROR_REC_TYPING_NOISE_DETECTED,      // Typing noise is detected.
933     ERROR_PLAY_DEVICE_OPEN_FAILED = 200,  // Could not open playout.
934     ERROR_PLAY_DEVICE_MUTED,              // Playout muted by OS.
935     ERROR_PLAY_DEVICE_REMOVED,            // Playout removed while active.
936     ERROR_PLAY_RUNTIME_ERROR,             // Errors in voice processing.
937     ERROR_PLAY_SRTP_ERROR,                // Generic SRTP failure.
938     ERROR_PLAY_SRTP_AUTH_FAILED,          // Failed to authenticate packets.
939     ERROR_PLAY_SRTP_REPLAY,               // Packet replay detected.
940   };
941 
VoiceMediaChannel()942   VoiceMediaChannel() {}
~VoiceMediaChannel()943   virtual ~VoiceMediaChannel() {}
944   // Sets the codecs/payload types to be used for incoming media.
945   virtual bool SetRecvCodecs(const std::vector<AudioCodec>& codecs) = 0;
946   // Sets the codecs/payload types to be used for outgoing media.
947   virtual bool SetSendCodecs(const std::vector<AudioCodec>& codecs) = 0;
948   // Starts or stops playout of received audio.
949   virtual bool SetPlayout(bool playout) = 0;
950   // Starts or stops sending (and potentially capture) of local audio.
951   virtual bool SetSend(SendFlags flag) = 0;
952   // Sets the renderer object to be used for the specified remote audio stream.
953   virtual bool SetRemoteRenderer(uint32 ssrc, AudioRenderer* renderer) = 0;
954   // Sets the renderer object to be used for the specified local audio stream.
955   virtual bool SetLocalRenderer(uint32 ssrc, AudioRenderer* renderer) = 0;
956   // Gets current energy levels for all incoming streams.
957   virtual bool GetActiveStreams(AudioInfo::StreamList* actives) = 0;
958   // Get the current energy level of the stream sent to the speaker.
959   virtual int GetOutputLevel() = 0;
960   // Get the time in milliseconds since last recorded keystroke, or negative.
961   virtual int GetTimeSinceLastTyping() = 0;
962   // Temporarily exposed field for tuning typing detect options.
963   virtual void SetTypingDetectionParameters(int time_window,
964     int cost_per_typing, int reporting_threshold, int penalty_decay,
965     int type_event_delay) = 0;
966   // Set left and right scale for speaker output volume of the specified ssrc.
967   virtual bool SetOutputScaling(uint32 ssrc, double left, double right) = 0;
968   // Get left and right scale for speaker output volume of the specified ssrc.
969   virtual bool GetOutputScaling(uint32 ssrc, double* left, double* right) = 0;
970   // Specifies a ringback tone to be played during call setup.
971   virtual bool SetRingbackTone(const char *buf, int len) = 0;
972   // Plays or stops the aforementioned ringback tone
973   virtual bool PlayRingbackTone(uint32 ssrc, bool play, bool loop) = 0;
974   // Returns if the telephone-event has been negotiated.
CanInsertDtmf()975   virtual bool CanInsertDtmf() { return false; }
976   // Send and/or play a DTMF |event| according to the |flags|.
977   // The DTMF out-of-band signal will be used on sending.
978   // The |ssrc| should be either 0 or a valid send stream ssrc.
979   // The valid value for the |event| are 0 to 15 which corresponding to
980   // DTMF event 0-9, *, #, A-D.
981   virtual bool InsertDtmf(uint32 ssrc, int event, int duration, int flags) = 0;
982   // Gets quality stats for the channel.
983   virtual bool GetStats(VoiceMediaInfo* info) = 0;
984   // Gets last reported error for this media channel.
GetLastMediaError(uint32 * ssrc,VoiceMediaChannel::Error * error)985   virtual void GetLastMediaError(uint32* ssrc,
986                                  VoiceMediaChannel::Error* error) {
987     ASSERT(error != NULL);
988     *error = ERROR_NONE;
989   }
990   // Sets the media options to use.
991   virtual bool SetOptions(const AudioOptions& options) = 0;
992   virtual bool GetOptions(AudioOptions* options) const = 0;
993 
994   // Signal errors from MediaChannel.  Arguments are:
995   //     ssrc(uint32), and error(VoiceMediaChannel::Error).
996   sigslot::signal2<uint32, VoiceMediaChannel::Error> SignalMediaError;
997 };
998 
999 class VideoMediaChannel : public MediaChannel {
1000  public:
1001   enum Error {
1002     ERROR_NONE = 0,                       // No error.
1003     ERROR_OTHER,                          // Other errors.
1004     ERROR_REC_DEVICE_OPEN_FAILED = 100,   // Could not open camera.
1005     ERROR_REC_DEVICE_NO_DEVICE,           // No camera.
1006     ERROR_REC_DEVICE_IN_USE,              // Device is in already use.
1007     ERROR_REC_DEVICE_REMOVED,             // Device is removed.
1008     ERROR_REC_SRTP_ERROR,                 // Generic sender SRTP failure.
1009     ERROR_REC_SRTP_AUTH_FAILED,           // Failed to authenticate packets.
1010     ERROR_REC_CPU_MAX_CANT_DOWNGRADE,     // Can't downgrade capture anymore.
1011     ERROR_PLAY_SRTP_ERROR = 200,          // Generic receiver SRTP failure.
1012     ERROR_PLAY_SRTP_AUTH_FAILED,          // Failed to authenticate packets.
1013     ERROR_PLAY_SRTP_REPLAY,               // Packet replay detected.
1014   };
1015 
VideoMediaChannel()1016   VideoMediaChannel() : renderer_(NULL) {}
~VideoMediaChannel()1017   virtual ~VideoMediaChannel() {}
1018   // Sets the codecs/payload types to be used for incoming media.
1019   virtual bool SetRecvCodecs(const std::vector<VideoCodec>& codecs) = 0;
1020   // Sets the codecs/payload types to be used for outgoing media.
1021   virtual bool SetSendCodecs(const std::vector<VideoCodec>& codecs) = 0;
1022   // Gets the currently set codecs/payload types to be used for outgoing media.
1023   virtual bool GetSendCodec(VideoCodec* send_codec) = 0;
1024   // Sets the format of a specified outgoing stream.
1025   virtual bool SetSendStreamFormat(uint32 ssrc, const VideoFormat& format) = 0;
1026   // Starts or stops playout of received video.
1027   virtual bool SetRender(bool render) = 0;
1028   // Starts or stops transmission (and potentially capture) of local video.
1029   virtual bool SetSend(bool send) = 0;
1030   // Sets the renderer object to be used for the specified stream.
1031   // If SSRC is 0, the renderer is used for the 'default' stream.
1032   virtual bool SetRenderer(uint32 ssrc, VideoRenderer* renderer) = 0;
1033   // If |ssrc| is 0, replace the default capturer (engine capturer) with
1034   // |capturer|. If |ssrc| is non zero create a new stream with |ssrc| as SSRC.
1035   virtual bool SetCapturer(uint32 ssrc, VideoCapturer* capturer) = 0;
1036   // Gets quality stats for the channel.
1037   virtual bool GetStats(VideoMediaInfo* info) = 0;
1038 
1039   // Send an intra frame to the receivers.
1040   virtual bool SendIntraFrame() = 0;
1041   // Reuqest each of the remote senders to send an intra frame.
1042   virtual bool RequestIntraFrame() = 0;
1043   // Sets the media options to use.
1044   virtual bool SetOptions(const VideoOptions& options) = 0;
1045   virtual bool GetOptions(VideoOptions* options) const = 0;
1046   virtual void UpdateAspectRatio(int ratio_w, int ratio_h) = 0;
1047 
1048   // Signal errors from MediaChannel.  Arguments are:
1049   //     ssrc(uint32), and error(VideoMediaChannel::Error).
1050   sigslot::signal2<uint32, Error> SignalMediaError;
1051 
1052  protected:
1053   VideoRenderer *renderer_;
1054 };
1055 
1056 enum DataMessageType {
1057   // Chrome-Internal use only.  See SctpDataMediaChannel for the actual PPID
1058   // values.
1059   DMT_NONE = 0,
1060   DMT_CONTROL = 1,
1061   DMT_BINARY = 2,
1062   DMT_TEXT = 3,
1063 };
1064 
1065 // Info about data received in DataMediaChannel.  For use in
1066 // DataMediaChannel::SignalDataReceived and in all of the signals that
1067 // signal fires, on up the chain.
1068 struct ReceiveDataParams {
1069   // The in-packet stream indentifier.
1070   // For SCTP, this is really SID, not SSRC.
1071   uint32 ssrc;
1072   // The type of message (binary, text, or control).
1073   DataMessageType type;
1074   // A per-stream value incremented per packet in the stream.
1075   int seq_num;
1076   // A per-stream value monotonically increasing with time.
1077   int timestamp;
1078 
ReceiveDataParamsReceiveDataParams1079   ReceiveDataParams() :
1080       ssrc(0),
1081       type(DMT_TEXT),
1082       seq_num(0),
1083       timestamp(0) {
1084   }
1085 };
1086 
1087 struct SendDataParams {
1088   // The in-packet stream indentifier.
1089   // For SCTP, this is really SID, not SSRC.
1090   uint32 ssrc;
1091   // The type of message (binary, text, or control).
1092   DataMessageType type;
1093 
1094   // For SCTP, whether to send messages flagged as ordered or not.
1095   // If false, messages can be received out of order.
1096   bool ordered;
1097   // For SCTP, whether the messages are sent reliably or not.
1098   // If false, messages may be lost.
1099   bool reliable;
1100   // For SCTP, if reliable == false, provide partial reliability by
1101   // resending up to this many times.  Either count or millis
1102   // is supported, not both at the same time.
1103   int max_rtx_count;
1104   // For SCTP, if reliable == false, provide partial reliability by
1105   // resending for up to this many milliseconds.  Either count or millis
1106   // is supported, not both at the same time.
1107   int max_rtx_ms;
1108 
SendDataParamsSendDataParams1109   SendDataParams() :
1110       ssrc(0),
1111       type(DMT_TEXT),
1112       // TODO(pthatcher): Make these true by default?
1113       ordered(false),
1114       reliable(false),
1115       max_rtx_count(0),
1116       max_rtx_ms(0) {
1117   }
1118 };
1119 
1120 enum SendDataResult { SDR_SUCCESS, SDR_ERROR, SDR_BLOCK };
1121 
1122 class DataMediaChannel : public MediaChannel {
1123  public:
1124   enum Error {
1125     ERROR_NONE = 0,                       // No error.
1126     ERROR_OTHER,                          // Other errors.
1127     ERROR_SEND_SRTP_ERROR = 200,          // Generic SRTP failure.
1128     ERROR_SEND_SRTP_AUTH_FAILED,          // Failed to authenticate packets.
1129     ERROR_RECV_SRTP_ERROR,                // Generic SRTP failure.
1130     ERROR_RECV_SRTP_AUTH_FAILED,          // Failed to authenticate packets.
1131     ERROR_RECV_SRTP_REPLAY,               // Packet replay detected.
1132   };
1133 
~DataMediaChannel()1134   virtual ~DataMediaChannel() {}
1135 
1136   virtual bool SetSendCodecs(const std::vector<DataCodec>& codecs) = 0;
1137   virtual bool SetRecvCodecs(const std::vector<DataCodec>& codecs) = 0;
1138 
MuteStream(uint32 ssrc,bool on)1139   virtual bool MuteStream(uint32 ssrc, bool on) { return false; }
1140   // TODO(pthatcher): Implement this.
GetStats(DataMediaInfo * info)1141   virtual bool GetStats(DataMediaInfo* info) { return true; }
1142 
1143   virtual bool SetSend(bool send) = 0;
1144   virtual bool SetReceive(bool receive) = 0;
1145 
1146   virtual bool SendData(
1147       const SendDataParams& params,
1148       const talk_base::Buffer& payload,
1149       SendDataResult* result = NULL) = 0;
1150   // Signals when data is received (params, data, len)
1151   sigslot::signal3<const ReceiveDataParams&,
1152                    const char*,
1153                    size_t> SignalDataReceived;
1154   // Signal errors from MediaChannel.  Arguments are:
1155   //     ssrc(uint32), and error(DataMediaChannel::Error).
1156   sigslot::signal2<uint32, DataMediaChannel::Error> SignalMediaError;
1157   // Signal when the media channel is ready to send the stream. Arguments are:
1158   //     writable(bool)
1159   sigslot::signal1<bool> SignalReadyToSend;
1160   // Signal for notifying when a new stream is added from the remote side. Used
1161   // for the in-band negotioation through the OPEN message for SCTP data
1162   // channel.
1163   sigslot::signal2<const std::string&, const webrtc::DataChannelInit&>
1164       SignalNewStreamReceived;
1165 };
1166 
1167 }  // namespace cricket
1168 
1169 #endif  // TALK_MEDIA_BASE_MEDIACHANNEL_H_
1170