blob: 661ab4bbdeece62c603b3e7d508db6f5a2243965 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellander65c7f672016-02-12 00:05:01 -08002 * Copyright 2004 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellander65c7f672016-02-12 00:05:01 -08004 * 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:36 +00009 */
10
Steve Anton10542f22019-01-11 09:11:00 -080011#ifndef PC_CHANNEL_MANAGER_H_
12#define PC_CHANNEL_MANAGER_H_
henrike@webrtc.org28e20752013-07-10 00:45:36 +000013
Yves Gerey3e707812018-11-28 16:47:49 +010014#include <stdint.h>
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070015
kwiberg31022942016-03-11 14:18:21 -080016#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000017#include <string>
18#include <vector>
19
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "api/crypto/crypto_options.h"
Niels Möller65f17ca2019-09-12 13:59:36 +020022#include "api/transport/media/media_transport_config.h"
Yves Gerey3e707812018-11-28 16:47:49 +010023#include "call/call.h"
24#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080025#include "media/base/media_channel.h"
26#include "media/base/media_config.h"
27#include "media/base/media_engine.h"
Steve Antonc9e15602017-11-06 15:40:09 -080028#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080029#include "pc/rtp_transport_internal.h"
30#include "pc/session_description.h"
Niels Möllere8e4dc42019-06-11 14:04:16 +020031#include "rtc_base/system/file_wrapper.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020032#include "rtc_base/thread.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000033
34namespace cricket {
35
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036// 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 15:40:09 -080044class ChannelManager final {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000045 public:
Steve Antonc9e15602017-11-06 15:40:09 -080046 // 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:36 +000051 ~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:52 +000055 rtc::Thread* worker_thread() const { return worker_thread_; }
56 bool set_worker_thread(rtc::Thread* thread) {
Danil Chapovalov33b01f22016-05-11 19:55:27 +020057 if (initialized_) {
58 return false;
59 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060 worker_thread_ = thread;
61 return true;
62 }
Danil Chapovalov33b01f22016-05-11 19:55:27 +020063 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:36 +000071
Fredrik Solenberg709ed672015-09-15 12:26:33 +020072 MediaEngineInterface* media_engine() { return media_engine_.get(); }
73
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074 // Retrieves the list of supported audio & video codec types.
75 // Can be called before starting the media engine.
ossudedfd282016-06-14 07:12:39 -070076 void GetSupportedAudioSendCodecs(std::vector<AudioCodec>* codecs) const;
77 void GetSupportedAudioReceiveCodecs(std::vector<AudioCodec>* codecs) const;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000078 void GetSupportedAudioRtpHeaderExtensions(RtpHeaderExtensions* ext) const;
magjed3cf8ece2016-11-10 03:36:53 -080079 void GetSupportedVideoCodecs(std::vector<VideoCodec>* codecs) const;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000080 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 10:48:46 -070091 // 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:36 +000094 // Creates a voice channel, to be associated with the specified session.
Anton Sukhanov98a462c2018-10-17 13:15:42 -070095 VoiceChannel* CreateVoiceChannel(
96 webrtc::Call* call,
97 const cricket::MediaConfig& media_config,
98 webrtc::RtpTransportInternal* rtp_transport,
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070099 const webrtc::MediaTransportConfig& media_transport_config,
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700100 rtc::Thread* signaling_thread,
101 const std::string& content_name,
102 bool srtp_required,
103 const webrtc::CryptoOptions& crypto_options,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800104 rtc::UniqueRandomIdGenerator* ssrc_generator,
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700105 const AudioOptions& options);
Steve Anton774115c2017-08-30 10:48:46 -0700106 // Destroys a voice channel created by CreateVoiceChannel.
Fredrik Solenberg709ed672015-09-15 12:26:33 +0200107 void DestroyVoiceChannel(VoiceChannel* voice_channel);
Steve Anton774115c2017-08-30 10:48:46 -0700108
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109 // Creates a video channel, synced with the specified voice channel, and
110 // associated with the specified session.
deadbeefe814a0d2017-02-25 18:15:09 -0800111 // Version of the above that takes PacketTransportInternal.
Niels Möller46879152019-01-07 15:54:47 +0100112 VideoChannel* CreateVideoChannel(
113 webrtc::Call* call,
114 const cricket::MediaConfig& media_config,
115 webrtc::RtpTransportInternal* rtp_transport,
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700116 const webrtc::MediaTransportConfig& media_transport_config,
Niels Möller46879152019-01-07 15:54:47 +0100117 rtc::Thread* signaling_thread,
118 const std::string& content_name,
119 bool srtp_required,
120 const webrtc::CryptoOptions& crypto_options,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800121 rtc::UniqueRandomIdGenerator* ssrc_generator,
Jonas Orelanda3aa9bd2019-04-17 07:38:40 +0200122 const VideoOptions& options,
123 webrtc::VideoBitrateAllocatorFactory* video_bitrate_allocator_factory);
Steve Anton774115c2017-08-30 10:48:46 -0700124 // Destroys a video channel created by CreateVideoChannel.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 void DestroyVideoChannel(VideoChannel* video_channel);
Steve Anton774115c2017-08-30 10:48:46 -0700126
Zhi Huang2dfc42d2017-12-04 13:38:48 -0800127 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 10:48:35 -0700132 bool srtp_required,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800133 const webrtc::CryptoOptions& crypto_options,
134 rtc::UniqueRandomIdGenerator* ssrc_generator);
Steve Anton774115c2017-08-30 10:48:46 -0700135 // Destroys a data channel created by CreateRtpDataChannel.
deadbeef953c2ce2017-01-09 14:53:41 -0800136 void DestroyRtpDataChannel(RtpDataChannel* data_channel);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000137
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 // Indicates whether any channels exist.
139 bool has_channels() const {
Steve Antonc9e15602017-11-06 15:40:09 -0800140 return (!voice_channels_.empty() || !video_channels_.empty() ||
141 !data_channels_.empty());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000142 }
143
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000144 // 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:36 +0000149 bool capturing() const { return capturing_; }
150
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000151 // The operations below occur on the main thread.
152
ivocd66b44d2016-01-15 03:06:36 -0800153 // 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.
Niels Möllere8e4dc42019-06-11 14:04:16 +0200156 bool StartAecDump(webrtc::FileWrapper file, int64_t max_size_bytes);
wu@webrtc.orga9890802013-12-13 00:21:03 +0000157
ivoc797ef122015-10-22 03:25:41 -0700158 // Stops recording AEC dump.
159 void StopAecDump();
160
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000161 private:
Steve Antonc9e15602017-11-06 15:40:09 -0800162 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:52 +0000165 rtc::Thread* main_thread_;
166 rtc::Thread* worker_thread_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200167 rtc::Thread* network_thread_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000168
Steve Antonc9e15602017-11-06 15:40:09 -0800169 // Vector contents are non-null.
Steve Anton774115c2017-08-30 10:48:46 -0700170 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:36 +0000173
Steve Antonc9e15602017-11-06 15:40:09 -0800174 bool enable_rtx_ = false;
175 bool capturing_ = false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000176};
177
178} // namespace cricket
179
Steve Anton10542f22019-01-11 09:11:00 -0800180#endif // PC_CHANNEL_MANAGER_H_