diff options
author | henrike@webrtc.org <henrike@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-07-10 00:45:36 +0000 |
---|---|---|
committer | henrike@webrtc.org <henrike@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-07-10 00:45:36 +0000 |
commit | 0e118e7129884fbea117e78d6f2068139a414dbe (patch) | |
tree | 6e3e8c07243950df0547766f29f18a86bedc5e15 /media/base/mediachannel.h | |
download | talk-0e118e7129884fbea117e78d6f2068139a414dbe.tar.gz |
Adds trunk/talk folder of revision 359 from libjingles google code to
trunk/talk
git-svn-id: http://webrtc.googlecode.com/svn/trunk/talk@4318 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'media/base/mediachannel.h')
-rw-r--r-- | media/base/mediachannel.h | 933 |
1 files changed, 933 insertions, 0 deletions
diff --git a/media/base/mediachannel.h b/media/base/mediachannel.h new file mode 100644 index 0000000..b20051e --- /dev/null +++ b/media/base/mediachannel.h @@ -0,0 +1,933 @@ +/* + * libjingle + * Copyright 2004 Google Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TALK_MEDIA_BASE_MEDIACHANNEL_H_ +#define TALK_MEDIA_BASE_MEDIACHANNEL_H_ + +#include <string> +#include <vector> + +#include "talk/base/basictypes.h" +#include "talk/base/buffer.h" +#include "talk/base/logging.h" +#include "talk/base/sigslot.h" +#include "talk/base/socket.h" +#include "talk/base/window.h" +#include "talk/media/base/codec.h" +#include "talk/media/base/constants.h" +#include "talk/media/base/streamparams.h" +// TODO(juberti): re-evaluate this include +#include "talk/session/media/audiomonitor.h" + +namespace talk_base { +class Buffer; +class RateLimiter; +class Timing; +} + +namespace cricket { + +class AudioRenderer; +struct RtpHeader; +class ScreencastId; +struct VideoFormat; +class VideoCapturer; +class VideoRenderer; + +const int kMinRtpHeaderExtensionId = 1; +const int kMaxRtpHeaderExtensionId = 255; +const int kScreencastDefaultFps = 5; + +// Used in AudioOptions and VideoOptions to signify "unset" values. +template <class T> +class Settable { + public: + Settable() : set_(false), val_() {} + explicit Settable(T val) : set_(true), val_(val) {} + + bool IsSet() const { + return set_; + } + + bool Get(T* out) const { + *out = val_; + return set_; + } + + T GetWithDefaultIfUnset(const T& default_value) const { + return set_ ? val_ : default_value; + } + + virtual void Set(T val) { + set_ = true; + val_ = val; + } + + void Clear() { + Set(T()); + set_ = false; + } + + void SetFrom(const Settable<T>& o) { + // Set this value based on the value of o, iff o is set. If this value is + // set and o is unset, the current value will be unchanged. + T val; + if (o.Get(&val)) { + Set(val); + } + } + + std::string ToString() const { + return set_ ? talk_base::ToString(val_) : ""; + } + + bool operator==(const Settable<T>& o) const { + // Equal if both are unset with any value or both set with the same value. + return (set_ == o.set_) && (!set_ || (val_ == o.val_)); + } + + bool operator!=(const Settable<T>& o) const { + return !operator==(o); + } + + protected: + void InitializeValue(const T &val) { + val_ = val; + } + + private: + bool set_; + T val_; +}; + +class SettablePercent : public Settable<float> { + public: + virtual void Set(float val) { + if (val < 0) { + val = 0; + } + if (val > 1.0) { + val = 1.0; + } + Settable<float>::Set(val); + } +}; + +template <class T> +static std::string ToStringIfSet(const char* key, const Settable<T>& val) { + std::string str; + if (val.IsSet()) { + str = key; + str += ": "; + str += val.ToString(); + str += ", "; + } + return str; +} + +// Options that can be applied to a VoiceMediaChannel or a VoiceMediaEngine. +// Used to be flags, but that makes it hard to selectively apply options. +// We are moving all of the setting of options to structs like this, +// but some things currently still use flags. +struct AudioOptions { + void SetAll(const AudioOptions& change) { + echo_cancellation.SetFrom(change.echo_cancellation); + auto_gain_control.SetFrom(change.auto_gain_control); + noise_suppression.SetFrom(change.noise_suppression); + highpass_filter.SetFrom(change.highpass_filter); + stereo_swapping.SetFrom(change.stereo_swapping); + typing_detection.SetFrom(change.typing_detection); + conference_mode.SetFrom(change.conference_mode); + adjust_agc_delta.SetFrom(change.adjust_agc_delta); + experimental_agc.SetFrom(change.experimental_agc); + experimental_aec.SetFrom(change.experimental_aec); + aec_dump.SetFrom(change.aec_dump); + } + + bool operator==(const AudioOptions& o) const { + return echo_cancellation == o.echo_cancellation && + auto_gain_control == o.auto_gain_control && + noise_suppression == o.noise_suppression && + highpass_filter == o.highpass_filter && + stereo_swapping == o.stereo_swapping && + typing_detection == o.typing_detection && + conference_mode == o.conference_mode && + experimental_agc == o.experimental_agc && + experimental_aec == o.experimental_aec && + adjust_agc_delta == o.adjust_agc_delta && + aec_dump == o.aec_dump; + } + + std::string ToString() const { + std::ostringstream ost; + ost << "AudioOptions {"; + ost << ToStringIfSet("aec", echo_cancellation); + ost << ToStringIfSet("agc", auto_gain_control); + ost << ToStringIfSet("ns", noise_suppression); + ost << ToStringIfSet("hf", highpass_filter); + ost << ToStringIfSet("swap", stereo_swapping); + ost << ToStringIfSet("typing", typing_detection); + ost << ToStringIfSet("conference", conference_mode); + ost << ToStringIfSet("agc_delta", adjust_agc_delta); + ost << ToStringIfSet("experimental_agc", experimental_agc); + ost << ToStringIfSet("experimental_aec", experimental_aec); + ost << ToStringIfSet("aec_dump", aec_dump); + ost << "}"; + return ost.str(); + } + + // Audio processing that attempts to filter away the output signal from + // later inbound pickup. + Settable<bool> echo_cancellation; + // Audio processing to adjust the sensitivity of the local mic dynamically. + Settable<bool> auto_gain_control; + // Audio processing to filter out background noise. + Settable<bool> noise_suppression; + // Audio processing to remove background noise of lower frequencies. + Settable<bool> highpass_filter; + // Audio processing to swap the left and right channels. + Settable<bool> stereo_swapping; + // Audio processing to detect typing. + Settable<bool> typing_detection; + Settable<bool> conference_mode; + Settable<int> adjust_agc_delta; + Settable<bool> experimental_agc; + Settable<bool> experimental_aec; + Settable<bool> aec_dump; +}; + +// Options that can be applied to a VideoMediaChannel or a VideoMediaEngine. +// Used to be flags, but that makes it hard to selectively apply options. +// We are moving all of the setting of options to structs like this, +// but some things currently still use flags. +struct VideoOptions { + VideoOptions() { + process_adaptation_threshhold.Set(kProcessCpuThreshold); + system_low_adaptation_threshhold.Set(kLowSystemCpuThreshold); + system_high_adaptation_threshhold.Set(kHighSystemCpuThreshold); + } + + void SetAll(const VideoOptions& change) { + adapt_input_to_encoder.SetFrom(change.adapt_input_to_encoder); + adapt_input_to_cpu_usage.SetFrom(change.adapt_input_to_cpu_usage); + adapt_view_switch.SetFrom(change.adapt_view_switch); + video_noise_reduction.SetFrom(change.video_noise_reduction); + video_three_layers.SetFrom(change.video_three_layers); + video_enable_camera_list.SetFrom(change.video_enable_camera_list); + video_one_layer_screencast.SetFrom(change.video_one_layer_screencast); + video_high_bitrate.SetFrom(change.video_high_bitrate); + video_watermark.SetFrom(change.video_watermark); + video_temporal_layer_screencast.SetFrom( + change.video_temporal_layer_screencast); + video_leaky_bucket.SetFrom(change.video_leaky_bucket); + conference_mode.SetFrom(change.conference_mode); + process_adaptation_threshhold.SetFrom(change.process_adaptation_threshhold); + system_low_adaptation_threshhold.SetFrom( + change.system_low_adaptation_threshhold); + system_high_adaptation_threshhold.SetFrom( + change.system_high_adaptation_threshhold); + buffered_mode_latency.SetFrom(change.buffered_mode_latency); + } + + bool operator==(const VideoOptions& o) const { + return adapt_input_to_encoder == o.adapt_input_to_encoder && + adapt_input_to_cpu_usage == o.adapt_input_to_cpu_usage && + adapt_view_switch == o.adapt_view_switch && + video_noise_reduction == o.video_noise_reduction && + video_three_layers == o.video_three_layers && + video_enable_camera_list == o.video_enable_camera_list && + video_one_layer_screencast == o.video_one_layer_screencast && + video_high_bitrate == o.video_high_bitrate && + video_watermark == o.video_watermark && + video_temporal_layer_screencast == o.video_temporal_layer_screencast && + video_leaky_bucket == o.video_leaky_bucket && + conference_mode == o.conference_mode && + process_adaptation_threshhold == o.process_adaptation_threshhold && + system_low_adaptation_threshhold == + o.system_low_adaptation_threshhold && + system_high_adaptation_threshhold == + o.system_high_adaptation_threshhold && + buffered_mode_latency == o.buffered_mode_latency; + } + + std::string ToString() const { + std::ostringstream ost; + ost << "VideoOptions {"; + ost << ToStringIfSet("encoder adaption", adapt_input_to_encoder); + ost << ToStringIfSet("cpu adaption", adapt_input_to_cpu_usage); + ost << ToStringIfSet("adapt view switch", adapt_view_switch); + ost << ToStringIfSet("noise reduction", video_noise_reduction); + ost << ToStringIfSet("3 layers", video_three_layers); + ost << ToStringIfSet("camera list", video_enable_camera_list); + ost << ToStringIfSet("1 layer screencast", + video_one_layer_screencast); + ost << ToStringIfSet("high bitrate", video_high_bitrate); + ost << ToStringIfSet("watermark", video_watermark); + ost << ToStringIfSet("video temporal layer screencast", + video_temporal_layer_screencast); + ost << ToStringIfSet("leaky bucket", video_leaky_bucket); + ost << ToStringIfSet("conference mode", conference_mode); + ost << ToStringIfSet("process", process_adaptation_threshhold); + ost << ToStringIfSet("low", system_low_adaptation_threshhold); + ost << ToStringIfSet("high", system_high_adaptation_threshhold); + ost << ToStringIfSet("buffered mode latency", buffered_mode_latency); + ost << "}"; + return ost.str(); + } + + // Encoder adaption, which is the gd callback in LMI, and TBA in WebRTC. + Settable<bool> adapt_input_to_encoder; + // Enable CPU adaptation? + Settable<bool> adapt_input_to_cpu_usage; + // Enable Adapt View Switch? + Settable<bool> adapt_view_switch; + // Enable denoising? + Settable<bool> video_noise_reduction; + // Experimental: Enable multi layer? + Settable<bool> video_three_layers; + // Experimental: Enable camera list? + Settable<bool> video_enable_camera_list; + // Experimental: Enable one layer screencast? + Settable<bool> video_one_layer_screencast; + // Experimental: Enable WebRtc higher bitrate? + Settable<bool> video_high_bitrate; + // Experimental: Add watermark to the rendered video image. + Settable<bool> video_watermark; + // Experimental: Enable WebRTC layered screencast. + Settable<bool> video_temporal_layer_screencast; + // Enable WebRTC leaky bucket when sending media packets. + Settable<bool> video_leaky_bucket; + // Use conference mode? + Settable<bool> conference_mode; + // Threshhold for process cpu adaptation. (Process limit) + SettablePercent process_adaptation_threshhold; + // Low threshhold for cpu adaptation. (Adapt up) + SettablePercent system_low_adaptation_threshhold; + // High threshhold for cpu adaptation. (Adapt down) + SettablePercent system_high_adaptation_threshhold; + // Specify buffered mode latency in milliseconds. + Settable<int> buffered_mode_latency; +}; + +// A class for playing out soundclips. +class SoundclipMedia { + public: + enum SoundclipFlags { + SF_LOOP = 1, + }; + + virtual ~SoundclipMedia() {} + + // Plays a sound out to the speakers with the given audio stream. The stream + // must be 16-bit little-endian 16 kHz PCM. If a stream is already playing + // on this SoundclipMedia, it is stopped. If clip is NULL, nothing is played. + // Returns whether it was successful. + virtual bool PlaySound(const char *clip, int len, int flags) = 0; +}; + +struct RtpHeaderExtension { + RtpHeaderExtension() : id(0) {} + RtpHeaderExtension(const std::string& u, int i) : uri(u), id(i) {} + std::string uri; + int id; + // TODO(juberti): SendRecv direction; + + bool operator==(const RtpHeaderExtension& ext) const { + // id is a reserved word in objective-c. Therefore the id attribute has to + // be a fully qualified name in order to compile on IOS. + return this->id == ext.id && + uri == ext.uri; + } +}; + +// Returns the named header extension if found among all extensions, NULL +// otherwise. +inline const RtpHeaderExtension* FindHeaderExtension( + const std::vector<RtpHeaderExtension>& extensions, + const std::string& name) { + for (std::vector<RtpHeaderExtension>::const_iterator it = extensions.begin(); + it != extensions.end(); ++it) { + if (it->uri == name) + return &(*it); + } + return NULL; +} + +enum MediaChannelOptions { + // Tune the stream for conference mode. + OPT_CONFERENCE = 0x0001 +}; + +enum VoiceMediaChannelOptions { + // Tune the audio stream for vcs with different target levels. + OPT_AGC_MINUS_10DB = 0x80000000 +}; + +// DTMF flags to control if a DTMF tone should be played and/or sent. +enum DtmfFlags { + DF_PLAY = 0x01, + DF_SEND = 0x02, +}; + +// Special purpose DTMF event code used by the VoiceMediaChannel::InsertDtmf. +const int kDtmfDelay = -1; // Insert a delay to the end of the DTMF queue. +const int kDtmfReset = -2; // Reset the DTMF queue. +// The delay in ms when the InsertDtmf is called with kDtmfDelay. +const int kDtmfDelayInMs = 2000; + +class MediaChannel : public sigslot::has_slots<> { + public: + class NetworkInterface { + public: + enum SocketType { ST_RTP, ST_RTCP }; + virtual bool SendPacket(talk_base::Buffer* packet) = 0; + virtual bool SendRtcp(talk_base::Buffer* packet) = 0; + virtual int SetOption(SocketType type, talk_base::Socket::Option opt, + int option) = 0; + virtual ~NetworkInterface() {} + }; + + MediaChannel() : network_interface_(NULL) {} + virtual ~MediaChannel() {} + + // Gets/sets the abstract inteface class for sending RTP/RTCP data. + NetworkInterface *network_interface() { return network_interface_; } + virtual void SetInterface(NetworkInterface *iface) { + network_interface_ = iface; + } + + // Called when a RTP packet is received. + virtual void OnPacketReceived(talk_base::Buffer* packet) = 0; + // Called when a RTCP packet is received. + virtual void OnRtcpReceived(talk_base::Buffer* packet) = 0; + // Called when the socket's ability to send has changed. + virtual void OnReadyToSend(bool ready) = 0; + // Creates a new outgoing media stream with SSRCs and CNAME as described + // by sp. + virtual bool AddSendStream(const StreamParams& sp) = 0; + // Removes an outgoing media stream. + // ssrc must be the first SSRC of the media stream if the stream uses + // multiple SSRCs. + virtual bool RemoveSendStream(uint32 ssrc) = 0; + // Creates a new incoming media stream with SSRCs and CNAME as described + // by sp. + virtual bool AddRecvStream(const StreamParams& sp) = 0; + // Removes an incoming media stream. + // ssrc must be the first SSRC of the media stream if the stream uses + // multiple SSRCs. + virtual bool RemoveRecvStream(uint32 ssrc) = 0; + + // Mutes the channel. + virtual bool MuteStream(uint32 ssrc, bool on) = 0; + + // Sets the RTP extension headers and IDs to use when sending RTP. + virtual bool SetRecvRtpHeaderExtensions( + const std::vector<RtpHeaderExtension>& extensions) = 0; + virtual bool SetSendRtpHeaderExtensions( + const std::vector<RtpHeaderExtension>& extensions) = 0; + // Sets the rate control to use when sending data. + virtual bool SetSendBandwidth(bool autobw, int bps) = 0; + + protected: + NetworkInterface *network_interface_; +}; + +enum SendFlags { + SEND_NOTHING, + SEND_RINGBACKTONE, + SEND_MICROPHONE +}; + +struct VoiceSenderInfo { + VoiceSenderInfo() + : ssrc(0), + bytes_sent(0), + packets_sent(0), + packets_lost(0), + fraction_lost(0.0), + ext_seqnum(0), + rtt_ms(0), + jitter_ms(0), + audio_level(0), + aec_quality_min(0.0), + echo_delay_median_ms(0), + echo_delay_std_ms(0), + echo_return_loss(0), + echo_return_loss_enhancement(0) { + } + + uint32 ssrc; + std::string codec_name; + int64 bytes_sent; + int packets_sent; + int packets_lost; + float fraction_lost; + int ext_seqnum; + int rtt_ms; + int jitter_ms; + int audio_level; + float aec_quality_min; + int echo_delay_median_ms; + int echo_delay_std_ms; + int echo_return_loss; + int echo_return_loss_enhancement; +}; + +struct VoiceReceiverInfo { + VoiceReceiverInfo() + : ssrc(0), + bytes_rcvd(0), + packets_rcvd(0), + packets_lost(0), + fraction_lost(0.0), + ext_seqnum(0), + jitter_ms(0), + jitter_buffer_ms(0), + jitter_buffer_preferred_ms(0), + delay_estimate_ms(0), + audio_level(0), + expand_rate(0) { + } + + uint32 ssrc; + int64 bytes_rcvd; + int packets_rcvd; + int packets_lost; + float fraction_lost; + int ext_seqnum; + int jitter_ms; + int jitter_buffer_ms; + int jitter_buffer_preferred_ms; + int delay_estimate_ms; + int audio_level; + // fraction of synthesized speech inserted through pre-emptive expansion + float expand_rate; +}; + +struct VideoSenderInfo { + VideoSenderInfo() + : bytes_sent(0), + packets_sent(0), + packets_cached(0), + packets_lost(0), + fraction_lost(0.0), + firs_rcvd(0), + nacks_rcvd(0), + rtt_ms(0), + frame_width(0), + frame_height(0), + framerate_input(0), + framerate_sent(0), + nominal_bitrate(0), + preferred_bitrate(0), + adapt_reason(0) { + } + + std::vector<uint32> ssrcs; + std::vector<SsrcGroup> ssrc_groups; + std::string codec_name; + int64 bytes_sent; + int packets_sent; + int packets_cached; + int packets_lost; + float fraction_lost; + int firs_rcvd; + int nacks_rcvd; + int rtt_ms; + int frame_width; + int frame_height; + int framerate_input; + int framerate_sent; + int nominal_bitrate; + int preferred_bitrate; + int adapt_reason; +}; + +struct VideoReceiverInfo { + VideoReceiverInfo() + : bytes_rcvd(0), + packets_rcvd(0), + packets_lost(0), + packets_concealed(0), + fraction_lost(0.0), + firs_sent(0), + nacks_sent(0), + frame_width(0), + frame_height(0), + framerate_rcvd(0), + framerate_decoded(0), + framerate_output(0), + framerate_render_input(0), + framerate_render_output(0) { + } + + std::vector<uint32> ssrcs; + std::vector<SsrcGroup> ssrc_groups; + int64 bytes_rcvd; + // vector<int> layer_bytes_rcvd; + int packets_rcvd; + int packets_lost; + int packets_concealed; + float fraction_lost; + int firs_sent; + int nacks_sent; + int frame_width; + int frame_height; + int framerate_rcvd; + int framerate_decoded; + int framerate_output; + // Framerate as sent to the renderer. + int framerate_render_input; + // Framerate that the renderer reports. + int framerate_render_output; +}; + +struct DataSenderInfo { + DataSenderInfo() + : ssrc(0), + bytes_sent(0), + packets_sent(0) { + } + + uint32 ssrc; + std::string codec_name; + int64 bytes_sent; + int packets_sent; +}; + +struct DataReceiverInfo { + DataReceiverInfo() + : ssrc(0), + bytes_rcvd(0), + packets_rcvd(0) { + } + + uint32 ssrc; + int64 bytes_rcvd; + int packets_rcvd; +}; + +struct BandwidthEstimationInfo { + BandwidthEstimationInfo() + : available_send_bandwidth(0), + available_recv_bandwidth(0), + target_enc_bitrate(0), + actual_enc_bitrate(0), + retransmit_bitrate(0), + transmit_bitrate(0), + bucket_delay(0) { + } + + int available_send_bandwidth; + int available_recv_bandwidth; + int target_enc_bitrate; + int actual_enc_bitrate; + int retransmit_bitrate; + int transmit_bitrate; + int bucket_delay; +}; + +struct VoiceMediaInfo { + void Clear() { + senders.clear(); + receivers.clear(); + } + std::vector<VoiceSenderInfo> senders; + std::vector<VoiceReceiverInfo> receivers; +}; + +struct VideoMediaInfo { + void Clear() { + senders.clear(); + receivers.clear(); + bw_estimations.clear(); + } + std::vector<VideoSenderInfo> senders; + std::vector<VideoReceiverInfo> receivers; + std::vector<BandwidthEstimationInfo> bw_estimations; +}; + +struct DataMediaInfo { + void Clear() { + senders.clear(); + receivers.clear(); + } + std::vector<DataSenderInfo> senders; + std::vector<DataReceiverInfo> receivers; +}; + +class VoiceMediaChannel : public MediaChannel { + public: + enum Error { + ERROR_NONE = 0, // No error. + ERROR_OTHER, // Other errors. + ERROR_REC_DEVICE_OPEN_FAILED = 100, // Could not open mic. + ERROR_REC_DEVICE_MUTED, // Mic was muted by OS. + ERROR_REC_DEVICE_SILENT, // No background noise picked up. + ERROR_REC_DEVICE_SATURATION, // Mic input is clipping. + ERROR_REC_DEVICE_REMOVED, // Mic was removed while active. + ERROR_REC_RUNTIME_ERROR, // Processing is encountering errors. + ERROR_REC_SRTP_ERROR, // Generic SRTP failure. + ERROR_REC_SRTP_AUTH_FAILED, // Failed to authenticate packets. + ERROR_REC_TYPING_NOISE_DETECTED, // Typing noise is detected. + ERROR_PLAY_DEVICE_OPEN_FAILED = 200, // Could not open playout. + ERROR_PLAY_DEVICE_MUTED, // Playout muted by OS. + ERROR_PLAY_DEVICE_REMOVED, // Playout removed while active. + ERROR_PLAY_RUNTIME_ERROR, // Errors in voice processing. + ERROR_PLAY_SRTP_ERROR, // Generic SRTP failure. + ERROR_PLAY_SRTP_AUTH_FAILED, // Failed to authenticate packets. + ERROR_PLAY_SRTP_REPLAY, // Packet replay detected. + }; + + VoiceMediaChannel() {} + virtual ~VoiceMediaChannel() {} + // Sets the codecs/payload types to be used for incoming media. + virtual bool SetRecvCodecs(const std::vector<AudioCodec>& codecs) = 0; + // Sets the codecs/payload types to be used for outgoing media. + virtual bool SetSendCodecs(const std::vector<AudioCodec>& codecs) = 0; + // Starts or stops playout of received audio. + virtual bool SetPlayout(bool playout) = 0; + // Starts or stops sending (and potentially capture) of local audio. + virtual bool SetSend(SendFlags flag) = 0; + // Sets the renderer object to be used for the specified audio stream. + virtual bool SetRenderer(uint32 ssrc, AudioRenderer* renderer) = 0; + // Gets current energy levels for all incoming streams. + virtual bool GetActiveStreams(AudioInfo::StreamList* actives) = 0; + // Get the current energy level of the stream sent to the speaker. + virtual int GetOutputLevel() = 0; + // Get the time in milliseconds since last recorded keystroke, or negative. + virtual int GetTimeSinceLastTyping() = 0; + // Temporarily exposed field for tuning typing detect options. + virtual void SetTypingDetectionParameters(int time_window, + int cost_per_typing, int reporting_threshold, int penalty_decay, + int type_event_delay) = 0; + // Set left and right scale for speaker output volume of the specified ssrc. + virtual bool SetOutputScaling(uint32 ssrc, double left, double right) = 0; + // Get left and right scale for speaker output volume of the specified ssrc. + virtual bool GetOutputScaling(uint32 ssrc, double* left, double* right) = 0; + // Specifies a ringback tone to be played during call setup. + virtual bool SetRingbackTone(const char *buf, int len) = 0; + // Plays or stops the aforementioned ringback tone + virtual bool PlayRingbackTone(uint32 ssrc, bool play, bool loop) = 0; + // Returns if the telephone-event has been negotiated. + virtual bool CanInsertDtmf() { return false; } + // Send and/or play a DTMF |event| according to the |flags|. + // The DTMF out-of-band signal will be used on sending. + // The |ssrc| should be either 0 or a valid send stream ssrc. + // The valid value for the |event| are -2 to 15. + // kDtmfReset(-2) is used to reset the DTMF. + // kDtmfDelay(-1) is used to insert a delay to the end of the DTMF queue. + // 0 to 15 which corresponding to DTMF event 0-9, *, #, A-D. + virtual bool InsertDtmf(uint32 ssrc, int event, int duration, int flags) = 0; + // Gets quality stats for the channel. + virtual bool GetStats(VoiceMediaInfo* info) = 0; + // Gets last reported error for this media channel. + virtual void GetLastMediaError(uint32* ssrc, + VoiceMediaChannel::Error* error) { + ASSERT(error != NULL); + *error = ERROR_NONE; + } + // Sets the media options to use. + virtual bool SetOptions(const AudioOptions& options) = 0; + virtual bool GetOptions(AudioOptions* options) const = 0; + + // Signal errors from MediaChannel. Arguments are: + // ssrc(uint32), and error(VoiceMediaChannel::Error). + sigslot::signal2<uint32, VoiceMediaChannel::Error> SignalMediaError; +}; + +class VideoMediaChannel : public MediaChannel { + public: + enum Error { + ERROR_NONE = 0, // No error. + ERROR_OTHER, // Other errors. + ERROR_REC_DEVICE_OPEN_FAILED = 100, // Could not open camera. + ERROR_REC_DEVICE_NO_DEVICE, // No camera. + ERROR_REC_DEVICE_IN_USE, // Device is in already use. + ERROR_REC_DEVICE_REMOVED, // Device is removed. + ERROR_REC_SRTP_ERROR, // Generic sender SRTP failure. + ERROR_REC_SRTP_AUTH_FAILED, // Failed to authenticate packets. + ERROR_REC_CPU_MAX_CANT_DOWNGRADE, // Can't downgrade capture anymore. + ERROR_PLAY_SRTP_ERROR = 200, // Generic receiver SRTP failure. + ERROR_PLAY_SRTP_AUTH_FAILED, // Failed to authenticate packets. + ERROR_PLAY_SRTP_REPLAY, // Packet replay detected. + }; + + VideoMediaChannel() : renderer_(NULL) {} + virtual ~VideoMediaChannel() {} + // Sets the codecs/payload types to be used for incoming media. + virtual bool SetRecvCodecs(const std::vector<VideoCodec>& codecs) = 0; + // Sets the codecs/payload types to be used for outgoing media. + virtual bool SetSendCodecs(const std::vector<VideoCodec>& codecs) = 0; + // Gets the currently set codecs/payload types to be used for outgoing media. + virtual bool GetSendCodec(VideoCodec* send_codec) = 0; + // Sets the format of a specified outgoing stream. + virtual bool SetSendStreamFormat(uint32 ssrc, const VideoFormat& format) = 0; + // Starts or stops playout of received video. + virtual bool SetRender(bool render) = 0; + // Starts or stops transmission (and potentially capture) of local video. + virtual bool SetSend(bool send) = 0; + // Sets the renderer object to be used for the specified stream. + // If SSRC is 0, the renderer is used for the 'default' stream. + virtual bool SetRenderer(uint32 ssrc, VideoRenderer* renderer) = 0; + // If |ssrc| is 0, replace the default capturer (engine capturer) with + // |capturer|. If |ssrc| is non zero create a new stream with |ssrc| as SSRC. + virtual bool SetCapturer(uint32 ssrc, VideoCapturer* capturer) = 0; + // Gets quality stats for the channel. + virtual bool GetStats(VideoMediaInfo* info) = 0; + + // Send an intra frame to the receivers. + virtual bool SendIntraFrame() = 0; + // Reuqest each of the remote senders to send an intra frame. + virtual bool RequestIntraFrame() = 0; + // Sets the media options to use. + virtual bool SetOptions(const VideoOptions& options) = 0; + virtual bool GetOptions(VideoOptions* options) const = 0; + virtual void UpdateAspectRatio(int ratio_w, int ratio_h) = 0; + + // Signal errors from MediaChannel. Arguments are: + // ssrc(uint32), and error(VideoMediaChannel::Error). + sigslot::signal2<uint32, Error> SignalMediaError; + + protected: + VideoRenderer *renderer_; +}; + +enum DataMessageType { + // TODO(pthatcher): Make this enum match the SCTP PPIDs that WebRTC uses? + DMT_CONTROL = 0, + DMT_BINARY = 1, + DMT_TEXT = 2, +}; + +// Info about data received in DataMediaChannel. For use in +// DataMediaChannel::SignalDataReceived and in all of the signals that +// signal fires, on up the chain. +struct ReceiveDataParams { + // The in-packet stream indentifier. + // For SCTP, this is really SID, not SSRC. + uint32 ssrc; + // The type of message (binary, text, or control). + DataMessageType type; + // A per-stream value incremented per packet in the stream. + int seq_num; + // A per-stream value monotonically increasing with time. + int timestamp; + + ReceiveDataParams() : + ssrc(0), + type(DMT_TEXT), + seq_num(0), + timestamp(0) { + } +}; + +struct SendDataParams { + // The in-packet stream indentifier. + // For SCTP, this is really SID, not SSRC. + uint32 ssrc; + // The type of message (binary, text, or control). + DataMessageType type; + + // For SCTP, whether to send messages flagged as ordered or not. + // If false, messages can be received out of order. + bool ordered; + // For SCTP, whether the messages are sent reliably or not. + // If false, messages may be lost. + bool reliable; + // For SCTP, if reliable == false, provide partial reliability by + // resending up to this many times. Either count or millis + // is supported, not both at the same time. + int max_rtx_count; + // For SCTP, if reliable == false, provide partial reliability by + // resending for up to this many milliseconds. Either count or millis + // is supported, not both at the same time. + int max_rtx_ms; + + SendDataParams() : + ssrc(0), + type(DMT_TEXT), + // TODO(pthatcher): Make these true by default? + ordered(false), + reliable(false), + max_rtx_count(0), + max_rtx_ms(0) { + } +}; + +enum SendDataResult { SDR_SUCCESS, SDR_ERROR, SDR_BLOCK }; + +class DataMediaChannel : public MediaChannel { + public: + enum Error { + ERROR_NONE = 0, // No error. + ERROR_OTHER, // Other errors. + ERROR_SEND_SRTP_ERROR = 200, // Generic SRTP failure. + ERROR_SEND_SRTP_AUTH_FAILED, // Failed to authenticate packets. + ERROR_RECV_SRTP_ERROR, // Generic SRTP failure. + ERROR_RECV_SRTP_AUTH_FAILED, // Failed to authenticate packets. + ERROR_RECV_SRTP_REPLAY, // Packet replay detected. + }; + + virtual ~DataMediaChannel() {} + + virtual bool SetSendBandwidth(bool autobw, int bps) = 0; + virtual bool SetSendCodecs(const std::vector<DataCodec>& codecs) = 0; + virtual bool SetRecvCodecs(const std::vector<DataCodec>& codecs) = 0; + virtual bool SetRecvRtpHeaderExtensions( + const std::vector<RtpHeaderExtension>& extensions) = 0; + virtual bool SetSendRtpHeaderExtensions( + const std::vector<RtpHeaderExtension>& extensions) = 0; + virtual bool AddSendStream(const StreamParams& sp) = 0; + virtual bool RemoveSendStream(uint32 ssrc) = 0; + virtual bool AddRecvStream(const StreamParams& sp) = 0; + virtual bool RemoveRecvStream(uint32 ssrc) = 0; + virtual bool MuteStream(uint32 ssrc, bool on) { return false; } + // TODO(pthatcher): Implement this. + virtual bool GetStats(DataMediaInfo* info) { return true; } + + virtual bool SetSend(bool send) = 0; + virtual bool SetReceive(bool receive) = 0; + virtual void OnPacketReceived(talk_base::Buffer* packet) = 0; + virtual void OnRtcpReceived(talk_base::Buffer* packet) = 0; + + virtual bool SendData( + const SendDataParams& params, + const talk_base::Buffer& payload, + SendDataResult* result = NULL) = 0; + // Signals when data is received (params, data, len) + sigslot::signal3<const ReceiveDataParams&, + const char*, + size_t> SignalDataReceived; + // Signal errors from MediaChannel. Arguments are: + // ssrc(uint32), and error(DataMediaChannel::Error). + sigslot::signal2<uint32, DataMediaChannel::Error> SignalMediaError; +}; + +} // namespace cricket + +#endif // TALK_MEDIA_BASE_MEDIACHANNEL_H_ |