libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
rtppayload.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 <cstddef>
15#include <promeki/buffer.h>
16#include <promeki/rtppacket.h>
17
18PROMEKI_NAMESPACE_BEGIN
19
39class RtpPayload {
40 public:
42 virtual ~RtpPayload() = default;
43
45 virtual uint8_t payloadType() const = 0;
46
48 virtual uint32_t clockRate() const = 0;
49
62 virtual RtpPacket::List pack(const void *mediaData, size_t size) = 0;
63
69 virtual Buffer unpack(const RtpPacket::List &packets) = 0;
70
94 enum class ValidateResult {
95 Accept,
96 DropSilently,
97 Wait,
98 };
99
122 virtual ValidateResult validate(const Buffer &unpacked) {
123 return unpacked.size() > 0 ? ValidateResult::Accept
124 : ValidateResult::DropSilently;
125 }
126
137 virtual void clearParamSets() {}
138
153 virtual bool isJpeg() const { return false; }
154
167 virtual size_t maxPayloadSize() const { return _maxPayloadSize; }
168
179 void setMaxPayloadSize(size_t bytes) { _maxPayloadSize = (bytes == 0) ? 1200 : bytes; }
180
181 protected:
183 RtpPayload() = default;
184
186 size_t _maxPayloadSize = 1200;
187};
188
206class RtpPayloadL24 : public RtpPayload {
207 public:
213 RtpPayloadL24(uint32_t sampleRate = 48000, int channels = 2);
214
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;
223
225 void setPayloadType(uint8_t pt) { _payloadType = pt; }
226
228 int channels() const { return _channels; }
229
231 uint32_t sampleRate() const { return _sampleRate; }
232
233 private:
234 uint32_t _sampleRate;
235 int _channels;
236 uint8_t _payloadType = 97;
237};
238
252class RtpPayloadL16 : public RtpPayload {
253 public:
259 RtpPayloadL16(uint32_t sampleRate = 48000, int channels = 2);
260
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;
269
271 void setPayloadType(uint8_t pt) { _payloadType = pt; }
272
274 int channels() const { return _channels; }
275
277 uint32_t sampleRate() const { return _sampleRate; }
278
279 private:
280 uint32_t _sampleRate;
281 int _channels;
282 uint8_t _payloadType = 96;
283};
284
285// RFC 4175 / ST 2110-20 uncompressed video lives in its own header
286// (rtppayloadrawvideo.h) so the full SRD / ESN / pgroup machinery can
287// be reviewed independently of the other RTP payload classes.
288
321class RtpPayloadJson : public RtpPayload {
322 public:
328 RtpPayloadJson(uint8_t payloadType = 98, uint32_t clockRate = 90000);
329
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;
338
340 void setPayloadType(uint8_t pt) { _payloadType = pt; }
341
343 void setClockRate(uint32_t hz) { _clockRate = hz; }
344
345 private:
346 uint8_t _payloadType;
347 uint32_t _clockRate;
348};
349
374class RtpPayloadJpeg : public RtpPayload {
375 public:
382 RtpPayloadJpeg(int width, int height, int quality = 85);
383
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; }
394
396 int width() const { return _width; }
397
399 int height() const { return _height; }
400
402 int quality() const { return _quality; }
403
405 void setQuality(int q) { _quality = q; }
406
407 private:
408 int _width;
409 int _height;
410 int _quality;
411};
412
464class RtpPayloadJpegXs : public RtpPayload {
465 public:
467 static constexpr size_t HeaderSize = 4;
468
470 static constexpr uint32_t ClockRate = 90000;
471
478 RtpPayloadJpegXs(int width, int height, uint8_t payloadType = 96);
479
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;
488
490 void setPayloadType(uint8_t pt) { _payloadType = pt; }
491
493 int width() const { return _width; }
495 int height() const { return _height; }
496
502 uint8_t frameCounter() const { return _frameCounter; }
503
505 void resetFrameCounter() { _frameCounter = 0; }
506
527 void setSliceMode(bool sliceMode) { _sliceMode = sliceMode; }
528
530 bool isSliceMode() const { return _sliceMode; }
531
532 private:
533 int _width;
534 int _height;
535 uint8_t _payloadType;
536 uint8_t _frameCounter = 0;
537 bool _sliceMode = false;
538};
539
617class RtpPayloadH264 : public RtpPayload {
618 public:
620 static constexpr uint32_t ClockRate = 90000;
621
623 static constexpr uint8_t NalTypeFuA = 28;
624
626 static constexpr uint8_t NalTypeStapA = 24;
627
629 static constexpr uint8_t NalTypeIdr = 5;
630
632 static constexpr uint8_t NalTypeSps = 7;
633
635 static constexpr uint8_t NalTypePps = 8;
636
641 explicit RtpPayloadH264(uint8_t payloadType = 96);
642
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;
651
670 ValidateResult validate(const Buffer &unpacked) override;
671
679 void clearParamSets() override;
680
696 void setSpropParameterSets(const String &csv);
697
701 bool spsObserved() const { return _spsObserved; }
702
705 bool ppsObserved() const { return _ppsObserved; }
706
710 bool idrLatched() const { return _idrLatched; }
711
713 void setPayloadType(uint8_t pt) { _payloadType = pt; }
714
715 private:
716 uint8_t _payloadType;
717 bool _spsObserved = false;
718 bool _ppsObserved = false;
719 bool _idrLatched = false;
720 bool _loggedWaitForParamSets = false;
721};
722
774class RtpPayloadH265 : public RtpPayload {
775 public:
777 static constexpr uint32_t ClockRate = 90000;
778
780 static constexpr uint8_t NalTypeFu = 49;
781
783 static constexpr uint8_t NalTypeAp = 48;
784
786 static constexpr uint8_t NalTypeVps = 32;
787
789 static constexpr uint8_t NalTypeSps = 33;
790
792 static constexpr uint8_t NalTypePps = 34;
793
795 static constexpr uint8_t IrapNalTypeMin = 16;
796
799 static constexpr uint8_t IrapNalTypeMax = 23;
800
805 explicit RtpPayloadH265(uint8_t payloadType = 96);
806
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;
815
829 ValidateResult validate(const Buffer &unpacked) override;
830
836 void clearParamSets() override;
837
846 void setSpropVps(const String &csv);
847
850 void setSpropSps(const String &csv);
851
854 void setSpropPps(const String &csv);
855
858 bool vpsObserved() const { return _vpsObserved; }
859
862 bool spsObserved() const { return _spsObserved; }
863
866 bool ppsObserved() const { return _ppsObserved; }
867
871 bool irapLatched() const { return _irapLatched; }
872
874 void setPayloadType(uint8_t pt) { _payloadType = pt; }
875
876 private:
877 uint8_t _payloadType;
878 bool _vpsObserved = false;
879 bool _spsObserved = false;
880 bool _ppsObserved = false;
881 bool _irapLatched = false;
882 bool _loggedWaitForParamSets = false;
883};
884
885PROMEKI_NAMESPACE_END
886
887#endif // PROMEKI_ENABLE_NETWORK