OLD | NEW |
| (Empty) |
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 | |
48 namespace rtc { | |
49 class Buffer; | |
50 class RateLimiter; | |
51 class Timing; | |
52 } | |
53 | |
54 namespace webrtc { | |
55 class AudioSinkInterface; | |
56 } | |
57 | |
58 namespace cricket { | |
59 | |
60 class AudioRenderer; | |
61 class ScreencastId; | |
62 class VideoCapturer; | |
63 class VideoRenderer; | |
64 struct RtpHeader; | |
65 struct VideoFormat; | |
66 | |
67 const int kMinRtpHeaderExtensionId = 1; | |
68 const int kMaxRtpHeaderExtensionId = 255; | |
69 const int kScreencastDefaultFps = 5; | |
70 | |
71 template <class T> | |
72 static 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 | |
83 template <class T> | |
84 static 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. | |
101 struct 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. | |
240 struct 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 | |
406 struct 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. | |
433 inline 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 | |
444 enum MediaChannelOptions { | |
445 // Tune the stream for conference mode. | |
446 OPT_CONFERENCE = 0x0001 | |
447 }; | |
448 | |
449 enum VoiceMediaChannelOptions { | |
450 // Tune the audio stream for vcs with different target levels. | |
451 OPT_AGC_MINUS_10DB = 0x80000000 | |
452 }; | |
453 | |
454 class 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 | |
558 enum 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. | |
570 struct 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 | |
579 struct SsrcReceiverInfo { | |
580 SsrcReceiverInfo() | |
581 : ssrc(0), | |
582 timestamp(0) { | |
583 } | |
584 uint32_t ssrc; | |
585 double timestamp; | |
586 }; | |
587 | |
588 struct 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 | |
635 template<class T> | |
636 struct 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 | |
649 struct 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 | |
694 struct 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 | |
718 struct 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 | |
765 struct 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 | |
808 struct 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 | |
871 struct DataSenderInfo : public MediaSenderInfo { | |
872 DataSenderInfo() | |
873 : ssrc(0) { | |
874 } | |
875 | |
876 uint32_t ssrc; | |
877 }; | |
878 | |
879 struct DataReceiverInfo : public MediaReceiverInfo { | |
880 DataReceiverInfo() | |
881 : ssrc(0) { | |
882 } | |
883 | |
884 uint32_t ssrc; | |
885 }; | |
886 | |
887 struct 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 | |
907 struct VoiceMediaInfo { | |
908 void Clear() { | |
909 senders.clear(); | |
910 receivers.clear(); | |
911 } | |
912 std::vector<VoiceSenderInfo> senders; | |
913 std::vector<VoiceReceiverInfo> receivers; | |
914 }; | |
915 | |
916 struct 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 | |
927 struct DataMediaInfo { | |
928 void Clear() { | |
929 senders.clear(); | |
930 receivers.clear(); | |
931 } | |
932 std::vector<DataSenderInfo> senders; | |
933 std::vector<DataReceiverInfo> receivers; | |
934 }; | |
935 | |
936 struct RtcpParameters { | |
937 bool reduced_size = false; | |
938 }; | |
939 | |
940 template <class Codec> | |
941 struct 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 | |
957 template <class Codec, class Options> | |
958 struct 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 | |
974 struct AudioSendParameters : RtpSendParameters<AudioCodec, AudioOptions> { | |
975 }; | |
976 | |
977 struct AudioRecvParameters : RtpParameters<AudioCodec> { | |
978 }; | |
979 | |
980 class 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 | |
1043 struct VideoSendParameters : RtpSendParameters<VideoCodec, VideoOptions> { | |
1044 }; | |
1045 | |
1046 struct VideoRecvParameters : RtpParameters<VideoCodec> { | |
1047 }; | |
1048 | |
1049 class 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 | |
1100 enum 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. | |
1112 struct 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 | |
1131 struct 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 | |
1164 enum SendDataResult { SDR_SUCCESS, SDR_ERROR, SDR_BLOCK }; | |
1165 | |
1166 struct DataOptions { | |
1167 std::string ToString() const { | |
1168 return "{}"; | |
1169 } | |
1170 }; | |
1171 | |
1172 struct 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 | |
1184 struct DataRecvParameters : RtpParameters<DataCodec> { | |
1185 }; | |
1186 | |
1187 class 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_ | |
OLD | NEW |