blob: 34f9013d73e04c5ecba79b743ed809d76cbd3f36 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:361/*
kjellander65c7f672016-02-12 08:05:012 * Copyright 2004 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:363 *
kjellander65c7f672016-02-12 08:05:014 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:369 */
10
Steve Anton10542f22019-01-11 17:11:0011#ifndef PC_CHANNEL_MANAGER_H_
12#define PC_CHANNEL_MANAGER_H_
henrike@webrtc.org28e20752013-07-10 00:45:3613
Yves Gerey3e707812018-11-28 15:47:4914#include <stdint.h>
Anton Sukhanov4f08faa2019-05-21 18:12:5715
kwiberg31022942016-03-11 22:18:2116#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:3617#include <string>
18#include <vector>
19
Yves Gerey3e707812018-11-28 15:47:4920#include "api/audio_options.h"
Steve Anton10542f22019-01-11 17:11:0021#include "api/crypto/crypto_options.h"
Anton Sukhanov4f08faa2019-05-21 18:12:5722#include "api/media_transport_config.h"
Yves Gerey3e707812018-11-28 15:47:4923#include "call/call.h"
24#include "media/base/codec.h"
Steve Anton10542f22019-01-11 17:11:0025#include "media/base/media_channel.h"
26#include "media/base/media_config.h"
27#include "media/base/media_engine.h"
Steve Antonc9e15602017-11-06 23:40:0928#include "pc/channel.h"
Steve Anton10542f22019-01-11 17:11:0029#include "pc/rtp_transport_internal.h"
30#include "pc/session_description.h"
Yves Gerey3e707812018-11-28 15:47:4931#include "rtc_base/platform_file.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3132#include "rtc_base/thread.h"
henrike@webrtc.org28e20752013-07-10 00:45:3633
34namespace cricket {
35
henrike@webrtc.org28e20752013-07-10 00:45:3636// ChannelManager allows the MediaEngine to run on a separate thread, and takes
37// care of marshalling calls between threads. It also creates and keeps track of
38// voice and video channels; by doing so, it can temporarily pause all the
39// channels when a new audio or video device is chosen. The voice and video
40// channels are stored in separate vectors, to easily allow operations on just
41// voice or just video channels.
42// ChannelManager also allows the application to discover what devices it has
43// using device manager.
Steve Antonc9e15602017-11-06 23:40:0944class ChannelManager final {
henrike@webrtc.org28e20752013-07-10 00:45:3645 public:
Steve Antonc9e15602017-11-06 23:40:0946 // Construct a ChannelManager with the specified media engine and data engine.
47 ChannelManager(std::unique_ptr<MediaEngineInterface> media_engine,
48 std::unique_ptr<DataEngineInterface> data_engine,
49 rtc::Thread* worker_thread,
50 rtc::Thread* network_thread);
henrike@webrtc.org28e20752013-07-10 00:45:3651 ~ChannelManager();
52
53 // Accessors for the worker thread, allowing it to be set after construction,
54 // but before Init. set_worker_thread will return false if called after Init.
buildbot@webrtc.orgd4e598d2014-07-29 17:36:5255 rtc::Thread* worker_thread() const { return worker_thread_; }
56 bool set_worker_thread(rtc::Thread* thread) {
Danil Chapovalov33b01f22016-05-11 17:55:2757 if (initialized_) {
58 return false;
59 }
henrike@webrtc.org28e20752013-07-10 00:45:3660 worker_thread_ = thread;
61 return true;
62 }
Danil Chapovalov33b01f22016-05-11 17:55:2763 rtc::Thread* network_thread() const { return network_thread_; }
64 bool set_network_thread(rtc::Thread* thread) {
65 if (initialized_) {
66 return false;
67 }
68 network_thread_ = thread;
69 return true;
70 }
henrike@webrtc.org28e20752013-07-10 00:45:3671
Fredrik Solenberg709ed672015-09-15 10:26:3372 MediaEngineInterface* media_engine() { return media_engine_.get(); }
73
henrike@webrtc.org28e20752013-07-10 00:45:3674 // Retrieves the list of supported audio & video codec types.
75 // Can be called before starting the media engine.
ossudedfd282016-06-14 14:12:3976 void GetSupportedAudioSendCodecs(std::vector<AudioCodec>* codecs) const;
77 void GetSupportedAudioReceiveCodecs(std::vector<AudioCodec>* codecs) const;
henrike@webrtc.org28e20752013-07-10 00:45:3678 void GetSupportedAudioRtpHeaderExtensions(RtpHeaderExtensions* ext) const;
magjed3cf8ece2016-11-10 11:36:5379 void GetSupportedVideoCodecs(std::vector<VideoCodec>* codecs) const;
henrike@webrtc.org28e20752013-07-10 00:45:3680 void GetSupportedVideoRtpHeaderExtensions(RtpHeaderExtensions* ext) const;
81 void GetSupportedDataCodecs(std::vector<DataCodec>* codecs) const;
82
83 // Indicates whether the media engine is started.
84 bool initialized() const { return initialized_; }
85 // Starts up the media engine.
86 bool Init();
87 // Shuts down the media engine.
88 void Terminate();
89
90 // The operations below all occur on the worker thread.
Steve Anton774115c2017-08-30 17:48:4691 // ChannelManager retains ownership of the created channels, so clients should
92 // call the appropriate Destroy*Channel method when done.
93
henrike@webrtc.org28e20752013-07-10 00:45:3694 // Creates a voice channel, to be associated with the specified session.
Anton Sukhanov98a462c2018-10-17 20:15:4295 VoiceChannel* CreateVoiceChannel(
96 webrtc::Call* call,
97 const cricket::MediaConfig& media_config,
98 webrtc::RtpTransportInternal* rtp_transport,
Anton Sukhanov4f08faa2019-05-21 18:12:5799 const webrtc::MediaTransportConfig& media_transport_config,
Anton Sukhanov98a462c2018-10-17 20:15:42100 rtc::Thread* signaling_thread,
101 const std::string& content_name,
102 bool srtp_required,
103 const webrtc::CryptoOptions& crypto_options,
Amit Hilbuchbcd39d42019-01-26 01:13:56104 rtc::UniqueRandomIdGenerator* ssrc_generator,
Anton Sukhanov98a462c2018-10-17 20:15:42105 const AudioOptions& options);
Steve Anton774115c2017-08-30 17:48:46106 // Destroys a voice channel created by CreateVoiceChannel.
Fredrik Solenberg709ed672015-09-15 10:26:33107 void DestroyVoiceChannel(VoiceChannel* voice_channel);
Steve Anton774115c2017-08-30 17:48:46108
henrike@webrtc.org28e20752013-07-10 00:45:36109 // Creates a video channel, synced with the specified voice channel, and
110 // associated with the specified session.
deadbeefe814a0d2017-02-26 02:15:09111 // Version of the above that takes PacketTransportInternal.
Niels Möller46879152019-01-07 14:54:47112 VideoChannel* CreateVideoChannel(
113 webrtc::Call* call,
114 const cricket::MediaConfig& media_config,
115 webrtc::RtpTransportInternal* rtp_transport,
Anton Sukhanov4f08faa2019-05-21 18:12:57116 const webrtc::MediaTransportConfig& media_transport_config,
Niels Möller46879152019-01-07 14:54:47117 rtc::Thread* signaling_thread,
118 const std::string& content_name,
119 bool srtp_required,
120 const webrtc::CryptoOptions& crypto_options,
Amit Hilbuchbcd39d42019-01-26 01:13:56121 rtc::UniqueRandomIdGenerator* ssrc_generator,
Jonas Orelanda3aa9bd2019-04-17 05:38:40122 const VideoOptions& options,
123 webrtc::VideoBitrateAllocatorFactory* video_bitrate_allocator_factory);
Steve Anton774115c2017-08-30 17:48:46124 // Destroys a video channel created by CreateVideoChannel.
henrike@webrtc.org28e20752013-07-10 00:45:36125 void DestroyVideoChannel(VideoChannel* video_channel);
Steve Anton774115c2017-08-30 17:48:46126
Zhi Huang2dfc42d2017-12-04 21:38:48127 RtpDataChannel* CreateRtpDataChannel(
128 const cricket::MediaConfig& media_config,
129 webrtc::RtpTransportInternal* rtp_transport,
130 rtc::Thread* signaling_thread,
131 const std::string& content_name,
Zhi Huange830e682018-03-30 17:48:35132 bool srtp_required,
Amit Hilbuchbcd39d42019-01-26 01:13:56133 const webrtc::CryptoOptions& crypto_options,
134 rtc::UniqueRandomIdGenerator* ssrc_generator);
Steve Anton774115c2017-08-30 17:48:46135 // Destroys a data channel created by CreateRtpDataChannel.
deadbeef953c2ce2017-01-09 22:53:41136 void DestroyRtpDataChannel(RtpDataChannel* data_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36137
henrike@webrtc.org28e20752013-07-10 00:45:36138 // Indicates whether any channels exist.
139 bool has_channels() const {
Steve Antonc9e15602017-11-06 23:40:09140 return (!voice_channels_.empty() || !video_channels_.empty() ||
141 !data_channels_.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36142 }
143
henrike@webrtc.org28e20752013-07-10 00:45:36144 // RTX will be enabled/disabled in engines that support it. The supporting
145 // engines will start offering an RTX codec. Must be called before Init().
146 bool SetVideoRtxEnabled(bool enable);
147
148 // Starts/stops the local microphone and enables polling of the input level.
henrike@webrtc.org28e20752013-07-10 00:45:36149 bool capturing() const { return capturing_; }
150
henrike@webrtc.org28e20752013-07-10 00:45:36151 // The operations below occur on the main thread.
152
ivocd66b44d2016-01-15 11:06:36153 // Starts AEC dump using existing file, with a specified maximum file size in
154 // bytes. When the limit is reached, logging will stop and the file will be
155 // closed. If max_size_bytes is set to <= 0, no limit will be used.
156 bool StartAecDump(rtc::PlatformFile file, int64_t max_size_bytes);
wu@webrtc.orga9890802013-12-13 00:21:03157
ivoc797ef122015-10-22 10:25:41158 // Stops recording AEC dump.
159 void StopAecDump();
160
henrike@webrtc.org28e20752013-07-10 00:45:36161 private:
Steve Antonc9e15602017-11-06 23:40:09162 std::unique_ptr<MediaEngineInterface> media_engine_; // Nullable.
163 std::unique_ptr<DataEngineInterface> data_engine_; // Non-null.
164 bool initialized_ = false;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52165 rtc::Thread* main_thread_;
166 rtc::Thread* worker_thread_;
Danil Chapovalov33b01f22016-05-11 17:55:27167 rtc::Thread* network_thread_;
henrike@webrtc.org28e20752013-07-10 00:45:36168
Steve Antonc9e15602017-11-06 23:40:09169 // Vector contents are non-null.
Steve Anton774115c2017-08-30 17:48:46170 std::vector<std::unique_ptr<VoiceChannel>> voice_channels_;
171 std::vector<std::unique_ptr<VideoChannel>> video_channels_;
172 std::vector<std::unique_ptr<RtpDataChannel>> data_channels_;
henrike@webrtc.org28e20752013-07-10 00:45:36173
Steve Antonc9e15602017-11-06 23:40:09174 bool enable_rtx_ = false;
175 bool capturing_ = false;
henrike@webrtc.org28e20752013-07-10 00:45:36176};
177
178} // namespace cricket
179
Steve Anton10542f22019-01-11 17:11:00180#endif // PC_CHANNEL_MANAGER_H_