blob: 57ad9e5fd0394224801b1af096621866b6d80d02 [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
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -070042 const std::string& transport_name() const override;
43
44 int SetRtpOption(rtc::Socket::Option opt, int value) override;
45 int SetRtcpOption(rtc::Socket::Option opt, int value) override;
46
47 rtc::PacketTransportInternal* rtp_packet_transport() const {
zsteind48dbda2017-04-04 19:45:57 -070048 return rtp_packet_transport_;
49 }
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -070050 void SetRtpPacketTransport(rtc::PacketTransportInternal* rtp);
zsteind48dbda2017-04-04 19:45:57 -070051
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -070052 rtc::PacketTransportInternal* rtcp_packet_transport() const {
zsteind48dbda2017-04-04 19:45:57 -070053 return rtcp_packet_transport_;
54 }
Bjorn A Mellem3a1b9272019-05-24 16:13:08 -070055 void SetRtcpPacketTransport(rtc::PacketTransportInternal* rtcp);
zsteind48dbda2017-04-04 19:45:57 -070056
Zhi Huange830e682018-03-30 10:48:35 -070057 bool IsReadyToSend() const override { return ready_to_send_; }
58
zstein398c3fd2017-07-19 13:38:02 -070059 bool IsWritable(bool rtcp) const override;
zstein56162b92017-04-24 16:54:35 -070060
Zhi Huangcf990f52017-09-22 12:12:30 -070061 bool SendRtpPacket(rtc::CopyOnWriteBuffer* packet,
62 const rtc::PacketOptions& options,
63 int flags) override;
64
65 bool SendRtcpPacket(rtc::CopyOnWriteBuffer* packet,
66 const rtc::PacketOptions& options,
67 int flags) override;
zstein56162b92017-04-24 16:54:35 -070068
Zhi Huange830e682018-03-30 10:48:35 -070069 bool IsSrtpActive() const override { return false; }
zstein3dcf0e92017-06-01 13:22:42 -070070
Zhi Huang365381f2018-04-13 16:44:34 -070071 void UpdateRtpHeaderExtensionMap(
72 const cricket::RtpHeaderExtensions& header_extensions) override;
73
74 bool RegisterRtpDemuxerSink(const RtpDemuxerCriteria& criteria,
75 RtpPacketSinkInterface* sink) override;
76
77 bool UnregisterRtpDemuxerSink(RtpPacketSinkInterface* sink) override;
78
zsteind9ce7642017-04-10 16:17:57 -070079 protected:
Zhi Huang365381f2018-04-13 16:44:34 -070080 // These methods will be used in the subclasses.
Amit Hilbuchedd20542019-03-18 12:33:43 -070081 void DemuxPacket(rtc::CopyOnWriteBuffer packet, int64_t packet_time_us);
Zhi Huang95e7dbb2018-03-29 00:08:03 +000082
Zhi Huang365381f2018-04-13 16:44:34 -070083 bool SendPacket(bool rtcp,
84 rtc::CopyOnWriteBuffer* packet,
85 const rtc::PacketOptions& options,
86 int flags);
87
88 // Overridden by SrtpTransport.
89 virtual void OnNetworkRouteChanged(
Danil Chapovalov66cadcc2018-06-19 16:47:43 +020090 absl::optional<rtc::NetworkRoute> network_route);
Amit Hilbuchedd20542019-03-18 12:33:43 -070091 virtual void OnRtpPacketReceived(rtc::CopyOnWriteBuffer packet,
Niels Möllere6933812018-11-05 13:01:41 +010092 int64_t packet_time_us);
Amit Hilbuchedd20542019-03-18 12:33:43 -070093 virtual void OnRtcpPacketReceived(rtc::CopyOnWriteBuffer packet,
Niels Möllere6933812018-11-05 13:01:41 +010094 int64_t packet_time_us);
Zhi Huang365381f2018-04-13 16:44:34 -070095 // Overridden by SrtpTransport and DtlsSrtpTransport.
96 virtual void OnWritableState(rtc::PacketTransportInternal* packet_transport);
97
98 private:
zstein56162b92017-04-24 16:54:35 -070099 void OnReadyToSend(rtc::PacketTransportInternal* transport);
Zhi Huangcd3fc5d2017-11-29 10:41:57 -0800100 void OnSentPacket(rtc::PacketTransportInternal* packet_transport,
101 const rtc::SentPacket& sent_packet);
Zhi Huang365381f2018-04-13 16:44:34 -0700102 void OnReadPacket(rtc::PacketTransportInternal* transport,
103 const char* data,
104 size_t len,
Niels Möllere6933812018-11-05 13:01:41 +0100105 const int64_t& packet_time_us,
Zhi Huang365381f2018-04-13 16:44:34 -0700106 int flags);
zstein56162b92017-04-24 16:54:35 -0700107
108 // Updates "ready to send" for an individual channel and fires
109 // SignalReadyToSend.
110 void SetReadyToSend(bool rtcp, bool ready);
111
112 void MaybeSignalReadyToSend();
113
Zhi Huang365381f2018-04-13 16:44:34 -0700114 bool IsTransportWritable();
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000115
zstein56162b92017-04-24 16:54:35 -0700116 bool rtcp_mux_enabled_;
zsteind48dbda2017-04-04 19:45:57 -0700117
zsteind48dbda2017-04-04 19:45:57 -0700118 rtc::PacketTransportInternal* rtp_packet_transport_ = nullptr;
119 rtc::PacketTransportInternal* rtcp_packet_transport_ = nullptr;
zsteind9ce7642017-04-10 16:17:57 -0700120
zstein56162b92017-04-24 16:54:35 -0700121 bool ready_to_send_ = false;
122 bool rtp_ready_to_send_ = false;
123 bool rtcp_ready_to_send_ = false;
124
Zhi Huang365381f2018-04-13 16:44:34 -0700125 RtpDemuxer rtp_demuxer_;
126
127 // Used for identifying the MID for RtpDemuxer.
128 RtpHeaderExtensionMap header_extension_map_;
zsteind48dbda2017-04-04 19:45:57 -0700129};
130
131} // namespace webrtc
132
Steve Anton10542f22019-01-11 09:11:00 -0800133#endif // PC_RTP_TRANSPORT_H_