werift 0.18.13 → 0.18.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/lib/common/src/binary.js.map +1 -1
  2. package/lib/common/src/index.d.ts +0 -1
  3. package/lib/common/src/index.js +0 -1
  4. package/lib/common/src/index.js.map +1 -1
  5. package/lib/dtls/src/client.js.map +1 -1
  6. package/lib/dtls/src/context/cipher.js +1 -1
  7. package/lib/dtls/src/context/cipher.js.map +1 -1
  8. package/lib/dtls/src/context/dtls.js.map +1 -1
  9. package/lib/dtls/src/context/transport.js.map +1 -1
  10. package/lib/dtls/src/flight/client/flight1.js.map +1 -1
  11. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  12. package/lib/dtls/src/flight/flight.js +1 -1
  13. package/lib/dtls/src/flight/flight.js.map +1 -1
  14. package/lib/dtls/src/flight/server/flight4.js.map +1 -1
  15. package/lib/dtls/src/flight/server/flight6.js.map +1 -1
  16. package/lib/dtls/src/handshake/extensions/ellipticCurves.js +1 -1
  17. package/lib/dtls/src/handshake/extensions/ellipticCurves.js.map +1 -1
  18. package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js +1 -1
  19. package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js.map +1 -1
  20. package/lib/dtls/src/handshake/extensions/renegotiationIndication.js +1 -1
  21. package/lib/dtls/src/handshake/extensions/renegotiationIndication.js.map +1 -1
  22. package/lib/dtls/src/handshake/extensions/signature.js +1 -1
  23. package/lib/dtls/src/handshake/extensions/signature.js.map +1 -1
  24. package/lib/dtls/src/handshake/extensions/useSrtp.js +1 -1
  25. package/lib/dtls/src/handshake/extensions/useSrtp.js.map +1 -1
  26. package/lib/dtls/src/handshake/message/alert.js +1 -1
  27. package/lib/dtls/src/handshake/message/alert.js.map +1 -1
  28. package/lib/dtls/src/handshake/message/certificate.js +1 -1
  29. package/lib/dtls/src/handshake/message/certificate.js.map +1 -1
  30. package/lib/dtls/src/handshake/message/changeCipherSpec.js +1 -1
  31. package/lib/dtls/src/handshake/message/changeCipherSpec.js.map +1 -1
  32. package/lib/dtls/src/handshake/message/client/certificateVerify.js +1 -1
  33. package/lib/dtls/src/handshake/message/client/certificateVerify.js.map +1 -1
  34. package/lib/dtls/src/handshake/message/client/hello.js +1 -1
  35. package/lib/dtls/src/handshake/message/client/hello.js.map +1 -1
  36. package/lib/dtls/src/handshake/message/client/keyExchange.js +1 -1
  37. package/lib/dtls/src/handshake/message/client/keyExchange.js.map +1 -1
  38. package/lib/dtls/src/handshake/message/finished.js.map +1 -1
  39. package/lib/dtls/src/handshake/message/server/certificateRequest.js +1 -1
  40. package/lib/dtls/src/handshake/message/server/certificateRequest.js.map +1 -1
  41. package/lib/dtls/src/handshake/message/server/hello.js +1 -1
  42. package/lib/dtls/src/handshake/message/server/hello.js.map +1 -1
  43. package/lib/dtls/src/handshake/message/server/helloDone.js +1 -1
  44. package/lib/dtls/src/handshake/message/server/helloDone.js.map +1 -1
  45. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js +1 -1
  46. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js.map +1 -1
  47. package/lib/dtls/src/handshake/message/server/keyExchange.js +1 -1
  48. package/lib/dtls/src/handshake/message/server/keyExchange.js.map +1 -1
  49. package/lib/dtls/src/handshake/random.js +1 -1
  50. package/lib/dtls/src/handshake/random.js.map +1 -1
  51. package/lib/dtls/src/record/message/fragment.js +1 -1
  52. package/lib/dtls/src/record/message/fragment.js.map +1 -1
  53. package/lib/dtls/src/record/message/header.js +2 -2
  54. package/lib/dtls/src/record/message/header.js.map +1 -1
  55. package/lib/dtls/src/record/message/plaintext.js +1 -1
  56. package/lib/dtls/src/record/message/plaintext.js.map +1 -1
  57. package/lib/dtls/src/server.js.map +1 -1
  58. package/lib/dtls/src/socket.js.map +1 -1
  59. package/lib/dtls/src/transport.js.map +1 -1
  60. package/lib/ice/src/candidate.js.map +1 -1
  61. package/lib/ice/src/exceptions.js.map +1 -1
  62. package/lib/ice/src/helper.js.map +1 -1
  63. package/lib/ice/src/ice.js.map +1 -1
  64. package/lib/ice/src/stun/attributes.js.map +1 -1
  65. package/lib/ice/src/stun/message.js.map +1 -1
  66. package/lib/ice/src/stun/protocol.js.map +1 -1
  67. package/lib/ice/src/stun/transaction.js.map +1 -1
  68. package/lib/ice/src/transport.js.map +1 -1
  69. package/lib/ice/src/turn/protocol.js.map +1 -1
  70. package/lib/rtp/src/codec/av1.js +1 -1
  71. package/lib/rtp/src/codec/av1.js.map +1 -1
  72. package/lib/rtp/src/container/index.d.ts +2 -1
  73. package/lib/rtp/src/container/index.js +2 -1
  74. package/lib/rtp/src/container/index.js.map +1 -1
  75. package/lib/rtp/src/container/mp4/container.d.ts +66 -0
  76. package/lib/rtp/src/container/mp4/container.js +262 -0
  77. package/lib/rtp/src/container/mp4/container.js.map +1 -0
  78. package/lib/rtp/src/container/mp4/exp-golomb.d.ts +20 -0
  79. package/lib/rtp/src/container/mp4/exp-golomb.js +144 -0
  80. package/lib/rtp/src/container/mp4/exp-golomb.js.map +1 -0
  81. package/lib/rtp/src/container/mp4/h264.d.ts +42 -0
  82. package/lib/rtp/src/container/mp4/h264.js +240 -0
  83. package/lib/rtp/src/container/mp4/h264.js.map +1 -0
  84. package/lib/rtp/src/container/mp4/index.d.ts +2 -0
  85. package/lib/rtp/src/container/mp4/index.js +19 -0
  86. package/lib/rtp/src/container/mp4/index.js.map +1 -0
  87. package/lib/rtp/src/container/mp4/mp4box.d.ts +5 -0
  88. package/lib/rtp/src/container/mp4/mp4box.js +32 -0
  89. package/lib/rtp/src/container/mp4/mp4box.js.map +1 -0
  90. package/lib/rtp/src/container/mp4/sps-parser.d.ts +40 -0
  91. package/lib/rtp/src/container/mp4/sps-parser.js +291 -0
  92. package/lib/rtp/src/container/mp4/sps-parser.js.map +1 -0
  93. package/lib/rtp/src/container/ogg/index.d.ts +1 -0
  94. package/lib/rtp/src/container/ogg/index.js +18 -0
  95. package/lib/rtp/src/container/ogg/index.js.map +1 -0
  96. package/lib/rtp/src/container/ogg/parser.d.ts +12 -0
  97. package/lib/rtp/src/container/ogg/parser.js +100 -0
  98. package/lib/rtp/src/container/ogg/parser.js.map +1 -0
  99. package/lib/rtp/src/container/{webm.d.ts → webm/container.d.ts} +1 -1
  100. package/lib/rtp/src/container/{webm.js → webm/container.js} +6 -6
  101. package/lib/rtp/src/container/webm/container.js.map +1 -0
  102. package/lib/rtp/src/container/webm/ebml/ebml.js.map +1 -0
  103. package/lib/rtp/src/container/webm/ebml/id.js.map +1 -0
  104. package/lib/rtp/src/container/webm/ebml/index.js.map +1 -0
  105. package/lib/rtp/src/container/webm/ebml/typedArrayUtils.js.map +1 -0
  106. package/lib/rtp/src/container/webm/index.d.ts +2 -0
  107. package/lib/rtp/src/container/webm/index.js +19 -0
  108. package/lib/rtp/src/container/webm/index.js.map +1 -0
  109. package/lib/rtp/src/processor/depacketizer.js.map +1 -1
  110. package/lib/rtp/src/processor/dtx.d.ts +1 -1
  111. package/lib/rtp/src/processor/dtx.js.map +1 -1
  112. package/lib/rtp/src/processor/index.d.ts +2 -0
  113. package/lib/rtp/src/processor/index.js +2 -0
  114. package/lib/rtp/src/processor/index.js.map +1 -1
  115. package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
  116. package/lib/rtp/src/processor/jitterBufferTransformer.js.map +1 -1
  117. package/lib/rtp/src/processor/lipsync.js.map +1 -1
  118. package/lib/rtp/src/processor/lipsyncCallback.js.map +1 -1
  119. package/lib/rtp/src/processor/mp4.d.ts +50 -0
  120. package/lib/rtp/src/processor/mp4.js +162 -0
  121. package/lib/rtp/src/processor/mp4.js.map +1 -0
  122. package/lib/rtp/src/processor/mp4Callback.d.ts +12 -0
  123. package/lib/rtp/src/processor/mp4Callback.js +83 -0
  124. package/lib/rtp/src/processor/mp4Callback.js.map +1 -0
  125. package/lib/rtp/src/processor/mute.d.ts +1 -1
  126. package/lib/rtp/src/processor/mute.js +6 -3
  127. package/lib/rtp/src/processor/mute.js.map +1 -1
  128. package/lib/rtp/src/processor/muteCallback.js.map +1 -1
  129. package/lib/rtp/src/processor/nack.js +2 -3
  130. package/lib/rtp/src/processor/nack.js.map +1 -1
  131. package/lib/rtp/src/processor/ntpTime.d.ts +1 -1
  132. package/lib/rtp/src/processor/ntpTime.js.map +1 -1
  133. package/lib/rtp/src/processor/rtcpCallback.js.map +1 -1
  134. package/lib/rtp/src/processor/rtpCallback.js.map +1 -1
  135. package/lib/rtp/src/processor/rtpStream.js.map +1 -1
  136. package/lib/rtp/src/processor/rtpTime.js.map +1 -1
  137. package/lib/rtp/src/processor/webm.d.ts +1 -1
  138. package/lib/rtp/src/processor/webm.js +1 -1
  139. package/lib/rtp/src/processor/webm.js.map +1 -1
  140. package/lib/rtp/src/processor/webmCallback.d.ts +1 -1
  141. package/lib/rtp/src/processor/webmCallback.js.map +1 -1
  142. package/lib/rtp/src/processor/webmStream.d.ts +1 -1
  143. package/lib/rtp/src/processor/webmStream.js.map +1 -1
  144. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js +1 -1
  145. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js.map +1 -1
  146. package/lib/rtp/src/rtcp/psfb/index.js +1 -1
  147. package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
  148. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js +1 -1
  149. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js.map +1 -1
  150. package/lib/rtp/src/rtcp/psfb/remb.js +1 -1
  151. package/lib/rtp/src/rtcp/psfb/remb.js.map +1 -1
  152. package/lib/rtp/src/rtcp/rr.js +3 -7
  153. package/lib/rtp/src/rtcp/rr.js.map +1 -1
  154. package/lib/rtp/src/rtcp/rtpfb/index.js +1 -1
  155. package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
  156. package/lib/rtp/src/rtcp/rtpfb/nack.js +6 -13
  157. package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
  158. package/lib/rtp/src/rtcp/rtpfb/twcc.js +12 -8
  159. package/lib/rtp/src/rtcp/rtpfb/twcc.js.map +1 -1
  160. package/lib/rtp/src/rtcp/sdes.js +1 -1
  161. package/lib/rtp/src/rtcp/sdes.js.map +1 -1
  162. package/lib/rtp/src/rtcp/sr.js +2 -6
  163. package/lib/rtp/src/rtcp/sr.js.map +1 -1
  164. package/lib/rtp/src/rtp/headerExtension.d.ts +5 -0
  165. package/lib/rtp/src/rtp/headerExtension.js +35 -9
  166. package/lib/rtp/src/rtp/headerExtension.js.map +1 -1
  167. package/lib/rtp/src/rtp/red/encoder.js.map +1 -1
  168. package/lib/rtp/src/rtp/red/handler.js.map +1 -1
  169. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  170. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  171. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
  172. package/lib/rtp/src/srtp/cipher/index.js.map +1 -1
  173. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  174. package/lib/rtp/src/srtp/session.js.map +1 -1
  175. package/lib/rtp/src/srtp/srtcp.js.map +1 -1
  176. package/lib/rtp/src/srtp/srtp.js.map +1 -1
  177. package/lib/rtp/src/util.js.map +1 -1
  178. package/lib/sctp/src/chunk.js +17 -17
  179. package/lib/sctp/src/chunk.js.map +1 -1
  180. package/lib/sctp/src/param.js +3 -3
  181. package/lib/sctp/src/param.js.map +1 -1
  182. package/lib/sctp/src/sctp.js.map +1 -1
  183. package/lib/sctp/src/transport.js.map +1 -1
  184. package/lib/webrtc/src/const.js.map +1 -1
  185. package/lib/webrtc/src/dataChannel.js.map +1 -1
  186. package/lib/webrtc/src/media/parameters.js.map +1 -1
  187. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  188. package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
  189. package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
  190. package/lib/webrtc/src/media/router.js.map +1 -1
  191. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  192. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  193. package/lib/webrtc/src/media/rtpTransceiver.d.ts +1 -1
  194. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  195. package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -1
  196. package/lib/webrtc/src/media/track.js.map +1 -1
  197. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  198. package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
  199. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  200. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  201. package/lib/webrtc/src/peerConnection.js.map +1 -1
  202. package/lib/webrtc/src/sdp.js.map +1 -1
  203. package/lib/webrtc/src/transport/dtls.d.ts +1 -1
  204. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  205. package/lib/webrtc/src/transport/ice.d.ts +2 -2
  206. package/lib/webrtc/src/transport/ice.js.map +1 -1
  207. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  208. package/lib/webrtc/src/types/domain.d.ts +2 -2
  209. package/lib/webrtc/src/types/domain.js.map +1 -1
  210. package/lib/webrtc/src/utils.d.ts +1 -0
  211. package/lib/webrtc/src/utils.js +9 -1
  212. package/lib/webrtc/src/utils.js.map +1 -1
  213. package/package.json +5 -3
  214. package/src/const.ts +1 -1
  215. package/src/dataChannel.ts +3 -3
  216. package/src/media/parameters.ts +3 -3
  217. package/src/media/receiver/nack.ts +7 -4
  218. package/src/media/receiver/receiverTwcc.ts +5 -5
  219. package/src/media/receiver/statistics.ts +1 -1
  220. package/src/media/router.ts +5 -5
  221. package/src/media/rtpReceiver.ts +9 -9
  222. package/src/media/rtpSender.ts +8 -8
  223. package/src/media/rtpTransceiver.ts +3 -3
  224. package/src/media/sender/senderBWE.ts +2 -2
  225. package/src/media/track.ts +1 -1
  226. package/src/nonstandard/recorder/index.ts +1 -1
  227. package/src/nonstandard/recorder/writer/index.ts +1 -1
  228. package/src/nonstandard/recorder/writer/webm.ts +2 -2
  229. package/src/nonstandard/userMedia.ts +1 -1
  230. package/src/peerConnection.ts +52 -52
  231. package/src/sdp.ts +27 -21
  232. package/src/transport/dtls.ts +13 -10
  233. package/src/transport/ice.ts +6 -6
  234. package/src/transport/sctp.ts +4 -4
  235. package/src/types/domain.ts +2 -2
  236. package/src/utils.ts +11 -2
  237. package/lib/common/src/array.d.ts +0 -1
  238. package/lib/common/src/array.js +0 -15
  239. package/lib/common/src/array.js.map +0 -1
  240. package/lib/rtp/src/container/ebml/ebml.js.map +0 -1
  241. package/lib/rtp/src/container/ebml/id.js.map +0 -1
  242. package/lib/rtp/src/container/ebml/index.js.map +0 -1
  243. package/lib/rtp/src/container/ebml/typedArrayUtils.js.map +0 -1
  244. package/lib/rtp/src/container/webm.js.map +0 -1
  245. /package/lib/rtp/src/container/{ebml → webm/ebml}/ebml.d.ts +0 -0
  246. /package/lib/rtp/src/container/{ebml → webm/ebml}/ebml.js +0 -0
  247. /package/lib/rtp/src/container/{ebml → webm/ebml}/id.d.ts +0 -0
  248. /package/lib/rtp/src/container/{ebml → webm/ebml}/id.js +0 -0
  249. /package/lib/rtp/src/container/{ebml → webm/ebml}/index.d.ts +0 -0
  250. /package/lib/rtp/src/container/{ebml → webm/ebml}/index.js +0 -0
  251. /package/lib/rtp/src/container/{ebml → webm/ebml}/typedArrayUtils.d.ts +0 -0
  252. /package/lib/rtp/src/container/{ebml → webm/ebml}/typedArrayUtils.js +0 -0
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.PacketResult = exports.PacketStatus = exports.PacketChunk = exports.RecvDelta = exports.StatusVectorChunk = exports.RunLengthChunk = exports.TransportWideCC = void 0;
7
7
  const debug_1 = __importDefault(require("debug"));
