11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
24PROMEKI_NAMESPACE_BEGIN
82class RtmpChunkStream :
public ObjectBase {
83 PROMEKI_OBJECT(RtmpChunkStream, ObjectBase)
86 static constexpr int DefaultChunkSize = 128;
89 static constexpr int MinChunkSize = 128;
99 static constexpr int MaxChunkSize = 65535;
102 static constexpr int DefaultWindowAckSize = 5'000'000;
111 explicit RtmpChunkStream(IODevice *device, ObjectBase *parent =
nullptr);
114 ~RtmpChunkStream()
override;
134 Error writeMessage(
const RtmpMessage &msg);
165 Result<RtmpMessage> readMessage(
unsigned int timeoutMs = 0);
170 int localChunkSize()
const {
return _localChunkSize.value(); }
181 Error setLocalChunkSize(
int bytes);
184 int peerChunkSize()
const {
return _peerChunkSize.value(); }
187 int localWindowAckSize()
const {
return _localWindowAckSize.value(); }
193 Error setLocalWindowAckSize(
int bytes);
196 int peerWindowAckSize()
const {
return _peerWindowAckSize.value(); }
201 int64_t bytesSent()
const {
return _bytesSent.value(); }
204 int64_t bytesReceived()
const {
return _bytesReceived.value(); }
207 int64_t lastAckBytesAcked()
const {
return _lastAckBytesSent.value(); }
217 PROMEKI_SIGNAL(controlMessageReceived, RtmpMessage);
220 PROMEKI_SIGNAL(peerChunkSizeChanged,
int);
227 PROMEKI_SIGNAL(peerAck, uint32_t);
236 uint32_t timestamp = 0;
238 uint32_t messageLength = 0;
239 uint8_t messageTypeId = 0;
240 uint32_t messageStreamId = 0;
241 bool established =
false;
250 uint32_t timestamp = 0;
252 uint32_t messageLength = 0;
253 uint8_t messageTypeId = 0;
254 uint32_t messageStreamId = 0;
255 bool extendedTimestamp =
false;
256 bool established =
false;
258 uint32_t reassemblyBytes = 0;
263 Error writeBytes(
const uint8_t *data,
size_t len);
264 Error readBytesExact(uint8_t *data,
size_t len,
unsigned int timeoutMs);
265 Error sendSetChunkSize(
int bytes);
266 Error sendWindowAckSize(
int bytes);
267 Error sendAck(uint32_t cumulative);
268 void handleControl(
const RtmpMessage &msg);
270 int defaultCsidForType(RtmpMessage::Type type)
const;
274 Atomic<int32_t> _localChunkSize{DefaultChunkSize};
275 Atomic<int32_t> _peerChunkSize{DefaultChunkSize};
276 Atomic<int32_t> _localWindowAckSize{DefaultWindowAckSize};
277 Atomic<int32_t> _peerWindowAckSize{0};
279 Atomic<int64_t> _bytesSent{0};
280 Atomic<int64_t> _bytesReceived{0};
281 Atomic<int64_t> _lastAckBytesSent{0};
285 HashMap<uint32_t, WriteState> _writeStates;
286 HashMap<uint32_t, ReadState> _readStates;