libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
srtsockettransport.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_SRT
13#include <promeki/namespace.h>
16#include <promeki/string.h>
17#include <promeki/srtsocket.h>
18
19PROMEKI_NAMESPACE_BEGIN
20
21class SrtServer;
22
75class SrtSocketTransport : public PacketTransport {
76 public:
78 using UPtr = UniquePtr<SrtSocketTransport>;
79
81 enum Mode {
82 Caller,
83 Listener,
84 Rendezvous
85 };
86
91 explicit SrtSocketTransport(Mode mode = Caller);
92
94 ~SrtSocketTransport() override;
95
97 Mode mode() const { return _mode; }
98
109 void setLocalAddress(const SocketAddress &addr) { _localAddress = addr; }
110
112 const SocketAddress &localAddress() const { return _localAddress; }
113
123 void setPeerAddress(const SocketAddress &addr) { _peerAddress = addr; }
124
126 const SocketAddress &peerAddress() const { return _peerAddress; }
127
132 void setAcceptTimeoutMs(unsigned int ms) { _acceptTimeoutMs = ms; }
133
135 unsigned int acceptTimeoutMs() const { return _acceptTimeoutMs; }
136
138 Error setLatency(int ms) {
139 if (ms < 0 || ms > 60000) return Error::Invalid;
140 _latencyMs = ms;
141 return Error::Ok;
142 }
143 int latency() const { return _latencyMs; }
144
146 Error setPassphrase(const String &passphrase) {
147 if (!passphrase.isEmpty() && (passphrase.byteCount() < 10 || passphrase.byteCount() > 79))
148 return Error::Invalid;
149 _passphrase = passphrase;
150 return Error::Ok;
151 }
152
154 Error setEncryptionKeyLength(int bytes) {
155 if (bytes != 0 && bytes != 16 && bytes != 24 && bytes != 32) return Error::Invalid;
156 _pbKeyLen = bytes;
157 return Error::Ok;
158 }
159
161 Error setStreamId(const String &id) {
162 if (id.byteCount() > 512) return Error::Invalid;
163 _streamId = id;
164 return Error::Ok;
165 }
166 const String &streamId() const { return _streamId; }
167
169 Error setPayloadSize(int bytes) {
170 if (bytes < 0 || bytes > 1456) return Error::Invalid;
171 _payloadSize = bytes;
172 return Error::Ok;
173 }
174
185 void setMaxBandwidth(int64_t bytesPerSec) { _maxBw = bytesPerSec; }
186
194 SrtSocket *socket() const { return _socket.get(); }
195
205 SrtSocket::Stats stats(bool resetWindowed = false) const {
206 if (!_socket) return SrtSocket::Stats{};
207 return _socket->stats(resetWindowed);
208 }
209
211 Error open() override;
212
214 void close() override;
215
217 bool isOpen() const override;
218
220 ssize_t sendPacket(const void *data, size_t size, const SocketAddress &dest) override;
221
223 int sendPackets(const DatagramList &datagrams) override;
224
226 ssize_t receivePacket(void *data, size_t maxSize, SocketAddress *sender = nullptr) override;
227
228 private:
229 Mode _mode = Caller;
230 SrtSocket::UPtr _socket;
231 UniquePtr<SrtServer> _listener;
232 SocketAddress _localAddress;
233 SocketAddress _peerAddress;
234 String _passphrase;
235 String _streamId;
236 int _latencyMs = 120;
237 int _payloadSize = 0;
238 int _pbKeyLen = 0;
239 int64_t _maxBw = 0;
240 unsigned int _acceptTimeoutMs = 0;
241
249 Error applySocketOptions(SrtSocket &sock);
250};
251
252PROMEKI_NAMESPACE_END
253
254#endif // PROMEKI_ENABLE_SRT