rtp_header_extensions.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #ifndef MODULES_RTP_RTCP_SOURCE_RTP_HEADER_EXTENSIONS_H_
  2. #define MODULES_RTP_RTCP_SOURCE_RTP_HEADER_EXTENSIONS_H_
  3. #include <stddef.h>
  4. #include <stdint.h>
  5. #include <string>
  6. #include "../rtp_header_extension/rtp_header_extension_defines.h"
  7. class AbsoluteSendTime {
  8. public:
  9. static const RTPExtensionType kId = kRtpExtensionAbsoluteSendTime;
  10. static const uint8_t kValueSizeBytes = 3;
  11. static bool Parse(const uint8_t *data, uint32_t* time_24bits);
  12. static size_t ValueSize(uint32_t time_24bits) { return kValueSizeBytes; }
  13. static bool Write(uint8_t *data, uint32_t time_24bits);
  14. static const uint32_t MsTo24Bits(int64_t time_ms) {
  15. return static_cast<uint32_t>(((time_ms << 18) + 500) / 1000) & 0x00FFFFFF;
  16. }
  17. static const char kUri[];
  18. };
  19. class AudioLevel {
  20. public:
  21. static const RTPExtensionType kId = kRtpExtensionAudioLevel;
  22. static const uint8_t kValueSizeBytes = 1;
  23. static bool Parse(const uint8_t *data,
  24. bool* voice_activity,
  25. uint8_t* audio_level);
  26. static size_t ValueSize(bool voice_activity, uint8_t audio_level) {
  27. return kValueSizeBytes;
  28. }
  29. static bool Write(uint8_t *data,
  30. bool voice_activity,
  31. uint8_t audio_level);
  32. static const char kUri[];
  33. };
  34. class TransmissionOffset {
  35. public:
  36. static const RTPExtensionType kId = kRtpExtensionTransmissionTimeOffset;
  37. static const uint8_t kValueSizeBytes = 3;
  38. static bool Parse(const uint8_t *data, int32_t* rtp_time);
  39. static size_t ValueSize(int32_t rtp_time) { return kValueSizeBytes; }
  40. static bool Write(uint8_t *data, int32_t rtp_time);
  41. static const char kUri[];
  42. };
  43. class TransportSequenceNumber {
  44. public:
  45. static const RTPExtensionType kId = kRtpExtensionTransportSequenceNumber;
  46. static const uint8_t kValueSizeBytes = 2;
  47. static bool Parse(const uint8_t *data,
  48. uint16_t* transport_sequence_number);
  49. static size_t ValueSize(uint16_t /*transport_sequence_number*/) {
  50. return kValueSizeBytes;
  51. }
  52. static bool Write(uint8_t *data,
  53. uint16_t transport_sequence_number);
  54. static const char kUri[];
  55. };
  56. class VideoOrientation {
  57. public:
  58. static const RTPExtensionType kId = kRtpExtensionVideoRotation;
  59. static const uint8_t kValueSizeBytes = 1;
  60. static bool Parse(const uint8_t *data, VideoRotation* value);
  61. static size_t ValueSize(VideoRotation) { return kValueSizeBytes; }
  62. static bool Write(uint8_t *data, VideoRotation value);
  63. static bool Parse(const uint8_t *data, uint8_t* value);
  64. static size_t ValueSize(uint8_t value) { return kValueSizeBytes; }
  65. static bool Write(uint8_t *data, uint8_t value);
  66. static const char kUri[];
  67. };
  68. class PlayoutDelayLimits {
  69. public:
  70. static const RTPExtensionType kId = kRtpExtensionPlayoutDelay;
  71. static const uint8_t kValueSizeBytes = 3;
  72. // Playout delay in milliseconds. A playout delay limit (min or max)
  73. // has 12 bits allocated. This allows a range of 0-4095 values which
  74. // translates to a range of 0-40950 in milliseconds.
  75. static const int kGranularityMs = 10;
  76. // Maximum playout delay value in milliseconds.
  77. static const int kMaxMs = 0xfff * kGranularityMs; // 40950.
  78. static bool Parse(const uint8_t *data,
  79. PlayoutDelay* playout_delay);
  80. static size_t ValueSize(const PlayoutDelay&) {
  81. return kValueSizeBytes;
  82. }
  83. static bool Write(uint8_t *data,
  84. const PlayoutDelay& playout_delay);
  85. static const char kUri[];
  86. };
  87. class VideoContentTypeExtension {
  88. public:
  89. static const RTPExtensionType kId = kRtpExtensionVideoContentType;
  90. static const uint8_t kValueSizeBytes = 1;
  91. static bool Parse(const uint8_t *data,
  92. VideoContentType* content_type);
  93. static size_t ValueSize(VideoContentType) {
  94. return kValueSizeBytes;
  95. }
  96. static bool Write(uint8_t *data,
  97. VideoContentType content_type);
  98. static const char kUri[];
  99. };
  100. // Base extension class for RTP header extensions which are strings.
  101. // Subclasses must defined kId and kUri static constexpr members.
  102. class BaseRtpStringExtension {
  103. public:
  104. // String RTP header extensions are limited to 16 bytes because it is the
  105. // maximum length that can be encoded with one-byte header extensions.
  106. static const uint8_t kMaxValueSizeBytes = 16;
  107. static bool Parse(const uint8_t *data, std::string* str);
  108. static size_t ValueSize(const std::string& str) { return str.size(); }
  109. static bool Write(uint8_t *data, const std::string& str);
  110. };
  111. class RtpStreamId : public BaseRtpStringExtension {
  112. public:
  113. static const RTPExtensionType kId = kRtpExtensionRtpStreamId;
  114. static const char kUri[];
  115. };
  116. class RepairedRtpStreamId : public BaseRtpStringExtension {
  117. public:
  118. static const RTPExtensionType kId = kRtpExtensionRepairedRtpStreamId;
  119. static const char kUri[];
  120. };
  121. class RtpMid : public BaseRtpStringExtension {
  122. public:
  123. static const RTPExtensionType kId = kRtpExtensionMid;
  124. static const char kUri[];
  125. };
  126. #endif // MODULES_RTP_RTCP_SOURCE_RTP_HEADER_EXTENSIONS_H_