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;
312class RtpPayloadRawVideo :
public RtpPayload {
327 RtpPayloadRawVideo(
int width,
int height,
int bitsPerPixel,
int pgroupBytes = 0);
330 uint8_t payloadType()
const override {
return _payloadType; }
332 uint32_t clockRate()
const override {
return 90000; }
334 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
336 Buffer unpack(
const RtpPacket::List &packets)
override;
339 void setPayloadType(uint8_t pt) { _payloadType = pt; }
342 int width()
const {
return _width; }
345 int height()
const {
return _height; }
348 int bitsPerPixel()
const {
return _bitsPerPixel; }
351 int pgroupBytes()
const {
return _pgroupBytes; }
358 uint8_t _payloadType = 96;
393class RtpPayloadJson :
public RtpPayload {
400 RtpPayloadJson(uint8_t payloadType = 98, uint32_t clockRate = 90000);
403 uint8_t payloadType()
const override {
return _payloadType; }
405 uint32_t clockRate()
const override {
return _clockRate; }
407 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
409 Buffer unpack(
const RtpPacket::List &packets)
override;
412 void setPayloadType(uint8_t pt) { _payloadType = pt; }
415 void setClockRate(uint32_t hz) { _clockRate = hz; }
418 uint8_t _payloadType;
446class RtpPayloadJpeg :
public RtpPayload {
454 RtpPayloadJpeg(
int width,
int height,
int quality = 85);
457 uint8_t payloadType()
const override {
return 26; }
459 uint32_t clockRate()
const override {
return 90000; }
461 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
463 Buffer unpack(
const RtpPacket::List &packets)
override;
465 bool isJpeg()
const override {
return true; }
468 int width()
const {
return _width; }
471 int height()
const {
return _height; }
474 int quality()
const {
return _quality; }
477 void setQuality(
int q) { _quality = q; }
536class RtpPayloadJpegXs :
public RtpPayload {
539 static constexpr size_t HeaderSize = 4;
542 static constexpr uint32_t ClockRate = 90000;
550 RtpPayloadJpegXs(
int width,
int height, uint8_t payloadType = 96);
553 uint8_t payloadType()
const override {
return _payloadType; }
555 uint32_t clockRate()
const override {
return ClockRate; }
557 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
559 Buffer unpack(
const RtpPacket::List &packets)
override;
562 void setPayloadType(uint8_t pt) { _payloadType = pt; }
565 int width()
const {
return _width; }
567 int height()
const {
return _height; }
574 uint8_t frameCounter()
const {
return _frameCounter; }
577 void resetFrameCounter() { _frameCounter = 0; }
582 uint8_t _payloadType;
583 uint8_t _frameCounter = 0;
663class RtpPayloadH264 :
public RtpPayload {
666 static constexpr uint32_t ClockRate = 90000;
669 static constexpr uint8_t NalTypeFuA = 28;
672 static constexpr uint8_t NalTypeStapA = 24;
675 static constexpr uint8_t NalTypeIdr = 5;
678 static constexpr uint8_t NalTypeSps = 7;
681 static constexpr uint8_t NalTypePps = 8;
687 explicit RtpPayloadH264(uint8_t payloadType = 96);
690 uint8_t payloadType()
const override {
return _payloadType; }
692 uint32_t clockRate()
const override {
return ClockRate; }
694 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
696 Buffer unpack(
const RtpPacket::List &packets)
override;
716 ValidateResult validate(
const Buffer &unpacked)
override;
725 void clearParamSets()
override;
742 void setSpropParameterSets(
const String &csv);
747 bool spsObserved()
const {
return _spsObserved; }
751 bool ppsObserved()
const {
return _ppsObserved; }
756 bool idrLatched()
const {
return _idrLatched; }
759 void setPayloadType(uint8_t pt) { _payloadType = pt; }
762 uint8_t _payloadType;
763 bool _spsObserved =
false;
764 bool _ppsObserved =
false;
765 bool _idrLatched =
false;
766 bool _loggedWaitForParamSets =
false;
820class RtpPayloadH265 :
public RtpPayload {
823 static constexpr uint32_t ClockRate = 90000;
826 static constexpr uint8_t NalTypeFu = 49;
829 static constexpr uint8_t NalTypeAp = 48;
832 static constexpr uint8_t NalTypeVps = 32;
835 static constexpr uint8_t NalTypeSps = 33;
838 static constexpr uint8_t NalTypePps = 34;
841 static constexpr uint8_t IrapNalTypeMin = 16;
845 static constexpr uint8_t IrapNalTypeMax = 23;
851 explicit RtpPayloadH265(uint8_t payloadType = 96);
854 uint8_t payloadType()
const override {
return _payloadType; }
856 uint32_t clockRate()
const override {
return ClockRate; }
858 RtpPacket::List pack(
const void *mediaData,
size_t size)
override;
860 Buffer unpack(
const RtpPacket::List &packets)
override;
875 ValidateResult validate(
const Buffer &unpacked)
override;
882 void clearParamSets()
override;
892 void setSpropVps(
const String &csv);
896 void setSpropSps(
const String &csv);
900 void setSpropPps(
const String &csv);
904 bool vpsObserved()
const {
return _vpsObserved; }
908 bool spsObserved()
const {
return _spsObserved; }
912 bool ppsObserved()
const {
return _ppsObserved; }
917 bool irapLatched()
const {
return _irapLatched; }
920 void setPayloadType(uint8_t pt) { _payloadType = pt; }
923 uint8_t _payloadType;
924 bool _vpsObserved =
false;
925 bool _spsObserved =
false;
926 bool _ppsObserved =
false;
927 bool _irapLatched =
false;
928 bool _loggedWaitForParamSets =
false;