libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
rtmphandshake.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
13#include <cstdint>
14#include <promeki/buffer.h>
15#include <promeki/bufferview.h>
16#include <promeki/enums.h>
17#include <promeki/error.h>
18#include <promeki/list.h>
19#include <promeki/namespace.h>
20#include <promeki/objectbase.h>
21
22PROMEKI_NAMESPACE_BEGIN
23
94class RtmpHandshake : public ObjectBase {
95 PROMEKI_OBJECT(RtmpHandshake, ObjectBase)
96 public:
104 enum State {
105 NotStarted,
106 ExchangingC0C1,
107 ExchangingC2S2,
108 Done,
109 Failed
110 };
111
118 static constexpr uint8_t Version = 0x03;
119
127 static constexpr int ChunkSize = 1536;
128
139 explicit RtmpHandshake(RtmpRole role, ObjectBase *parent = nullptr);
140
142 ~RtmpHandshake() override;
143
151 Error setMode(RtmpHandshakeMode mode);
152
154 RtmpHandshakeMode mode() const { return _mode; }
155
165 RtmpHandshakeMode negotiatedMode() const { return _negotiatedMode; }
166
175 Buffer pendingOutput();
176
194 Error feed(const BufferView &data);
195
204 void markPeerClosed();
205
207 State state() const { return _state; }
208
210 Error lastError() const { return _lastError; }
211
215 RtmpRole role() const { return _role; }
216
225 uint32_t peerEpoch() const { return _peerEpoch; }
226
236 uint32_t localEpoch() const { return _localEpoch; }
237
244 void setLocalEpoch(uint32_t epoch);
245
259 Error setLocalNonce(const BufferView &nonce);
260
264 PROMEKI_SIGNAL(complete);
265
270 PROMEKI_SIGNAL(failed, Error);
271
272 private:
274 enum InternalStep {
275 StepSendC0C1,
276 StepRecvS0S1,
277 StepSendC2,
278 StepRecvS2,
279 StepRecvC0C1,
280 StepSendS0S1S2,
281 StepRecvC2,
282 StepDone
283 };
284
285 void advance();
286 void fail(Error err);
287 Error produceClientC1();
288 Error produceClientC2();
289 Error produceServerS0S1S2();
290 Error consumePeerC0C1();
291 Error consumePeerS0S1();
292 Error consumePeerC2();
293 Error consumePeerS2();
294
295 RtmpRole _role;
296 RtmpHandshakeMode _mode = RtmpHandshakeMode::Auto;
297 RtmpHandshakeMode _negotiatedMode = RtmpHandshakeMode::Auto;
298 State _state = NotStarted;
299 InternalStep _step = StepSendC0C1;
300 Error _lastError = Error::Ok;
301
302 uint32_t _localEpoch = 0;
303 uint32_t _peerEpoch = 0;
304
305 bool _outEmittedFirst = false;
306 bool _hasOverrideNonce = false;
307 List<uint8_t> _overrideNonce;
308
309 List<uint8_t> _outBuffer;
310 List<uint8_t> _inBuffer;
311
312 // ---- Complex-handshake bookkeeping ----
313 int _localScheme = 1;
314 int _peerScheme = -1;
315 List<uint8_t> _localC1S1;
316 List<uint8_t> _peerC1S1;
317 uint8_t _localDigest[32] = {};
318 uint8_t _peerDigest[32] = {};
319};
320
321PROMEKI_NAMESPACE_END
322
323#endif // PROMEKI_ENABLE_NETWORK