You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

rtp-header-extension.h 9.5KB

10 mesi fa
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. #ifndef _rtp_header_extension_h_
  2. #define _rtp_header_extension_h_
  3. #include <vector>
  4. #include <string>
  5. #include "rtp-ext.h"
  6. template <typename Extension, typename... Values>
  7. bool GetRtpExtensionWithMap(const void* data, const struct rtp_ext_data_t view[256], const uint8_t exts[256], Values... values) {
  8. uint8_t id = exts[Extension::Id];
  9. assert(0 == view[id].id || id == view[id].id);
  10. return 0 != id && id == view[id].id && Extension::Parse((const uint8_t*)data + view[id].off, (uint16_t)view[id].len, values...);
  11. }
  12. template <typename Extension, typename... Values>
  13. bool GetRtpExtension(const void* data, const struct rtp_ext_data_t view[256], Values... values) {
  14. uint8_t id = view[Extension::Id].id;
  15. assert(0 == id || id == Extension::Id);
  16. return 0 != id && Extension::Parse((const uint8_t*)data + view[id].off, (uint16_t)view[id].len, values...);
  17. }
  18. template <typename Extension, typename... Values>
  19. int SetRtpExtension(void* data, int bytes, const struct rtp_ext_data_t view[256], Values... values) {
  20. if (bytes < Extension::Size)
  21. return -1;
  22. return Extension::Write((uint8_t*)data, bytes, view[Extension::Id].id, values...);
  23. }
  24. class RtpExtensionSsrcAudioLevel
  25. {
  26. public:
  27. static const uint8_t Id = RTP_HDREXT_SSRC_AUDIO_LEVEL_ID;
  28. static const uint16_t Size = 1;
  29. static const char* Uri() {
  30. return rtp_ext_list()[Id].uri;
  31. }
  32. static bool Parse(const uint8_t* data, uint16_t bytes, uint8_t* activity, uint8_t* level) {
  33. return 0 == rtp_ext_ssrc_audio_level_parse(data, bytes, activity, level);
  34. }
  35. static int Write(uint8_t* data, uint16_t bytes, uint8_t activity, uint8_t level) {
  36. return rtp_ext_ssrc_audio_level_write(data, bytes, activity, level);
  37. }
  38. };
  39. class RtpExtensionCsrcAudioLevel
  40. {
  41. public:
  42. static const uint8_t Id = RTP_HDREXT_CSRC_AUDIO_LEVEL_ID;
  43. static const uint16_t Size = 15;
  44. static const char* Uri() {
  45. return rtp_ext_list()[Id].uri;
  46. }
  47. static bool Parse(const uint8_t* data, uint16_t bytes, uint8_t* levels, int num) {
  48. return 0 == rtp_ext_csrc_audio_level_parse(data, bytes, levels, num);
  49. }
  50. static int Write(uint8_t* data, uint16_t bytes, const uint8_t* levels, int num) {
  51. return rtp_ext_csrc_audio_level_write(data, bytes, levels, num);
  52. }
  53. };
  54. class RtpExtensionFrameMarking
  55. {
  56. public:
  57. static const uint8_t Id = RTP_HDREXT_FRAME_MARKING_ID;
  58. static const uint16_t Size = 3;
  59. static const char* Uri() {
  60. return rtp_ext_list()[Id].uri;
  61. }
  62. static bool Parse(const uint8_t* data, uint16_t bytes, rtp_ext_frame_marking_t* ext) {
  63. return 0 == rtp_ext_frame_marking_parse(data, bytes, ext);
  64. }
  65. static int Write(uint8_t* data, uint16_t bytes, const rtp_ext_frame_marking_t* ext) {
  66. return rtp_ext_frame_marking_write(data, bytes, ext);
  67. }
  68. };
  69. class RtpExtensionString
  70. {
  71. public:
  72. static bool Parse(const uint8_t* data, uint16_t bytes, std::string& rid) {
  73. rid.reserve(bytes);
  74. return 0 == rtp_ext_string_parse(data, bytes, (char*)rid.data(), rid.capacity());
  75. }
  76. static int Write(uint8_t* data, uint16_t bytes, const char* v, int n) {
  77. return rtp_ext_string_write(data, bytes, v, n);
  78. }
  79. };
  80. class RtpExtensionSdesMid : public RtpExtensionString
  81. {
  82. public:
  83. static const uint8_t Id = RTP_HDREXT_SDES_MID_ID;
  84. static const uint16_t Size = 255;
  85. static const char* Uri() {
  86. return rtp_ext_list()[Id].uri;
  87. }
  88. };
  89. class RtpExtensionSdesRtpStreamId: public RtpExtensionString
  90. {
  91. public:
  92. static const uint8_t Id = RTP_HDREXT_SDES_RTP_STREAM_ID;
  93. static const uint16_t Size = 255;
  94. static const char* Uri() {
  95. return rtp_ext_list()[Id].uri;
  96. }
  97. };
  98. class RtpExtensionSdesRepairedRtpStreamId : public RtpExtensionString
  99. {
  100. public:
  101. static const uint8_t Id = RTP_HDREXT_SDES_REPAIRED_RTP_STREAM_ID;
  102. static const uint16_t Size = 255;
  103. static const char* Uri() {
  104. return rtp_ext_list()[Id].uri;
  105. }
  106. };
  107. class RtpExtensionTransmissionOffset
  108. {
  109. public:
  110. static const uint8_t Id = RTP_HDREXT_TOFFSET_ID;
  111. static const uint16_t Size = 3;
  112. static const char* Uri() {
  113. return rtp_ext_list()[Id].uri;
  114. }
  115. static bool Parse(const uint8_t* data, uint16_t bytes, uint32_t* timestamp) {
  116. return 0 == rtp_ext_toffset_parse(data, bytes, timestamp);
  117. }
  118. static int Write(uint8_t* data, uint16_t bytes, uint32_t timestamp) {
  119. return rtp_ext_toffset_write(data, bytes, timestamp);
  120. }
  121. };
  122. class RtpExtensionVideoOrientation
  123. {
  124. public:
  125. static const uint8_t Id = RTP_HDREXT_VIDEO_ORIENTATION_ID;
  126. static const uint16_t Size = 1;
  127. static const char* Uri() {
  128. return rtp_ext_list()[Id].uri;
  129. }
  130. static bool Parse(const uint8_t* data, uint16_t bytes, rtp_ext_video_orientation_t* ext) {
  131. return 0 == rtp_ext_video_orientation_parse(data, bytes, ext);
  132. }
  133. static int Write(uint8_t* data, uint16_t bytes, const rtp_ext_video_orientation_t* ext) {
  134. return rtp_ext_video_orientation_write(data, bytes, ext);
  135. }
  136. };
  137. class RtpExtensionAbsoluteSendTime
  138. {
  139. public:
  140. static const uint8_t Id = RTP_HDREXT_ABSOLUTE_SEND_TIME_ID;
  141. static const uint16_t Size = 3;
  142. static const char* Uri() {
  143. return rtp_ext_list()[Id].uri;
  144. }
  145. static bool Parse(const uint8_t* data, uint16_t bytes, uint64_t* ms) {
  146. return 0 == rtp_ext_abs_send_time_parse(data, bytes, ms);
  147. }
  148. static int Write(uint8_t* data, uint16_t bytes, uint64_t ms) {
  149. return rtp_ext_abs_send_time_write(data, bytes, ms);
  150. }
  151. };
  152. class RtpExtensionAbsoluteCaptureTime
  153. {
  154. public:
  155. static const uint8_t Id = RTP_HDREXT_ABSOLUTE_CAPTURE_TIME_ID;
  156. static const uint16_t Size = 16;
  157. static const char* Uri() {
  158. return rtp_ext_list()[Id].uri;
  159. }
  160. static bool Parse(const uint8_t* data, uint16_t bytes, rtp_ext_absolute_capture_time_t* ext) {
  161. return 0 == rtp_ext_absolute_capture_time_parse(data, bytes, ext);
  162. }
  163. static int Write(uint8_t* data, uint16_t bytes, const rtp_ext_absolute_capture_time_t* ext) {
  164. return rtp_ext_absolute_capture_time_write(data, bytes, ext);
  165. }
  166. };
  167. class RtpExtensionTransportSequenceNumber
  168. {
  169. public:
  170. static const uint8_t Id = RTP_HDREXT_TRANSPORT_WIDE_CC_ID;
  171. static const uint16_t Size = 4;
  172. static const char* Uri() {
  173. return rtp_ext_list()[Id].uri;
  174. }
  175. static bool Parse(const uint8_t* data, uint16_t bytes, rtp_ext_transport_wide_cc_t* ext) {
  176. return 0 == rtp_ext_transport_wide_cc_parse(data, bytes, ext);
  177. }
  178. static int Write(uint8_t* data, uint16_t bytes, const rtp_ext_transport_wide_cc_t* ext) {
  179. return rtp_ext_transport_wide_cc_write(data, bytes, ext);
  180. }
  181. };
  182. class RtpExtensionVideoTiming
  183. {
  184. public:
  185. static const uint8_t Id = RTP_HDREXT_VIDEO_TIMING_ID;
  186. static const uint16_t Size = 13;
  187. static const char* Uri() {
  188. return rtp_ext_list()[Id].uri;
  189. }
  190. static bool Parse(const uint8_t* data, uint16_t bytes, rtp_ext_video_timing_t* ext) {
  191. return 0 == rtp_ext_video_timing_parse(data, bytes, ext);
  192. }
  193. static int Write(uint8_t* data, uint16_t bytes, const rtp_ext_video_timing_t* ext) {
  194. return rtp_ext_video_timing_write(data, bytes, ext);
  195. }
  196. };
  197. class RtpExtensionPlayoutDelay
  198. {
  199. public:
  200. static const uint8_t Id = RTP_HDREXT_PLAYOUT_DELAY_ID;
  201. static const uint16_t Size = 3;
  202. static const char* Uri() {
  203. return rtp_ext_list()[Id].uri;
  204. }
  205. static bool Parse(const uint8_t* data, uint16_t bytes, rtp_ext_playout_delay_t* ext) {
  206. return 0 == rtp_ext_playout_delay_parse(data, bytes, ext);
  207. }
  208. static int Write(uint8_t* data, uint16_t bytes, const rtp_ext_playout_delay_t* ext) {
  209. return rtp_ext_playout_delay_write(data, bytes, ext);
  210. }
  211. };
  212. class RtpExtensionColorSpace
  213. {
  214. public:
  215. static const uint8_t Id = RTP_HDREXT_COLOR_SPACE_ID;
  216. static const uint16_t Size = 28;
  217. static const char* Uri() {
  218. return rtp_ext_list()[Id].uri;
  219. }
  220. static bool Parse(const uint8_t* data, uint16_t bytes, rtp_ext_color_space_t* ext) {
  221. return 0 == rtp_ext_color_space_parse(data, bytes, ext);
  222. }
  223. static int Write(uint8_t* data, uint16_t bytes, const rtp_ext_color_space_t* ext) {
  224. return rtp_ext_color_space_write(data, bytes, ext);
  225. }
  226. };
  227. class RtpExtensionVideoContentType
  228. {
  229. public:
  230. static const uint8_t Id = RTP_HDREXT_VIDEO_CONTENT_TYPE_ID;
  231. static const uint16_t Size = 1;
  232. static const char* Uri() {
  233. return rtp_ext_list()[Id].uri;
  234. }
  235. static bool Parse(const uint8_t* data, uint16_t bytes, uint8_t* ext) {
  236. return 0 == rtp_ext_video_content_type_parse(data, bytes, ext);
  237. }
  238. static int Write(uint8_t* data, uint16_t bytes, uint8_t ext) {
  239. return rtp_ext_video_content_type_write(data, bytes, ext);
  240. }
  241. };
  242. class RtpExtensionInbandComfortNoise
  243. {
  244. public:
  245. static const uint8_t Id = RTP_HDREXT_INBAND_CN_ID;
  246. static const uint16_t Size = 1;
  247. static const char* Uri() {
  248. return rtp_ext_list()[Id].uri;
  249. }
  250. static bool Parse(const uint8_t* data, uint16_t bytes, uint8_t* level) {
  251. return 0 == rtp_ext_inband_cn_parse(data, bytes, level);
  252. }
  253. static int Write(uint8_t* data, uint16_t bytes, uint8_t level) {
  254. return rtp_ext_inband_cn_write(data, bytes, level);
  255. }
  256. };
  257. class RtpExtensionVideoFrameTracking
  258. {
  259. public:
  260. static const uint8_t Id = RTP_HDREXT_VIDEO_FRAME_TRACKING_ID;
  261. static const uint16_t Size = 2;
  262. static const char* Uri() {
  263. return rtp_ext_list()[Id].uri;
  264. }
  265. static bool Parse(const uint8_t* data, uint16_t bytes, uint16_t* ext) {
  266. return 0 == rtp_ext_video_frame_tracking_id_parse(data, bytes, ext);
  267. }
  268. static int Write(uint8_t* data, uint16_t bytes, uint16_t ext) {
  269. return rtp_ext_video_frame_tracking_id_write(data, bytes, ext);
  270. }
  271. };
  272. class RtpExtensionVideoLayersAllocation
  273. {
  274. public:
  275. static const uint8_t Id = RTP_HDREXT_VIDEO_LAYERS_ALLOCATION_ID;
  276. static const uint16_t Size = 2;
  277. static const char* Uri() {
  278. return rtp_ext_list()[Id].uri;
  279. }
  280. static bool Parse(const uint8_t* data, uint16_t bytes, rtp_ext_video_layers_allocation_t* ext) {
  281. return 0 == rtp_ext_video_layers_allocation_parse(data, bytes, ext);
  282. }
  283. static int Write(uint8_t* data, uint16_t bytes, const rtp_ext_video_layers_allocation_t* ext) {
  284. return rtp_ext_video_layers_allocation_write(data, bytes, ext);
  285. }
  286. };
  287. #endif /* !_rtp_header_extension_h_ */