11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
18PROMEKI_NAMESPACE_BEGIN
42 virtual ~RtpPayload() =
default;
45 virtual uint8_t payloadType()
const = 0;
48 virtual uint32_t clockRate()
const = 0;
62 virtual RtpPacket::List pack(
const void *mediaData,
size_t size) = 0;
69 virtual Buffer unpack(
const RtpPacket::List &packets) = 0;
94 enum class ValidateResult {
122 virtual ValidateResult validate(
const Buffer &unpacked) {
123 return unpacked.size() > 0 ? ValidateResult::Accept
124 : ValidateResult::DropSilently;
137 virtual void clearParamSets() {}
153 virtual bool isJpeg()
const {
return false; }
167 virtual size_t maxPayloadSize()
const {
return _maxPayloadSize; }
179 void setMaxPayloadSize(
size_t bytes) { _maxPayloadSize = (bytes == 0) ? 1200 : bytes; }
183 RtpPayload() =
default;
186 size_t _maxPayloadSize = 1200;
206class RtpPayloadL24 :
public RtpPayload {
213 RtpPayloadL24(uint32_t sampleRate = 48000,
int channels = 2);
216 uint8_t payloadType()
const override {
return _payloadType; }
218 uint32_t clockRate()
const override {
return _sampleRate; }
220 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
222 Buffer unpack(
const RtpPacket::List &packets)
override;
225 void setPayloadType(uint8_t pt) { _payloadType = pt; }
228 int channels()
const {
return _channels; }
231 uint32_t sampleRate()
const {
return _sampleRate; }
234 uint32_t _sampleRate;
236 uint8_t _payloadType = 97;
252class RtpPayloadL16 :
public RtpPayload {
259 RtpPayloadL16(uint32_t sampleRate = 48000,
int channels = 2);
262 uint8_t payloadType()
const override {
return _payloadType; }
264 uint32_t clockRate()
const override {
return _sampleRate; }
266 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
268 Buffer unpack(
const RtpPacket::List &packets)
override;
271 void setPayloadType(uint8_t pt) { _payloadType = pt; }
274 int channels()
const {
return _channels; }
277 uint32_t sampleRate()
const {
return _sampleRate; }
280 uint32_t _sampleRate;
282 uint8_t _payloadType = 96;
321class RtpPayloadJson :
public RtpPayload {
328 RtpPayloadJson(uint8_t payloadType = 98, uint32_t clockRate = 90000);
331 uint8_t payloadType()
const override {
return _payloadType; }
333 uint32_t clockRate()
const override {
return _clockRate; }
335 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
337 Buffer unpack(
const RtpPacket::List &packets)
override;
340 void setPayloadType(uint8_t pt) { _payloadType = pt; }
343 void setClockRate(uint32_t hz) { _clockRate = hz; }
346 uint8_t _payloadType;
374class RtpPayloadJpeg :
public RtpPayload {
382 RtpPayloadJpeg(
int width,
int height,
int quality = 85);
385 uint8_t payloadType()
const override {
return 26; }
387 uint32_t clockRate()
const override {
return 90000; }
389 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
391 Buffer unpack(
const RtpPacket::List &packets)
override;
393 bool isJpeg()
const override {
return true; }
396 int width()
const {
return _width; }
399 int height()
const {
return _height; }
402 int quality()
const {
return _quality; }
405 void setQuality(
int q) { _quality = q; }
464class RtpPayloadJpegXs :
public RtpPayload {
467 static constexpr size_t HeaderSize = 4;
470 static constexpr uint32_t ClockRate = 90000;
478 RtpPayloadJpegXs(
int width,
int height, uint8_t payloadType = 96);
481 uint8_t payloadType()
const override {
return _payloadType; }
483 uint32_t clockRate()
const override {
return ClockRate; }
485 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
487 Buffer unpack(
const RtpPacket::List &packets)
override;
490 void setPayloadType(uint8_t pt) { _payloadType = pt; }
493 int width()
const {
return _width; }
495 int height()
const {
return _height; }
502 uint8_t frameCounter()
const {
return _frameCounter; }
505 void resetFrameCounter() { _frameCounter = 0; }
527 void setSliceMode(
bool sliceMode) { _sliceMode = sliceMode; }
530 bool isSliceMode()
const {
return _sliceMode; }
535 uint8_t _payloadType;
536 uint8_t _frameCounter = 0;
537 bool _sliceMode =
false;
617class RtpPayloadH264 :
public RtpPayload {
620 static constexpr uint32_t ClockRate = 90000;
623 static constexpr uint8_t NalTypeFuA = 28;
626 static constexpr uint8_t NalTypeStapA = 24;
629 static constexpr uint8_t NalTypeIdr = 5;
632 static constexpr uint8_t NalTypeSps = 7;
635 static constexpr uint8_t NalTypePps = 8;
641 explicit RtpPayloadH264(uint8_t payloadType = 96);
644 uint8_t payloadType()
const override {
return _payloadType; }
646 uint32_t clockRate()
const override {
return ClockRate; }
648 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
650 Buffer unpack(
const RtpPacket::List &packets)
override;
670 ValidateResult validate(
const Buffer &unpacked)
override;
679 void clearParamSets()
override;
696 void setSpropParameterSets(
const String &csv);
701 bool spsObserved()
const {
return _spsObserved; }
705 bool ppsObserved()
const {
return _ppsObserved; }
710 bool idrLatched()
const {
return _idrLatched; }
713 void setPayloadType(uint8_t pt) { _payloadType = pt; }
716 uint8_t _payloadType;
717 bool _spsObserved =
false;
718 bool _ppsObserved =
false;
719 bool _idrLatched =
false;
720 bool _loggedWaitForParamSets =
false;
774class RtpPayloadH265 :
public RtpPayload {
777 static constexpr uint32_t ClockRate = 90000;
780 static constexpr uint8_t NalTypeFu = 49;
783 static constexpr uint8_t NalTypeAp = 48;
786 static constexpr uint8_t NalTypeVps = 32;
789 static constexpr uint8_t NalTypeSps = 33;
792 static constexpr uint8_t NalTypePps = 34;
795 static constexpr uint8_t IrapNalTypeMin = 16;
799 static constexpr uint8_t IrapNalTypeMax = 23;
805 explicit RtpPayloadH265(uint8_t payloadType = 96);
808 uint8_t payloadType()
const override {
return _payloadType; }
810 uint32_t clockRate()
const override {
return ClockRate; }
812 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
814 Buffer unpack(
const RtpPacket::List &packets)
override;
829 ValidateResult validate(
const Buffer &unpacked)
override;
836 void clearParamSets()
override;
846 void setSpropVps(
const String &csv);
850 void setSpropSps(
const String &csv);
854 void setSpropPps(
const String &csv);
858 bool vpsObserved()
const {
return _vpsObserved; }
862 bool spsObserved()
const {
return _spsObserved; }
866 bool ppsObserved()
const {
return _ppsObserved; }
871 bool irapLatched()
const {
return _irapLatched; }
874 void setPayloadType(uint8_t pt) { _payloadType = pt; }
877 uint8_t _payloadType;
878 bool _vpsObserved =
false;
879 bool _spsObserved =
false;
880 bool _ppsObserved =
false;
881 bool _irapLatched =
false;
882 bool _loggedWaitForParamSets =
false;