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
312class RtpPayloadRawVideo : public RtpPayload {
313 public:
327 RtpPayloadRawVideo(int width, int height, int bitsPerPixel, int pgroupBytes = 0);
328
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;
337
339 void setPayloadType(uint8_t pt) { _payloadType = pt; }
340
342 int width() const { return _width; }
343
345 int height() const { return _height; }
346
348 int bitsPerPixel() const { return _bitsPerPixel; }
349
351 int pgroupBytes() const { return _pgroupBytes; }
352
353 private:
354 int _width;
355 int _height;
356 int _bitsPerPixel;
357 int _pgroupBytes;
358 uint8_t _payloadType = 96;
359};
360
393class RtpPayloadJson : public RtpPayload {
394 public:
400 RtpPayloadJson(uint8_t payloadType = 98, uint32_t clockRate = 90000);
401
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;
410
412 void setPayloadType(uint8_t pt) { _payloadType = pt; }
413
415 void setClockRate(uint32_t hz) { _clockRate = hz; }
416
417 private:
418 uint8_t _payloadType;
419 uint32_t _clockRate;
420};
421
446class RtpPayloadJpeg : public RtpPayload {
447 public:
454 RtpPayloadJpeg(int width, int height, int quality = 85);
455
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; }
466
468 int width() const { return _width; }
469
471 int height() const { return _height; }
472
474 int quality() const { return _quality; }
475
477 void setQuality(int q) { _quality = q; }
478
479 private:
480 int _width;
481 int _height;
482 int _quality;
483};
484
536class RtpPayloadJpegXs : public RtpPayload {
537 public:
539 static constexpr size_t HeaderSize = 4;
540
542 static constexpr uint32_t ClockRate = 90000;
543
550 RtpPayloadJpegXs(int width, int height, uint8_t payloadType = 96);
551
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;
560
562 void setPayloadType(uint8_t pt) { _payloadType = pt; }
563
565 int width() const { return _width; }
567 int height() const { return _height; }
568
574 uint8_t frameCounter() const { return _frameCounter; }
575
577 void resetFrameCounter() { _frameCounter = 0; }
578
579 private:
580 int _width;
581 int _height;
582 uint8_t _payloadType;
583 uint8_t _frameCounter = 0;
584};
585
663class RtpPayloadH264 : public RtpPayload {
664 public:
666 static constexpr uint32_t ClockRate = 90000;
667
669 static constexpr uint8_t NalTypeFuA = 28;
670
672 static constexpr uint8_t NalTypeStapA = 24;
673
675 static constexpr uint8_t NalTypeIdr = 5;
676
678 static constexpr uint8_t NalTypeSps = 7;
679
681 static constexpr uint8_t NalTypePps = 8;
682
687 explicit RtpPayloadH264(uint8_t payloadType = 96);
688
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;
697
716 ValidateResult validate(const Buffer &unpacked) override;
717
725 void clearParamSets() override;
726
742 void setSpropParameterSets(const String &csv);
743
747 bool spsObserved() const { return _spsObserved; }
748
751 bool ppsObserved() const { return _ppsObserved; }
752
756 bool idrLatched() const { return _idrLatched; }
757
759 void setPayloadType(uint8_t pt) { _payloadType = pt; }
760
761 private:
762 uint8_t _payloadType;
763 bool _spsObserved = false;
764 bool _ppsObserved = false;
765 bool _idrLatched = false;
766 bool _loggedWaitForParamSets = false;
767};
768
820class RtpPayloadH265 : public RtpPayload {
821 public:
823 static constexpr uint32_t ClockRate = 90000;
824
826 static constexpr uint8_t NalTypeFu = 49;
827
829 static constexpr uint8_t NalTypeAp = 48;
830
832 static constexpr uint8_t NalTypeVps = 32;
833
835 static constexpr uint8_t NalTypeSps = 33;
836
838 static constexpr uint8_t NalTypePps = 34;
839
841 static constexpr uint8_t IrapNalTypeMin = 16;
842
845 static constexpr uint8_t IrapNalTypeMax = 23;
846
851 explicit RtpPayloadH265(uint8_t payloadType = 96);
852
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;
861
875 ValidateResult validate(const Buffer &unpacked) override;
876
882 void clearParamSets() override;
883
892 void setSpropVps(const String &csv);
893
896 void setSpropSps(const String &csv);
897
900 void setSpropPps(const String &csv);
901
904 bool vpsObserved() const { return _vpsObserved; }
905
908 bool spsObserved() const { return _spsObserved; }
909
912 bool ppsObserved() const { return _ppsObserved; }
913
917 bool irapLatched() const { return _irapLatched; }
918
920 void setPayloadType(uint8_t pt) { _payloadType = pt; }
921
922 private:
923 uint8_t _payloadType;
924 bool _vpsObserved = false;
925 bool _spsObserved = false;
926 bool _ppsObserved = false;
927 bool _irapLatched = false;
928 bool _loggedWaitForParamSets = false;
929};
930
931PROMEKI_NAMESPACE_END
932
933#endif // PROMEKI_ENABLE_NETWORK