-
-
Notifications
You must be signed in to change notification settings - Fork 200
Expand file tree
/
Copy pathTransport.hpp
More file actions
237 lines (209 loc) · 7.28 KB
/
Transport.hpp
File metadata and controls
237 lines (209 loc) · 7.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#ifndef MSC_TRANSPORT_HPP
#define MSC_TRANSPORT_HPP
#include "Consumer.hpp"
#include "DataConsumer.hpp"
#include "DataProducer.hpp"
#include "Handler.hpp"
#include "Producer.hpp"
#include <json.hpp>
#include <api/media_stream_interface.h> // webrtc::MediaStreamTrackInterface
#include <api/peer_connection_interface.h> // webrtc::PeerConnectionInterface
#include <api/rtp_parameters.h> // webrtc::RtpEncodingParameters
#include <future>
#include <map>
#include <memory> // unique_ptr
#include <string>
namespace mediasoupclient
{
// Fast forward declarations.
class Device;
class Transport : public Handler::PrivateListener
{
public:
/* Public Listener API */
class Listener
{
public:
virtual ~Listener() = default;
virtual std::future<void> OnConnect(Transport* transport, const nlohmann::json& dtlsParameters) = 0;
virtual void OnConnectionStateChange(Transport* transport, const std::string& connectionState) = 0;
};
/* Only child classes will create transport intances */
protected:
Transport(
Listener* listener,
const std::string& id,
const nlohmann::json* extendedRtpCapabilities,
const nlohmann::json& appData);
public:
virtual ~Transport() = default;
const std::string& GetId() const;
bool IsClosed() const;
const std::string& GetConnectionState() const;
nlohmann::json& GetAppData();
virtual void Close();
nlohmann::json GetStats() const;
void RestartIce(const nlohmann::json& iceParameters);
void UpdateIceServers(const nlohmann::json& iceServers);
protected:
void SetHandler(Handler* handler);
/* Pure virtual methods inherited from Handler::PrivateListener */
public:
void OnConnect(nlohmann::json& dtlsParameters) override;
void OnConnectionStateChange(
webrtc::PeerConnectionInterface::IceConnectionState connectionState) override;
protected:
// Closed flag.
bool closed{ false };
// Extended RTP capabilities.
const nlohmann::json* extendedRtpCapabilities{ nullptr };
// SCTP max message size if enabled, null otherwise.
size_t maxSctpMessageSize{ 0u };
// Whether the Consumer for RTP probation has been created.
bool probatorConsumerCreated{ false };
// Whether this transport supports DataChannel.
bool hasSctpParameters{ false };
private:
// Listener.
Listener* listener{ nullptr };
// Id.
std::string id;
// Transport (IceConneciton) connection state.
webrtc::PeerConnectionInterface::IceConnectionState connectionState{
webrtc::PeerConnectionInterface::IceConnectionState::kIceConnectionNew
};
// Handler.
Handler* handler{ nullptr };
// App custom data.
nlohmann::json appData = nlohmann::json::object();
};
class SendTransport : public Transport,
public Producer::PrivateListener,
public DataProducer::PrivateListener
{
public:
/* Public Listener API */
class Listener : public Transport::Listener
{
public:
virtual std::future<std::string> OnProduce(
SendTransport* transport,
const std::string& kind,
nlohmann::json rtpParameters,
const nlohmann::json& appData) = 0;
virtual std::future<std::string> OnProduceData(
SendTransport* transport,
const nlohmann::json& sctpStreamParameters,
const std::string& label,
const std::string& protocol,
const nlohmann::json& appData) = 0;
};
private:
SendTransport(
Listener* listener,
const std::string& id,
const nlohmann::json& iceParameters,
const nlohmann::json& iceCandidates,
const nlohmann::json& dtlsParameters,
const nlohmann::json& sctpParameters,
const PeerConnection::Options* peerConnectionOptions,
const nlohmann::json* extendedRtpCapabilities,
const std::map<std::string, bool>* canProduceByKind,
const nlohmann::json& appData);
/* Device is the only one constructing Transports. */
friend Device;
public:
Producer* Produce(
Producer::Listener* producerListener,
webrtc::MediaStreamTrackInterface* track,
const std::vector<webrtc::RtpEncodingParameters>* encodings,
const nlohmann::json* codecOptions,
const nlohmann::json* codec,
const nlohmann::json& appData = nlohmann::json::object());
DataProducer* ProduceData(
DataProducer::Listener* listener,
const std::string& label = "",
const std::string& protocol = "",
bool ordered = true,
int maxRetransmits = 0,
int maxPacketLifeTime = 0,
const nlohmann::json& appData = nlohmann::json::object());
/* Virtual methods inherited from Transport. */
public:
void Close() override;
/* Virtual methods inherited from Producer::PrivateListener. */
public:
void OnClose(Producer* producer) override;
void OnClose(DataProducer* dataProducer) override;
void OnReplaceTrack(const Producer* producer, webrtc::MediaStreamTrackInterface* track) override;
void OnSetMaxSpatialLayer(const Producer* producer, uint8_t maxSpatialLayer) override;
nlohmann::json OnGetStats(const Producer* producer) override;
void OnPause(Producer* producer);
void OnResume(Producer* producer);
private:
// Listener instance.
Listener* listener;
// Map of Producers indexed by id.
std::unordered_map<std::string, Producer*> producers;
std::unordered_map<std::string, DataProducer*> dataProducers;
// Whether we can produce audio/video based on computed extended RTP
// capabilities.
const std::map<std::string, bool>* canProduceByKind{ nullptr };
// SendHandler instance.
std::unique_ptr<SendHandler> sendHandler;
};
class RecvTransport : public Transport,
public Consumer::PrivateListener,
public DataConsumer::PrivateListener
{
public:
/* Public Listener API */
class Listener : public Transport::Listener
{
};
private:
RecvTransport(
Listener* listener,
const std::string& id,
const nlohmann::json& iceParameters,
const nlohmann::json& iceCandidates,
const nlohmann::json& dtlsParameters,
const nlohmann::json& sctpParameters,
const PeerConnection::Options* peerConnectionOptions,
const nlohmann::json* extendedRtpCapabilities,
const nlohmann::json& appData);
/* Device is the only one constructing Transports */
friend Device;
public:
Consumer* Consume(
Consumer::Listener* consumerListener,
const std::string& id,
const std::string& producerId,
const std::string& kind,
nlohmann::json* rtpParameters,
const nlohmann::json& appData = nlohmann::json::object());
DataConsumer* ConsumeData(
DataConsumer::Listener* listener,
const std::string& id,
const std::string& producerId,
const uint16_t streamId,
const std::string& label,
const std::string& protocol = std::string(),
const nlohmann::json& appData = nlohmann::json::object());
/* Virtual methods inherited from Transport. */
public:
void Close() override;
/* Virtual methods inherited from Consumer::PrivateListener. */
public:
void OnClose(Consumer* consumer) override;
void OnClose(DataConsumer* consumer) override;
nlohmann::json OnGetStats(const Consumer* consumer) override;
private:
// Map of Consumers indexed by id.
std::unordered_map<std::string, Consumer*> consumers;
std::unordered_map<std::string, DataConsumer*> dataConsumers;
// SendHandler instance.
std::unique_ptr<RecvHandler> recvHandler;
};
} // namespace mediasoupclient
#endif