8
- const range_1 = __importDefault(require("lodash/range"));
9
8
  const src_1 = require("../../../../common/src");
10
9
  const header_1 = require("../header");
11
10
  const log = (0, debug_1.default)("werift/rtp/rtcp/rtpfb/twcc");
@@ -134,9 +133,9 @@ class TransportWideCC {
134
133
  PacketStatus.TypeTCCPacketReceivedSmallDelta ||
135
134
  packetStatus.packetStatus ===
136
135
  PacketStatus.TypeTCCPacketReceivedLargeDelta) {
137
- (0, range_1.default)(packetNumberToProcess).forEach(() => {
136
+ for (let _ = 0; _ < packetNumberToProcess; _++) {
138
137
  recvDeltas.push(new RecvDelta({ type: packetStatus.packetStatus }));
139
- });
138
+ }
140
139
  }
141
140
  processedPacketNum += packetNumberToProcess;
142
141
  }
@@ -250,13 +249,13 @@ class TransportWideCC {
250
249
  return results;
251
250
  }
252
251
  }
253
- exports.TransportWideCC = TransportWideCC;
254
252
  Object.defineProperty(TransportWideCC, "count", {
255
253
  enumerable: true,
256
254
  configurable: true,
257
255
  writable: true,
258
256
  value: 15
259
257
  });
258
+ exports.TransportWideCC = TransportWideCC;
260
259
  // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
261
260
  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
262
261
  // |T| S | Run Length |
