blob: 72bd3f61abad911feacf31c0d91d15c1cdad915a [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/ortc/srtptransportinterface.h"
18#include "api/rtcerror.h"
19#include "media/base/streamparams.h"
20#include "ortc/rtptransportcontrolleradapter.h"
21#include "pc/channel.h"
Zhi Huange830e682018-03-30 10:48:35 -070022#include "pc/rtptransport.h"
23#include "pc/rtptransportinternal.h"
24#include "pc/srtptransport.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "rtc_base/constructormagic.h"
26#include "rtc_base/sigslot.h"
deadbeefe814a0d2017-02-25 18:15:09 -080027
28namespace webrtc {
Zhi Huange830e682018-03-30 10:48:35 -070029// This class is a wrapper over an RtpTransport or an SrtpTransport. The base
30// class RtpTransportInternalAdapter keeps a raw pointer, |transport_|, of the
31// transport object and implements both the public SrtpTransportInterface and
32// RtpTransport internal interface by calling the |transport_| underneath.
33//
34// This adapter can be used as an unencrypted RTP transport or an SrtpTransport
35// with RtpSenderAdapter, RtpReceiverAdapter, and RtpTransportControllerAdapter.
deadbeefe814a0d2017-02-25 18:15:09 -080036//
37// TODO(deadbeef): When BaseChannel is split apart into separate
38// "RtpTransport"/"RtpTransceiver"/"RtpSender"/"RtpReceiver" objects, this
39// adapter object can be removed.
Zhi Huange830e682018-03-30 10:48:35 -070040class RtpTransportAdapter : public RtpTransportInternalAdapter {
deadbeefe814a0d2017-02-25 18:15:09 -080041 public:
42 // |rtp| can't be null. |rtcp| can if RTCP muxing is used immediately (meaning
43 // |rtcp_parameters.mux| is also true).
44 static RTCErrorOr<std::unique_ptr<RtpTransportInterface>> CreateProxied(
sprangdb2a9fc2017-08-09 06:42:32 -070045 const RtpTransportParameters& rtcp_parameters,
deadbeefe814a0d2017-02-25 18:15:09 -080046 PacketTransportInterface* rtp,
47 PacketTransportInterface* rtcp,
48 RtpTransportControllerAdapter* rtp_transport_controller);
zhihuangd3501ad2017-03-03 14:39:06 -080049
50 static RTCErrorOr<std::unique_ptr<SrtpTransportInterface>> CreateSrtpProxied(
sprangdb2a9fc2017-08-09 06:42:32 -070051 const RtpTransportParameters& rtcp_parameters,
zhihuangd3501ad2017-03-03 14:39:06 -080052 PacketTransportInterface* rtp,
53 PacketTransportInterface* rtcp,
54 RtpTransportControllerAdapter* rtp_transport_controller);
55
deadbeefe814a0d2017-02-25 18:15:09 -080056 ~RtpTransportAdapter() override;
57
58 // RtpTransportInterface implementation.
Zhi Huange830e682018-03-30 10:48:35 -070059 PacketTransportInterface* GetRtpPacketTransport() const override {
60 return rtp_packet_transport_;
61 }
62 PacketTransportInterface* GetRtcpPacketTransport() const override {
63 return rtcp_packet_transport_;
64 }
sprangdb2a9fc2017-08-09 06:42:32 -070065 RTCError SetParameters(const RtpTransportParameters& parameters) override;
66 RtpTransportParameters GetParameters() const override { return parameters_; }
deadbeefe814a0d2017-02-25 18:15:09 -080067
zhihuangd3501ad2017-03-03 14:39:06 -080068 // SRTP specific implementation.
69 RTCError SetSrtpSendKey(const cricket::CryptoParams& params) override;
70 RTCError SetSrtpReceiveKey(const cricket::CryptoParams& params) override;
71
deadbeefe814a0d2017-02-25 18:15:09 -080072 // Methods used internally by OrtcFactory.
73 RtpTransportControllerAdapter* rtp_transport_controller() {
74 return rtp_transport_controller_;
75 }
76 void TakeOwnershipOfRtpTransportController(
77 std::unique_ptr<RtpTransportControllerInterface> controller);
78
79 // Used by RtpTransportControllerAdapter to tell when it should stop
80 // returning this transport from GetTransports().
81 sigslot::signal1<RtpTransportAdapter*> SignalDestroyed;
82
Zhi Huange830e682018-03-30 10:48:35 -070083 bool IsSrtpActive() const override { return transport_->IsSrtpActive(); }
84
85 bool IsSrtpTransport() const { return srtp_transport_ != nullptr; }
zhihuangd3501ad2017-03-03 14:39:06 -080086
deadbeefe814a0d2017-02-25 18:15:09 -080087 protected:
88 RtpTransportAdapter* GetInternal() override { return this; }
89
90 private:
sprangdb2a9fc2017-08-09 06:42:32 -070091 RtpTransportAdapter(const RtcpParameters& rtcp_params,
deadbeefe814a0d2017-02-25 18:15:09 -080092 PacketTransportInterface* rtp,
93 PacketTransportInterface* rtcp,
zhihuangd3501ad2017-03-03 14:39:06 -080094 RtpTransportControllerAdapter* rtp_transport_controller,
95 bool is_srtp_transport);
deadbeefe814a0d2017-02-25 18:15:09 -080096
Zhi Huange830e682018-03-30 10:48:35 -070097 void OnReadyToSend(bool ready) { SignalReadyToSend(ready); }
98
99 void OnPacketReceived(bool rtcp,
100 rtc::CopyOnWriteBuffer* packet,
101 const rtc::PacketTime& time) {
102 SignalPacketReceived(rtcp, packet, time);
103 }
104
105 void OnWritableState(bool writable) { SignalWritableState(writable); }
106
107 PacketTransportInterface* rtp_packet_transport_ = nullptr;
108 PacketTransportInterface* rtcp_packet_transport_ = nullptr;
109 RtpTransportControllerAdapter* const rtp_transport_controller_ = nullptr;
deadbeefe814a0d2017-02-25 18:15:09 -0800110 // Non-null if this class owns the transport controller.
111 std::unique_ptr<RtpTransportControllerInterface>
112 owned_rtp_transport_controller_;
sprangdb2a9fc2017-08-09 06:42:32 -0700113 RtpTransportParameters parameters_;
deadbeefe814a0d2017-02-25 18:15:09 -0800114
Zhi Huange830e682018-03-30 10:48:35 -0700115 // Only one of them is non-null;
116 std::unique_ptr<RtpTransport> unencrypted_rtp_transport_;
117 std::unique_ptr<SrtpTransport> srtp_transport_;
118
119 rtc::Thread* network_thread_ = nullptr;
zhihuangd3501ad2017-03-03 14:39:06 -0800120
deadbeefe814a0d2017-02-25 18:15:09 -0800121 RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RtpTransportAdapter);
122};
123
124} // namespace webrtc
125
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200126#endif // ORTC_RTPTRANSPORTADAPTER_H_