blob: 238a8e20fee877628d23e0078b008604c8c67450 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef PC_CHANNEL_H_
12#define PC_CHANNEL_H_
henrike@webrtc.org28e20752013-07-10 00:45:36 +000013
deadbeefcbecd352015-09-23 11:50:27 -070014#include <map>
kwiberg31022942016-03-11 14:18:21 -080015#include <memory>
deadbeefcbecd352015-09-23 11:50:27 -070016#include <set>
kjellandera96e2d72016-02-04 23:52:28 -080017#include <string>
deadbeefcbecd352015-09-23 11:50:27 -070018#include <utility>
kjellandera96e2d72016-02-04 23:52:28 -080019#include <vector>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000020
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "api/call/audio_sink.h"
Danil Chapovalov89313452019-11-29 12:56:43 +010022#include "api/function_view.h"
Steve Anton3828c062017-12-06 10:34:51 -080023#include "api/jsep.h"
Steve Anton10542f22019-01-11 09:11:00 -080024#include "api/rtp_receiver_interface.h"
Niels Möller65f17ca2019-09-12 13:59:36 +020025#include "api/transport/media/media_transport_config.h"
Niels Möllerc6ce9c52018-05-11 11:15:30 +020026#include "api/video/video_sink_interface.h"
Niels Möller0327c2d2018-05-21 14:09:31 +020027#include "api/video/video_source_interface.h"
Zhi Huang365381f2018-04-13 16:44:34 -070028#include "call/rtp_packet_sink_interface.h"
Steve Anton10542f22019-01-11 09:11:00 -080029#include "media/base/media_channel.h"
30#include "media/base/media_engine.h"
31#include "media/base/stream_params.h"
32#include "p2p/base/dtls_transport_internal.h"
33#include "p2p/base/packet_transport_internal.h"
34#include "pc/channel_interface.h"
35#include "pc/dtls_srtp_transport.h"
36#include "pc/media_session.h"
37#include "pc/rtp_transport.h"
38#include "pc/srtp_filter.h"
39#include "pc/srtp_transport.h"
40#include "rtc_base/async_invoker.h"
41#include "rtc_base/async_udp_socket.h"
42#include "rtc_base/critical_section.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020043#include "rtc_base/network.h"
Artem Titove41c4332018-07-25 15:04:28 +020044#include "rtc_base/third_party/sigslot/sigslot.h"
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080045#include "rtc_base/unique_id_generator.h"
Tommif888bb52015-12-12 01:37:01 +010046
47namespace webrtc {
48class AudioSinkInterface;
Anton Sukhanov98a462c2018-10-17 13:15:42 -070049class MediaTransportInterface;
Tommif888bb52015-12-12 01:37:01 +010050} // namespace webrtc
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051
52namespace cricket {
53
54struct CryptoParams;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055
deadbeef062ce9f2016-08-26 21:42:15 -070056// BaseChannel contains logic common to voice and video, including enable,
57// marshaling calls to a worker and network threads, and connection and media
58// monitors.
59//
Danil Chapovalov33b01f22016-05-11 19:55:27 +020060// BaseChannel assumes signaling and other threads are allowed to make
61// synchronous calls to the worker thread, the worker thread makes synchronous
62// calls only to the network thread, and the network thread can't be blocked by
63// other threads.
64// All methods with _n suffix must be called on network thread,
deadbeef062ce9f2016-08-26 21:42:15 -070065// methods with _w suffix on worker thread
Danil Chapovalov33b01f22016-05-11 19:55:27 +020066// and methods with _s suffix on signaling thread.
67// Network and worker threads may be the same thread.
wu@webrtc.org78187522013-10-07 23:32:02 +000068//
69// WARNING! SUBCLASSES MUST CALL Deinit() IN THEIR DESTRUCTORS!
70// This is required to avoid a data race between the destructor modifying the
71// vtable, and the media channel's thread using BaseChannel as the
72// NetworkInterface.
73
Amit Hilbuchdd9390c2018-11-13 16:26:05 -080074class BaseChannel : public ChannelInterface,
75 public rtc::MessageHandler,
Zhi Huang365381f2018-04-13 16:44:34 -070076 public sigslot::has_slots<>,
77 public MediaChannel::NetworkInterface,
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -080078 public webrtc::RtpPacketSinkInterface {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079 public:
deadbeef7af91dd2016-12-13 11:29:11 -080080 // If |srtp_required| is true, the channel will not send or receive any
81 // RTP/RTCP packets without using SRTP (either using SDES or DTLS-SRTP).
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080082 // The BaseChannel does not own the UniqueRandomIdGenerator so it is the
83 // responsibility of the user to ensure it outlives this object.
Zhi Huange830e682018-03-30 10:48:35 -070084 // TODO(zhihuang:) Create a BaseChannel::Config struct for the parameter lists
85 // which will make it easier to change the constructor.
Danil Chapovalov33b01f22016-05-11 19:55:27 +020086 BaseChannel(rtc::Thread* worker_thread,
87 rtc::Thread* network_thread,
zhihuangf5b251b2017-01-12 19:37:48 -080088 rtc::Thread* signaling_thread,
Steve Anton8699a322017-11-06 15:53:33 -080089 std::unique_ptr<MediaChannel> media_channel,
deadbeefcbecd352015-09-23 11:50:27 -070090 const std::string& content_name,
Zhi Huange830e682018-03-30 10:48:35 -070091 bool srtp_required,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -080092 webrtc::CryptoOptions crypto_options,
93 rtc::UniqueRandomIdGenerator* ssrc_generator);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000094 virtual ~BaseChannel();
Anton Sukhanov4f08faa2019-05-21 11:12:57 -070095 virtual void Init_w(
96 webrtc::RtpTransportInternal* rtp_transport,
97 const webrtc::MediaTransportConfig& media_transport_config);
Zhi Huang2dfc42d2017-12-04 13:38:48 -080098
Danil Chapovalov33b01f22016-05-11 19:55:27 +020099 // Deinit may be called multiple times and is simply ignored if it's already
wu@webrtc.org78187522013-10-07 23:32:02 +0000100 // done.
101 void Deinit();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000102
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000103 rtc::Thread* worker_thread() const { return worker_thread_; }
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200104 rtc::Thread* network_thread() const { return network_thread_; }
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800105 const std::string& content_name() const override { return content_name_; }
deadbeeff5346592017-01-24 21:51:21 -0800106 // TODO(deadbeef): This is redundant; remove this.
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800107 const std::string& transport_name() const override { return transport_name_; }
108 bool enabled() const override { return enabled_; }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000109
Zhi Huangcf990f52017-09-22 12:12:30 -0700110 // This function returns true if using SRTP (DTLS-based keying or SDES).
Zhi Huange830e682018-03-30 10:48:35 -0700111 bool srtp_active() const {
112 return rtp_transport_ && rtp_transport_->IsSrtpActive();
113 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000114
115 bool writable() const { return writable_; }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000116
Zhi Huang2dfc42d2017-12-04 13:38:48 -0800117 // Set an RTP level transport which could be an RtpTransport without
118 // encryption, an SrtpTransport for SDES or a DtlsSrtpTransport for DTLS-SRTP.
119 // This can be called from any thread and it hops to the network thread
120 // internally. It would replace the |SetTransports| and its variants.
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800121 bool SetRtpTransport(webrtc::RtpTransportInternal* rtp_transport) override;
Zhi Huang2dfc42d2017-12-04 13:38:48 -0800122
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -0700123 webrtc::RtpTransportInternal* rtp_transport() const { return rtp_transport_; }
124
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000125 // Channel control
126 bool SetLocalContent(const MediaContentDescription* content,
Steve Anton3828c062017-12-06 10:34:51 -0800127 webrtc::SdpType type,
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800128 std::string* error_desc) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000129 bool SetRemoteContent(const MediaContentDescription* content,
Steve Anton3828c062017-12-06 10:34:51 -0800130 webrtc::SdpType type,
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800131 std::string* error_desc) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000132
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800133 bool Enable(bool enable) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000134
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800135 const std::vector<StreamParams>& local_streams() const override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000136 return local_streams_;
137 }
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800138 const std::vector<StreamParams>& remote_streams() const override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000139 return remote_streams_;
140 }
141
deadbeef953c2ce2017-01-09 14:53:41 -0800142 sigslot::signal2<BaseChannel*, bool> SignalDtlsSrtpSetupFailure;
143 void SignalDtlsSrtpSetupFailure_n(bool rtcp);
144 void SignalDtlsSrtpSetupFailure_s(bool rtcp);
pthatcher@webrtc.org4eeef582015-03-16 19:34:23 +0000145
buildbot@webrtc.org6bfd6192014-05-15 16:15:59 +0000146 // Used for latency measurements.
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800147 sigslot::signal1<ChannelInterface*>& SignalFirstPacketReceived() override {
148 return SignalFirstPacketReceived_;
149 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000150
zhihuangb2cdd932017-01-19 16:54:25 -0800151 // Forward SignalSentPacket to worker thread.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200152 sigslot::signal1<const rtc::SentPacket&> SignalSentPacket;
153
deadbeefac22f702017-01-12 21:59:29 -0800154 // Emitted whenever rtcp-mux is fully negotiated and the rtcp-transport can
155 // be destroyed.
156 // Fired on the network thread.
157 sigslot::signal1<const std::string&> SignalRtcpMuxFullyActive;
zhihuangf5b251b2017-01-12 19:37:48 -0800158
zstein56162b92017-04-24 16:54:35 -0700159 // From RtpTransport - public for testing only
160 void OnTransportReadyToSend(bool ready);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000161
guoweis@webrtc.org4f852882015-03-12 20:09:44 +0000162 // Only public for unit tests. Otherwise, consider protected.
Yves Gerey665174f2018-06-19 15:03:05 +0200163 int SetOption(SocketType type, rtc::Socket::Option o, int val) override;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200164 int SetOption_n(SocketType type, rtc::Socket::Option o, int val);
guoweis@webrtc.org4f852882015-03-12 20:09:44 +0000165
Zhi Huang365381f2018-04-13 16:44:34 -0700166 // RtpPacketSinkInterface overrides.
167 void OnRtpPacket(const webrtc::RtpPacketReceived& packet) override;
zstein3dcf0e92017-06-01 13:22:42 -0700168
Steve Anton593e3252017-12-15 11:44:48 -0800169 // Used by the RTCStatsCollector tests to set the transport name without
170 // creating RtpTransports.
171 void set_transport_name_for_testing(const std::string& transport_name) {
172 transport_name_ = transport_name;
173 }
174
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800175 MediaChannel* media_channel() const override { return media_channel_.get(); }
Taylor Brandstetterbad33bf2016-08-25 13:31:14 -0700176
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800177 protected:
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000178 bool was_ever_writable() const { return was_ever_writable_; }
Steve Anton4e70a722017-11-28 14:57:10 -0800179 void set_local_content_direction(webrtc::RtpTransceiverDirection direction) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000180 local_content_direction_ = direction;
181 }
Steve Anton4e70a722017-11-28 14:57:10 -0800182 void set_remote_content_direction(webrtc::RtpTransceiverDirection direction) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000183 remote_content_direction_ = direction;
184 }
Taylor Brandstetterbad33bf2016-08-25 13:31:14 -0700185 // These methods verify that:
186 // * The required content description directions have been set.
187 // * The channel is enabled.
188 // * And for sending:
189 // - The SRTP filter is active if it's needed.
190 // - The transport has been writable before, meaning it should be at least
191 // possible to succeed in sending a packet.
192 //
193 // When any of these properties change, UpdateMediaSendRecvState_w should be
194 // called.
195 bool IsReadyToReceiveMedia_w() const;
196 bool IsReadyToSendMedia_w() const;
zhihuangf5b251b2017-01-12 19:37:48 -0800197 rtc::Thread* signaling_thread() { return signaling_thread_; }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000198
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200199 void FlushRtcpMessages_n();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000200
201 // NetworkInterface implementation, called by MediaEngine
jbaucheec21bd2016-03-20 06:15:43 -0700202 bool SendPacket(rtc::CopyOnWriteBuffer* packet,
203 const rtc::PacketOptions& options) override;
204 bool SendRtcp(rtc::CopyOnWriteBuffer* packet,
205 const rtc::PacketOptions& options) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000206
Zhi Huangcd3fc5d2017-11-29 10:41:57 -0800207 // From RtpTransportInternal
208 void OnWritableState(bool writable);
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -0800209
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200210 void OnNetworkRouteChanged(absl::optional<rtc::NetworkRoute> network_route);
Honghai Zhangcc411c02016-03-29 17:27:21 -0700211
deadbeef5bd5ca32017-02-10 11:31:50 -0800212 bool PacketIsRtcp(const rtc::PacketTransportInternal* transport,
johand89ab142016-10-25 10:50:32 -0700213 const char* data,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000214 size_t len);
stefanc1aeaf02015-10-15 07:26:07 -0700215 bool SendPacket(bool rtcp,
jbaucheec21bd2016-03-20 06:15:43 -0700216 rtc::CopyOnWriteBuffer* packet,
stefanc1aeaf02015-10-15 07:26:07 -0700217 const rtc::PacketOptions& options);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200218
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000219 void EnableMedia_w();
220 void DisableMedia_w();
Taylor Brandstetterbad33bf2016-08-25 13:31:14 -0700221
222 // Performs actions if the RTP/RTCP writable state changed. This should
223 // be called whenever a channel's writable state changes or when RTCP muxing
224 // becomes active/inactive.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200225 void UpdateWritableState_n();
226 void ChannelWritable_n();
227 void ChannelNotWritable_n();
Taylor Brandstetterbad33bf2016-08-25 13:31:14 -0700228
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000229 bool AddRecvStream_w(const StreamParams& sp);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200230 bool RemoveRecvStream_w(uint32_t ssrc);
Saurav Dasff27da52019-09-20 11:05:30 -0700231 void ResetUnsignaledRecvStream_w();
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000232 bool AddSendStream_w(const StreamParams& sp);
Peter Boström0c4e06b2015-10-07 12:23:21 +0200233 bool RemoveSendStream_w(uint32_t ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000234
Taylor Brandstetterbad33bf2016-08-25 13:31:14 -0700235 // Should be called whenever the conditions for
236 // IsReadyToReceiveMedia/IsReadyToSendMedia are satisfied (or unsatisfied).
237 // Updates the send/recv state of the media channel.
238 void UpdateMediaSendRecvState();
239 virtual void UpdateMediaSendRecvState_w() = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000240
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000241 bool UpdateLocalStreams_w(const std::vector<StreamParams>& streams,
Steve Anton3828c062017-12-06 10:34:51 -0800242 webrtc::SdpType type,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000243 std::string* error_desc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000244 bool UpdateRemoteStreams_w(const std::vector<StreamParams>& streams,
Steve Anton3828c062017-12-06 10:34:51 -0800245 webrtc::SdpType type,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000246 std::string* error_desc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000247 virtual bool SetLocalContent_w(const MediaContentDescription* content,
Steve Anton3828c062017-12-06 10:34:51 -0800248 webrtc::SdpType type,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000249 std::string* error_desc) = 0;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000250 virtual bool SetRemoteContent_w(const MediaContentDescription* content,
Steve Anton3828c062017-12-06 10:34:51 -0800251 webrtc::SdpType type,
sergeyu@chromium.org4b26e2e2014-01-15 23:15:54 +0000252 std::string* error_desc) = 0;
jbauch5869f502017-06-29 12:31:36 -0700253 // Return a list of RTP header extensions with the non-encrypted extensions
254 // removed depending on the current crypto_options_ and only if both the
255 // non-encrypted and encrypted extension is present for the same URI.
256 RtpHeaderExtensions GetFilteredRtpHeaderExtensions(
257 const RtpHeaderExtensions& extensions);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000258
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000259 // From MessageHandler
rlesterec9d1872015-10-27 14:22:16 -0700260 void OnMessage(rtc::Message* pmsg) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000261
stefanf79ade12017-06-02 06:44:03 -0700262 // Helper function template for invoking methods on the worker thread.
Danil Chapovalov89313452019-11-29 12:56:43 +0100263 template <class T>
264 T InvokeOnWorker(const rtc::Location& posted_from,
265 rtc::FunctionView<T()> functor) {
stefanf79ade12017-06-02 06:44:03 -0700266 return worker_thread_->Invoke<T>(posted_from, functor);
sergeyu@chromium.org9cf037b2014-02-07 19:03:26 +0000267 }
268
zstein3dcf0e92017-06-01 13:22:42 -0700269 void AddHandledPayloadType(int payload_type);
270
Steve Antonbe2e5f72019-09-06 16:26:02 -0700271 void ClearHandledPayloadTypes();
272
Zhi Huang365381f2018-04-13 16:44:34 -0700273 void UpdateRtpHeaderExtensionMap(
274 const RtpHeaderExtensions& header_extensions);
275
276 bool RegisterRtpDemuxerSink();
277
Piotr (Peter) Slatala309aafe2019-01-15 14:24:34 -0800278 bool has_received_packet_ = false;
279
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000280 private:
Zhi Huang365381f2018-04-13 16:44:34 -0700281 bool ConnectToRtpTransport();
Zhi Huangcd3fc5d2017-11-29 10:41:57 -0800282 void DisconnectFromRtpTransport();
Zhi Huangcd3fc5d2017-11-29 10:41:57 -0800283 void SignalSentPacket_n(const rtc::SentPacket& sent_packet);
Taylor Brandstetterbad33bf2016-08-25 13:31:14 -0700284 bool IsReadyToSendMedia_n() const;
Piotr (Peter) Slatala179a3922018-11-16 09:57:58 -0800285
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200286 rtc::Thread* const worker_thread_;
287 rtc::Thread* const network_thread_;
zhihuangf5b251b2017-01-12 19:37:48 -0800288 rtc::Thread* const signaling_thread_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200289 rtc::AsyncInvoker invoker_;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800290 sigslot::signal1<ChannelInterface*> SignalFirstPacketReceived_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000291
pthatcher@webrtc.org990a00c2015-03-13 18:20:33 +0000292 const std::string content_name_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200293
deadbeeff5346592017-01-24 21:51:21 -0800294 // Won't be set when using raw packet transports. SDP-specific thing.
deadbeefcbecd352015-09-23 11:50:27 -0700295 std::string transport_name_;
zhihuangb2cdd932017-01-19 16:54:25 -0800296
Zhi Huangcd3fc5d2017-11-29 10:41:57 -0800297 webrtc::RtpTransportInternal* rtp_transport_ = nullptr;
Zhi Huangcd3fc5d2017-11-29 10:41:57 -0800298
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700299 // Optional media transport configuration (experimental).
300 webrtc::MediaTransportConfig media_transport_config_;
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700301
deadbeeff5346592017-01-24 21:51:21 -0800302 std::vector<std::pair<rtc::Socket::Option, int> > socket_options_;
deadbeefcbecd352015-09-23 11:50:27 -0700303 std::vector<std::pair<rtc::Socket::Option, int> > rtcp_socket_options_;
deadbeef23d947d2016-08-22 16:00:30 -0700304 bool writable_ = false;
305 bool was_ever_writable_ = false;
deadbeef7af91dd2016-12-13 11:29:11 -0800306 const bool srtp_required_ = true;
Benjamin Wrighta54daf12018-10-11 15:33:17 -0700307 webrtc::CryptoOptions crypto_options_;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200308
Taylor Brandstetterbad33bf2016-08-25 13:31:14 -0700309 // MediaChannel related members that should be accessed from the worker
310 // thread.
Steve Anton8699a322017-11-06 15:53:33 -0800311 std::unique_ptr<MediaChannel> media_channel_;
Taylor Brandstetterbad33bf2016-08-25 13:31:14 -0700312 // Currently the |enabled_| flag is accessed from the signaling thread as
313 // well, but it can be changed only when signaling thread does a synchronous
314 // call to the worker thread, so it should be safe.
deadbeef23d947d2016-08-22 16:00:30 -0700315 bool enabled_ = false;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200316 std::vector<StreamParams> local_streams_;
317 std::vector<StreamParams> remote_streams_;
Steve Anton4e70a722017-11-28 14:57:10 -0800318 webrtc::RtpTransceiverDirection local_content_direction_ =
319 webrtc::RtpTransceiverDirection::kInactive;
320 webrtc::RtpTransceiverDirection remote_content_direction_ =
321 webrtc::RtpTransceiverDirection::kInactive;
Zhi Huangc99b6c72017-11-10 16:44:46 -0800322
Zhi Huang365381f2018-04-13 16:44:34 -0700323 webrtc::RtpDemuxerCriteria demuxer_criteria_;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800324 // This generator is used to generate SSRCs for local streams.
325 // This is needed in cases where SSRCs are not negotiated or set explicitly
326 // like in Simulcast.
327 // This object is not owned by the channel so it must outlive it.
328 rtc::UniqueRandomIdGenerator* const ssrc_generator_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000329};
330
331// VoiceChannel is a specialization that adds support for early media, DTMF,
332// and input/output level monitoring.
Bjorn A Mellem7a9a0922019-11-26 09:19:40 -0800333class VoiceChannel : public BaseChannel {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000334 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200335 VoiceChannel(rtc::Thread* worker_thread,
336 rtc::Thread* network_thread,
zhihuangf5b251b2017-01-12 19:37:48 -0800337 rtc::Thread* signaling_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800338 std::unique_ptr<VoiceMediaChannel> channel,
deadbeefcbecd352015-09-23 11:50:27 -0700339 const std::string& content_name,
Zhi Huange830e682018-03-30 10:48:35 -0700340 bool srtp_required,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800341 webrtc::CryptoOptions crypto_options,
342 rtc::UniqueRandomIdGenerator* ssrc_generator);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000343 ~VoiceChannel();
solenberg1dd98f32015-09-10 01:57:14 -0700344
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000345 // downcasts a MediaChannel
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200346 VoiceMediaChannel* media_channel() const override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000347 return static_cast<VoiceMediaChannel*>(BaseChannel::media_channel());
348 }
349
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800350 cricket::MediaType media_type() const override {
351 return cricket::MEDIA_TYPE_AUDIO;
352 }
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700353 void Init_w(
354 webrtc::RtpTransportInternal* rtp_transport,
355 const webrtc::MediaTransportConfig& media_transport_config) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000356
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000357 private:
358 // overrides from BaseChannel
Taylor Brandstetterbad33bf2016-08-25 13:31:14 -0700359 void UpdateMediaSendRecvState_w() override;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200360 bool SetLocalContent_w(const MediaContentDescription* content,
Steve Anton3828c062017-12-06 10:34:51 -0800361 webrtc::SdpType type,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200362 std::string* error_desc) override;
363 bool SetRemoteContent_w(const MediaContentDescription* content,
Steve Anton3828c062017-12-06 10:34:51 -0800364 webrtc::SdpType type,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200365 std::string* error_desc) override;
Peter Thatcherc2ee2c82015-08-07 16:05:34 -0700366
367 // Last AudioSendParameters sent down to the media_channel() via
368 // SetSendParameters.
369 AudioSendParameters last_send_params_;
370 // Last AudioRecvParameters sent down to the media_channel() via
371 // SetRecvParameters.
372 AudioRecvParameters last_recv_params_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000373};
374
375// VideoChannel is a specialization for video.
376class VideoChannel : public BaseChannel {
377 public:
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200378 VideoChannel(rtc::Thread* worker_thread,
zhihuangf5b251b2017-01-12 19:37:48 -0800379 rtc::Thread* network_thread,
380 rtc::Thread* signaling_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800381 std::unique_ptr<VideoMediaChannel> media_channel,
deadbeefcbecd352015-09-23 11:50:27 -0700382 const std::string& content_name,
Zhi Huange830e682018-03-30 10:48:35 -0700383 bool srtp_required,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800384 webrtc::CryptoOptions crypto_options,
385 rtc::UniqueRandomIdGenerator* ssrc_generator);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000386 ~VideoChannel();
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000387
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200388 // downcasts a MediaChannel
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200389 VideoMediaChannel* media_channel() const override {
Fredrik Solenberg4b60c732015-05-07 14:07:48 +0200390 return static_cast<VideoMediaChannel*>(BaseChannel::media_channel());
391 }
392
stefanf79ade12017-06-02 06:44:03 -0700393 void FillBitrateInfo(BandwidthEstimationInfo* bwe_info);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000394
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800395 cricket::MediaType media_type() const override {
396 return cricket::MEDIA_TYPE_VIDEO;
397 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000398
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000399 private:
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000400 // overrides from BaseChannel
Taylor Brandstetterbad33bf2016-08-25 13:31:14 -0700401 void UpdateMediaSendRecvState_w() override;
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200402 bool SetLocalContent_w(const MediaContentDescription* content,
Steve Anton3828c062017-12-06 10:34:51 -0800403 webrtc::SdpType type,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200404 std::string* error_desc) override;
405 bool SetRemoteContent_w(const MediaContentDescription* content,
Steve Anton3828c062017-12-06 10:34:51 -0800406 webrtc::SdpType type,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200407 std::string* error_desc) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000408
Peter Thatcherc2ee2c82015-08-07 16:05:34 -0700409 // Last VideoSendParameters sent down to the media_channel() via
410 // SetSendParameters.
411 VideoSendParameters last_send_params_;
412 // Last VideoRecvParameters sent down to the media_channel() via
413 // SetRecvParameters.
414 VideoRecvParameters last_recv_params_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000415};
416
deadbeef953c2ce2017-01-09 14:53:41 -0800417// RtpDataChannel is a specialization for data.
418class RtpDataChannel : public BaseChannel {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000419 public:
deadbeef953c2ce2017-01-09 14:53:41 -0800420 RtpDataChannel(rtc::Thread* worker_thread,
421 rtc::Thread* network_thread,
zhihuangf5b251b2017-01-12 19:37:48 -0800422 rtc::Thread* signaling_thread,
Steve Anton8699a322017-11-06 15:53:33 -0800423 std::unique_ptr<DataMediaChannel> channel,
deadbeef953c2ce2017-01-09 14:53:41 -0800424 const std::string& content_name,
Zhi Huange830e682018-03-30 10:48:35 -0700425 bool srtp_required,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800426 webrtc::CryptoOptions crypto_options,
427 rtc::UniqueRandomIdGenerator* ssrc_generator);
deadbeef953c2ce2017-01-09 14:53:41 -0800428 ~RtpDataChannel();
Zhi Huang2dfc42d2017-12-04 13:38:48 -0800429 // TODO(zhihuang): Remove this once the RtpTransport can be shared between
430 // BaseChannels.
Steve Anton8699a322017-11-06 15:53:33 -0800431 void Init_w(DtlsTransportInternal* rtp_dtls_transport,
deadbeeff5346592017-01-24 21:51:21 -0800432 DtlsTransportInternal* rtcp_dtls_transport,
deadbeef5bd5ca32017-02-10 11:31:50 -0800433 rtc::PacketTransportInternal* rtp_packet_transport,
434 rtc::PacketTransportInternal* rtcp_packet_transport);
Piotr (Peter) Slatala309aafe2019-01-15 14:24:34 -0800435 void Init_w(
436 webrtc::RtpTransportInternal* rtp_transport,
Anton Sukhanov4f08faa2019-05-21 11:12:57 -0700437 const webrtc::MediaTransportConfig& media_transport_config) override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000438
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000439 virtual bool SendData(const SendDataParams& params,
jbaucheec21bd2016-03-20 06:15:43 -0700440 const rtc::CopyOnWriteBuffer& payload,
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000441 SendDataResult* result);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000442
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +0000443 // Should be called on the signaling thread only.
Yves Gerey665174f2018-06-19 15:03:05 +0200444 bool ready_to_send_data() const { return ready_to_send_data_; }
wu@webrtc.org07a6fbe2013-11-04 18:41:34 +0000445
deadbeef953c2ce2017-01-09 14:53:41 -0800446 sigslot::signal2<const ReceiveDataParams&, const rtc::CopyOnWriteBuffer&>
447 SignalDataReceived;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000448 // Signal for notifying when the channel becomes ready to send data.
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000449 // That occurs when the channel is enabled, the transport is writable,
450 // both local and remote descriptions are set, and the channel is unblocked.
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000451 sigslot::signal1<bool> SignalReadyToSendData;
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800452 cricket::MediaType media_type() const override {
453 return cricket::MEDIA_TYPE_DATA;
454 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000455
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000456 protected:
457 // downcasts a MediaChannel.
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200458 DataMediaChannel* media_channel() const override {
wu@webrtc.orgcadf9042013-08-30 21:24:16 +0000459 return static_cast<DataMediaChannel*>(BaseChannel::media_channel());
460 }
461
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000462 private:
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000463 struct SendDataMessageData : public rtc::MessageData {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000464 SendDataMessageData(const SendDataParams& params,
jbaucheec21bd2016-03-20 06:15:43 -0700465 const rtc::CopyOnWriteBuffer* payload,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000466 SendDataResult* result)
Yves Gerey665174f2018-06-19 15:03:05 +0200467 : params(params), payload(payload), result(result), succeeded(false) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000468
469 const SendDataParams& params;
jbaucheec21bd2016-03-20 06:15:43 -0700470 const rtc::CopyOnWriteBuffer* payload;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000471 SendDataResult* result;
472 bool succeeded;
473 };
474
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000475 struct DataReceivedMessageData : public rtc::MessageData {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000476 // We copy the data because the data will become invalid after we
477 // handle DataMediaChannel::SignalDataReceived but before we fire
478 // SignalDataReceived.
Yves Gerey665174f2018-06-19 15:03:05 +0200479 DataReceivedMessageData(const ReceiveDataParams& params,
480 const char* data,
481 size_t len)
482 : params(params), payload(data, len) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000483 const ReceiveDataParams params;
jbaucheec21bd2016-03-20 06:15:43 -0700484 const rtc::CopyOnWriteBuffer payload;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000485 };
486
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000487 typedef rtc::TypedMessageData<bool> DataChannelReadyToSendMessageData;
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000488
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000489 // overrides from BaseChannel
deadbeef953c2ce2017-01-09 14:53:41 -0800490 // Checks that data channel type is RTP.
Harald Alvestrand755187f2019-12-05 13:43:34 +0100491 bool CheckDataChannelTypeFromContent(const MediaContentDescription* content,
deadbeef953c2ce2017-01-09 14:53:41 -0800492 std::string* error_desc);
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200493 bool SetLocalContent_w(const MediaContentDescription* content,
Steve Anton3828c062017-12-06 10:34:51 -0800494 webrtc::SdpType type,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200495 std::string* error_desc) override;
496 bool SetRemoteContent_w(const MediaContentDescription* content,
Steve Anton3828c062017-12-06 10:34:51 -0800497 webrtc::SdpType type,
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200498 std::string* error_desc) override;
Taylor Brandstetterbad33bf2016-08-25 13:31:14 -0700499 void UpdateMediaSendRecvState_w() override;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000500
Danil Chapovalov33b01f22016-05-11 19:55:27 +0200501 void OnMessage(rtc::Message* pmsg) override;
Yves Gerey665174f2018-06-19 15:03:05 +0200502 void OnDataReceived(const ReceiveDataParams& params,
503 const char* data,
504 size_t len);
wu@webrtc.orgd64719d2013-08-01 00:00:07 +0000505 void OnDataChannelReadyToSend(bool writable);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000506
deadbeef953c2ce2017-01-09 14:53:41 -0800507 bool ready_to_send_data_ = false;
Peter Thatcherc2ee2c82015-08-07 16:05:34 -0700508
509 // Last DataSendParameters sent down to the media_channel() via
510 // SetSendParameters.
511 DataSendParameters last_send_params_;
512 // Last DataRecvParameters sent down to the media_channel() via
513 // SetRecvParameters.
514 DataRecvParameters last_recv_params_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000515};
516
517} // namespace cricket
518
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200519#endif // PC_CHANNEL_H_