@@ -338,14 +337,19 @@ class StatusVectorChunk {
338
337
  const type = PacketChunk.TypeTCCStatusVectorChunk;
339
338
  let symbolSize = (0, src_1.getBit)(data[0], 1, 1);
340
339
  const symbolList = [];
340
+ function range(n, cb) {
341
+ for (let i = 0; i < n; i++) {
342
+ cb(i);
343
+ }
344
+ }
341
345
  switch (symbolSize) {
342
346
  case 0:
343
- (0, range_1.default)(6).forEach((_, i) => symbolList.push((0, src_1.getBit)(data[0], 2 + i, 1)));
344
- (0, range_1.default)(8).forEach((_, i) => symbolList.push((0, src_1.getBit)(data[1], i, 1)));
347
+ range(6, (i) => symbolList.push((0, src_1.getBit)(data[0], 2 + i, 1)));
348
+ range(8, (i) => symbolList.push((0, src_1.getBit)(data[1], i, 1)));
345
349
  break;
346
350
  case 1:
347
- (0, range_1.default)(3).forEach((i) => symbolList.push((0, src_1.getBit)(data[0], 2 + i * 2, 2)));
348
- (0, range_1.default)(4).forEach((i) => symbolList.push((0, src_1.getBit)(data[1], i * 2, 2)));
351
+ range(3, (i) => symbolList.push((0, src_1.getBit)(data[0], 2 + i * 2, 2)));
352
+ range(4, (i) => symbolList.push((0, src_1.getBit)(data[1], i * 2, 2)));
349
353
  break;
350
354
  default:
351
355
  symbolSize = ((0, src_1.getBit)(data[0], 2, 6) << 8) + data[1];
@@ -1 +1 @@
1
- {"version":3,"file":"twcc.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/rtpfb/twcc.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport range from \"lodash/range\";\n\nimport {\n BitWriter2,\n bufferReader,\n bufferWriter,\n getBit,\n} from \"../../../../common/src\";\nimport { RtcpHeader } from \"../header\";\n\nconst log = debug(\"werift/rtp/rtcp/rtpfb/twcc\");\n\n/* RTP Extensions for Transport-wide Congestion Control\n * draft-holmer-rmcat-transport-wide-cc-extensions-01\n\n 0 1 2 3\n 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n |V=2|P| FMT=15 | PT=205 | length |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | SSRC of packet sender |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | SSRC of media source |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | base sequence number | packet status count |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | reference time | fb pkt. count |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | packet chunk | packet chunk |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n . .\n . .\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | packet chunk | recv delta | recv delta |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n . .\n . .\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | recv delta | recv delta | zero padding |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class TransportWideCC {\n static count = 15;\n count = TransportWideCC.count;\n length = 2;\n\n senderSsrc!: number;\n mediaSourceSsrc!: number;\n baseSequenceNumber!: number;\n packetStatusCount!: number;\n /** 24bit multiples of 64ms */\n referenceTime!: number;\n fbPktCount!: number;\n packetChunks: (RunLengthChunk | StatusVectorChunk)[] = [];\n recvDeltas: RecvDelta[] = [];\n header!: RtcpHeader;\n\n constructor(props: Partial<TransportWideCC> = {}) {\n Object.assign(this, props);\n if (!this.header) {\n this.header = new RtcpHeader({\n type: 205,\n count: this.count,\n version: 2,\n });\n }\n }\n\n static deSerialize(data: Buffer, header: RtcpHeader) {\n const [\n senderSsrc,\n mediaSsrc,\n baseSequenceNumber,\n packetStatusCount,\n referenceTime,\n fbPktCount,\n ] = bufferReader(data, [4, 4, 2, 2, 3, 1]);\n const packetChunks: (RunLengthChunk | StatusVectorChunk)[] = [];\n const recvDeltas: RecvDelta[] = [];\n\n let packetStatusPos = 16;\n for (let processedPacketNum = 0; processedPacketNum < packetStatusCount; ) {\n const type = getBit(\n data.slice(packetStatusPos, packetStatusPos + 1)[0],\n 0,\n 1\n );\n let iPacketStatus: RunLengthChunk | StatusVectorChunk | undefined;\n switch (type) {\n case PacketChunk.TypeTCCRunLengthChunk:\n {\n const packetStatus = RunLengthChunk.deSerialize(\n data.slice(packetStatusPos, packetStatusPos + 2)\n );\n iPacketStatus = packetStatus;\n const packetNumberToProcess = Math.min(\n packetStatusCount - processedPacketNum,\n packetStatus.runLength\n );\n if (\n packetStatus.packetStatus ===\n PacketStatus.TypeTCCPacketReceivedSmallDelta ||\n packetStatus.packetStatus ===\n PacketStatus.TypeTCCPacketReceivedLargeDelta\n ) {\n range(packetNumberToProcess).forEach(() => {\n recvDeltas.push(\n new RecvDelta({ type: packetStatus.packetStatus as any })\n );\n });\n }\n processedPacketNum += packetNumberToProcess;\n }\n break;\n case PacketChunk.TypeTCCStatusVectorChunk:\n {\n const packetStatus = StatusVectorChunk.deSerialize(\n data.slice(packetStatusPos, packetStatusPos + 2)\n );\n iPacketStatus = packetStatus;\n if (packetStatus.symbolSize === 0) {\n packetStatus.symbolList.forEach((v) => {\n if (v === PacketStatus.TypeTCCPacketReceivedSmallDelta) {\n recvDeltas.push(\n new RecvDelta({\n type: PacketStatus.TypeTCCPacketReceivedSmallDelta,\n })\n );\n }\n });\n }\n if (packetStatus.symbolSize === 1) {\n packetStatus.symbolList.forEach((v) => {\n if (\n v === PacketStatus.TypeTCCPacketReceivedSmallDelta ||\n v === PacketStatus.TypeTCCPacketReceivedLargeDelta\n ) {\n recvDeltas.push(\n new RecvDelta({\n type: v,\n })\n );\n }\n });\n }\n processedPacketNum += packetStatus.symbolList.length;\n }\n break;\n }\n if (!iPacketStatus) throw new Error();\n packetStatusPos += 2;\n packetChunks.push(iPacketStatus);\n }\n\n let recvDeltaPos = packetStatusPos;\n recvDeltas.forEach((delta) => {\n if (delta.type === PacketStatus.TypeTCCPacketReceivedSmallDelta) {\n delta.deSerialize(data.slice(recvDeltaPos, recvDeltaPos + 1));\n recvDeltaPos++;\n }\n if (delta.type === PacketStatus.TypeTCCPacketReceivedLargeDelta) {\n delta.deSerialize(data.slice(recvDeltaPos, recvDeltaPos + 2));\n recvDeltaPos += 2;\n }\n });\n\n return new TransportWideCC({\n senderSsrc,\n mediaSourceSsrc: mediaSsrc,\n baseSequenceNumber,\n packetStatusCount,\n referenceTime,\n fbPktCount,\n recvDeltas,\n packetChunks,\n header,\n });\n }\n\n serialize() {\n const constBuf = bufferWriter(\n [4, 4, 2, 2, 3, 1],\n [\n this.senderSsrc,\n this.mediaSourceSsrc,\n this.baseSequenceNumber,\n this.packetStatusCount,\n this.referenceTime,\n this.fbPktCount,\n ]\n );\n\n const chunks = Buffer.concat(\n this.packetChunks.map((chunk) => chunk.serialize())\n );\n\n const deltas = Buffer.concat(\n this.recvDeltas\n .map((delta) => {\n try {\n return delta.serialize();\n } catch (error: any) {\n log(error?.message);\n return undefined;\n }\n })\n .filter((v) => v) as Buffer[]\n );\n\n const buf = Buffer.concat([constBuf, chunks, deltas]);\n\n if (this.header.padding && buf.length % 4 !== 0) {\n const rest = 4 - (buf.length % 4);\n const padding = Buffer.alloc(rest);\n padding[padding.length - 1] = padding.length;\n\n this.header.length = Math.floor((buf.length + padding.length) / 4);\n return Buffer.concat([this.header.serialize(), buf, padding]);\n }\n\n this.header.length = Math.floor(buf.length / 4);\n return Buffer.concat([this.header.serialize(), buf]);\n }\n\n get packetResults(): PacketResult[] {\n const currentSequenceNumber = this.baseSequenceNumber - 1;\n const results = this.packetChunks\n .filter((v) => v instanceof RunLengthChunk)\n .map((chunk) => (chunk as RunLengthChunk).results(currentSequenceNumber))\n .flatMap((v) => v);\n\n let deltaIdx = 0;\n const referenceTime = BigInt(this.referenceTime) * 64n;\n let currentReceivedAtMs = referenceTime;\n\n for (const result of results) {\n const recvDelta = this.recvDeltas[deltaIdx];\n if (!result.received || !recvDelta) {\n continue;\n }\n currentReceivedAtMs += BigInt(recvDelta.delta) / 1000n;\n result.delta = recvDelta.delta;\n result.receivedAtMs = Number(currentReceivedAtMs);\n deltaIdx++;\n }\n return results;\n }\n}\n\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |T| S | Run Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class RunLengthChunk {\n type!: PacketChunk.TypeTCCRunLengthChunk;\n packetStatus!: PacketStatus;\n /** 13bit */\n runLength!: number;\n\n constructor(props: Partial<RunLengthChunk> = {}) {\n Object.assign(this, props);\n this.type = PacketChunk.TypeTCCRunLengthChunk;\n }\n\n static deSerialize(data: Buffer) {\n const packetStatus = getBit(data[0], 1, 2);\n const runLength = (getBit(data[0], 3, 5) << 8) + data[1];\n\n return new RunLengthChunk({ type: 0, packetStatus, runLength });\n }\n\n serialize() {\n const buf = new BitWriter2(16)\n .set(0)\n .set(this.packetStatus, 2)\n .set(this.runLength, 13).buffer;\n\n return buf;\n }\n\n results(currentSequenceNumber: number) {\n const received =\n this.packetStatus === PacketStatus.TypeTCCPacketReceivedSmallDelta ||\n this.packetStatus === PacketStatus.TypeTCCPacketReceivedLargeDelta;\n\n const results: PacketResult[] = [];\n for (let i = 0; i <= this.runLength; ++i) {\n results.push(\n new PacketResult({ sequenceNumber: ++currentSequenceNumber, received })\n );\n }\n return results;\n }\n}\n\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |T|S| symbol list |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class StatusVectorChunk {\n type!: number;\n symbolSize!: number;\n symbolList: number[] = [];\n\n constructor(props: Partial<StatusVectorChunk> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(data: Buffer) {\n const type = PacketChunk.TypeTCCStatusVectorChunk;\n let symbolSize = getBit(data[0], 1, 1);\n const symbolList: number[] = [];\n\n switch (symbolSize) {\n case 0:\n range(6).forEach((_, i) => symbolList.push(getBit(data[0], 2 + i, 1)));\n range(8).forEach((_, i) => symbolList.push(getBit(data[1], i, 1)));\n break;\n case 1:\n range(3).forEach((i) => symbolList.push(getBit(data[0], 2 + i * 2, 2)));\n range(4).forEach((i) => symbolList.push(getBit(data[1], i * 2, 2)));\n break;\n default:\n symbolSize = (getBit(data[0], 2, 6) << 8) + data[1];\n }\n\n return new StatusVectorChunk({ type, symbolSize, symbolList });\n }\n\n serialize() {\n const buf = Buffer.alloc(2);\n\n const writer = new BitWriter2(16).set(1).set(this.symbolSize);\n const bits = this.symbolSize === 0 ? 1 : 2;\n\n this.symbolList.forEach((v) => {\n writer.set(v, bits);\n });\n buf.writeUInt16BE(writer.value);\n return buf;\n }\n}\n\nexport class RecvDelta {\n /**optional (If undefined, it will be set automatically.)*/\n type?:\n | PacketStatus.TypeTCCPacketReceivedSmallDelta\n | PacketStatus.TypeTCCPacketReceivedLargeDelta;\n /**micro sec */\n delta!: number;\n\n constructor(props: Partial<RecvDelta> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(data: Buffer) {\n let type: number | undefined;\n let delta: number | undefined;\n\n if (data.length === 1) {\n type = PacketStatus.TypeTCCPacketReceivedSmallDelta;\n delta = 250 * data[0];\n } else if (data.length === 2) {\n type = PacketStatus.TypeTCCPacketReceivedLargeDelta;\n delta = 250 * data.readInt16BE();\n }\n\n if (type === undefined || delta === undefined) throw new Error();\n\n return new RecvDelta({ type, delta });\n }\n\n deSerialize(data: Buffer) {\n const res = RecvDelta.deSerialize(data);\n this.delta = res.delta;\n }\n\n parsed = false; // todo refactor\n parseDelta() {\n this.delta = Math.floor(this.delta / 250);\n\n if (this.delta < 0 || this.delta > 255) {\n if (this.delta > 32767) this.delta = 32767; // maxInt16\n if (this.delta < -32768) this.delta = -32768; // minInt16\n if (!this.type) this.type = PacketStatus.TypeTCCPacketReceivedLargeDelta;\n } else {\n if (!this.type) this.type = PacketStatus.TypeTCCPacketReceivedSmallDelta;\n }\n this.parsed = true;\n }\n\n serialize() {\n if (!this.parsed) this.parseDelta();\n if (this.type === PacketStatus.TypeTCCPacketReceivedSmallDelta) {\n const buf = Buffer.alloc(1);\n buf.writeUInt8(this.delta);\n return buf;\n } else if (this.type === PacketStatus.TypeTCCPacketReceivedLargeDelta) {\n const buf = Buffer.alloc(2);\n buf.writeInt16BE(this.delta);\n return buf;\n }\n\n throw new Error(\"errDeltaExceedLimit \" + this.delta + \" \" + this.type);\n }\n}\n\nexport enum PacketChunk {\n TypeTCCRunLengthChunk,\n TypeTCCStatusVectorChunk,\n packetStatusChunkLength,\n}\n\nexport enum PacketStatus {\n TypeTCCPacketNotReceived,\n TypeTCCPacketReceivedSmallDelta,\n TypeTCCPacketReceivedLargeDelta,\n TypeTCCPacketReceivedWithoutDelta,\n}\n\nexport class PacketResult {\n sequenceNumber = 0;\n delta = 0;\n received = false;\n receivedAtMs = 0;\n constructor(props: Partial<PacketResult>) {\n Object.assign(this, props);\n }\n}\n"]}
1
+ {"version":3,"file":"twcc.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/rtpfb/twcc.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\n\nimport {\n BitWriter2,\n bufferReader,\n bufferWriter,\n getBit,\n} from \"../../../../common/src\";\nimport { RtcpHeader } from \"../header\";\n\nconst log = debug(\"werift/rtp/rtcp/rtpfb/twcc\");\n\n/* RTP Extensions for Transport-wide Congestion Control\n * draft-holmer-rmcat-transport-wide-cc-extensions-01\n\n 0 1 2 3\n 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n |V=2|P| FMT=15 | PT=205 | length |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | SSRC of packet sender |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | SSRC of media source |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | base sequence number | packet status count |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | reference time | fb pkt. count |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | packet chunk | packet chunk |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n . .\n . .\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | packet chunk | recv delta | recv delta |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n . .\n . .\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n | recv delta | recv delta | zero padding |\n +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class TransportWideCC {\n static count = 15;\n count = TransportWideCC.count;\n length = 2;\n\n senderSsrc!: number;\n mediaSourceSsrc!: number;\n baseSequenceNumber!: number;\n packetStatusCount!: number;\n /** 24bit multiples of 64ms */\n referenceTime!: number;\n fbPktCount!: number;\n packetChunks: (RunLengthChunk | StatusVectorChunk)[] = [];\n recvDeltas: RecvDelta[] = [];\n header!: RtcpHeader;\n\n constructor(props: Partial<TransportWideCC> = {}) {\n Object.assign(this, props);\n if (!this.header) {\n this.header = new RtcpHeader({\n type: 205,\n count: this.count,\n version: 2,\n });\n }\n }\n\n static deSerialize(data: Buffer, header: RtcpHeader) {\n const [\n senderSsrc,\n mediaSsrc,\n baseSequenceNumber,\n packetStatusCount,\n referenceTime,\n fbPktCount,\n ] = bufferReader(data, [4, 4, 2, 2, 3, 1]);\n const packetChunks: (RunLengthChunk | StatusVectorChunk)[] = [];\n const recvDeltas: RecvDelta[] = [];\n\n let packetStatusPos = 16;\n for (let processedPacketNum = 0; processedPacketNum < packetStatusCount; ) {\n const type = getBit(\n data.slice(packetStatusPos, packetStatusPos + 1)[0],\n 0,\n 1\n );\n let iPacketStatus: RunLengthChunk | StatusVectorChunk | undefined;\n switch (type) {\n case PacketChunk.TypeTCCRunLengthChunk:\n {\n const packetStatus = RunLengthChunk.deSerialize(\n data.slice(packetStatusPos, packetStatusPos + 2)\n );\n iPacketStatus = packetStatus;\n const packetNumberToProcess = Math.min(\n packetStatusCount - processedPacketNum,\n packetStatus.runLength\n );\n if (\n packetStatus.packetStatus ===\n PacketStatus.TypeTCCPacketReceivedSmallDelta ||\n packetStatus.packetStatus ===\n PacketStatus.TypeTCCPacketReceivedLargeDelta\n ) {\n for (let _ = 0; _ < packetNumberToProcess; _++) {\n recvDeltas.push(\n new RecvDelta({ type: packetStatus.packetStatus as any })\n );\n }\n }\n processedPacketNum += packetNumberToProcess;\n }\n break;\n case PacketChunk.TypeTCCStatusVectorChunk:\n {\n const packetStatus = StatusVectorChunk.deSerialize(\n data.slice(packetStatusPos, packetStatusPos + 2)\n );\n iPacketStatus = packetStatus;\n if (packetStatus.symbolSize === 0) {\n packetStatus.symbolList.forEach((v) => {\n if (v === PacketStatus.TypeTCCPacketReceivedSmallDelta) {\n recvDeltas.push(\n new RecvDelta({\n type: PacketStatus.TypeTCCPacketReceivedSmallDelta,\n })\n );\n }\n });\n }\n if (packetStatus.symbolSize === 1) {\n packetStatus.symbolList.forEach((v) => {\n if (\n v === PacketStatus.TypeTCCPacketReceivedSmallDelta ||\n v === PacketStatus.TypeTCCPacketReceivedLargeDelta\n ) {\n recvDeltas.push(\n new RecvDelta({\n type: v,\n })\n );\n }\n });\n }\n processedPacketNum += packetStatus.symbolList.length;\n }\n break;\n }\n if (!iPacketStatus) throw new Error();\n packetStatusPos += 2;\n packetChunks.push(iPacketStatus);\n }\n\n let recvDeltaPos = packetStatusPos;\n recvDeltas.forEach((delta) => {\n if (delta.type === PacketStatus.TypeTCCPacketReceivedSmallDelta) {\n delta.deSerialize(data.slice(recvDeltaPos, recvDeltaPos + 1));\n recvDeltaPos++;\n }\n if (delta.type === PacketStatus.TypeTCCPacketReceivedLargeDelta) {\n delta.deSerialize(data.slice(recvDeltaPos, recvDeltaPos + 2));\n recvDeltaPos += 2;\n }\n });\n\n return new TransportWideCC({\n senderSsrc,\n mediaSourceSsrc: mediaSsrc,\n baseSequenceNumber,\n packetStatusCount,\n referenceTime,\n fbPktCount,\n recvDeltas,\n packetChunks,\n header,\n });\n }\n\n serialize() {\n const constBuf = bufferWriter(\n [4, 4, 2, 2, 3, 1],\n [\n this.senderSsrc,\n this.mediaSourceSsrc,\n this.baseSequenceNumber,\n this.packetStatusCount,\n this.referenceTime,\n this.fbPktCount,\n ]\n );\n\n const chunks = Buffer.concat(\n this.packetChunks.map((chunk) => chunk.serialize())\n );\n\n const deltas = Buffer.concat(\n this.recvDeltas\n .map((delta) => {\n try {\n return delta.serialize();\n } catch (error: any) {\n log(error?.message);\n return undefined;\n }\n })\n .filter((v) => v) as Buffer[]\n );\n\n const buf = Buffer.concat([constBuf, chunks, deltas]);\n\n if (this.header.padding && buf.length % 4 !== 0) {\n const rest = 4 - (buf.length % 4);\n const padding = Buffer.alloc(rest);\n padding[padding.length - 1] = padding.length;\n\n this.header.length = Math.floor((buf.length + padding.length) / 4);\n return Buffer.concat([this.header.serialize(), buf, padding]);\n }\n\n this.header.length = Math.floor(buf.length / 4);\n return Buffer.concat([this.header.serialize(), buf]);\n }\n\n get packetResults(): PacketResult[] {\n const currentSequenceNumber = this.baseSequenceNumber - 1;\n const results = this.packetChunks\n .filter((v) => v instanceof RunLengthChunk)\n .map((chunk) => (chunk as RunLengthChunk).results(currentSequenceNumber))\n .flatMap((v) => v);\n\n let deltaIdx = 0;\n const referenceTime = BigInt(this.referenceTime) * 64n;\n let currentReceivedAtMs = referenceTime;\n\n for (const result of results) {\n const recvDelta = this.recvDeltas[deltaIdx];\n if (!result.received || !recvDelta) {\n continue;\n }\n currentReceivedAtMs += BigInt(recvDelta.delta) / 1000n;\n result.delta = recvDelta.delta;\n result.receivedAtMs = Number(currentReceivedAtMs);\n deltaIdx++;\n }\n return results;\n }\n}\n\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |T| S | Run Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class RunLengthChunk {\n type!: PacketChunk.TypeTCCRunLengthChunk;\n packetStatus!: PacketStatus;\n /** 13bit */\n runLength!: number;\n\n constructor(props: Partial<RunLengthChunk> = {}) {\n Object.assign(this, props);\n this.type = PacketChunk.TypeTCCRunLengthChunk;\n }\n\n static deSerialize(data: Buffer) {\n const packetStatus = getBit(data[0], 1, 2);\n const runLength = (getBit(data[0], 3, 5) << 8) + data[1];\n\n return new RunLengthChunk({ type: 0, packetStatus, runLength });\n }\n\n serialize() {\n const buf = new BitWriter2(16)\n .set(0)\n .set(this.packetStatus, 2)\n .set(this.runLength, 13).buffer;\n\n return buf;\n }\n\n results(currentSequenceNumber: number) {\n const received =\n this.packetStatus === PacketStatus.TypeTCCPacketReceivedSmallDelta ||\n this.packetStatus === PacketStatus.TypeTCCPacketReceivedLargeDelta;\n\n const results: PacketResult[] = [];\n for (let i = 0; i <= this.runLength; ++i) {\n results.push(\n new PacketResult({ sequenceNumber: ++currentSequenceNumber, received })\n );\n }\n return results;\n }\n}\n\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |T|S| symbol list |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class StatusVectorChunk {\n type!: number;\n symbolSize!: number;\n symbolList: number[] = [];\n\n constructor(props: Partial<StatusVectorChunk> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(data: Buffer) {\n const type = PacketChunk.TypeTCCStatusVectorChunk;\n let symbolSize = getBit(data[0], 1, 1);\n const symbolList: number[] = [];\n\n function range(n: number, cb: (i: number) => void) {\n for (let i = 0; i < n; i++) {\n cb(i);\n }\n }\n\n switch (symbolSize) {\n case 0:\n range(6, (i) => symbolList.push(getBit(data[0], 2 + i, 1)));\n range(8, (i) => symbolList.push(getBit(data[1], i, 1)));\n break;\n case 1:\n range(3, (i) => symbolList.push(getBit(data[0], 2 + i * 2, 2)));\n range(4, (i) => symbolList.push(getBit(data[1], i * 2, 2)));\n break;\n default:\n symbolSize = (getBit(data[0], 2, 6) << 8) + data[1];\n }\n\n return new StatusVectorChunk({ type, symbolSize, symbolList });\n }\n\n serialize() {\n const buf = Buffer.alloc(2);\n\n const writer = new BitWriter2(16).set(1).set(this.symbolSize);\n const bits = this.symbolSize === 0 ? 1 : 2;\n\n this.symbolList.forEach((v) => {\n writer.set(v, bits);\n });\n buf.writeUInt16BE(writer.value);\n return buf;\n }\n}\n\nexport class RecvDelta {\n /**optional (If undefined, it will be set automatically.)*/\n type?:\n | PacketStatus.TypeTCCPacketReceivedSmallDelta\n | PacketStatus.TypeTCCPacketReceivedLargeDelta;\n /**micro sec */\n delta!: number;\n\n constructor(props: Partial<RecvDelta> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(data: Buffer) {\n let type: number | undefined;\n let delta: number | undefined;\n\n if (data.length === 1) {\n type = PacketStatus.TypeTCCPacketReceivedSmallDelta;\n delta = 250 * data[0];\n } else if (data.length === 2) {\n type = PacketStatus.TypeTCCPacketReceivedLargeDelta;\n delta = 250 * data.readInt16BE();\n }\n\n if (type === undefined || delta === undefined) throw new Error();\n\n return new RecvDelta({ type, delta });\n }\n\n deSerialize(data: Buffer) {\n const res = RecvDelta.deSerialize(data);\n this.delta = res.delta;\n }\n\n parsed = false; // todo refactor\n parseDelta() {\n this.delta = Math.floor(this.delta / 250);\n\n if (this.delta < 0 || this.delta > 255) {\n if (this.delta > 32767) this.delta = 32767; // maxInt16\n if (this.delta < -32768) this.delta = -32768; // minInt16\n if (!this.type) this.type = PacketStatus.TypeTCCPacketReceivedLargeDelta;\n } else {\n if (!this.type) this.type = PacketStatus.TypeTCCPacketReceivedSmallDelta;\n }\n this.parsed = true;\n }\n\n serialize() {\n if (!this.parsed) this.parseDelta();\n if (this.type === PacketStatus.TypeTCCPacketReceivedSmallDelta) {\n const buf = Buffer.alloc(1);\n buf.writeUInt8(this.delta);\n return buf;\n } else if (this.type === PacketStatus.TypeTCCPacketReceivedLargeDelta) {\n const buf = Buffer.alloc(2);\n buf.writeInt16BE(this.delta);\n return buf;\n }\n\n throw new Error(\"errDeltaExceedLimit \" + this.delta + \" \" + this.type);\n }\n}\n\nexport enum PacketChunk {\n TypeTCCRunLengthChunk,\n TypeTCCStatusVectorChunk,\n packetStatusChunkLength,\n}\n\nexport enum PacketStatus {\n TypeTCCPacketNotReceived,\n TypeTCCPacketReceivedSmallDelta,\n TypeTCCPacketReceivedLargeDelta,\n TypeTCCPacketReceivedWithoutDelta,\n}\n\nexport class PacketResult {\n sequenceNumber = 0;\n delta = 0;\n received = false;\n receivedAtMs = 0;\n constructor(props: Partial<PacketResult>) {\n Object.assign(this, props);\n }\n}\n"]}
@@ -40,13 +40,13 @@ class RtcpSourceDescriptionPacket {
40
40
  return new RtcpSourceDescriptionPacket({ chunks });
41
41
  }
