blob: c1b8efaf055d958c900db626ccff1c0b3b83866d [file] [log] [blame]
deadbeefe814a0d2017-02-25 18:15:09 -08001/*
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 ORTC_RTPTRANSPORTADAPTER_H_
12#define ORTC_RTPTRANSPORTADAPTER_H_
deadbeefe814a0d2017-02-25 18:15:09 -080013
14#include <memory>
15#include <vector>
16
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "api/rtcerror.h"
18#include "media/base/streamparams.h"
19#include "ortc/rtptransportcontrolleradapter.h"
20#include "pc/channel.h"
Zhi Huang365381f2018-04-13 16:44:34 -070021#include "pc/rtptransportinternaladapter.h"
Zhi Huange830e682018-03-30 10:48:35 -070022#include "pc/srtptransport.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "rtc_base/constructormagic.h"
24#include "rtc_base/sigslot.h"
deadbeefe814a0d2017-02-25 18:15:09 -080025
26namespace webrtc {
Zhi Huange830e682018-03-30 10:48:35 -070027// This class is a wrapper over an RtpTransport or an SrtpTransport. The base
28// class RtpTransportInternalAdapter keeps a raw pointer, |transport_|, of the
29// transport object and implements both the public SrtpTransportInterface and
30// RtpTransport internal interface by calling the |transport_| underneath.
31//
32// This adapter can be used as an unencrypted RTP transport or an SrtpTransport
33// with RtpSenderAdapter, RtpReceiverAdapter, and RtpTransportControllerAdapter.
deadbeefe814a0d2017-02-25 18:15:09 -080034//
35// TODO(deadbeef): When BaseChannel is split apart into separate
36// "RtpTransport"/"RtpTransceiver"/"RtpSender"/"RtpReceiver" objects, this
37// adapter object can be removed.
Zhi Huange830e682018-03-30 10:48:35 -070038class RtpTransportAdapter : public RtpTransportInternalAdapter {
deadbeefe814a0d2017-02-25 18:15:09 -080039 public:
40 // |rtp| can't be null. |rtcp| can if RTCP muxing is used immediately (meaning
41 // |rtcp_parameters.mux| is also true).
42 static RTCErrorOr<std::unique_ptr<RtpTransportInterface>> CreateProxied(
sprangdb2a9fc2017-08-09 06:42:32 -070043 const RtpTransportParameters& rtcp_parameters,
deadbeefe814a0d2017-02-25 18:15:09 -080044 PacketTransportInterface* rtp,
45 PacketTransportInterface* rtcp,
46 RtpTransportControllerAdapter* rtp_transport_controller);
zhihuangd3501ad2017-03-03 14:39:06 -080047
48 static RTCErrorOr<std::unique_ptr<SrtpTransportInterface>> CreateSrtpProxied(
sprangdb2a9fc2017-08-09 06:42:32 -070049 const RtpTransportParameters& rtcp_parameters,
zhihuangd3501ad2017-03-03 14:39:06 -080050 PacketTransportInterface* rtp,
51 PacketTransportInterface* rtcp,
52 RtpTransportControllerAdapter* rtp_transport_controller);
53
deadbeefe814a0d2017-02-25 18:15:09 -080054 ~RtpTransportAdapter() override;
55
56 // RtpTransportInterface implementation.
Zhi Huange830e682018-03-30 10:48:35 -070057 PacketTransportInterface* GetRtpPacketTransport() const override {
58 return rtp_packet_transport_;
59 }
60 PacketTransportInterface* GetRtcpPacketTransport() const override {
61 return rtcp_packet_transport_;
62 }
sprangdb2a9fc2017-08-09 06:42:32 -070063 RTCError SetParameters(const RtpTransportParameters& parameters) override;
64 RtpTransportParameters GetParameters() const override { return parameters_; }
deadbeefe814a0d2017-02-25 18:15:09 -080065
zhihuangd3501ad2017-03-03 14:39:06 -080066 // SRTP specific implementation.
67 RTCError SetSrtpSendKey(const cricket::CryptoParams& params) override;
68 RTCError SetSrtpReceiveKey(const cricket::CryptoParams& params) override;
69
deadbeefe814a0d2017-02-25 18:15:09 -080070 // Methods used internally by OrtcFactory.
71 RtpTransportControllerAdapter* rtp_transport_controller() {
72 return rtp_transport_controller_;
73 }
74 void TakeOwnershipOfRtpTransportController(
75 std::unique_ptr<RtpTransportControllerInterface> controller);
76
77 // Used by RtpTransportControllerAdapter to tell when it should stop
78 // returning this transport from GetTransports().
79 sigslot::signal1<RtpTransportAdapter*> SignalDestroyed;
80
Zhi Huange830e682018-03-30 10:48:35 -070081 bool IsSrtpActive() const override { return transport_->IsSrtpActive(); }
82
deadbeefe814a0d2017-02-25 18:15:09 -080083 protected:
84 RtpTransportAdapter* GetInternal() override { return this; }
85
86 private:
sprangdb2a9fc2017-08-09 06:42:32 -070087 RtpTransportAdapter(const RtcpParameters& rtcp_params,
deadbeefe814a0d2017-02-25 18:15:09 -080088 PacketTransportInterface* rtp,
89 PacketTransportInterface* rtcp,
zhihuangd3501ad2017-03-03 14:39:06 -080090 RtpTransportControllerAdapter* rtp_transport_controller,
91 bool is_srtp_transport);
deadbeefe814a0d2017-02-25 18:15:09 -080092
Zhi Huange830e682018-03-30 10:48:35 -070093 void OnReadyToSend(bool ready) { SignalReadyToSend(ready); }
94
Zhi Huang365381f2018-04-13 16:44:34 -070095 void OnRtcpPacketReceived(rtc::CopyOnWriteBuffer* packet,
96 const rtc::PacketTime& time) {
97 SignalRtcpPacketReceived(packet, time);
Zhi Huange830e682018-03-30 10:48:35 -070098 }
99
100 void OnWritableState(bool writable) { SignalWritableState(writable); }
101
102 PacketTransportInterface* rtp_packet_transport_ = nullptr;
103 PacketTransportInterface* rtcp_packet_transport_ = nullptr;
104 RtpTransportControllerAdapter* const rtp_transport_controller_ = nullptr;
deadbeefe814a0d2017-02-25 18:15:09 -0800105 // Non-null if this class owns the transport controller.
106 std::unique_ptr<RtpTransportControllerInterface>
107 owned_rtp_transport_controller_;
sprangdb2a9fc2017-08-09 06:42:32 -0700108 RtpTransportParameters parameters_;
deadbeefe814a0d2017-02-25 18:15:09 -0800109
Zhi Huange830e682018-03-30 10:48:35 -0700110 // Only one of them is non-null;
111 std::unique_ptr<RtpTransport> unencrypted_rtp_transport_;
112 std::unique_ptr<SrtpTransport> srtp_transport_;
113
114 rtc::Thread* network_thread_ = nullptr;
zhihuangd3501ad2017-03-03 14:39:06 -0800115
deadbeefe814a0d2017-02-25 18:15:09 -0800116 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RtpTransportAdapter);
117};
118
119} // namespace webrtc
120
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200121#endif // ORTC_RTPTRANSPORTADAPTER_H_