blob: f188a17a39eb8a32b8c709cfb5a482020686c8fc [file] [log] [blame]
zsteind48dbda2017-04-04 19:45:57 -07001/*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * 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.
9 */
10
Steve Anton10542f22019-01-11 09:11:00 -080011#ifndef PC_RTP_TRANSPORT_H_
12#define PC_RTP_TRANSPORT_H_
zsteind48dbda2017-04-04 19:45:57 -070013
Zhi Huang942bc2e2017-11-13 13:26:07 -080014#include <string>
15
Zhi Huang365381f2018-04-13 16:44:34 -070016#include "call/rtp_demuxer.h"
17#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
Steve Anton10542f22019-01-11 09:11:00 -080018#include "pc/rtp_transport_internal.h"
Artem Titove41c4332018-07-25 15:04:28 +020019#include "rtc_base/third_party/sigslot/sigslot.h"
zsteind9ce7642017-04-10 16:17:57 -070020
zsteind48dbda2017-04-04 19:45:57 -070021namespace rtc {
22
zstein56162b92017-04-24 16:54:35 -070023class CopyOnWriteBuffer;
24struct PacketOptions;
zsteind48dbda2017-04-04 19:45:57 -070025class PacketTransportInternal;
26
27} // namespace rtc
28
29namespace webrtc {
30
zstein398c3fd2017-07-19 13:38:02 -070031class RtpTransport : public RtpTransportInternal {
zsteind48dbda2017-04-04 19:45:57 -070032 public:
33 RtpTransport(const RtpTransport&) = delete;
34 RtpTransport& operator=(const RtpTransport&) = delete;
35
zstein56162b92017-04-24 16:54:35 -070036 explicit RtpTransport(bool rtcp_mux_enabled)
37 : rtcp_mux_enabled_(rtcp_mux_enabled) {}
zsteind48dbda2017-04-04 19:45:57 -070038
Zhi Huangf2d7beb2017-11-20 14:35:11 -080039 bool rtcp_mux_enabled() const override { return rtcp_mux_enabled_; }
zstein398c3fd2017-07-19 13:38:02 -070040 void SetRtcpMuxEnabled(bool enable) override;
zsteind48dbda2017-04-04 19:45:57 -070041
zstein398c3fd2017-07-19 13:38:02 -070042 rtc::PacketTransportInternal* rtp_packet_transport() const override {
zsteind48dbda2017-04-04 19:45:57 -070043 return rtp_packet_transport_;
44 }
zstein398c3fd2017-07-19 13:38:02 -070045 void SetRtpPacketTransport(rtc::PacketTransportInternal* rtp) override;
zsteind48dbda2017-04-04 19:45:57 -070046
zstein398c3fd2017-07-19 13:38:02 -070047 rtc::PacketTransportInternal* rtcp_packet_transport() const override {
zsteind48dbda2017-04-04 19:45:57 -070048 return rtcp_packet_transport_;
49 }
zstein398c3fd2017-07-19 13:38:02 -070050 void SetRtcpPacketTransport(rtc::PacketTransportInternal* rtcp) override;
zsteind48dbda2017-04-04 19:45:57 -070051
Zhi Huange830e682018-03-30 10:48:35 -070052 PacketTransportInterface* GetRtpPacketTransport() const override {
53 return rtp_packet_transport_;
54 }
55 PacketTransportInterface* GetRtcpPacketTransport() const override {
56 return rtcp_packet_transport_;
57 }
zsteind9ce7642017-04-10 16:17:57 -070058
59 // TODO(zstein): Use these RtcpParameters for configuration elsewhere.
sprangdb2a9fc2017-08-09 06:42:32 -070060 RTCError SetParameters(const RtpTransportParameters& parameters) override;
61 RtpTransportParameters GetParameters() const override;
zsteind9ce7642017-04-10 16:17:57 -070062
Zhi Huange830e682018-03-30 10:48:35 -070063 bool IsReadyToSend() const override { return ready_to_send_; }
64
zstein398c3fd2017-07-19 13:38:02 -070065 bool IsWritable(bool rtcp) const override;
zstein56162b92017-04-24 16:54:35 -070066
Zhi Huangcf990f52017-09-22 12:12:30 -070067 bool SendRtpPacket(rtc::CopyOnWriteBuffer* packet,
68 const rtc::PacketOptions& options,
69 int flags) override;
70
71 bool SendRtcpPacket(rtc::CopyOnWriteBuffer* packet,
72 const rtc::PacketOptions& options,
73 int flags) override;
zstein56162b92017-04-24 16:54:35 -070074
Zhi Huange830e682018-03-30 10:48:35 -070075 bool IsSrtpActive() const override { return false; }
zstein3dcf0e92017-06-01 13:22:42 -070076
Zhi Huang365381f2018-04-13 16:44:34 -070077 void UpdateRtpHeaderExtensionMap(
78 const cricket::RtpHeaderExtensions& header_extensions) override;
79
80 bool RegisterRtpDemuxerSink(const RtpDemuxerCriteria& criteria,
81 RtpPacketSinkInterface* sink) override;
82
83 bool UnregisterRtpDemuxerSink(RtpPacketSinkInterface* sink) override;
84
zsteind9ce7642017-04-10 16:17:57 -070085 protected:
86 // TODO(zstein): Remove this when we remove RtpTransportAdapter.
87 RtpTransportAdapter* GetInternal() override;
88
Zhi Huang365381f2018-04-13 16:44:34 -070089 // These methods will be used in the subclasses.
Niels Möllere6933812018-11-05 13:01:41 +010090 void DemuxPacket(rtc::CopyOnWriteBuffer* packet, int64_t packet_time_us);
Zhi Huang95e7dbb2018-03-29 00:08:03 +000091
Zhi Huang365381f2018-04-13 16:44:34 -070092 bool SendPacket(bool rtcp,
93 rtc::CopyOnWriteBuffer* packet,
94 const rtc::PacketOptions& options,
95 int flags);
96
97 // Overridden by SrtpTransport.
98 virtual void OnNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +020099 absl::optional<rtc::NetworkRoute> network_route);
Zhi Huang365381f2018-04-13 16:44:34 -0700100 virtual void OnRtpPacketReceived(rtc::CopyOnWriteBuffer* packet,
Niels Möllere6933812018-11-05 13:01:41 +0100101 int64_t packet_time_us);
Zhi Huang365381f2018-04-13 16:44:34 -0700102 virtual void OnRtcpPacketReceived(rtc::CopyOnWriteBuffer* packet,
Niels Möllere6933812018-11-05 13:01:41 +0100103 int64_t packet_time_us);
Zhi Huang365381f2018-04-13 16:44:34 -0700104 // Overridden by SrtpTransport and DtlsSrtpTransport.
105 virtual void OnWritableState(rtc::PacketTransportInternal* packet_transport);
106
107 private:
zstein56162b92017-04-24 16:54:35 -0700108 void OnReadyToSend(rtc::PacketTransportInternal* transport);
Zhi Huangcd3fc5d2017-11-29 10:41:57 -0800109 void OnSentPacket(rtc::PacketTransportInternal* packet_transport,
110 const rtc::SentPacket& sent_packet);
Zhi Huang365381f2018-04-13 16:44:34 -0700111 void OnReadPacket(rtc::PacketTransportInternal* transport,
112 const char* data,
113 size_t len,
Niels Möllere6933812018-11-05 13:01:41 +0100114 const int64_t& packet_time_us,
Zhi Huang365381f2018-04-13 16:44:34 -0700115 int flags);
zstein56162b92017-04-24 16:54:35 -0700116
117 // Updates "ready to send" for an individual channel and fires
118 // SignalReadyToSend.
119 void SetReadyToSend(bool rtcp, bool ready);
120
121 void MaybeSignalReadyToSend();
122
Zhi Huang365381f2018-04-13 16:44:34 -0700123 bool IsTransportWritable();
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000124
Zhi Huang365381f2018-04-13 16:44:34 -0700125 // SRTP specific methods.
126 // TODO(zhihuang): Improve the inheritance model so that the RtpTransport
127 // doesn't need to implement SRTP specfic methods.
Zhi Huange830e682018-03-30 10:48:35 -0700128 RTCError SetSrtpSendKey(const cricket::CryptoParams& params) override {
129 RTC_NOTREACHED();
130 return RTCError::OK();
131 }
132 RTCError SetSrtpReceiveKey(const cricket::CryptoParams& params) override {
133 RTC_NOTREACHED();
134 return RTCError::OK();
135 }
136
zstein56162b92017-04-24 16:54:35 -0700137 bool rtcp_mux_enabled_;
zsteind48dbda2017-04-04 19:45:57 -0700138
zsteind48dbda2017-04-04 19:45:57 -0700139 rtc::PacketTransportInternal* rtp_packet_transport_ = nullptr;
140 rtc::PacketTransportInternal* rtcp_packet_transport_ = nullptr;
zsteind9ce7642017-04-10 16:17:57 -0700141
zstein56162b92017-04-24 16:54:35 -0700142 bool ready_to_send_ = false;
143 bool rtp_ready_to_send_ = false;
144 bool rtcp_ready_to_send_ = false;
145
sprangdb2a9fc2017-08-09 06:42:32 -0700146 RtpTransportParameters parameters_;
Zhi Huang365381f2018-04-13 16:44:34 -0700147 RtpDemuxer rtp_demuxer_;
148
149 // Used for identifying the MID for RtpDemuxer.
150 RtpHeaderExtensionMap header_extension_map_;
zsteind48dbda2017-04-04 19:45:57 -0700151};
152
153} // namespace webrtc
154
Steve Anton10542f22019-01-11 09:11:00 -0800155#endif // PC_RTP_TRANSPORT_H_