blob: 004461542653283966420c32e4bf68a5b7f4278f [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef PC_RTPTRANSPORT_H_
12#define PC_RTPTRANSPORT_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"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "pc/rtptransportinternal.h"
19#include "rtc_base/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;
zstein3dcf0e92017-06-01 13:22:42 -070025struct PacketTime;
zsteind48dbda2017-04-04 19:45:57 -070026class PacketTransportInternal;
27
28} // namespace rtc
29
30namespace webrtc {
31
zstein398c3fd2017-07-19 13:38:02 -070032class RtpTransport : public RtpTransportInternal {
zsteind48dbda2017-04-04 19:45:57 -070033 public:
34 RtpTransport(const RtpTransport&) = delete;
35 RtpTransport& operator=(const RtpTransport&) = delete;
36
zstein56162b92017-04-24 16:54:35 -070037 explicit RtpTransport(bool rtcp_mux_enabled)
38 : rtcp_mux_enabled_(rtcp_mux_enabled) {}
zsteind48dbda2017-04-04 19:45:57 -070039
Zhi Huangf2d7beb2017-11-20 14:35:11 -080040 bool rtcp_mux_enabled() const override { return rtcp_mux_enabled_; }
zstein398c3fd2017-07-19 13:38:02 -070041 void SetRtcpMuxEnabled(bool enable) override;
zsteind48dbda2017-04-04 19:45:57 -070042
zstein398c3fd2017-07-19 13:38:02 -070043 rtc::PacketTransportInternal* rtp_packet_transport() const override {
zsteind48dbda2017-04-04 19:45:57 -070044 return rtp_packet_transport_;
45 }
zstein398c3fd2017-07-19 13:38:02 -070046 void SetRtpPacketTransport(rtc::PacketTransportInternal* rtp) override;
zsteind48dbda2017-04-04 19:45:57 -070047
zstein398c3fd2017-07-19 13:38:02 -070048 rtc::PacketTransportInternal* rtcp_packet_transport() const override {
zsteind48dbda2017-04-04 19:45:57 -070049 return rtcp_packet_transport_;
50 }
zstein398c3fd2017-07-19 13:38:02 -070051 void SetRtcpPacketTransport(rtc::PacketTransportInternal* rtcp) override;
zsteind48dbda2017-04-04 19:45:57 -070052
Zhi Huange830e682018-03-30 10:48:35 -070053 PacketTransportInterface* GetRtpPacketTransport() const override {
54 return rtp_packet_transport_;
55 }
56 PacketTransportInterface* GetRtcpPacketTransport() const override {
57 return rtcp_packet_transport_;
58 }
zsteind9ce7642017-04-10 16:17:57 -070059
60 // TODO(zstein): Use these RtcpParameters for configuration elsewhere.
sprangdb2a9fc2017-08-09 06:42:32 -070061 RTCError SetParameters(const RtpTransportParameters& parameters) override;
62 RtpTransportParameters GetParameters() const override;
zsteind9ce7642017-04-10 16:17:57 -070063
Zhi Huange830e682018-03-30 10:48:35 -070064 bool IsReadyToSend() const override { return ready_to_send_; }
65
zstein398c3fd2017-07-19 13:38:02 -070066 bool IsWritable(bool rtcp) const override;
zstein56162b92017-04-24 16:54:35 -070067
Zhi Huangcf990f52017-09-22 12:12:30 -070068 bool SendRtpPacket(rtc::CopyOnWriteBuffer* packet,
69 const rtc::PacketOptions& options,
70 int flags) override;
71
72 bool SendRtcpPacket(rtc::CopyOnWriteBuffer* packet,
73 const rtc::PacketOptions& options,
74 int flags) override;
zstein56162b92017-04-24 16:54:35 -070075
Zhi Huange830e682018-03-30 10:48:35 -070076 bool IsSrtpActive() const override { return false; }
zstein3dcf0e92017-06-01 13:22:42 -070077
Zhi Huang365381f2018-04-13 16:44:34 -070078 void UpdateRtpHeaderExtensionMap(
79 const cricket::RtpHeaderExtensions& header_extensions) override;
80
81 bool RegisterRtpDemuxerSink(const RtpDemuxerCriteria& criteria,
82 RtpPacketSinkInterface* sink) override;
83
84 bool UnregisterRtpDemuxerSink(RtpPacketSinkInterface* sink) override;
85
Steve Antondb67ba12018-03-19 17:41:42 -070086 void SetMetricsObserver(
87 rtc::scoped_refptr<MetricsObserverInterface> metrics_observer) override {}
88
zsteind9ce7642017-04-10 16:17:57 -070089 protected:
90 // TODO(zstein): Remove this when we remove RtpTransportAdapter.
91 RtpTransportAdapter* GetInternal() override;
92
Zhi Huang365381f2018-04-13 16:44:34 -070093 // These methods will be used in the subclasses.
94 void DemuxPacket(rtc::CopyOnWriteBuffer* packet, const rtc::PacketTime& time);
Zhi Huang95e7dbb2018-03-29 00:08:03 +000095
Zhi Huang365381f2018-04-13 16:44:34 -070096 bool SendPacket(bool rtcp,
97 rtc::CopyOnWriteBuffer* packet,
98 const rtc::PacketOptions& options,
99 int flags);
100
101 // Overridden by SrtpTransport.
102 virtual void OnNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200103 absl::optional<rtc::NetworkRoute> network_route);
Zhi Huang365381f2018-04-13 16:44:34 -0700104 virtual void OnRtpPacketReceived(rtc::CopyOnWriteBuffer* packet,
105 const rtc::PacketTime& packet_time);
106 virtual void OnRtcpPacketReceived(rtc::CopyOnWriteBuffer* packet,
107 const rtc::PacketTime& packet_time);
108 // Overridden by SrtpTransport and DtlsSrtpTransport.
109 virtual void OnWritableState(rtc::PacketTransportInternal* packet_transport);
110
111 private:
zstein56162b92017-04-24 16:54:35 -0700112 void OnReadyToSend(rtc::PacketTransportInternal* transport);
Zhi Huangcd3fc5d2017-11-29 10:41:57 -0800113 void OnSentPacket(rtc::PacketTransportInternal* packet_transport,
114 const rtc::SentPacket& sent_packet);
Zhi Huang365381f2018-04-13 16:44:34 -0700115 void OnReadPacket(rtc::PacketTransportInternal* transport,
116 const char* data,
117 size_t len,
118 const rtc::PacketTime& packet_time,
119 int flags);
zstein56162b92017-04-24 16:54:35 -0700120
121 // Updates "ready to send" for an individual channel and fires
122 // SignalReadyToSend.
123 void SetReadyToSend(bool rtcp, bool ready);
124
125 void MaybeSignalReadyToSend();
126
Zhi Huang365381f2018-04-13 16:44:34 -0700127 bool IsTransportWritable();
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000128
Zhi Huang365381f2018-04-13 16:44:34 -0700129 // SRTP specific methods.
130 // TODO(zhihuang): Improve the inheritance model so that the RtpTransport
131 // doesn't need to implement SRTP specfic methods.
Zhi Huange830e682018-03-30 10:48:35 -0700132 RTCError SetSrtpSendKey(const cricket::CryptoParams& params) override {
133 RTC_NOTREACHED();
134 return RTCError::OK();
135 }
136 RTCError SetSrtpReceiveKey(const cricket::CryptoParams& params) override {
137 RTC_NOTREACHED();
138 return RTCError::OK();
139 }
140
zstein56162b92017-04-24 16:54:35 -0700141 bool rtcp_mux_enabled_;
zsteind48dbda2017-04-04 19:45:57 -0700142
zsteind48dbda2017-04-04 19:45:57 -0700143 rtc::PacketTransportInternal* rtp_packet_transport_ = nullptr;
144 rtc::PacketTransportInternal* rtcp_packet_transport_ = nullptr;
zsteind9ce7642017-04-10 16:17:57 -0700145
zstein56162b92017-04-24 16:54:35 -0700146 bool ready_to_send_ = false;
147 bool rtp_ready_to_send_ = false;
148 bool rtcp_ready_to_send_ = false;
149
sprangdb2a9fc2017-08-09 06:42:32 -0700150 RtpTransportParameters parameters_;
Zhi Huang365381f2018-04-13 16:44:34 -0700151 RtpDemuxer rtp_demuxer_;
152
153 // Used for identifying the MID for RtpDemuxer.
154 RtpHeaderExtensionMap header_extension_map_;
zsteind48dbda2017-04-04 19:45:57 -0700155};
156
157} // namespace webrtc
158
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200159#endif // PC_RTPTRANSPORT_H_