42
42
  }
43
- exports.RtcpSourceDescriptionPacket = RtcpSourceDescriptionPacket;
44
43
  Object.defineProperty(RtcpSourceDescriptionPacket, "type", {
45
44
  enumerable: true,
46
45
  configurable: true,
47
46
  writable: true,
48
47
  value: 202
49
48
  });
49
+ exports.RtcpSourceDescriptionPacket = RtcpSourceDescriptionPacket;
50
50
  class SourceDescriptionChunk {
51
51
  constructor(props = {}) {
52
52
  Object.defineProperty(this, "source", {
@@ -1 +1 @@
1
- {"version":3,"file":"sdes.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/sdes.ts"],"names":[],"mappings":"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","sourcesContent":["import { bufferWriter } from \"../../../common/src\";\nimport { RtcpHeader } from \"./header\";\nimport { RtcpPacketConverter } from \"./rtcp\";\n\nexport class RtcpSourceDescriptionPacket {\n static readonly type = 202;\n readonly type = RtcpSourceDescriptionPacket.type;\n chunks: SourceDescriptionChunk[] = [];\n\n constructor(props: Partial<RtcpSourceDescriptionPacket>) {\n Object.assign(this, props);\n }\n\n get length() {\n let length = 0;\n this.chunks.forEach((chunk) => (length += chunk.length));\n return length;\n }\n\n serialize() {\n let payload = Buffer.concat(this.chunks.map((chunk) => chunk.serialize()));\n while (payload.length % 4)\n payload = Buffer.concat([payload, Buffer.from([0])]);\n return RtcpPacketConverter.serialize(\n this.type,\n this.chunks.length,\n payload,\n payload.length / 4\n );\n }\n\n static deSerialize(payload: Buffer, header: RtcpHeader) {\n const chunks: SourceDescriptionChunk[] = [];\n for (let i = 0; i < payload.length; ) {\n const chunk = SourceDescriptionChunk.deSerialize(payload.slice(i));\n chunks.push(chunk);\n i += chunk.length;\n }\n\n return new RtcpSourceDescriptionPacket({ chunks });\n }\n}\n\nexport class SourceDescriptionChunk {\n source!: number;\n items: SourceDescriptionItem[] = [];\n\n constructor(props: Partial<SourceDescriptionChunk> = {}) {\n Object.assign(this, props);\n }\n\n get length() {\n let length = 4;\n this.items.forEach((item) => (length += item.length));\n length += 1;\n length += getPadding(length);\n return length;\n }\n\n serialize() {\n const data = Buffer.concat([\n bufferWriter([4], [this.source]),\n Buffer.concat(this.items.map((item) => item.serialize())),\n ]);\n\n const res = Buffer.concat([data, Buffer.alloc(getPadding(data.length))]);\n return res;\n }\n\n static deSerialize(data: Buffer) {\n const source = data.readUInt32BE();\n const items: SourceDescriptionItem[] = [];\n for (let i = 4; i < data.length; ) {\n const type = data[i];\n if (type === 0) break;\n\n const item = SourceDescriptionItem.deSerialize(data.slice(i));\n items.push(item);\n i += item.length;\n }\n\n return new SourceDescriptionChunk({ source, items });\n }\n}\n\nexport class SourceDescriptionItem {\n type!: number;\n text!: string;\n\n constructor(props: Partial<SourceDescriptionItem>) {\n Object.assign(this, props);\n }\n\n get length() {\n return 1 + 1 + Buffer.from(this.text).length;\n }\n\n serialize() {\n const text = Buffer.from(this.text);\n return Buffer.concat([\n bufferWriter([1, 1], [this.type, text.length]),\n text,\n ]);\n }\n\n static deSerialize(data: Buffer) {\n const type = data[0];\n const octetCount = data[1];\n const text = data.slice(2, 2 + octetCount).toString();\n return new SourceDescriptionItem({ type, text });\n }\n}\n\nfunction getPadding(len: number) {\n if (len % 4 == 0) {\n return 0;\n }\n return 4 - (len % 4);\n}\n"]}
1
+ {"version":3,"file":"sdes.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/sdes.ts"],"names":[],"mappings":"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","sourcesContent":["import { bufferWriter } from \"../../../common/src\";\nimport { RtcpHeader } from \"./header\";\nimport { RtcpPacketConverter } from \"./rtcp\";\n\nexport class RtcpSourceDescriptionPacket {\n static readonly type = 202;\n readonly type = RtcpSourceDescriptionPacket.type;\n chunks: SourceDescriptionChunk[] = [];\n\n constructor(props: Partial<RtcpSourceDescriptionPacket>) {\n Object.assign(this, props);\n }\n\n get length() {\n let length = 0;\n this.chunks.forEach((chunk) => (length += chunk.length));\n return length;\n }\n\n serialize() {\n let payload = Buffer.concat(this.chunks.map((chunk) => chunk.serialize()));\n while (payload.length % 4)\n payload = Buffer.concat([payload, Buffer.from([0])]);\n return RtcpPacketConverter.serialize(\n this.type,\n this.chunks.length,\n payload,\n payload.length / 4\n );\n }\n\n static deSerialize(payload: Buffer, header: RtcpHeader) {\n const chunks: SourceDescriptionChunk[] = [];\n for (let i = 0; i < payload.length; ) {\n const chunk = SourceDescriptionChunk.deSerialize(payload.slice(i));\n chunks.push(chunk);\n i += chunk.length;\n }\n\n return new RtcpSourceDescriptionPacket({ chunks });\n }\n}\n\nexport class SourceDescriptionChunk {\n source!: number;\n items: SourceDescriptionItem[] = [];\n\n constructor(props: Partial<SourceDescriptionChunk> = {}) {\n Object.assign(this, props);\n }\n\n get length() {\n let length = 4;\n this.items.forEach((item) => (length += item.length));\n length += 1;\n length += getPadding(length);\n return length;\n }\n\n serialize() {\n const data = Buffer.concat([\n bufferWriter([4], [this.source]),\n Buffer.concat(this.items.map((item) => item.serialize())),\n ]);\n\n const res = Buffer.concat([data, Buffer.alloc(getPadding(data.length))]);\n return res;\n }\n\n static deSerialize(data: Buffer) {\n const source = data.readUInt32BE();\n const items: SourceDescriptionItem[] = [];\n for (let i = 4; i < data.length; ) {\n const type = data[i];\n if (type === 0) break;\n\n const item = SourceDescriptionItem.deSerialize(data.slice(i));\n items.push(item);\n i += item.length;\n }\n\n return new SourceDescriptionChunk({ source, items });\n }\n}\n\nexport class SourceDescriptionItem {\n type!: number;\n text!: string;\n\n constructor(props: Partial<SourceDescriptionItem>) {\n Object.assign(this, props);\n }\n\n get length() {\n return 1 + 1 + Buffer.from(this.text).length;\n }\n\n serialize() {\n const text = Buffer.from(this.text);\n return Buffer.concat([\n bufferWriter([1, 1], [this.type, text.length]),\n text,\n ]);\n }\n\n static deSerialize(data: Buffer) {\n const type = data[0];\n const octetCount = data[1];\n const text = data.slice(2, 2 + octetCount).toString();\n return new SourceDescriptionItem({ type, text });\n }\n}\n\nfunction getPadding(len: number) {\n if (len % 4 == 0) {\n return 0;\n }\n return 4 - (len % 4);\n}\n"]}
@@ -1,10 +1,6 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.ntpTime2Sec = exports.RtcpSenderInfo = exports.RtcpSrPacket = void 0;
7
- const range_1 = __importDefault(require("lodash/range"));
8
4
  const src_1 = require("../../../common/src");
9
5
  const rr_1 = require("./rr");
10
6
  const rtcp_1 = require("./rtcp");
@@ -94,7 +90,7 @@ class RtcpSrPacket {
94
90
  const senderInfo = RtcpSenderInfo.deSerialize(payload.subarray(4, 24));
95
91
  let pos = 24;
96
92
  const reports = [];
97
- for (const _ of (0, range_1.default)(count)) {
93
+ for (let _ = 0; _ < count; _++) {
98
94
  reports.push(rr_1.RtcpReceiverInfo.deSerialize(payload.subarray(pos, pos + 24)));
99
95
  pos += 24;
100
96
  }
@@ -102,13 +98,13 @@ class RtcpSrPacket {
102
98
  return packet;
103
99
  }
104
100
  }
105
- exports.RtcpSrPacket = RtcpSrPacket;
106
101
  Object.defineProperty(RtcpSrPacket, "type", {
107
102
  enumerable: true,
108
103
  configurable: true,
109
104
  writable: true,
110
105
  value: 200
111
106
  });
107
+ exports.RtcpSrPacket = RtcpSrPacket;
112
108
  class RtcpSenderInfo {
113
109
  constructor(props = {}) {
114
110
  Object.defineProperty(this, "ntpTimestamp", {
@@ -1 +1 @@
1
- {"version":3,"file":"sr.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/sr.ts"],"names":[],"mappings":"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","sourcesContent":["import range from \"lodash/range\";\n\nimport { bufferReader, bufferWriter } from \"../../../common/src\";\nimport { RtcpReceiverInfo } from \"./rr\";\nimport { RtcpPacketConverter } from \"./rtcp\";\n\n// https://datatracker.ietf.org/doc/html/rfc3550#section-6.4.1\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// header |V=2|P| RC | PT=SR=200 | length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | SSRC of sender |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// sender | NTP timestamp, most significant word |\n// info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | NTP timestamp, least significant word |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | RTP timestamp |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | sender's packet count |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | sender's octet count |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// report | SSRC_1 (SSRC of first source) |\n// block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// 1 | fraction lost | cumulative number of packets lost |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | extended highest sequence number received |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | interarrival jitter |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | last SR (LSR) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | delay since last SR (DLSR) |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// report | SSRC_2 (SSRC of second source) |\n// block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// 2 : ... :\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// | profile-specific extensions |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\nexport class RtcpSrPacket {\n ssrc: number = 0;\n senderInfo!: RtcpSenderInfo;\n reports: RtcpReceiverInfo[] = [];\n static readonly type = 200;\n readonly type = RtcpSrPacket.type;\n\n constructor(props: Pick<RtcpSrPacket, \"senderInfo\"> & Partial<RtcpSrPacket>) {\n Object.assign(this, props);\n }\n\n toJSON() {\n return {\n ssrc: this.ssrc,\n senderInfo: this.senderInfo.toJSON(),\n reports: this.reports.map((r) => r.toJSON()),\n };\n }\n\n serialize() {\n let payload = Buffer.alloc(4);\n payload.writeUInt32BE(this.ssrc);\n payload = Buffer.concat([payload, this.senderInfo.serialize()]);\n payload = Buffer.concat([\n payload,\n ...this.reports.map((report) => report.serialize()),\n ]);\n return RtcpPacketConverter.serialize(\n RtcpSrPacket.type,\n this.reports.length,\n payload,\n Math.floor(payload.length / 4)\n );\n }\n\n static deSerialize(payload: Buffer, count: number) {\n const ssrc = payload.readUInt32BE();\n const senderInfo = RtcpSenderInfo.deSerialize(payload.subarray(4, 24));\n let pos = 24;\n const reports: RtcpReceiverInfo[] = [];\n for (const _ of range(count)) {\n reports.push(\n RtcpReceiverInfo.deSerialize(payload.subarray(pos, pos + 24))\n );\n pos += 24;\n }\n const packet = new RtcpSrPacket({ ssrc, senderInfo, reports });\n return packet;\n }\n}\n\nexport class RtcpSenderInfo {\n ntpTimestamp!: bigint;\n rtpTimestamp!: number;\n packetCount!: number;\n octetCount!: number;\n\n constructor(props: Partial<RtcpSenderInfo> = {}) {\n Object.assign(this, props);\n }\n\n toJSON() {\n return {\n ntpTimestamp: ntpTime2Sec(this.ntpTimestamp),\n rtpTimestamp: this.rtpTimestamp,\n };\n }\n\n serialize() {\n return bufferWriter(\n [8, 4, 4, 4],\n [this.ntpTimestamp, this.rtpTimestamp, this.packetCount, this.octetCount]\n );\n }\n\n static deSerialize(data: Buffer) {\n const [ntpTimestamp, rtpTimestamp, packetCount, octetCount] = bufferReader(\n data,\n [8, 4, 4, 4]\n );\n\n return new RtcpSenderInfo({\n ntpTimestamp,\n rtpTimestamp,\n packetCount,\n octetCount,\n });\n }\n}\n\nexport const ntpTime2Sec = (ntp: bigint) => {\n const [ntpSec, ntpMsec] = bufferReader(bufferWriter([8], [ntp]), [4, 4]);\n\n return Number(`${ntpSec}.${ntpMsec}`);\n};\n"]}
1
+ {"version":3,"file":"sr.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/sr.ts"],"names":[],"mappings":"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","sourcesContent":["import { bufferReader, bufferWriter } from \"../../../common/src\";\nimport { RtcpReceiverInfo } from \"./rr\";\nimport { RtcpPacketConverter } from \"./rtcp\";\n\n// https://datatracker.ietf.org/doc/html/rfc3550#section-6.4.1\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// header |V=2|P| RC | PT=SR=200 | length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | SSRC of sender |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// sender | NTP timestamp, most significant word |\n// info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | NTP timestamp, least significant word |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | RTP timestamp |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | sender's packet count |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | sender's octet count |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// report | SSRC_1 (SSRC of first source) |\n// block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// 1 | fraction lost | cumulative number of packets lost |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | extended highest sequence number received |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | interarrival jitter |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | last SR (LSR) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | delay since last SR (DLSR) |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// report | SSRC_2 (SSRC of second source) |\n// block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// 2 : ... :\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// | profile-specific extensions |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\nexport class RtcpSrPacket {\n ssrc: number = 0;\n senderInfo!: RtcpSenderInfo;\n reports: RtcpReceiverInfo[] = [];\n static readonly type = 200;\n readonly type = RtcpSrPacket.type;\n\n constructor(props: Pick<RtcpSrPacket, \"senderInfo\"> & Partial<RtcpSrPacket>) {\n Object.assign(this, props);\n }\n\n toJSON() {\n return {\n ssrc: this.ssrc,\n senderInfo: this.senderInfo.toJSON(),\n reports: this.reports.map((r) => r.toJSON()),\n };\n }\n\n serialize() {\n let payload = Buffer.alloc(4);\n payload.writeUInt32BE(this.ssrc);\n payload = Buffer.concat([payload, this.senderInfo.serialize()]);\n payload = Buffer.concat([\n payload,\n ...this.reports.map((report) => report.serialize()),\n ]);\n return RtcpPacketConverter.serialize(\n RtcpSrPacket.type,\n this.reports.length,\n payload,\n Math.floor(payload.length / 4)\n );\n }\n\n static deSerialize(payload: Buffer, count: number) {\n const ssrc = payload.readUInt32BE();\n const senderInfo = RtcpSenderInfo.deSerialize(payload.subarray(4, 24));\n let pos = 24;\n const reports: RtcpReceiverInfo[] = [];\n for (let _ = 0; _ < count; _++) {\n reports.push(\n RtcpReceiverInfo.deSerialize(payload.subarray(pos, pos + 24))\n );\n pos += 24;\n }\n const packet = new RtcpSrPacket({ ssrc, senderInfo, reports });\n return packet;\n }\n}\n\nexport class RtcpSenderInfo {\n ntpTimestamp!: bigint;\n rtpTimestamp!: number;\n packetCount!: number;\n octetCount!: number;\n\n constructor(props: Partial<RtcpSenderInfo> = {}) {\n Object.assign(this, props);\n }\n\n toJSON() {\n return {\n ntpTimestamp: ntpTime2Sec(this.ntpTimestamp),\n rtpTimestamp: this.rtpTimestamp,\n };\n }\n\n serialize() {\n return bufferWriter(\n [8, 4, 4, 4],\n [this.ntpTimestamp, this.rtpTimestamp, this.packetCount, this.octetCount]\n );\n }\n\n static deSerialize(data: Buffer) {\n const [ntpTimestamp, rtpTimestamp, packetCount, octetCount] = bufferReader(\n data,\n [8, 4, 4, 4]\n );\n\n return new RtcpSenderInfo({\n ntpTimestamp,\n rtpTimestamp,\n packetCount,\n octetCount,\n });\n }\n}\n\nexport const ntpTime2Sec = (ntp: bigint) => {\n const [ntpSec, ntpMsec] = bufferReader(bufferWriter([8], [ntp]), [4, 4]);\n\n return Number(`${ntpSec}.${ntpMsec}`);\n};\n"]}
@@ -24,3 +24,8 @@ export declare function serializeSdesRTPStreamID(id: string): Buffer;
24
24
  export declare function serializeRepairedRtpStreamId(id: string): Buffer;
25
25
  export declare function serializeTransportWideCC(transportSequenceNumber: number): Buffer;
26
26
  export declare function serializeAbsSendTime(ntpTime: bigint): Buffer;
27
+ export declare function serializeAudioLevelIndication(level: number): Buffer;
28
+ export declare function deserializeString(buf: Buffer): string;
29
+ export declare function deserializeUint16BE(buf: Buffer): number;
30
+ export declare function deserializeAbsSendTime(buf: Buffer): any;
31
+ export declare function deserializeAudioLevelIndication(buf: Buffer): AudioLevelIndicationPayload;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.serializeAbsSendTime = exports.serializeTransportWideCC = exports.serializeRepairedRtpStreamId = exports.serializeSdesRTPStreamID = exports.serializeSdesMid = exports.rtpHeaderExtensionsParser = exports.RTP_EXTENSION_URI = void 0;
3
+ exports.deserializeAudioLevelIndication = exports.deserializeAbsSendTime = exports.deserializeUint16BE = exports.deserializeString = exports.serializeAudioLevelIndication = exports.serializeAbsSendTime = exports.serializeTransportWideCC = exports.serializeRepairedRtpStreamId = exports.serializeSdesRTPStreamID = exports.serializeSdesMid = exports.rtpHeaderExtensionsParser = exports.RTP_EXTENSION_URI = void 0;
4
4
  const src_1 = require("../../../common/src");
5
5
  exports.RTP_EXTENSION_URI = {
6
6
  sdesMid: "urn:ietf:params:rtp-hdrext:sdes:mid",
@@ -19,21 +19,19 @@ function rtpHeaderExtensionsParser(extensions, extIdUriMap) {
19
19
  case exports.RTP_EXTENSION_URI.sdesMid:
20
20
  case exports.RTP_EXTENSION_URI.sdesRTPStreamID:
21
21
  case exports.RTP_EXTENSION_URI.repairedRtpStreamId:
22
- return { uri, value: extension.payload.toString() };
22
+ return { uri, value: deserializeString(extension.payload) };
23
23
  case exports.RTP_EXTENSION_URI.transportWideCC:
24
- return { uri, value: extension.payload.readUInt16BE() };
24
+ return { uri, value: deserializeUint16BE(extension.payload) };
25
25
  case exports.RTP_EXTENSION_URI.absSendTime:
26
26
  return {
27
27
  uri,
28
- value: (0, src_1.bufferReader)(extension.payload, [3])[0],
28
+ value: deserializeAbsSendTime(extension.payload),
29
29
  };
30
30
  case exports.RTP_EXTENSION_URI.audioLevelIndication: {
31
- const stream = new src_1.BitStream(extension.payload);
32
- const value = {
33
- v: stream.readBits(1) === 1,
34
- level: stream.readBits(7),
31
+ return {
32
+ uri,
33
+ value: deserializeAudioLevelIndication(extension.payload),
35
34
  };
36
- return { uri, value };
37
35
  }
38
36
  default:
39
37
  return { uri, value: 0 };
@@ -69,4 +67,32 @@ function serializeAbsSendTime(ntpTime) {
69
67
  return buf;
70
68
  }
71
69
  exports.serializeAbsSendTime = serializeAbsSendTime;
70
+ function serializeAudioLevelIndication(level) {
71
+ const stream = new src_1.BitStream(Buffer.alloc(1));
72
+ stream.writeBits(1, 1);
73
+ stream.writeBits(level, 7);
74
+ return stream.uint8Array;
75
+ }
76
+ exports.serializeAudioLevelIndication = serializeAudioLevelIndication;
77
+ function deserializeString(buf) {
78
+ return buf.toString();
79
+ }
80
+ exports.deserializeString = deserializeString;
81
+ function deserializeUint16BE(buf) {
82
+ return buf.readUInt16BE();
83
+ }
84
+ exports.deserializeUint16BE = deserializeUint16BE;
85
+ function deserializeAbsSendTime(buf) {
86
+ return (0, src_1.bufferReader)(buf, [3])[0];
87
+ }
88
+ exports.deserializeAbsSendTime = deserializeAbsSendTime;
89
+ function deserializeAudioLevelIndication(buf) {
90
+ const stream = new src_1.BitStream(buf);
91
+ const value = {
92
+ v: stream.readBits(1) === 1,
93
+ level: stream.readBits(7),
94
+ };
95
+ return value;
96
+ }
97
+ exports.deserializeAudioLevelIndication = deserializeAudioLevelIndication;
72
98
  //# sourceMappingURL=headerExtension.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"headerExtension.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/headerExtension.ts"],"names":[],"mappings":";;;AAAA,6CAA4E;AAG/D,QAAA,iBAAiB,GAAG;IAC/B,OAAO,EAAE,qCAAqC;IAC9C,eAAe,EAAE,+CAA+C;IAChE,mBAAmB,EAAE,wDAAwD;IAC7E,eAAe,EACb,2EAA2E;IAC7E,WAAW,EAAE,4DAA4D;IACzE,oBAAoB,EAClB,yFAAyF;IAC3F,oBAAoB,EAAE,6CAA6C;CAC3D,CAAC;AAMX,SAAgB,yBAAyB,CACvC,UAAuB,EACvB,WAAqC;IAErC,OAAO,UAAU;SACd,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QACjB,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACtC,QAAQ,GAAG,EAAE;YACX,KAAK,yBAAiB,CAAC,OAAO,CAAC;YAC/B,KAAK,yBAAiB,CAAC,eAAe,CAAC;YACvC,KAAK,yBAAiB,CAAC,mBAAmB;gBACxC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YACtD,KAAK,yBAAiB,CAAC,eAAe;gBACpC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;YAC1D,KAAK,yBAAiB,CAAC,WAAW;gBAChC,OAAO;oBACL,GAAG;oBACH,KAAK,EAAE,IAAA,kBAAY,EAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC/C,CAAC;YACJ,KAAK,yBAAiB,CAAC,oBAAoB,CAAC,CAAC;gBAC3C,MAAM,MAAM,GAAG,IAAI,eAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAChD,MAAM,KAAK,GAAgC;oBACzC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;oBAC3B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;iBAC1B,CAAC;gBACF,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;aACvB;YACD;gBACE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;SAC5B;IACH,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,GAA2B,EAAE,GAAG,EAAE,EAAE;QAC3C,IAAI,GAAG;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAClC,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,CAAC;AAnCD,8DAmCC;AAED,SAAgB,gBAAgB,CAAC,EAAU;IACzC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAFD,4CAEC;AAED,SAAgB,wBAAwB,CAAC,EAAU;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAFD,4DAEC;AAED,SAAgB,4BAA4B,CAAC,EAAU;IACrD,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAFD,oEAEC;AAED,SAAgB,wBAAwB,CAAC,uBAA+B;IACtE,OAAO,IAAA,kBAAY,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC;AACtD,CAAC;AAFD,4DAEC;AAED,SAAgB,oBAAoB,CAAC,OAAe;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,WAAW,CAAC;IAC5C,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC;AALD,oDAKC","sourcesContent":["import { BitStream, bufferReader, bufferWriter } from \"../../../common/src\";\nimport { Extension } from \"./rtp\";\n\nexport const RTP_EXTENSION_URI = {\n sdesMid: \"urn:ietf:params:rtp-hdrext:sdes:mid\",\n sdesRTPStreamID: \"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\",\n repairedRtpStreamId: \"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\",\n transportWideCC:\n \"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\",\n absSendTime: \"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\",\n dependencyDescriptor:\n \"https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension\",\n audioLevelIndication: \"urn:ietf:params:rtp-hdrext:ssrc-audio-level\",\n} as const;\n\nexport type TransportWideCCPayload = number;\n\nexport type AudioLevelIndicationPayload = { v: boolean; level: number };\n\nexport function rtpHeaderExtensionsParser(\n extensions: Extension[],\n extIdUriMap: { [id: number]: string }\n): { [uri: string]: any } {\n return extensions\n .map((extension) => {\n const uri = extIdUriMap[extension.id];\n switch (uri) {\n case RTP_EXTENSION_URI.sdesMid:\n case RTP_EXTENSION_URI.sdesRTPStreamID:\n case RTP_EXTENSION_URI.repairedRtpStreamId:\n return { uri, value: extension.payload.toString() };\n case RTP_EXTENSION_URI.transportWideCC:\n return { uri, value: extension.payload.readUInt16BE() };\n case RTP_EXTENSION_URI.absSendTime:\n return {\n uri,\n value: bufferReader(extension.payload, [3])[0],\n };\n case RTP_EXTENSION_URI.audioLevelIndication: {\n const stream = new BitStream(extension.payload);\n const value: AudioLevelIndicationPayload = {\n v: stream.readBits(1) === 1,\n level: stream.readBits(7),\n };\n return { uri, value };\n }\n default:\n return { uri, value: 0 };\n }\n })\n .reduce((acc: { [uri: string]: any }, cur) => {\n if (cur) acc[cur.uri] = cur.value;\n return acc;\n }, {});\n}\n\nexport function serializeSdesMid(id: string) {\n return Buffer.from(id);\n}\n\nexport function serializeSdesRTPStreamID(id: string) {\n return Buffer.from(id);\n}\n\nexport function serializeRepairedRtpStreamId(id: string) {\n return Buffer.from(id);\n}\n\nexport function serializeTransportWideCC(transportSequenceNumber: number) {\n return bufferWriter([2], [transportSequenceNumber]);\n}\n\nexport function serializeAbsSendTime(ntpTime: bigint) {\n const buf = Buffer.alloc(3);\n const time = (ntpTime >> 14n) & 0x00ffffffn;\n buf.writeUIntBE(Number(time), 0, 3);\n return buf;\n}\n"]}
1
+ {"version":3,"file":"headerExtension.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/headerExtension.ts"],"names":[],"mappings":";;;AAAA,6CAA4E;AAG/D,QAAA,iBAAiB,GAAG;IAC/B,OAAO,EAAE,qCAAqC;IAC9C,eAAe,EAAE,+CAA+C;IAChE,mBAAmB,EAAE,wDAAwD;IAC7E,eAAe,EACb,2EAA2E;IAC7E,WAAW,EAAE,4DAA4D;IACzE,oBAAoB,EAClB,yFAAyF;IAC3F,oBAAoB,EAAE,6CAA6C;CAC3D,CAAC;AAMX,SAAgB,yBAAyB,CACvC,UAAuB,EACvB,WAAqC;IAErC,OAAO,UAAU;SACd,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QACjB,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACtC,QAAQ,GAAG,EAAE;YACX,KAAK,yBAAiB,CAAC,OAAO,CAAC;YAC/B,KAAK,yBAAiB,CAAC,eAAe,CAAC;YACvC,KAAK,yBAAiB,CAAC,mBAAmB;gBACxC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,KAAK,yBAAiB,CAAC,eAAe;gBACpC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAChE,KAAK,yBAAiB,CAAC,WAAW;gBAChC,OAAO;oBACL,GAAG;oBACH,KAAK,EAAE,sBAAsB,CAAC,SAAS,CAAC,OAAO,CAAC;iBACjD,CAAC;YACJ,KAAK,yBAAiB,CAAC,oBAAoB,CAAC,CAAC;gBAC3C,OAAO;oBACL,GAAG;oBACH,KAAK,EAAE,+BAA+B,CAAC,SAAS,CAAC,OAAO,CAAC;iBAC1D,CAAC;aACH;YACD;gBACE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;SAC5B;IACH,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,GAA2B,EAAE,GAAG,EAAE,EAAE;QAC3C,IAAI,GAAG;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAClC,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,CAAC;AAjCD,8DAiCC;AAED,SAAgB,gBAAgB,CAAC,EAAU;IACzC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAFD,4CAEC;AAED,SAAgB,wBAAwB,CAAC,EAAU;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAFD,4DAEC;AAED,SAAgB,4BAA4B,CAAC,EAAU;IACrD,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAFD,oEAEC;AAED,SAAgB,wBAAwB,CAAC,uBAA+B;IACtE,OAAO,IAAA,kBAAY,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC;AACtD,CAAC;AAFD,4DAEC;AAED,SAAgB,oBAAoB,CAAC,OAAe;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,WAAW,CAAC;IAC5C,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC;AALD,oDAKC;AAED,SAAgB,6BAA6B,CAAC,KAAa;IACzD,MAAM,MAAM,GAAG,IAAI,eAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAE3B,OAAO,MAAM,CAAC,UAAU,CAAC;AAC3B,CAAC;AAND,sEAMC;AAED,SAAgB,iBAAiB,CAAC,GAAW;IAC3C,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAFD,8CAEC;AAED,SAAgB,mBAAmB,CAAC,GAAW;IAC7C,OAAO,GAAG,CAAC,YAAY,EAAE,CAAC;AAC5B,CAAC;AAFD,kDAEC;AAED,SAAgB,sBAAsB,CAAC,GAAW;IAChD,OAAO,IAAA,kBAAY,EAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAFD,wDAEC;AAED,SAAgB,+BAA+B,CAAC,GAAW;IACzD,MAAM,MAAM,GAAG,IAAI,eAAS,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,KAAK,GAAgC;QACzC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;KAC1B,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAPD,0EAOC","sourcesContent":["import { BitStream, bufferReader, bufferWriter } from \"../../../common/src\";\nimport { Extension } from \"./rtp\";\n\nexport const RTP_EXTENSION_URI = {\n sdesMid: \"urn:ietf:params:rtp-hdrext:sdes:mid\",\n sdesRTPStreamID: \"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\",\n repairedRtpStreamId: \"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\",\n transportWideCC:\n \"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\",\n absSendTime: \"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\",\n dependencyDescriptor:\n \"https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension\",\n audioLevelIndication: \"urn:ietf:params:rtp-hdrext:ssrc-audio-level\",\n} as const;\n\nexport type TransportWideCCPayload = number;\n\nexport type AudioLevelIndicationPayload = { v: boolean; level: number };\n\nexport function rtpHeaderExtensionsParser(\n extensions: Extension[],\n extIdUriMap: { [id: number]: string }\n): { [uri: string]: any } {\n return extensions\n .map((extension) => {\n const uri = extIdUriMap[extension.id];\n switch (uri) {\n case RTP_EXTENSION_URI.sdesMid:\n case RTP_EXTENSION_URI.sdesRTPStreamID:\n case RTP_EXTENSION_URI.repairedRtpStreamId:\n return { uri, value: deserializeString(extension.payload) };\n case RTP_EXTENSION_URI.transportWideCC:\n return { uri, value: deserializeUint16BE(extension.payload) };\n case RTP_EXTENSION_URI.absSendTime:\n return {\n uri,\n value: deserializeAbsSendTime(extension.payload),\n };\n case RTP_EXTENSION_URI.audioLevelIndication: {\n return {\n uri,\n value: deserializeAudioLevelIndication(extension.payload),\n };\n }\n default:\n return { uri, value: 0 };\n }\n })\n .reduce((acc: { [uri: string]: any }, cur) => {\n if (cur) acc[cur.uri] = cur.value;\n return acc;\n }, {});\n}\n\nexport function serializeSdesMid(id: string) {\n return Buffer.from(id);\n}\n\nexport function serializeSdesRTPStreamID(id: string) {\n return Buffer.from(id);\n}\n\nexport function serializeRepairedRtpStreamId(id: string) {\n return Buffer.from(id);\n}\n\nexport function serializeTransportWideCC(transportSequenceNumber: number) {\n return bufferWriter([2], [transportSequenceNumber]);\n}\n\nexport function serializeAbsSendTime(ntpTime: bigint) {\n const buf = Buffer.alloc(3);\n const time = (ntpTime >> 14n) & 0x00ffffffn;\n buf.writeUIntBE(Number(time), 0, 3);\n return buf;\n}\n\nexport function serializeAudioLevelIndication(level: number) {\n const stream = new BitStream(Buffer.alloc(1));\n stream.writeBits(1, 1);\n stream.writeBits(level, 7);\n\n return stream.uint8Array;\n}\n\nexport function deserializeString(buf: Buffer) {\n return buf.toString();\n}\n\nexport function deserializeUint16BE(buf: Buffer) {\n return buf.readUInt16BE();\n}\n\nexport function deserializeAbsSendTime(buf: Buffer) {\n return bufferReader(buf, [3])[0];\n}\n\nexport function deserializeAudioLevelIndication(buf: Buffer) {\n const stream = new BitStream(buf);\n const value: AudioLevelIndicationPayload = {\n v: stream.readBits(1) === 1,\n level: stream.readBits(7),\n };\n return value;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"encoder.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtp/red/encoder.ts"],"names":[],"mappings":";;;AAAA,gDAAmD;AACnD,qCAA+B;AAE/B,MAAa,UAAU;IAIrB,YAAmB,WAAW,CAAC;;;;;mBAAZ;;QAHnB;;;;mBAAyE,EAAE;WAAC;QAC5E;;;;mBAAY,EAAE;WAAC;IAEmB,CAAC;IAEnC,IAAI,CAAC,OAA8D;QACjE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;YACtC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;SACpB;IACH,CAAC;IAED,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,YAAG,EAAE,CAAC;QACtB,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;QAEjE,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO,GAAG,CAAC;SACZ;QAED,iBAAiB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YACtC,MAAM,eAAe,GAAG,IAAA,eAAS,EAC/B,cAAc,CAAC,SAAS,EACxB,CAAC,SAAS,CAAC,SAAS,CACrB,CAAC;YACF,IAAI,eAAe,GAAG,SAAS,EAAE;gBAC/B,OAAO;aACR;YACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;gBACd,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,eAAe;aAChB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;YACd,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,OAAO,EAAE,cAAc,CAAC,OAAO;SAChC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AA1CD,gCA0CC;AAED,MAAM,SAAS,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC","sourcesContent":["import { uint32Add } from \"../../../../common/src\";\nimport { Red } from \"./packet\";\n\nexport class RedEncoder {\n private cache: { block: Buffer; timestamp: number; blockPT: number }[] = [];\n cacheSize = 10;\n\n constructor(public distance = 1) {}\n\n push(payload: { block: Buffer; timestamp: number; blockPT: number }) {\n this.cache.push(payload);\n if (this.cache.length > this.cacheSize) {\n this.cache.shift();\n }\n }\n\n build() {\n const red = new Red();\n const redundantPayloads = this.cache.slice(-(this.distance + 1));\n\n const presentPayload = redundantPayloads.pop();\n if (!presentPayload) {\n return red;\n }\n\n redundantPayloads.forEach((redundant) => {\n const timestampOffset = uint32Add(\n presentPayload.timestamp,\n -redundant.timestamp\n );\n if (timestampOffset > Max14Uint) {\n return;\n }\n red.blocks.push({\n block: redundant.block,\n blockPT: redundant.blockPT,\n timestampOffset,\n });\n });\n red.blocks.push({\n block: presentPayload.block,\n blockPT: presentPayload.blockPT,\n });\n return red;\n }\n}\n\nconst Max14Uint = (0x01 << 14) - 1;\n"]}
1
+ {"version":3,"file":"encoder.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtp/red/encoder.ts"],"names":[],"mappings":";;;AAAA,gDAAmD;AACnD,qCAA+B;AAE/B,MAAa,UAAU;IAIrB,YAAmB,WAAW,CAAC;QAAnB;;;;mBAAO,QAAQ;WAAI;QAHvB;;;;mBAAiE,EAAE;WAAC;QAC5E;;;;mBAAY,EAAE;WAAC;IAEmB,CAAC;IAEnC,IAAI,CAAC,OAA8D;QACjE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;YACtC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;SACpB;IACH,CAAC;IAED,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,YAAG,EAAE,CAAC;QACtB,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;QAEjE,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,EAAE;YACnB,OAAO,GAAG,CAAC;SACZ;QAED,iBAAiB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YACtC,MAAM,eAAe,GAAG,IAAA,eAAS,EAC/B,cAAc,CAAC,SAAS,EACxB,CAAC,SAAS,CAAC,SAAS,CACrB,CAAC;YACF,IAAI,eAAe,GAAG,SAAS,EAAE;gBAC/B,OAAO;aACR;YACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;gBACd,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,eAAe;aAChB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;YACd,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,OAAO,EAAE,cAAc,CAAC,OAAO;SAChC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AA1CD,gCA0CC;AAED,MAAM,SAAS,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC","sourcesContent":["import { uint32Add } from \"../../../../common/src\";\nimport { Red } from \"./packet\";\n\nexport class RedEncoder {\n private cache: { block: Buffer; timestamp: number; blockPT: number }[] = [];\n cacheSize = 10;\n\n constructor(public distance = 1) {}\n\n push(payload: { block: Buffer; timestamp: number; blockPT: number }) {\n this.cache.push(payload);\n if (this.cache.length > this.cacheSize) {\n this.cache.shift();\n }\n }\n\n build() {\n const red = new Red();\n const redundantPayloads = this.cache.slice(-(this.distance + 1));\n\n const presentPayload = redundantPayloads.pop();\n if (!presentPayload) {\n return red;\n }\n\n redundantPayloads.forEach((redundant) => {\n const timestampOffset = uint32Add(\n presentPayload.timestamp,\n -redundant.timestamp\n );\n if (timestampOffset > Max14Uint) {\n return;\n }\n red.blocks.push({\n block: redundant.block,\n blockPT: redundant.blockPT,\n timestampOffset,\n });\n });\n red.blocks.push({\n block: presentPayload.block,\n blockPT: presentPayload.blockPT,\n });\n return red;\n }\n}\n\nconst Max14Uint = (0x01 << 14) - 1;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtp/red/handler.ts"],"names":[],"mappings":";;;AAAA,6BAAwE;AAExE,iEAAiE;AACjE,mEAAmE;AACnE,oEAAoE;AACpE,oEAAoE;AACpE,oEAAoE;AAEpE,kBAAkB;AAClB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AAEpB,MAAa,UAAU;IAAvB;QACE;;;;mBAAwB,GAAG;WAAC;QAC5B;;;;mBAAoC,EAAE;WAAC;IAsDzC,CAAC;IApDC,IAAI,CAAC,GAAQ,EAAE,IAAe;QAC5B,MAAM,OAAO,GAAgB,EAAE,CAAC;QAEhC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;YAC5D,MAAM,cAAc,GAAG,IAAA,aAAS,EAC9B,IAAI,CAAC,MAAM,CAAC,cAAc,EAC1B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAC/B,CAAC;YACF,IAAI,eAAe,EAAE;gBACnB,OAAO,CAAC,IAAI,CACV,IAAI,aAAS,CACX,IAAI,aAAS,CAAC;oBACZ,SAAS,EAAE,IAAA,aAAS,EAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC;oBAC7D,WAAW,EAAE,OAAO;oBACpB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;oBACtB,cAAc;oBACd,MAAM,EAAE,IAAI;iBACb,CAAC,EACF,KAAK,CACN,CACF,CAAC;aACH;iBAAM;gBACL,OAAO,CAAC,IAAI,CACV,IAAI,aAAS,CACX,IAAI,aAAS,CAAC;oBACZ,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;oBAChC,WAAW,EAAE,OAAO;oBACpB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;oBACtB,cAAc;oBACd,MAAM,EAAE,IAAI;iBACb,CAAC,EACF,KAAK,CACN,CACF,CAAC;aACH;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,YAAY;YACZ,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;gBAC1D,OAAO,KAAK,CAAC;aACd;iBAAM;gBACL,kBAAkB;gBAClB,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE;oBAC3C,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;iBAC9B;gBACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gBACnD,OAAO,IAAI,CAAC;aACb;QACH,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAxDD,gCAwDC","sourcesContent":["import { Red, RtpHeader, RtpPacket, uint16Add, uint32Add } from \"../..\";\n\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |F| block PT | timestamp offset | block length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |0| Block PT |\n// +-+-+-+-+-+-+-+-+\n\nexport class RedHandler {\n private readonly size = 150;\n private sequenceNumbers: number[] = [];\n\n push(red: Red, base: RtpPacket) {\n const packets: RtpPacket[] = [];\n\n red.blocks.forEach(({ blockPT, timestampOffset, block }, i) => {\n const sequenceNumber = uint16Add(\n base.header.sequenceNumber,\n -(red.blocks.length - (i + 1))\n );\n if (timestampOffset) {\n packets.push(\n new RtpPacket(\n new RtpHeader({\n timestamp: uint32Add(base.header.timestamp, -timestampOffset),\n payloadType: blockPT,\n ssrc: base.header.ssrc,\n sequenceNumber,\n marker: true,\n }),\n block\n )\n );\n } else {\n packets.push(\n new RtpPacket(\n new RtpHeader({\n timestamp: base.header.timestamp,\n payloadType: blockPT,\n ssrc: base.header.ssrc,\n sequenceNumber,\n marker: true,\n }),\n block\n )\n );\n }\n });\n\n const filtered = packets.filter((p) => {\n // duplicate\n if (this.sequenceNumbers.includes(p.header.sequenceNumber)) {\n return false;\n } else {\n // buffer overflow\n if (this.sequenceNumbers.length > this.size) {\n this.sequenceNumbers.shift();\n }\n this.sequenceNumbers.push(p.header.sequenceNumber);\n return true;\n }\n });\n return filtered;\n }\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtp/red/handler.ts"],"names":[],"mappings":";;;AAAA,6BAAwE;AAExE,iEAAiE;AACjE,mEAAmE;AACnE,oEAAoE;AACpE,oEAAoE;AACpE,oEAAoE;AAEpE,kBAAkB;AAClB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AAEpB,MAAa,UAAU;IAAvB;QACmB;;;;mBAAO,GAAG;WAAC;QACpB;;;;mBAA4B,EAAE;WAAC;IAsDzC,CAAC;IApDC,IAAI,CAAC,GAAQ,EAAE,IAAe;QAC5B,MAAM,OAAO,GAAgB,EAAE,CAAC;QAEhC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;YAC5D,MAAM,cAAc,GAAG,IAAA,aAAS,EAC9B,IAAI,CAAC,MAAM,CAAC,cAAc,EAC1B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAC/B,CAAC;YACF,IAAI,eAAe,EAAE;gBACnB,OAAO,CAAC,IAAI,CACV,IAAI,aAAS,CACX,IAAI,aAAS,CAAC;oBACZ,SAAS,EAAE,IAAA,aAAS,EAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC;oBAC7D,WAAW,EAAE,OAAO;oBACpB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;oBACtB,cAAc;oBACd,MAAM,EAAE,IAAI;iBACb,CAAC,EACF,KAAK,CACN,CACF,CAAC;aACH;iBAAM;gBACL,OAAO,CAAC,IAAI,CACV,IAAI,aAAS,CACX,IAAI,aAAS,CAAC;oBACZ,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;oBAChC,WAAW,EAAE,OAAO;oBACpB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;oBACtB,cAAc;oBACd,MAAM,EAAE,IAAI;iBACb,CAAC,EACF,KAAK,CACN,CACF,CAAC;aACH;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,YAAY;YACZ,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;gBAC1D,OAAO,KAAK,CAAC;aACd;iBAAM;gBACL,kBAAkB;gBAClB,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE;oBAC3C,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;iBAC9B;gBACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gBACnD,OAAO,IAAI,CAAC;aACb;QACH,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAxDD,gCAwDC","sourcesContent":["import { Red, RtpHeader, RtpPacket, uint16Add, uint32Add } from \"../..\";\n\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |F| block PT | timestamp offset | block length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |0| Block PT |\n// +-+-+-+-+-+-+-+-+\n\nexport class RedHandler {\n private readonly size = 150;\n private sequenceNumbers: number[] = [];\n\n push(red: Red, base: RtpPacket) {\n const packets: RtpPacket[] = [];\n\n red.blocks.forEach(({ blockPT, timestampOffset, block }, i) => {\n const sequenceNumber = uint16Add(\n base.header.sequenceNumber,\n -(red.blocks.length - (i + 1))\n );\n if (timestampOffset) {\n packets.push(\n new RtpPacket(\n new RtpHeader({\n timestamp: uint32Add(base.header.timestamp, -timestampOffset),\n payloadType: blockPT,\n ssrc: base.header.ssrc,\n sequenceNumber,\n marker: true,\n }),\n block\n )\n );\n } else {\n packets.push(\n new RtpPacket(\n new RtpHeader({\n timestamp: base.header.timestamp,\n payloadType: blockPT,\n ssrc: base.header.ssrc,\n sequenceNumber,\n marker: true,\n }),\n block\n )\n );\n }\n });\n\n const filtered = packets.filter((p) => {\n // duplicate\n if (this.sequenceNumbers.includes(p.header.sequenceNumber)) {\n return false;\n } else {\n // buffer overflow\n if (this.sequenceNumbers.length > this.size) {\n this.sequenceNumbers.shift();\n }\n this.sequenceNumbers.push(p.header.sequenceNumber);\n return true;\n }\n });\n return filtered;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"rtp.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/rtp.ts"],"names":[],"mappings":"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","sourcesContent":["import { BitWriter, getBit } from \"../../../common/src\";\n\nexport type Extension = { id: number; payload: Buffer };\n\nexport const ExtensionProfiles = {\n OneByte: 0xbede, // 48862\n TwoByte: 0x1000, // 4096\n} as const;\ntype ExtensionProfile =\n typeof ExtensionProfiles[keyof typeof ExtensionProfiles];\n\nconst seqNumOffset = 2;\nconst timestampOffset = 4;\nconst ssrcOffset = 8;\nconst csrcOffset = 12;\nconst csrcSize = 4;\n\n/*\n * 0 1 2 3\n * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |V=2|P|X| CC |M| PT | sequence number |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | timestamp |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | synchronization source (SSRC) identifier |\n * +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n * | contributing source (CSRC) identifiers |\n * | .... |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class RtpHeader {\n version: number = 2;\n padding: boolean = false;\n paddingSize: number = 0;\n extension: boolean = false;\n marker: boolean = false;\n payloadOffset: number = 0;\n payloadType: number = 0;\n /**16bit, 初期値はランダムである必要があります*/\n sequenceNumber: number = 0;\n /**32bit microsec (milli/1000), 初期値はランダムである必要があります*/\n timestamp: number = 0;\n ssrc: number = 0;\n csrcLength = 0;\n csrc: number[] = [];\n extensionProfile: ExtensionProfile = ExtensionProfiles.OneByte;\n /**deserialize only */\n extensionLength?: number;\n extensions: Extension[] = [];\n constructor(props: Partial<RtpHeader> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(rawPacket: Buffer) {\n const h = new RtpHeader();\n let currOffset = 0;\n const v_p_x_cc = rawPacket[currOffset++];\n h.version = getBit(v_p_x_cc, 0, 2);\n h.padding = getBit(v_p_x_cc, 2) > 0;\n h.extension = getBit(v_p_x_cc, 3) > 0;\n h.csrcLength = getBit(v_p_x_cc, 4, 4);\n h.csrc = [...Array(h.csrcLength)].map(() => {\n const csrc = rawPacket.readUInt32BE(currOffset);\n currOffset += 4;\n return csrc;\n });\n currOffset += csrcOffset - 1;\n\n const m_pt = rawPacket[1];\n h.marker = getBit(m_pt, 0) > 0;\n h.payloadType = getBit(m_pt, 1, 7);\n\n h.sequenceNumber = rawPacket.readUInt16BE(seqNumOffset);\n h.timestamp = rawPacket.readUInt32BE(timestampOffset);\n h.ssrc = rawPacket.readUInt32BE(ssrcOffset);\n\n for (let i = 0; i < h.csrc.length; i++) {\n const offset = csrcOffset + i * csrcSize;\n h.csrc[i] = rawPacket.subarray(offset).readUInt32BE();\n }\n if (h.extension) {\n h.extensionProfile = rawPacket\n .subarray(currOffset)\n .readUInt16BE() as ExtensionProfile;\n currOffset += 2;\n const extensionLength = rawPacket.subarray(currOffset).readUInt16BE() * 4;\n h.extensionLength = extensionLength;\n currOffset += 2;\n\n switch (h.extensionProfile) {\n // RFC 8285 RTP One Byte Header Extension\n case ExtensionProfiles.OneByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n\n const extId = rawPacket[currOffset] >> 4;\n const len =\n (rawPacket[currOffset] & (rawPacket[currOffset] ^ 0xf0)) + 1; // and not &^\n currOffset++;\n if (extId === 0xf) {\n break;\n }\n const extension: Extension = {\n id: extId,\n payload: rawPacket.subarray(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n // RFC 8285 RTP Two Byte Header Extension\n case ExtensionProfiles.TwoByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n const extId = rawPacket[currOffset];\n currOffset++;\n const len = rawPacket[currOffset];\n currOffset++;\n\n const extension: Extension = {\n id: extId,\n payload: rawPacket.subarray(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n default:\n {\n const extension: Extension = {\n id: 0,\n payload: rawPacket.subarray(\n currOffset,\n currOffset + extensionLength\n ),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += h.extensions[0].payload.length;\n }\n break;\n }\n }\n h.payloadOffset = currOffset;\n if (h.padding) {\n h.paddingSize = rawPacket[rawPacket.length - 1];\n }\n\n return h;\n }\n\n get serializeSize() {\n const { csrc, extensionProfile, extensions } = this;\n\n let size = 12 + csrc.length * csrcSize;\n\n if (extensions.length > 0 || this.extension === true) {\n let extSize = 4;\n switch (extensionProfile) {\n case ExtensionProfiles.OneByte:\n for (const extension of extensions) {\n extSize += 1 + extension.payload.length;\n }\n break;\n case ExtensionProfiles.TwoByte:\n for (const extension of extensions) {\n extSize += 2 + extension.payload.length;\n }\n break;\n default:\n extSize += extensions[0].payload.length;\n }\n size += Math.floor((extSize + 3) / 4) * 4;\n }\n\n return size;\n }\n\n serialize(size: number) {\n const buf = Buffer.alloc(size);\n let offset = 0;\n\n const v_p_x_cc = new BitWriter(8);\n v_p_x_cc.set(2, 0, this.version);\n if (this.padding) v_p_x_cc.set(1, 2, 1);\n if (this.extensions.length > 0) this.extension = true;\n if (this.extension) v_p_x_cc.set(1, 3, 1);\n v_p_x_cc.set(4, 4, this.csrc.length);\n buf.writeUInt8(v_p_x_cc.value, offset++);\n\n const m_pt = new BitWriter(8);\n if (this.marker) m_pt.set(1, 0, 1);\n m_pt.set(7, 1, this.payloadType);\n buf.writeUInt8(m_pt.value, offset++);\n\n buf.writeUInt16BE(this.sequenceNumber, seqNumOffset);\n offset += 2;\n buf.writeUInt32BE(this.timestamp, timestampOffset);\n offset += 4;\n buf.writeUInt32BE(this.ssrc, ssrcOffset);\n offset += 4;\n\n for (const csrc of this.csrc) {\n buf.writeUInt32BE(csrc, offset);\n offset += 4;\n }\n\n if (this.extension) {\n const extHeaderPos = offset;\n buf.writeUInt16BE(this.extensionProfile, offset);\n offset += 4;\n const startExtensionsPos = offset;\n\n switch (this.extensionProfile) {\n case ExtensionProfiles.OneByte:\n for (const extension of this.extensions) {\n buf.writeUInt8(\n (extension.id << 4) | (extension.payload.length - 1),\n offset++\n );\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n }\n break;\n case ExtensionProfiles.TwoByte: // 1バイトで収まらなくなった歴史的経緯\n for (const extension of this.extensions) {\n buf.writeUInt8(extension.id, offset++);\n buf.writeUInt8(extension.payload.length, offset++);\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n }\n break;\n default:\n const extLen = this.extensions[0].payload.length;\n if (extLen % 4 != 0) {\n throw new Error();\n }\n this.extensions[0].payload.copy(buf, offset);\n offset += extLen;\n }\n\n const extSize = offset - startExtensionsPos;\n const roundedExtSize = Math.trunc((extSize + 3) / 4) * 4;\n\n buf.writeUInt16BE(Math.trunc(roundedExtSize / 4), extHeaderPos + 2);\n // padding 4 bytes boundaries\n for (let i = 0; i < roundedExtSize - extSize; i++) {\n buf.writeUInt8(0, offset);\n offset++;\n }\n }\n this.payloadOffset = offset;\n return buf;\n }\n}\n\nexport class RtpPacket {\n constructor(public header: RtpHeader, public payload: Buffer) {}\n\n get serializeSize() {\n return this.header.serializeSize + this.payload.length;\n }\n\n clone() {\n return new RtpPacket(new RtpHeader({ ...this.header }), this.payload);\n }\n\n serialize() {\n let buf = this.header.serialize(\n this.header.serializeSize + this.payload.length\n );\n const { payloadOffset } = this.header;\n this.payload.copy(buf, payloadOffset);\n if (this.header.padding) {\n const padding = Buffer.alloc(this.header.paddingSize);\n padding.writeUInt8(this.header.paddingSize, this.header.paddingSize - 1);\n buf = Buffer.concat([buf, padding]);\n }\n\n return buf;\n }\n\n static deSerialize(buf: Buffer) {\n const header = RtpHeader.deSerialize(buf);\n const p = new RtpPacket(\n header,\n buf.subarray(header.payloadOffset, buf.length - header.paddingSize)\n );\n return p;\n }\n\n clear() {\n this.payload = null as any;\n }\n}\n"]}
1
+ {"version":3,"file":"rtp.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/rtp.ts"],"names":[],"mappings":"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","sourcesContent":["import { BitWriter, getBit } from \"../../../common/src\";\n\nexport type Extension = { id: number; payload: Buffer };\n\nexport const ExtensionProfiles = {\n OneByte: 0xbede, // 48862\n TwoByte: 0x1000, // 4096\n} as const;\ntype ExtensionProfile =\n typeof ExtensionProfiles[keyof typeof ExtensionProfiles];\n\nconst seqNumOffset = 2;\nconst timestampOffset = 4;\nconst ssrcOffset = 8;\nconst csrcOffset = 12;\nconst csrcSize = 4;\n\n/*\n * 0 1 2 3\n * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |V=2|P|X| CC |M| PT | sequence number |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | timestamp |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | synchronization source (SSRC) identifier |\n * +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n * | contributing source (CSRC) identifiers |\n * | .... |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class RtpHeader {\n version: number = 2;\n padding: boolean = false;\n paddingSize: number = 0;\n extension: boolean = false;\n marker: boolean = false;\n payloadOffset: number = 0;\n payloadType: number = 0;\n /**16bit, 初期値はランダムである必要があります*/\n sequenceNumber: number = 0;\n /**32bit microsec (milli/1000), 初期値はランダムである必要があります*/\n timestamp: number = 0;\n ssrc: number = 0;\n csrcLength = 0;\n csrc: number[] = [];\n extensionProfile: ExtensionProfile = ExtensionProfiles.OneByte;\n /**deserialize only */\n extensionLength?: number;\n extensions: Extension[] = [];\n constructor(props: Partial<RtpHeader> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(rawPacket: Buffer) {\n const h = new RtpHeader();\n let currOffset = 0;\n const v_p_x_cc = rawPacket[currOffset++];\n h.version = getBit(v_p_x_cc, 0, 2);\n h.padding = getBit(v_p_x_cc, 2) > 0;\n h.extension = getBit(v_p_x_cc, 3) > 0;\n h.csrcLength = getBit(v_p_x_cc, 4, 4);\n h.csrc = [...Array(h.csrcLength)].map(() => {\n const csrc = rawPacket.readUInt32BE(currOffset);\n currOffset += 4;\n return csrc;\n });\n currOffset += csrcOffset - 1;\n\n const m_pt = rawPacket[1];\n h.marker = getBit(m_pt, 0) > 0;\n h.payloadType = getBit(m_pt, 1, 7);\n\n h.sequenceNumber = rawPacket.readUInt16BE(seqNumOffset);\n h.timestamp = rawPacket.readUInt32BE(timestampOffset);\n h.ssrc = rawPacket.readUInt32BE(ssrcOffset);\n\n for (let i = 0; i < h.csrc.length; i++) {\n const offset = csrcOffset + i * csrcSize;\n h.csrc[i] = rawPacket.subarray(offset).readUInt32BE();\n }\n if (h.extension) {\n h.extensionProfile = rawPacket\n .subarray(currOffset)\n .readUInt16BE() as ExtensionProfile;\n currOffset += 2;\n const extensionLength = rawPacket.subarray(currOffset).readUInt16BE() * 4;\n h.extensionLength = extensionLength;\n currOffset += 2;\n\n switch (h.extensionProfile) {\n // RFC 8285 RTP One Byte Header Extension\n case ExtensionProfiles.OneByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n\n const extId = rawPacket[currOffset] >> 4;\n const len =\n (rawPacket[currOffset] & (rawPacket[currOffset] ^ 0xf0)) + 1; // and not &^\n currOffset++;\n if (extId === 0xf) {\n break;\n }\n const extension: Extension = {\n id: extId,\n payload: rawPacket.subarray(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n // RFC 8285 RTP Two Byte Header Extension\n case ExtensionProfiles.TwoByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n const extId = rawPacket[currOffset];\n currOffset++;\n const len = rawPacket[currOffset];\n currOffset++;\n\n const extension: Extension = {\n id: extId,\n payload: rawPacket.subarray(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n default:\n {\n const extension: Extension = {\n id: 0,\n payload: rawPacket.subarray(\n currOffset,\n currOffset + extensionLength\n ),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += h.extensions[0].payload.length;\n }\n break;\n }\n }\n h.payloadOffset = currOffset;\n if (h.padding) {\n h.paddingSize = rawPacket[rawPacket.length - 1];\n }\n\n return h;\n }\n\n get serializeSize() {\n const { csrc, extensionProfile, extensions } = this;\n\n let size = 12 + csrc.length * csrcSize;\n\n if (extensions.length > 0 || this.extension === true) {\n let extSize = 4;\n switch (extensionProfile) {\n case ExtensionProfiles.OneByte:\n for (const extension of extensions) {\n extSize += 1 + extension.payload.length;\n }\n break;\n case ExtensionProfiles.TwoByte:\n for (const extension of extensions) {\n extSize += 2 + extension.payload.length;\n }\n break;\n default:\n extSize += extensions[0].payload.length;\n }\n size += Math.floor((extSize + 3) / 4) * 4;\n }\n\n return size;\n }\n\n serialize(size: number) {\n const buf = Buffer.alloc(size);\n let offset = 0;\n\n const v_p_x_cc = new BitWriter(8);\n v_p_x_cc.set(2, 0, this.version);\n if (this.padding) v_p_x_cc.set(1, 2, 1);\n if (this.extensions.length > 0) this.extension = true;\n if (this.extension) v_p_x_cc.set(1, 3, 1);\n v_p_x_cc.set(4, 4, this.csrc.length);\n buf.writeUInt8(v_p_x_cc.value, offset++);\n\n const m_pt = new BitWriter(8);\n if (this.marker) m_pt.set(1, 0, 1);\n m_pt.set(7, 1, this.payloadType);\n buf.writeUInt8(m_pt.value, offset++);\n\n buf.writeUInt16BE(this.sequenceNumber, seqNumOffset);\n offset += 2;\n buf.writeUInt32BE(this.timestamp, timestampOffset);\n offset += 4;\n buf.writeUInt32BE(this.ssrc, ssrcOffset);\n offset += 4;\n\n for (const csrc of this.csrc) {\n buf.writeUInt32BE(csrc, offset);\n offset += 4;\n }\n\n if (this.extension) {\n const extHeaderPos = offset;\n buf.writeUInt16BE(this.extensionProfile, offset);\n offset += 4;\n const startExtensionsPos = offset;\n\n switch (this.extensionProfile) {\n case ExtensionProfiles.OneByte:\n for (const extension of this.extensions) {\n buf.writeUInt8(\n (extension.id << 4) | (extension.payload.length - 1),\n offset++\n );\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n }\n break;\n case ExtensionProfiles.TwoByte: // 1バイトで収まらなくなった歴史的経緯\n for (const extension of this.extensions) {\n buf.writeUInt8(extension.id, offset++);\n buf.writeUInt8(extension.payload.length, offset++);\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n }\n break;\n default:\n const extLen = this.extensions[0].payload.length;\n if (extLen % 4 != 0) {\n throw new Error();\n }\n this.extensions[0].payload.copy(buf, offset);\n offset += extLen;\n }\n\n const extSize = offset - startExtensionsPos;\n const roundedExtSize = Math.trunc((extSize + 3) / 4) * 4;\n\n buf.writeUInt16BE(Math.trunc(roundedExtSize / 4), extHeaderPos + 2);\n // padding 4 bytes boundaries\n for (let i = 0; i < roundedExtSize - extSize; i++) {\n buf.writeUInt8(0, offset);\n offset++;\n }\n }\n this.payloadOffset = offset;\n return buf;\n }\n}\n\nexport class RtpPacket {\n constructor(public header: RtpHeader, public payload: Buffer) {}\n\n get serializeSize() {\n return this.header.serializeSize + this.payload.length;\n }\n\n clone() {\n return new RtpPacket(new RtpHeader({ ...this.header }), this.payload);\n }\n\n serialize() {\n let buf = this.header.serialize(\n this.header.serializeSize + this.payload.length\n );\n const { payloadOffset } = this.header;\n this.payload.copy(buf, payloadOffset);\n if (this.header.padding) {\n const padding = Buffer.alloc(this.header.paddingSize);\n padding.writeUInt8(this.header.paddingSize, this.header.paddingSize - 1);\n buf = Buffer.concat([buf, padding]);\n }\n\n return buf;\n }\n\n static deSerialize(buf: Buffer) {\n const header = RtpHeader.deSerialize(buf);\n const p = new RtpPacket(\n header,\n buf.subarray(header.payloadOffset, buf.length - header.paddingSize)\n );\n return p;\n }\n\n clear() {\n this.payload = null as any;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ctr.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/cipher/ctr.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createDecipheriv, createHmac } from \"crypto\";\n\nimport { RtcpHeader } from \"../../rtcp/header\";\nimport { RtpHeader } from \"../../rtp/rtp\";\nimport { CipherAesBase } from \".\";\n\nexport class CipherAesCtr extends CipherAesBase {\n readonly authTagLength = 10;\n\n constructor(\n srtpSessionKey: Buffer,\n srtpSessionSalt: Buffer,\n srtcpSessionKey: Buffer,\n srtcpSessionSalt: Buffer,\n private srtpSessionAuthTag: Buffer,\n private srtcpSessionAuthTag: Buffer\n ) {\n super(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt);\n }\n\n encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number) {\n const headerBuffer = header.serialize(header.serializeSize);\n\n const counter = this.generateCounter(\n header.sequenceNumber,\n rolloverCounter,\n header.ssrc,\n this.srtpSessionSalt\n );\n\n const cipher = createCipheriv(\"aes-128-ctr\", this.srtpSessionKey, counter);\n const enc = cipher.update(payload);\n\n const authTag = this.generateSrtpAuthTag(\n rolloverCounter,\n headerBuffer,\n enc\n );\n return Buffer.concat([headerBuffer, enc, authTag]);\n }\n\n decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader] {\n const header = RtpHeader.deSerialize(cipherText);\n\n const size = cipherText.length - this.authTagLength;\n\n cipherText = cipherText.subarray(0, cipherText.length - this.authTagLength);\n\n const counter = this.generateCounter(\n header.sequenceNumber,\n rolloverCounter,\n header.ssrc,\n this.srtpSessionSalt\n );\n const cipher = createDecipheriv(\n \"aes-128-ctr\",\n this.srtpSessionKey,\n counter\n );\n const payload = cipherText.subarray(header.payloadOffset);\n const buf = cipher.update(payload);\n\n const dst = Buffer.concat([\n cipherText.subarray(0, header.payloadOffset),\n buf,\n Buffer.alloc(size - header.payloadOffset - buf.length),\n ]);\n\n return [dst, header];\n }\n\n encryptRTCP(rtcpPacket: Buffer, srtcpIndex: number): Buffer {\n let out = Buffer.from(rtcpPacket);\n const ssrc = out.readUInt32BE(4);\n\n const counter = this.generateCounter(\n srtcpIndex & 0xffff,\n srtcpIndex >> 16,\n ssrc,\n this.srtcpSessionSalt\n );\n const cipher = createCipheriv(\"aes-128-ctr\", this.srtcpSessionKey, counter);\n // Encrypt everything after header\n const buf = cipher.update(out.slice(8));\n buf.copy(out, 8);\n out = Buffer.concat([out, Buffer.alloc(4)]);\n out.writeUInt32BE(srtcpIndex, out.length - 4);\n out[out.length - 4] |= 0x80;\n const authTag = this.generateSrtcpAuthTag(out);\n out = Buffer.concat([out, authTag]);\n\n return out;\n }\n\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n const header = RtcpHeader.deSerialize(encrypted);\n\n const tailOffset = encrypted.length - (this.authTagLength + srtcpIndexSize);\n const out = Buffer.from(encrypted).slice(0, tailOffset);\n\n const isEncrypted = encrypted[tailOffset] >> 7;\n if (isEncrypted === 0) return [out, header];\n\n let srtcpIndex = encrypted.readUInt32BE(tailOffset);\n srtcpIndex &= ~(1 << 31);\n\n const ssrc = encrypted.readUInt32BE(4);\n\n // todo impl compare\n const actualTag = encrypted.subarray(encrypted.length - 10);\n\n const counter = this.generateCounter(\n srtcpIndex & 0xffff,\n srtcpIndex >> 16,\n ssrc,\n this.srtcpSessionSalt\n );\n const cipher = createDecipheriv(\n \"aes-128-ctr\",\n this.srtcpSessionKey,\n counter\n );\n const buf = cipher.update(out.subarray(8));\n buf.copy(out, 8);\n return [out, header];\n }\n\n generateSrtcpAuthTag(buf: Buffer) {\n const srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n return srtcpSessionAuth.update(buf).digest().slice(0, 10);\n }\n\n generateCounter(\n sequenceNumber: number,\n rolloverCounter: number,\n ssrc: number,\n sessionSalt: Buffer\n ) {\n const counter = Buffer.alloc(16);\n counter.writeUInt32BE(ssrc, 4);\n counter.writeUInt32BE(rolloverCounter, 8);\n counter.writeUInt32BE(Number(BigInt(sequenceNumber) << 16n), 12);\n\n for (let i = 0; i < sessionSalt.length; i++) {\n counter[i] ^= sessionSalt[i];\n }\n return counter;\n }\n\n generateSrtpAuthTag(roc: number, ...buffers: Buffer[]) {\n const srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n const rocRaw = Buffer.alloc(4);\n rocRaw.writeUInt32BE(roc);\n\n for (const buf of buffers) {\n srtpSessionAuth.update(buf);\n }\n return srtpSessionAuth.update(rocRaw).digest().subarray(0, 10);\n }\n}\n\nconst srtcpIndexSize = 4;\n"]}
1
+ {"version":3,"file":"ctr.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/cipher/ctr.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createDecipheriv, createHmac } from \"crypto\";\n\nimport { RtcpHeader } from \"../../rtcp/header\";\nimport { RtpHeader } from \"../../rtp/rtp\";\nimport { CipherAesBase } from \".\";\n\nexport class CipherAesCtr extends CipherAesBase {\n readonly authTagLength = 10;\n\n constructor(\n srtpSessionKey: Buffer,\n srtpSessionSalt: Buffer,\n srtcpSessionKey: Buffer,\n srtcpSessionSalt: Buffer,\n private srtpSessionAuthTag: Buffer,\n private srtcpSessionAuthTag: Buffer\n ) {\n super(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt);\n }\n\n encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number) {\n const headerBuffer = header.serialize(header.serializeSize);\n\n const counter = this.generateCounter(\n header.sequenceNumber,\n rolloverCounter,\n header.ssrc,\n this.srtpSessionSalt\n );\n\n const cipher = createCipheriv(\"aes-128-ctr\", this.srtpSessionKey, counter);\n const enc = cipher.update(payload);\n\n const authTag = this.generateSrtpAuthTag(\n rolloverCounter,\n headerBuffer,\n enc\n );\n return Buffer.concat([headerBuffer, enc, authTag]);\n }\n\n decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader] {\n const header = RtpHeader.deSerialize(cipherText);\n\n const size = cipherText.length - this.authTagLength;\n\n cipherText = cipherText.subarray(0, cipherText.length - this.authTagLength);\n\n const counter = this.generateCounter(\n header.sequenceNumber,\n rolloverCounter,\n header.ssrc,\n this.srtpSessionSalt\n );\n const cipher = createDecipheriv(\n \"aes-128-ctr\",\n this.srtpSessionKey,\n counter\n );\n const payload = cipherText.subarray(header.payloadOffset);\n const buf = cipher.update(payload);\n\n const dst = Buffer.concat([\n cipherText.subarray(0, header.payloadOffset),\n buf,\n Buffer.alloc(size - header.payloadOffset - buf.length),\n ]);\n\n return [dst, header];\n }\n\n encryptRTCP(rtcpPacket: Buffer, srtcpIndex: number): Buffer {\n let out = Buffer.from(rtcpPacket);\n const ssrc = out.readUInt32BE(4);\n\n const counter = this.generateCounter(\n srtcpIndex & 0xffff,\n srtcpIndex >> 16,\n ssrc,\n this.srtcpSessionSalt\n );\n const cipher = createCipheriv(\"aes-128-ctr\", this.srtcpSessionKey, counter);\n // Encrypt everything after header\n const buf = cipher.update(out.slice(8));\n buf.copy(out, 8);\n out = Buffer.concat([out, Buffer.alloc(4)]);\n out.writeUInt32BE(srtcpIndex, out.length - 4);\n out[out.length - 4] |= 0x80;\n const authTag = this.generateSrtcpAuthTag(out);\n out = Buffer.concat([out, authTag]);\n\n return out;\n }\n\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n const header = RtcpHeader.deSerialize(encrypted);\n\n const tailOffset = encrypted.length - (this.authTagLength + srtcpIndexSize);\n const out = Buffer.from(encrypted).slice(0, tailOffset);\n\n const isEncrypted = encrypted[tailOffset] >> 7;\n if (isEncrypted === 0) return [out, header];\n\n let srtcpIndex = encrypted.readUInt32BE(tailOffset);\n srtcpIndex &= ~(1 << 31);\n\n const ssrc = encrypted.readUInt32BE(4);\n\n // todo impl compare\n const actualTag = encrypted.subarray(encrypted.length - 10);\n\n const counter = this.generateCounter(\n srtcpIndex & 0xffff,\n srtcpIndex >> 16,\n ssrc,\n this.srtcpSessionSalt\n );\n const cipher = createDecipheriv(\n \"aes-128-ctr\",\n this.srtcpSessionKey,\n counter\n );\n const buf = cipher.update(out.subarray(8));\n buf.copy(out, 8);\n return [out, header];\n }\n\n generateSrtcpAuthTag(buf: Buffer) {\n const srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n return srtcpSessionAuth.update(buf).digest().slice(0, 10);\n }\n\n generateCounter(\n sequenceNumber: number,\n rolloverCounter: number,\n ssrc: number,\n sessionSalt: Buffer\n ) {\n const counter = Buffer.alloc(16);\n counter.writeUInt32BE(ssrc, 4);\n counter.writeUInt32BE(rolloverCounter, 8);\n counter.writeUInt32BE(Number(BigInt(sequenceNumber) << 16n), 12);\n\n for (let i = 0; i < sessionSalt.length; i++) {\n counter[i] ^= sessionSalt[i];\n }\n return counter;\n }\n\n generateSrtpAuthTag(roc: number, ...buffers: Buffer[]) {\n const srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n const rocRaw = Buffer.alloc(4);\n rocRaw.writeUInt32BE(roc);\n\n for (const buf of buffers) {\n srtpSessionAuth.update(buf);\n }\n return srtpSessionAuth.update(rocRaw).digest().subarray(0, 10);\n }\n}\n\nconst srtcpIndexSize = 4;\n"]}