werift 0.19.0 → 0.19.1

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 (241) hide show
  1. package/lib/common/src/binary.js.map +1 -1
  2. package/lib/common/src/network.js.map +1 -1
  3. package/lib/common/src/promise.js.map +1 -1
  4. package/lib/dtls/src/cipher/const.js +2 -2
  5. package/lib/dtls/src/cipher/const.js.map +1 -1
  6. package/lib/dtls/src/cipher/create.js +10 -10
  7. package/lib/dtls/src/cipher/create.js.map +1 -1
  8. package/lib/dtls/src/cipher/namedCurve.js.map +1 -1
  9. package/lib/dtls/src/cipher/prf.js +1 -1
  10. package/lib/dtls/src/cipher/prf.js.map +1 -1
  11. package/lib/dtls/src/cipher/suites/aead.d.ts +1 -1
  12. package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
  13. package/lib/dtls/src/client.js.map +1 -1
  14. package/lib/dtls/src/context/cipher.js +2 -2
  15. package/lib/dtls/src/context/cipher.js.map +1 -1
  16. package/lib/dtls/src/context/dtls.js.map +1 -1
  17. package/lib/dtls/src/context/srtp.js.map +1 -1
  18. package/lib/dtls/src/flight/client/flight5.js +8 -6
  19. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  20. package/lib/dtls/src/flight/flight.js +1 -1
  21. package/lib/dtls/src/flight/flight.js.map +1 -1
  22. package/lib/dtls/src/flight/server/flight2.js.map +1 -1
  23. package/lib/dtls/src/flight/server/flight4.js.map +1 -1
  24. package/lib/dtls/src/flight/server/flight6.js.map +1 -1
  25. package/lib/dtls/src/handshake/const.js +1 -1
  26. package/lib/dtls/src/handshake/const.js.map +1 -1
  27. package/lib/dtls/src/handshake/extensions/ellipticCurves.js +1 -1
  28. package/lib/dtls/src/handshake/extensions/ellipticCurves.js.map +1 -1
  29. package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js +1 -1
  30. package/lib/dtls/src/handshake/extensions/extendedMasterSecret.js.map +1 -1
  31. package/lib/dtls/src/handshake/extensions/renegotiationIndication.js +1 -1
  32. package/lib/dtls/src/handshake/extensions/renegotiationIndication.js.map +1 -1
  33. package/lib/dtls/src/handshake/extensions/signature.js +1 -1
  34. package/lib/dtls/src/handshake/extensions/signature.js.map +1 -1
  35. package/lib/dtls/src/handshake/extensions/useSrtp.js +1 -1
  36. package/lib/dtls/src/handshake/extensions/useSrtp.js.map +1 -1
  37. package/lib/dtls/src/handshake/message/alert.js +1 -1
  38. package/lib/dtls/src/handshake/message/alert.js.map +1 -1
  39. package/lib/dtls/src/handshake/message/certificate.js +1 -1
  40. package/lib/dtls/src/handshake/message/certificate.js.map +1 -1
  41. package/lib/dtls/src/handshake/message/changeCipherSpec.js +1 -1
  42. package/lib/dtls/src/handshake/message/changeCipherSpec.js.map +1 -1
  43. package/lib/dtls/src/handshake/message/client/certificateVerify.js +1 -1
  44. package/lib/dtls/src/handshake/message/client/certificateVerify.js.map +1 -1
  45. package/lib/dtls/src/handshake/message/client/hello.js +1 -1
  46. package/lib/dtls/src/handshake/message/client/hello.js.map +1 -1
  47. package/lib/dtls/src/handshake/message/client/keyExchange.js +1 -1
  48. package/lib/dtls/src/handshake/message/client/keyExchange.js.map +1 -1
  49. package/lib/dtls/src/handshake/message/server/certificateRequest.js +1 -1
  50. package/lib/dtls/src/handshake/message/server/certificateRequest.js.map +1 -1
  51. package/lib/dtls/src/handshake/message/server/hello.js +1 -1
  52. package/lib/dtls/src/handshake/message/server/hello.js.map +1 -1
  53. package/lib/dtls/src/handshake/message/server/helloDone.js +1 -1
  54. package/lib/dtls/src/handshake/message/server/helloDone.js.map +1 -1
  55. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js +1 -1
  56. package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js.map +1 -1
  57. package/lib/dtls/src/handshake/message/server/keyExchange.js +1 -1
  58. package/lib/dtls/src/handshake/message/server/keyExchange.js.map +1 -1
  59. package/lib/dtls/src/handshake/random.js +2 -2
  60. package/lib/dtls/src/handshake/random.js.map +1 -1
  61. package/lib/dtls/src/helper.d.ts +1 -1
  62. package/lib/dtls/src/helper.js.map +1 -1
  63. package/lib/dtls/src/record/const.js +2 -2
  64. package/lib/dtls/src/record/const.js.map +1 -1
  65. package/lib/dtls/src/record/message/fragment.d.ts +1 -1
  66. package/lib/dtls/src/record/message/fragment.js +3 -3
  67. package/lib/dtls/src/record/message/fragment.js.map +1 -1
  68. package/lib/dtls/src/record/message/header.js +2 -2
  69. package/lib/dtls/src/record/message/header.js.map +1 -1
  70. package/lib/dtls/src/record/message/plaintext.js +1 -1
  71. package/lib/dtls/src/record/message/plaintext.js.map +1 -1
  72. package/lib/dtls/src/record/receive.js.map +1 -1
  73. package/lib/dtls/src/server.js.map +1 -1
  74. package/lib/dtls/src/socket.js.map +1 -1
  75. package/lib/dtls/src/transport.js.map +1 -1
  76. package/lib/ice/src/candidate.js +1 -1
  77. package/lib/ice/src/candidate.js.map +1 -1
  78. package/lib/ice/src/dns/lookup.js.map +1 -1
  79. package/lib/ice/src/exceptions.js.map +1 -1
  80. package/lib/ice/src/helper.js.map +1 -1
  81. package/lib/ice/src/ice.d.ts +5 -13
  82. package/lib/ice/src/ice.js +57 -154
  83. package/lib/ice/src/ice.js.map +1 -1
  84. package/lib/ice/src/stun/attributes.js.map +1 -1
  85. package/lib/ice/src/stun/const.d.ts +1 -1
  86. package/lib/ice/src/stun/const.js +2 -2
  87. package/lib/ice/src/stun/const.js.map +1 -1
  88. package/lib/ice/src/stun/message.js +1 -1
  89. package/lib/ice/src/stun/message.js.map +1 -1
  90. package/lib/ice/src/stun/protocol.js.map +1 -1
  91. package/lib/ice/src/stun/transaction.js.map +1 -1
  92. package/lib/ice/src/transport.js +1 -1
  93. package/lib/ice/src/transport.js.map +1 -1
  94. package/lib/ice/src/turn/protocol.js.map +1 -1
  95. package/lib/ice/src/utils.d.ts +1 -0
  96. package/lib/ice/src/utils.js +72 -1
  97. package/lib/ice/src/utils.js.map +1 -1
  98. package/lib/rtp/src/codec/av1.js +1 -1
  99. package/lib/rtp/src/codec/av1.js.map +1 -1
  100. package/lib/rtp/src/codec/h264.js.map +1 -1
  101. package/lib/rtp/src/codec/index.js.map +1 -1
  102. package/lib/rtp/src/codec/opus.js.map +1 -1
  103. package/lib/rtp/src/codec/vp8.js.map +1 -1
  104. package/lib/rtp/src/codec/vp9.js.map +1 -1
  105. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  106. package/lib/rtp/src/extra/container/mp4/exp-golomb.js.map +1 -1
  107. package/lib/rtp/src/extra/container/mp4/h264.js +1 -1
  108. package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
  109. package/lib/rtp/src/extra/container/mp4/sps-parser.js +4 -4
  110. package/lib/rtp/src/extra/container/mp4/sps-parser.js.map +1 -1
  111. package/lib/rtp/src/extra/container/ogg/parser.js.map +1 -1
  112. package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
  113. package/lib/rtp/src/extra/container/webm/ebml/ebml.js +1 -1
  114. package/lib/rtp/src/extra/container/webm/ebml/ebml.js.map +1 -1
  115. package/lib/rtp/src/extra/container/webm/ebml/typedArrayUtils.js.map +1 -1
  116. package/lib/rtp/src/extra/processor/depacketizer.js.map +1 -1
  117. package/lib/rtp/src/extra/processor/depacketizerTransformer.js.map +1 -1
  118. package/lib/rtp/src/extra/processor/dtx.js.map +1 -1
  119. package/lib/rtp/src/extra/processor/interface.js.map +1 -1
  120. package/lib/rtp/src/extra/processor/jitterBuffer.js.map +1 -1
  121. package/lib/rtp/src/extra/processor/jitterBufferTransformer.js.map +1 -1
  122. package/lib/rtp/src/extra/processor/lipsync.js.map +1 -1
  123. package/lib/rtp/src/extra/processor/lipsyncCallback.d.ts +1 -1
  124. package/lib/rtp/src/extra/processor/lipsyncCallback.js.map +1 -1
  125. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  126. package/lib/rtp/src/extra/processor/mp4Callback.js +1 -1
  127. package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
  128. package/lib/rtp/src/extra/processor/mute.js.map +1 -1
  129. package/lib/rtp/src/extra/processor/muteCallback.js.map +1 -1
  130. package/lib/rtp/src/extra/processor/nack.js.map +1 -1
  131. package/lib/rtp/src/extra/processor/ntpTime.js.map +1 -1
  132. package/lib/rtp/src/extra/processor/rtcpCallback.js.map +1 -1
  133. package/lib/rtp/src/extra/processor/rtpCallback.js.map +1 -1
  134. package/lib/rtp/src/extra/processor/rtpStream.js.map +1 -1
  135. package/lib/rtp/src/extra/processor/rtpTime.js.map +1 -1
  136. package/lib/rtp/src/extra/processor/webm.js.map +1 -1
  137. package/lib/rtp/src/extra/processor/webmCallback.js.map +1 -1
  138. package/lib/rtp/src/extra/processor/webmStream.js.map +1 -1
  139. package/lib/rtp/src/index.d.ts +1 -0
  140. package/lib/rtp/src/rtcp/header.js.map +1 -1
  141. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js +1 -1
  142. package/lib/rtp/src/rtcp/psfb/fullIntraRequest.js.map +1 -1
  143. package/lib/rtp/src/rtcp/psfb/index.js +1 -1
  144. package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
  145. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js +1 -1
  146. package/lib/rtp/src/rtcp/psfb/pictureLossIndication.js.map +1 -1
  147. package/lib/rtp/src/rtcp/psfb/remb.js +1 -1
  148. package/lib/rtp/src/rtcp/psfb/remb.js.map +1 -1
  149. package/lib/rtp/src/rtcp/rr.js +1 -1
  150. package/lib/rtp/src/rtcp/rr.js.map +1 -1
  151. package/lib/rtp/src/rtcp/rtcp.js.map +1 -1
  152. package/lib/rtp/src/rtcp/rtpfb/index.js +1 -1
  153. package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
  154. package/lib/rtp/src/rtcp/rtpfb/nack.js +2 -2
  155. package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
  156. package/lib/rtp/src/rtcp/rtpfb/twcc.js +3 -3
  157. package/lib/rtp/src/rtcp/rtpfb/twcc.js.map +1 -1
  158. package/lib/rtp/src/rtcp/sdes.js +1 -1
  159. package/lib/rtp/src/rtcp/sdes.js.map +1 -1
  160. package/lib/rtp/src/rtcp/sr.js +1 -1
  161. package/lib/rtp/src/rtcp/sr.js.map +1 -1
  162. package/lib/rtp/src/rtp/headerExtension.js.map +1 -1
  163. package/lib/rtp/src/rtp/red/encoder.js.map +1 -1
  164. package/lib/rtp/src/rtp/red/handler.js.map +1 -1
  165. package/lib/rtp/src/rtp/red/packet.js +0 -1
  166. package/lib/rtp/src/rtp/red/packet.js.map +1 -1
  167. package/lib/rtp/src/rtp/rtp.js +3 -2
  168. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  169. package/lib/rtp/src/srtp/cipher/ctr.d.ts +1 -1
  170. package/lib/rtp/src/srtp/cipher/ctr.js +1 -1
  171. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  172. package/lib/rtp/src/srtp/cipher/gcm.d.ts +1 -1
  173. package/lib/rtp/src/srtp/cipher/gcm.js +1 -1
  174. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
  175. package/lib/rtp/src/srtp/const.js.map +1 -1
  176. package/lib/rtp/src/srtp/context/context.js +1 -1
  177. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  178. package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
  179. package/lib/sctp/src/chunk.js +17 -17
  180. package/lib/sctp/src/chunk.js.map +1 -1
  181. package/lib/sctp/src/const.js +2 -2
  182. package/lib/sctp/src/const.js.map +1 -1
  183. package/lib/sctp/src/param.js +5 -5
  184. package/lib/sctp/src/param.js.map +1 -1
  185. package/lib/sctp/src/sctp.js +5 -1
  186. package/lib/sctp/src/sctp.js.map +1 -1
  187. package/lib/sctp/src/transport.js.map +1 -1
  188. package/lib/webrtc/src/dataChannel.d.ts +1 -1
  189. package/lib/webrtc/src/dataChannel.js +1 -1
  190. package/lib/webrtc/src/dataChannel.js.map +1 -1
  191. package/lib/webrtc/src/helper.js.map +1 -1
  192. package/lib/webrtc/src/media/parameters.d.ts +1 -2
  193. package/lib/webrtc/src/media/parameters.js.map +1 -1
  194. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  195. package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
  196. package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
  197. package/lib/webrtc/src/media/router.js +4 -2
  198. package/lib/webrtc/src/media/router.js.map +1 -1
  199. package/lib/webrtc/src/media/rtpReceiver.d.ts +1 -1
  200. package/lib/webrtc/src/media/rtpReceiver.js +1 -1
  201. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  202. package/lib/webrtc/src/media/rtpSender.js +1 -1
  203. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  204. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  205. package/lib/webrtc/src/media/sender/cumulativeResult.js.map +1 -1
  206. package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -1
  207. package/lib/webrtc/src/media/track.js.map +1 -1
  208. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  209. package/lib/webrtc/src/nonstandard/recorder/writer/index.d.ts +1 -1
  210. package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
  211. package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +2 -2
  212. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -2
  213. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  214. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  215. package/lib/webrtc/src/peerConnection.d.ts +2 -2
  216. package/lib/webrtc/src/peerConnection.js +11 -8
  217. package/lib/webrtc/src/peerConnection.js.map +1 -1
  218. package/lib/webrtc/src/sdp.js +47 -37
  219. package/lib/webrtc/src/sdp.js.map +1 -1
  220. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  221. package/lib/webrtc/src/transport/ice.js.map +1 -1
  222. package/lib/webrtc/src/transport/sctp.js +9 -7
  223. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  224. package/lib/webrtc/src/utils.js +1 -1
  225. package/lib/webrtc/src/utils.js.map +1 -1
  226. package/package.json +9 -17
  227. package/src/dataChannel.ts +1 -1
  228. package/src/media/parameters.ts +2 -2
  229. package/src/media/receiver/nack.ts +4 -7
  230. package/src/media/router.ts +36 -40
  231. package/src/media/rtpReceiver.ts +12 -15
  232. package/src/media/rtpSender.ts +69 -82
  233. package/src/nonstandard/recorder/writer/index.ts +1 -1
  234. package/src/nonstandard/recorder/writer/webm.ts +3 -3
  235. package/src/nonstandard/userMedia.ts +1 -3
  236. package/src/peerConnection.ts +28 -24
  237. package/src/sdp.ts +49 -55
  238. package/src/transport/dtls.ts +3 -6
  239. package/src/transport/ice.ts +1 -1
  240. package/src/transport/sctp.ts +60 -66
  241. package/src/utils.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../ice/src/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { createSocket, Socket, SocketType } from \"dgram\";\n\nimport {\n findPort,\n interfaceAddress,\n InterfaceAddresses,\n} from \"../../common/src\";\nimport { Address } from \"./types/model\";\nimport { normalizeFamilyNodeV18 } from \"./utils\";\n\nconst log = debug(\"werift-ice:packages/ice/src/transport.ts\");\n\nexport class UdpTransport implements Transport {\n private socket: Socket;\n onData: (data: Buffer, addr: Address) => void = () => {};\n\n constructor(\n private type: SocketType,\n private portRange?: [number, number],\n private interfaceAddresses?: InterfaceAddresses,\n ) {\n this.socket = createSocket(this.type);\n this.socket.on(\"message\", (data, info) => {\n if (normalizeFamilyNodeV18(info.family) === 6) {\n [info.address] = info.address.split(\"%\"); // example fe80::1d3a:8751:4ffd:eb80%wlp82s0\n }\n try {\n this.onData(data, [info.address, info.port]);\n } catch (error) {\n log(\"onData error\", error);\n }\n });\n }\n\n static async init(\n type: SocketType,\n portRange?: [number, number],\n interfaceAddresses?: InterfaceAddresses,\n ) {\n const transport = new UdpTransport(type, portRange, interfaceAddresses);\n await transport.init();\n return transport;\n }\n\n private async init() {\n const address = interfaceAddress(this.type, this.interfaceAddresses);\n if (this.portRange) {\n const port = await findPort(\n this.portRange[0],\n this.portRange[1],\n this.type,\n this.interfaceAddresses,\n );\n this.socket.bind({ port, address });\n } else {\n this.socket.bind({ address });\n }\n await new Promise((r) => this.socket.once(\"listening\", r));\n }\n\n send = (data: Buffer, addr: Address) =>\n new Promise<void>((r, f) => {\n this.socket.send(data, addr[1], addr[0], (error) => {\n if (error) {\n log(\"send error\", addr, data);\n f(error);\n } else {\n r();\n }\n });\n });\n\n address() {\n return this.socket.address();\n }\n\n close = () =>\n new Promise<void>((r) => {\n this.socket.once(\"close\", r);\n try {\n this.socket.close();\n } catch (error) {\n r();\n }\n });\n}\n\nexport interface Transport {\n onData: (data: Buffer, addr: Address) => void;\n send: (data: Buffer, addr: Address) => Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../ice/src/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { Socket, SocketType, createSocket } from \"dgram\";\nimport debug from \"debug\";\n\nimport {\n InterfaceAddresses,\n findPort,\n interfaceAddress,\n} from \"../../common/src\";\nimport { Address } from \"./types/model\";\nimport { normalizeFamilyNodeV18 } from \"./utils\";\n\nconst log = debug(\"werift-ice:packages/ice/src/transport.ts\");\n\nexport class UdpTransport implements Transport {\n private socket: Socket;\n onData: (data: Buffer, addr: Address) => void = () => {};\n\n constructor(\n private type: SocketType,\n private portRange?: [number, number],\n private interfaceAddresses?: InterfaceAddresses,\n ) {\n this.socket = createSocket(this.type);\n this.socket.on(\"message\", (data, info) => {\n if (normalizeFamilyNodeV18(info.family) === 6) {\n [info.address] = info.address.split(\"%\"); // example fe80::1d3a:8751:4ffd:eb80%wlp82s0\n }\n try {\n this.onData(data, [info.address, info.port]);\n } catch (error) {\n log(\"onData error\", error);\n }\n });\n }\n\n static async init(\n type: SocketType,\n portRange?: [number, number],\n interfaceAddresses?: InterfaceAddresses,\n ) {\n const transport = new UdpTransport(type, portRange, interfaceAddresses);\n await transport.init();\n return transport;\n }\n\n private async init() {\n const address = interfaceAddress(this.type, this.interfaceAddresses);\n if (this.portRange) {\n const port = await findPort(\n this.portRange[0],\n this.portRange[1],\n this.type,\n this.interfaceAddresses,\n );\n this.socket.bind({ port, address });\n } else {\n this.socket.bind({ address });\n }\n await new Promise((r) => this.socket.once(\"listening\", r));\n }\n\n send = (data: Buffer, addr: Address) =>\n new Promise<void>((r, f) => {\n this.socket.send(data, addr[1], addr[0], (error) => {\n if (error) {\n log(\"send error\", addr, data);\n f(error);\n } else {\n r();\n }\n });\n });\n\n address() {\n return this.socket.address();\n }\n\n close = () =>\n new Promise<void>((r) => {\n this.socket.once(\"close\", r);\n try {\n this.socket.close();\n } catch (error) {\n r();\n }\n });\n}\n\nexport interface Transport {\n onData: (data: Buffer, addr: Address) => void;\n send: (data: Buffer, addr: Address) => Promise<void>;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../ice/src/turn/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"crypto\";\nimport debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport PCancelable from \"p-cancelable\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\n\nimport { InterfaceAddresses } from \"../../../common/src/network\";\nimport { Candidate } from \"../candidate\";\nimport { TransactionFailed } from \"../exceptions\";\nimport { Future, future } from \"../helper\";\nimport { Connection } from \"../ice\";\nimport { classes, methods } from \"../stun/const\";\nimport { Message, parseMessage } from \"../stun/message\";\nimport { Transaction } from \"../stun/transaction\";\nimport { Transport, UdpTransport } from \"../transport\";\nimport { Address, Protocol } from \"../types/model\";\n\nconst log = debug(\"werift-ice:packages/ice/src/turn/protocol.ts\");\n\nconst TCP_TRANSPORT = 0x06000000;\nconst UDP_TRANSPORT = 0x11000000;\n\nclass TurnTransport implements Protocol {\n readonly type = \"turn\";\n localCandidate!: Candidate;\n receiver?: Connection;\n\n constructor(public turn: TurnClient) {\n turn.onDatagramReceived = this.datagramReceived;\n }\n\n private datagramReceived = (data: Buffer, addr: Address) => {\n try {\n const message = parseMessage(data);\n if (!message) {\n this.receiver?.dataReceived(data, this.localCandidate.component);\n return;\n }\n\n if (\n (message?.messageClass === classes.RESPONSE ||\n message?.messageClass === classes.ERROR) &&\n this.turn.transactions[message.transactionIdHex]\n ) {\n const transaction = this.turn.transactions[message.transactionIdHex];\n transaction.responseReceived(message, addr);\n } else if (message?.messageClass === classes.REQUEST) {\n this.receiver?.requestReceived(message, addr, this, data);\n }\n } catch (error) {\n log(\"datagramReceived error\", error);\n }\n };\n\n async request(request: Message, addr: Address, integrityKey?: Buffer) {\n if (this.turn.transactions[request.transactionIdHex])\n throw new Error(\"exist\");\n\n if (integrityKey) {\n request.addMessageIntegrity(integrityKey);\n request.addFingerprint();\n }\n\n const transaction = new Transaction(request, addr, this);\n this.turn.transactions[request.transactionIdHex] = transaction;\n\n try {\n return await transaction.run();\n } catch (e) {\n throw e;\n } finally {\n delete this.turn.transactions[request.transactionIdHex];\n }\n }\n async connectionMade() {}\n async sendData(data: Buffer, addr: Address) {\n await this.turn.sendData(data, addr);\n }\n async sendStun(message: Message, addr: Address) {\n await this.turn.sendData(message.bytes, addr);\n }\n}\n\nclass TurnClient implements Protocol {\n type = \"inner_turn\";\n readonly onData = new Event<[Buffer, Address]>();\n transactions: { [hexId: string]: Transaction } = {};\n integrityKey?: Buffer;\n nonce?: Buffer;\n realm?: string;\n relayedAddress!: Address;\n mappedAddress!: Address;\n refreshHandle?: Future;\n channelNumber = 0x4000;\n channel?: { number: number; address: Address };\n localCandidate!: Candidate;\n\n onDatagramReceived: (data: Buffer, addr: Address) => void = () => {};\n\n private channelBinding?: Promise<void>;\n\n constructor(\n public server: Address,\n public username: string,\n public password: string,\n public lifetime: number,\n public transport: Transport,\n ) {}\n\n async connectionMade() {\n this.transport.onData = (data, addr) => {\n this.datagramReceived(data, addr);\n };\n }\n\n private handleChannelData(data: Buffer) {\n const [, length] = jspack.Unpack(\"!HH\", data.slice(0, 4));\n\n if (this.channel?.address) {\n const payload = data.slice(4, 4 + length);\n this.onDatagramReceived(payload, this.channel.address);\n }\n }\n\n private handleSTUNMessage(data: Buffer, addr: Address) {\n try {\n const message = parseMessage(data);\n if (!message) throw new Error(\"not stun message\");\n if (\n message.messageClass === classes.RESPONSE ||\n message.messageClass === classes.ERROR\n ) {\n const transaction = this.transactions[message.transactionIdHex];\n if (transaction) transaction.responseReceived(message, addr);\n } else if (message.messageClass === classes.REQUEST) {\n this.onDatagramReceived(data, addr);\n }\n\n if (message.getAttributeValue(\"DATA\")) {\n const buf: Buffer = message.getAttributeValue(\"DATA\");\n this.onDatagramReceived(buf, addr);\n }\n } catch (error) {\n log(\"parse error\", data.toString());\n }\n }\n\n private datagramReceived(data: Buffer, addr: Address) {\n if (data.length >= 4 && isChannelData(data)) {\n this.handleChannelData(data);\n } else {\n this.handleSTUNMessage(data, addr);\n }\n }\n\n async connect() {\n const withoutCred = new Message(methods.ALLOCATE, classes.REQUEST);\n withoutCred\n .setAttribute(\"LIFETIME\", this.lifetime)\n .setAttribute(\"REQUESTED-TRANSPORT\", UDP_TRANSPORT);\n\n const err: TransactionFailed = await this.request(\n withoutCred,\n this.server,\n ).catch((e) => e);\n\n // resolve dns address\n this.server = err.addr;\n\n if (err.response.getAttributeValue(\"NONCE\")) {\n this.nonce = err.response.getAttributeValue(\"NONCE\");\n }\n if (err.response.getAttributeValue(\"REALM\")) {\n this.realm = err.response.getAttributeValue(\"REALM\");\n }\n this.integrityKey = makeIntegrityKey(\n this.username,\n this.realm!,\n this.password,\n );\n\n const request = new Message(methods.ALLOCATE, classes.REQUEST);\n request.setAttribute(\"REQUESTED-TRANSPORT\", UDP_TRANSPORT);\n\n const [response] = await this.request(request, this.server);\n this.relayedAddress = response.getAttributeValue(\"XOR-RELAYED-ADDRESS\");\n this.mappedAddress = response.getAttributeValue(\"XOR-MAPPED-ADDRESS\");\n\n this.refreshHandle = future(this.refresh());\n }\n\n async createPermission(peerAddress: Address) {\n const request = new Message(methods.CREATE_PERMISSION, classes.REQUEST);\n request\n .setAttribute(\"XOR-PEER-ADDRESS\", peerAddress)\n .setAttribute(\"USERNAME\", this.username)\n .setAttribute(\"REALM\", this.realm)\n .setAttribute(\"NONCE\", this.nonce);\n const [response] = await this.request(request, this.server).catch((e) => {\n request;\n throw e;\n });\n return response;\n }\n\n refresh = () =>\n new PCancelable(async (_, f, onCancel) => {\n let run = true;\n onCancel(() => {\n run = false;\n f(\"cancel\");\n });\n\n while (run) {\n // refresh before expire\n await setTimeout((5 / 6) * this.lifetime * 1000);\n\n const request = new Message(methods.REFRESH, classes.REQUEST);\n request.setAttribute(\"LIFETIME\", this.lifetime);\n\n await this.request(request, this.server);\n }\n });\n\n async request(request: Message, addr: Address): Promise<[Message, Address]> {\n if (this.transactions[request.transactionIdHex]) {\n throw new Error(\"exist\");\n }\n if (this.integrityKey) {\n request\n .setAttribute(\"USERNAME\", this.username)\n .setAttribute(\"REALM\", this.realm)\n .setAttribute(\"NONCE\", this.nonce)\n .addMessageIntegrity(this.integrityKey)\n .addFingerprint();\n }\n\n const transaction = new Transaction(request, addr, this);\n this.transactions[request.transactionIdHex] = transaction;\n\n try {\n return await transaction.run();\n } catch (e) {\n throw e;\n } finally {\n delete this.transactions[request.transactionIdHex];\n }\n }\n\n async sendData(data: Buffer, addr: Address) {\n const channel = await this.getChannel(addr);\n\n const header = jspack.Pack(\"!HH\", [channel.number, data.length]);\n this.transport.send(\n Buffer.concat([Buffer.from(header), data]),\n this.server,\n );\n }\n\n private async getChannel(addr: Address) {\n if (this.channelBinding) {\n await this.channelBinding;\n }\n if (!this.channel) {\n this.channel = { number: this.channelNumber++, address: addr };\n\n this.channelBinding = this.channelBind(this.channel.number, addr);\n await this.channelBinding.catch((e) => {\n log(\"channelBind error\", e);\n throw e;\n });\n this.channelBinding = undefined;\n log(\"channelBind\", this.channel);\n }\n return this.channel;\n }\n\n private async channelBind(channelNumber: number, addr: Address) {\n const request = new Message(methods.CHANNEL_BIND, classes.REQUEST);\n request\n .setAttribute(\"CHANNEL-NUMBER\", channelNumber)\n .setAttribute(\"XOR-PEER-ADDRESS\", addr);\n const [response] = await this.request(request, this.server);\n if (response.messageMethod !== methods.CHANNEL_BIND) {\n throw new Error(\"should be CHANNEL_BIND\");\n }\n }\n\n async sendStun(message: Message, addr: Address) {\n await this.transport.send(message.bytes, addr);\n }\n}\n\nexport async function createTurnEndpoint(\n serverAddr: Address,\n username: string,\n password: string,\n {\n lifetime,\n portRange,\n interfaceAddresses,\n }: {\n lifetime?: number;\n ssl?: boolean;\n transport?: \"udp\";\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n },\n) {\n if (lifetime == undefined) {\n lifetime = 600;\n }\n\n const transport = await UdpTransport.init(\n \"udp4\",\n portRange,\n interfaceAddresses,\n );\n\n const turnClient = new TurnClient(\n serverAddr,\n username,\n password,\n lifetime,\n transport,\n );\n\n await turnClient.connectionMade();\n await turnClient.connect();\n const turnTransport = new TurnTransport(turnClient);\n\n return turnTransport;\n}\n\nexport function makeIntegrityKey(\n username: string,\n realm: string,\n password: string,\n) {\n return createHash(\"md5\")\n .update(Buffer.from([username, realm, password].join(\":\")))\n .digest();\n}\n\nfunction isChannelData(data: Buffer) {\n return (data[0] & 0xc0) == 0x40;\n}\n"]}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../ice/src/turn/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"crypto\";\nimport debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport PCancelable from \"p-cancelable\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\n\nimport { InterfaceAddresses } from \"../../../common/src/network\";\nimport { Candidate } from \"../candidate\";\nimport { TransactionFailed } from \"../exceptions\";\nimport { Future, future } from \"../helper\";\nimport { Connection } from \"../ice\";\nimport { classes, methods } from \"../stun/const\";\nimport { Message, parseMessage } from \"../stun/message\";\nimport { Transaction } from \"../stun/transaction\";\nimport { Transport, UdpTransport } from \"../transport\";\nimport { Address, Protocol } from \"../types/model\";\n\nconst log = debug(\"werift-ice:packages/ice/src/turn/protocol.ts\");\n\nconst TCP_TRANSPORT = 0x06000000;\nconst UDP_TRANSPORT = 0x11000000;\n\nclass TurnTransport implements Protocol {\n readonly type = \"turn\";\n localCandidate!: Candidate;\n receiver?: Connection;\n\n constructor(public turn: TurnClient) {\n turn.onDatagramReceived = this.datagramReceived;\n }\n\n private datagramReceived = (data: Buffer, addr: Address) => {\n try {\n const message = parseMessage(data);\n if (!message) {\n this.receiver?.dataReceived(data, this.localCandidate.component);\n return;\n }\n\n if (\n (message?.messageClass === classes.RESPONSE ||\n message?.messageClass === classes.ERROR) &&\n this.turn.transactions[message.transactionIdHex]\n ) {\n const transaction = this.turn.transactions[message.transactionIdHex];\n transaction.responseReceived(message, addr);\n } else if (message?.messageClass === classes.REQUEST) {\n this.receiver?.requestReceived(message, addr, this, data);\n }\n } catch (error) {\n log(\"datagramReceived error\", error);\n }\n };\n\n async request(request: Message, addr: Address, integrityKey?: Buffer) {\n if (this.turn.transactions[request.transactionIdHex])\n throw new Error(\"exist\");\n\n if (integrityKey) {\n request.addMessageIntegrity(integrityKey);\n request.addFingerprint();\n }\n\n const transaction = new Transaction(request, addr, this);\n this.turn.transactions[request.transactionIdHex] = transaction;\n\n try {\n return await transaction.run();\n } catch (e) {\n throw e;\n } finally {\n delete this.turn.transactions[request.transactionIdHex];\n }\n }\n async connectionMade() {}\n async sendData(data: Buffer, addr: Address) {\n await this.turn.sendData(data, addr);\n }\n async sendStun(message: Message, addr: Address) {\n await this.turn.sendData(message.bytes, addr);\n }\n}\n\nclass TurnClient implements Protocol {\n type = \"inner_turn\";\n readonly onData = new Event<[Buffer, Address]>();\n transactions: { [hexId: string]: Transaction } = {};\n integrityKey?: Buffer;\n nonce?: Buffer;\n realm?: string;\n relayedAddress!: Address;\n mappedAddress!: Address;\n refreshHandle?: Future;\n channelNumber = 0x4000;\n channel?: { number: number; address: Address };\n localCandidate!: Candidate;\n\n onDatagramReceived: (data: Buffer, addr: Address) => void = () => {};\n\n private channelBinding?: Promise<void>;\n\n constructor(\n public server: Address,\n public username: string,\n public password: string,\n public lifetime: number,\n public transport: Transport,\n ) {}\n\n async connectionMade() {\n this.transport.onData = (data, addr) => {\n this.datagramReceived(data, addr);\n };\n }\n\n private handleChannelData(data: Buffer) {\n const [, length] = jspack.Unpack(\"!HH\", data.slice(0, 4));\n\n if (this.channel?.address) {\n const payload = data.slice(4, 4 + length);\n this.onDatagramReceived(payload, this.channel.address);\n }\n }\n\n private handleSTUNMessage(data: Buffer, addr: Address) {\n try {\n const message = parseMessage(data);\n if (!message) throw new Error(\"not stun message\");\n if (\n message.messageClass === classes.RESPONSE ||\n message.messageClass === classes.ERROR\n ) {\n const transaction = this.transactions[message.transactionIdHex];\n if (transaction) transaction.responseReceived(message, addr);\n } else if (message.messageClass === classes.REQUEST) {\n this.onDatagramReceived(data, addr);\n }\n\n if (message.getAttributeValue(\"DATA\")) {\n const buf: Buffer = message.getAttributeValue(\"DATA\");\n this.onDatagramReceived(buf, addr);\n }\n } catch (error) {\n log(\"parse error\", data.toString());\n }\n }\n\n private datagramReceived(data: Buffer, addr: Address) {\n if (data.length >= 4 && isChannelData(data)) {\n this.handleChannelData(data);\n } else {\n this.handleSTUNMessage(data, addr);\n }\n }\n\n async connect() {\n const withoutCred = new Message(methods.ALLOCATE, classes.REQUEST);\n withoutCred\n .setAttribute(\"LIFETIME\", this.lifetime)\n .setAttribute(\"REQUESTED-TRANSPORT\", UDP_TRANSPORT);\n\n const err: TransactionFailed = await this.request(\n withoutCred,\n this.server,\n ).catch((e) => e);\n\n // resolve dns address\n this.server = err.addr;\n\n if (err.response.getAttributeValue(\"NONCE\")) {\n this.nonce = err.response.getAttributeValue(\"NONCE\");\n }\n if (err.response.getAttributeValue(\"REALM\")) {\n this.realm = err.response.getAttributeValue(\"REALM\");\n }\n this.integrityKey = makeIntegrityKey(\n this.username,\n this.realm!,\n this.password,\n );\n\n const request = new Message(methods.ALLOCATE, classes.REQUEST);\n request.setAttribute(\"REQUESTED-TRANSPORT\", UDP_TRANSPORT);\n\n const [response] = await this.request(request, this.server);\n this.relayedAddress = response.getAttributeValue(\"XOR-RELAYED-ADDRESS\");\n this.mappedAddress = response.getAttributeValue(\"XOR-MAPPED-ADDRESS\");\n\n this.refreshHandle = future(this.refresh());\n }\n\n async createPermission(peerAddress: Address) {\n const request = new Message(methods.CREATE_PERMISSION, classes.REQUEST);\n request\n .setAttribute(\"XOR-PEER-ADDRESS\", peerAddress)\n .setAttribute(\"USERNAME\", this.username)\n .setAttribute(\"REALM\", this.realm)\n .setAttribute(\"NONCE\", this.nonce);\n const [response] = await this.request(request, this.server).catch((e) => {\n request;\n throw e;\n });\n return response;\n }\n\n refresh = () =>\n new PCancelable(async (_, f, onCancel) => {\n let run = true;\n onCancel(() => {\n run = false;\n f(\"cancel\");\n });\n\n while (run) {\n // refresh before expire\n await setTimeout((5 / 6) * this.lifetime * 1000);\n\n const request = new Message(methods.REFRESH, classes.REQUEST);\n request.setAttribute(\"LIFETIME\", this.lifetime);\n\n await this.request(request, this.server);\n }\n });\n\n async request(request: Message, addr: Address): Promise<[Message, Address]> {\n if (this.transactions[request.transactionIdHex]) {\n throw new Error(\"exist\");\n }\n if (this.integrityKey) {\n request\n .setAttribute(\"USERNAME\", this.username)\n .setAttribute(\"REALM\", this.realm)\n .setAttribute(\"NONCE\", this.nonce)\n .addMessageIntegrity(this.integrityKey)\n .addFingerprint();\n }\n\n const transaction = new Transaction(request, addr, this);\n this.transactions[request.transactionIdHex] = transaction;\n\n try {\n return await transaction.run();\n } catch (e) {\n throw e;\n } finally {\n delete this.transactions[request.transactionIdHex];\n }\n }\n\n async sendData(data: Buffer, addr: Address) {\n const channel = await this.getChannel(addr);\n\n const header = jspack.Pack(\"!HH\", [channel.number, data.length]);\n this.transport.send(\n Buffer.concat([Buffer.from(header), data]),\n this.server,\n );\n }\n\n private async getChannel(addr: Address) {\n if (this.channelBinding) {\n await this.channelBinding;\n }\n if (!this.channel) {\n this.channel = { number: this.channelNumber++, address: addr };\n\n this.channelBinding = this.channelBind(this.channel.number, addr);\n await this.channelBinding.catch((e) => {\n log(\"channelBind error\", e);\n throw e;\n });\n this.channelBinding = undefined;\n log(\"channelBind\", this.channel);\n }\n return this.channel;\n }\n\n private async channelBind(channelNumber: number, addr: Address) {\n const request = new Message(methods.CHANNEL_BIND, classes.REQUEST);\n request\n .setAttribute(\"CHANNEL-NUMBER\", channelNumber)\n .setAttribute(\"XOR-PEER-ADDRESS\", addr);\n const [response] = await this.request(request, this.server);\n if (response.messageMethod !== methods.CHANNEL_BIND) {\n throw new Error(\"should be CHANNEL_BIND\");\n }\n }\n\n async sendStun(message: Message, addr: Address) {\n await this.transport.send(message.bytes, addr);\n }\n}\n\nexport async function createTurnEndpoint(\n serverAddr: Address,\n username: string,\n password: string,\n {\n lifetime,\n portRange,\n interfaceAddresses,\n }: {\n lifetime?: number;\n ssl?: boolean;\n transport?: \"udp\";\n portRange?: [number, number];\n interfaceAddresses?: InterfaceAddresses;\n },\n) {\n if (lifetime == undefined) {\n lifetime = 600;\n }\n\n const transport = await UdpTransport.init(\n \"udp4\",\n portRange,\n interfaceAddresses,\n );\n\n const turnClient = new TurnClient(\n serverAddr,\n username,\n password,\n lifetime,\n transport,\n );\n\n await turnClient.connectionMade();\n await turnClient.connect();\n const turnTransport = new TurnTransport(turnClient);\n\n return turnTransport;\n}\n\nexport function makeIntegrityKey(\n username: string,\n realm: string,\n password: string,\n) {\n return createHash(\"md5\")\n .update(Buffer.from([username, realm, password].join(\":\")))\n .digest();\n}\n\nfunction isChannelData(data: Buffer) {\n return (data[0] & 0xc0) == 0x40;\n}\n"]}
@@ -2,3 +2,4 @@ import { InterfaceAddresses } from "../../common/src/network";
2
2
  import { Address } from "./types/model";
3
3
  export declare function getGlobalIp(stunServer?: Address, interfaceAddresses?: InterfaceAddresses): Promise<string>;
4
4
  export declare function normalizeFamilyNodeV18(family: string | number): 4 | 6;
5
+ export declare function getHostAddresses(useIpv4: boolean, useIpv6: boolean): string[];
@@ -1,6 +1,34 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
2
28
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.normalizeFamilyNodeV18 = exports.getGlobalIp = void 0;
29
+ exports.getHostAddresses = exports.normalizeFamilyNodeV18 = exports.getGlobalIp = void 0;
30
+ const nodeIp = __importStar(require("ip"));
31
+ const os_1 = __importDefault(require("os"));
4
32
  const ice_1 = require("./ice");
5
33
  const protocol_1 = require("./stun/protocol");
6
34
  async function getGlobalIp(stunServer, interfaceAddresses) {
@@ -31,4 +59,47 @@ function normalizeFamilyNodeV18(family) {
31
59
  return family;
32
60
  }
33
61
  exports.normalizeFamilyNodeV18 = normalizeFamilyNodeV18;
62
+ function isAutoconfigurationAddress(info) {
63
+ return (normalizeFamilyNodeV18(info.family) === 4 &&
64
+ info.address?.startsWith("169.254."));
65
+ }
66
+ function nodeIpAddress(family) {
67
+ // https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/network.cc#236
68
+ const costlyNetworks = ["ipsec", "tun", "utun", "tap"];
69
+ const banNetworks = ["vmnet", "veth"];
70
+ const interfaces = os_1.default.networkInterfaces();
71
+ const all = Object.keys(interfaces)
72
+ .map((nic) => {
73
+ for (const word of [...costlyNetworks, ...banNetworks]) {
74
+ if (nic.startsWith(word)) {
75
+ return {
76
+ nic,
77
+ addresses: [],
78
+ };
79
+ }
80
+ }
81
+ const addresses = interfaces[nic].filter((details) => normalizeFamilyNodeV18(details.family) === family &&
82
+ !nodeIp.isLoopback(details.address) &&
83
+ !isAutoconfigurationAddress(details));
84
+ return {
85
+ nic,
86
+ addresses: addresses.map((address) => address.address),
87
+ };
88
+ })
89
+ .filter((address) => !!address);
90
+ // os.networkInterfaces doesn't actually return addresses in a good order.
91
+ // have seen instances where en0 (ethernet) is after en1 (wlan), etc.
92
+ // eth0 > eth1
93
+ all.sort((a, b) => a.nic.localeCompare(b.nic));
94
+ return Object.values(all).flatMap((entry) => entry.addresses);
95
+ }
96
+ function getHostAddresses(useIpv4, useIpv6) {
97
+ const address = [];
98
+ if (useIpv4)
99
+ address.push(...nodeIpAddress(4));
100
+ if (useIpv6)
101
+ address.push(...nodeIpAddress(6));
102
+ return address;
103
+ }
104
+ exports.getHostAddresses = getHostAddresses;
34
105
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../ice/src/utils.ts"],"names":[],"mappings":";;;AACA,+BAA6D;AAC7D,8CAA+C;AAGxC,KAAK,UAAU,WAAW,CAC/B,UAAoB,EACpB,kBAAuC;IAEvC,MAAM,UAAU,GAAG,IAAI,gBAAU,CAAC,IAAI,EAAE;QACtC,UAAU,EAAE,UAAU,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC;KACvD,CAAC,CAAC;IACH,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC;IAEpC,MAAM,QAAQ,GAAG,IAAI,uBAAY,CAAC,UAAU,CAAC,CAAC;IAC9C,QAAQ,CAAC,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,MAAM,IAAA,8BAAwB,EAAC,QAAQ,EAAE;QACzD,mBAAmB;QACnB,KAAK;KACN,CAAC,CAAC;IAEH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;IACzB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEvB,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;QACpB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;KACnC;IAED,OAAO,SAAS,EAAE,IAAI,CAAC;AACzB,CAAC;AAzBD,kCAyBC;AAED,SAAgB,sBAAsB,CAAC,MAAuB;IAC5D,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAEhC,OAAO,MAAe,CAAC;AACzB,CAAC;AALD,wDAKC","sourcesContent":["import { InterfaceAddresses } from \"../../common/src/network\";\nimport { Connection, serverReflexiveCandidate } from \"./ice\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { Address } from \"./types/model\";\n\nexport async function getGlobalIp(\n stunServer?: Address,\n interfaceAddresses?: InterfaceAddresses,\n) {\n const connection = new Connection(true, {\n stunServer: stunServer ?? [\"stun.l.google.com\", 19302],\n });\n await connection.gatherCandidates();\n\n const protocol = new StunProtocol(connection);\n protocol.localCandidate = connection.localCandidates[0];\n await protocol.connectionMade(true, undefined, interfaceAddresses);\n const candidate = await serverReflexiveCandidate(protocol, [\n \"stun.l.google.com\",\n 19302,\n ]);\n\n await connection.close();\n await protocol.close();\n\n if (!candidate?.host) {\n throw new Error(\"host not exist\");\n }\n\n return candidate?.host;\n}\n\nexport function normalizeFamilyNodeV18(family: string | number): 4 | 6 {\n if (family === \"IPv4\") return 4;\n if (family === \"IPv6\") return 6;\n\n return family as 4 | 6;\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../ice/src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { InterfaceAddresses } from \"../../common/src/network\";\nimport * as nodeIp from \"ip\";\nimport os from \"os\";\nimport { Connection, serverReflexiveCandidate } from \"./ice\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { Address } from \"./types/model\";\n\nexport async function getGlobalIp(\n stunServer?: Address,\n interfaceAddresses?: InterfaceAddresses,\n) {\n const connection = new Connection(true, {\n stunServer: stunServer ?? [\"stun.l.google.com\", 19302],\n });\n await connection.gatherCandidates();\n\n const protocol = new StunProtocol(connection);\n protocol.localCandidate = connection.localCandidates[0];\n await protocol.connectionMade(true, undefined, interfaceAddresses);\n const candidate = await serverReflexiveCandidate(protocol, [\n \"stun.l.google.com\",\n 19302,\n ]);\n\n await connection.close();\n await protocol.close();\n\n if (!candidate?.host) {\n throw new Error(\"host not exist\");\n }\n\n return candidate?.host;\n}\n\nexport function normalizeFamilyNodeV18(family: string | number): 4 | 6 {\n if (family === \"IPv4\") return 4;\n if (family === \"IPv6\") return 6;\n\n return family as 4 | 6;\n}\n\nfunction isAutoconfigurationAddress(info: os.NetworkInterfaceInfo) {\n return (\n normalizeFamilyNodeV18(info.family) === 4 &&\n info.address?.startsWith(\"169.254.\")\n );\n}\n\nfunction nodeIpAddress(family: number): string[] {\n // https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/network.cc#236\n const costlyNetworks = [\"ipsec\", \"tun\", \"utun\", \"tap\"];\n const banNetworks = [\"vmnet\", \"veth\"];\n\n const interfaces = os.networkInterfaces();\n\n const all = Object.keys(interfaces)\n .map((nic) => {\n for (const word of [...costlyNetworks, ...banNetworks]) {\n if (nic.startsWith(word)) {\n return {\n nic,\n addresses: [],\n };\n }\n }\n const addresses = interfaces[nic]!.filter(\n (details) =>\n normalizeFamilyNodeV18(details.family) === family &&\n !nodeIp.isLoopback(details.address) &&\n !isAutoconfigurationAddress(details),\n );\n return {\n nic,\n addresses: addresses.map((address) => address.address),\n };\n })\n .filter((address) => !!address);\n\n // os.networkInterfaces doesn't actually return addresses in a good order.\n // have seen instances where en0 (ethernet) is after en1 (wlan), etc.\n // eth0 > eth1\n all.sort((a, b) => a.nic.localeCompare(b.nic));\n return Object.values(all).flatMap((entry) => entry.addresses);\n}\n\nexport function getHostAddresses(useIpv4: boolean, useIpv6: boolean) {\n const address: string[] = [];\n if (useIpv4) address.push(...nodeIpAddress(4));\n if (useIpv6) address.push(...nodeIpAddress(6));\n return address;\n}\n"]}
@@ -154,6 +154,7 @@ class AV1RtpPayload {
154
154
  ]);
155
155
  }
156
156
  }
157
+ exports.AV1RtpPayload = AV1RtpPayload;
157
158
  Object.defineProperty(AV1RtpPayload, "deSerialize", {
158
159
  enumerable: true,
159
160
  configurable: true,
@@ -192,7 +193,6 @@ Object.defineProperty(AV1RtpPayload, "deSerialize", {
192
193
  return p;
193
194
  }
194
195
  });
195
- exports.AV1RtpPayload = AV1RtpPayload;
196
196
  class AV1Obu {
197
197
  constructor() {
198
198
  Object.defineProperty(this, "obu_forbidden_bit", {
@@ -1 +1 @@
1
- {"version":3,"file":"av1.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/av1.ts"],"names":[],"mappings":"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","sourcesContent":["// RTP Payload Format For AV1 https://aomediacodec.github.io/av1-rtp-spec/\n\nimport { LEB128 } from \"@minhducsun2002/leb128\";\nimport { debug } from \"debug\";\n\nimport { BitWriter2, getBit } from \"../../../common/src\";\nimport { RtpHeader } from \"..\";\n\nconst log = debug(\"werift-rtp : packages/rtp/src/codec/av1.ts\");\n\n// 4.4 AV1 Aggregation Header\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |Z|Y| W |N|-|-|-|\n// +-+-+-+-+-+-+-+-+\n\n// RTP payload syntax:\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// |Z|Y|0 0|N|-|-|-| OBU element 1 size (leb128) | |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |\n// : :\n// : OBU element 1 data :\n// : :\n// | |\n// | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | | OBU element 2 size (leb128) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// : :\n// : OBU element 2 data :\n// : :\n// | |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// : :\n// : ... :\n// : :\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |OBU e... N size| |\n// +-+-+-+-+-+-+-+-+ OBU element N data +-+-+-+-+-+-+-+-+\n// | |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n// OBU syntax:\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |0| type |X|S|-| (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// X: | TID |SID|-|-|-| (OPTIONAL)\n// +-+-+-+-+-+-+-+-+\n// |1| |\n// +-+ OBU payload |\n// S: |1| | (OPTIONAL, variable length leb128 encoded)\n// +-+ size |\n// |0| |\n// +-+-+-+-+-+-+-+-+\n// | OBU payload |\n// | ... |\n\nexport class AV1RtpPayload {\n /**\n * RtpStartsWithFragment\n * MUST be set to 1 if the first OBU element is an OBU fragment that is a continuation of an OBU fragment from the previous packet, and MUST be set to 0 otherwise.\n */\n zBit_RtpStartsWithFragment!: number;\n /**\n * RtpEndsWithFragment\n * MUST be set to 1 if the last OBU element is an OBU fragment that will continue in the next packet, and MUST be set to 0 otherwise.\n */\n yBit_RtpEndsWithFragment!: number;\n /**\n * RtpNumObus\n * two bit field that describes the number of OBU elements in the packet. This field MUST be set equal to 0 or equal to the number of OBU elements contained in the packet. If set to 0, each OBU element MUST be preceded by a length field.\n */\n w_RtpNumObus!: number;\n /**\n * RtpStartsNewCodedVideoSequence\n * MUST be set to 1 if the packet is the first packet of a coded video sequence, and MUST be set to 0 otherwise.\n */\n nBit_RtpStartsNewCodedVideoSequence!: number;\n obu_or_fragment: { data: Buffer; isFragment: boolean }[] = [];\n\n static deSerialize = (buf: Buffer) => {\n const p = new AV1RtpPayload();\n\n let offset = 0;\n\n p.zBit_RtpStartsWithFragment = getBit(buf[offset], 0);\n p.yBit_RtpEndsWithFragment = getBit(buf[offset], 1);\n p.w_RtpNumObus = getBit(buf[offset], 2, 2);\n p.nBit_RtpStartsNewCodedVideoSequence = getBit(buf[offset], 4);\n offset++;\n\n if (p.nBit_RtpStartsNewCodedVideoSequence && p.zBit_RtpStartsWithFragment) {\n throw new Error();\n }\n\n [...Array(p.w_RtpNumObus - 1).keys()].forEach((i) => {\n const [elementSize, bytes] = leb128decode(buf.subarray(offset));\n\n const start = offset + bytes;\n const end = start + elementSize;\n\n let isFragment = false;\n if (p.zBit_RtpStartsWithFragment && i === 0) {\n isFragment = true;\n }\n p.obu_or_fragment.push({ data: buf.subarray(start, end), isFragment });\n\n offset += bytes + elementSize;\n });\n let isFragment = false;\n if (\n p.yBit_RtpEndsWithFragment ||\n (p.w_RtpNumObus === 1 && p.zBit_RtpStartsWithFragment)\n ) {\n isFragment = true;\n }\n p.obu_or_fragment.push({\n data: buf.subarray(offset),\n isFragment: isFragment,\n });\n\n return p;\n };\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return this.nBit_RtpStartsNewCodedVideoSequence === 1;\n }\n\n static getFrame(payloads: AV1RtpPayload[]) {\n const frames: Buffer[] = [];\n const objects = payloads\n .flatMap((p) => p.obu_or_fragment)\n .reduce(\n (\n acc: Record<number, { data: Buffer; isFragment: boolean }>,\n cur,\n i,\n ) => {\n acc[i] = cur;\n return acc;\n },\n {},\n );\n const length = Object.keys(objects).length;\n\n for (const i of Object.keys(objects).map(Number)) {\n const exist = objects[i];\n if (!exist) continue;\n const { data, isFragment } = exist;\n if (isFragment) {\n let fragments: Buffer[] = [];\n for (let head = i; head < length; head++) {\n const target = objects[head];\n if (target.isFragment) {\n fragments.push(target.data);\n delete objects[head];\n } else {\n break;\n }\n }\n if (fragments.length <= 1) {\n log(\"fragment lost, maybe packet lost\");\n fragments = [];\n }\n frames.push(Buffer.concat(fragments));\n } else {\n frames.push(data);\n }\n }\n const obus = frames.map((f) => AV1Obu.deSerialize(f));\n const lastObu = obus.pop()!;\n return Buffer.concat([\n ...obus.map((o) => {\n o.obu_has_size_field = 1;\n return o.serialize();\n }),\n lastObu.serialize(),\n ]);\n }\n}\n\nexport class AV1Obu {\n obu_forbidden_bit!: number;\n obu_type!: OBU_TYPE;\n obu_extension_flag!: number;\n obu_has_size_field!: number;\n obu_reserved_1bit!: number;\n payload!: Buffer;\n\n static deSerialize(buf: Buffer) {\n const obu = new AV1Obu();\n let offset = 0;\n obu.obu_forbidden_bit = getBit(buf[offset], 0);\n obu.obu_type =\n OBU_TYPES[getBit(buf[offset], 1, 4) as keyof typeof OBU_TYPES];\n obu.obu_extension_flag = getBit(buf[offset], 5);\n obu.obu_has_size_field = getBit(buf[offset], 6);\n obu.obu_reserved_1bit = getBit(buf[offset], 7);\n offset++;\n\n obu.payload = buf.subarray(offset);\n\n return obu;\n }\n\n serialize() {\n const header = new BitWriter2(8)\n .set(this.obu_forbidden_bit)\n .set(OBU_TYPE_IDS[this.obu_type], 4)\n .set(this.obu_extension_flag)\n .set(this.obu_has_size_field)\n .set(this.obu_reserved_1bit).buffer;\n let obuSize: Uint8Array | Buffer = Buffer.alloc(0);\n if (this.obu_has_size_field) {\n obuSize = LEB128.encode(this.payload.length);\n }\n return Buffer.concat([header, obuSize, this.payload]);\n }\n}\n\nexport function leb128decode(buf: Buffer) {\n let value = 0;\n let leb128bytes = 0;\n for (let i = 0; i < 8; i++) {\n const leb128byte = buf.readUInt8(i);\n value |= (leb128byte & 0x7f) << (i * 7);\n leb128bytes++;\n if (!(leb128byte & 0x80)) {\n break;\n }\n }\n return [value, leb128bytes];\n}\n\nconst OBU_TYPES = {\n 0: \"Reserved\",\n 1: \"OBU_SEQUENCE_HEADER\",\n 2: \"OBU_TEMPORAL_DELIMITER\",\n 3: \"OBU_FRAME_HEADER\",\n 4: \"OBU_TILE_GROUP\",\n 5: \"OBU_METADATA\",\n 6: \"OBU_FRAME\",\n 7: \"OBU_REDUNDANT_FRAME_HEADER\",\n 8: \"OBU_TILE_LIST\",\n 15: \"OBU_PADDING\",\n} as const;\ntype OBU_TYPE = (typeof OBU_TYPES)[keyof typeof OBU_TYPES];\nconst OBU_TYPE_IDS: Record<OBU_TYPE, number> = Object.entries(OBU_TYPES).reduce(\n (acc: any, [key, value]) => {\n acc[value] = Number(key);\n return acc;\n },\n {},\n);\n"]}
1
+ {"version":3,"file":"av1.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/av1.ts"],"names":[],"mappings":"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","sourcesContent":["// RTP Payload Format For AV1 https://aomediacodec.github.io/av1-rtp-spec/\n\nimport { LEB128 } from \"@minhducsun2002/leb128\";\nimport { debug } from \"debug\";\n\nimport { RtpHeader } from \"..\";\nimport { BitWriter2, getBit } from \"../../../common/src\";\n\nconst log = debug(\"werift-rtp : packages/rtp/src/codec/av1.ts\");\n\n// 4.4 AV1 Aggregation Header\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |Z|Y| W |N|-|-|-|\n// +-+-+-+-+-+-+-+-+\n\n// RTP payload syntax:\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// |Z|Y|0 0|N|-|-|-| OBU element 1 size (leb128) | |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |\n// : :\n// : OBU element 1 data :\n// : :\n// | |\n// | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | | OBU element 2 size (leb128) |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// : :\n// : OBU element 2 data :\n// : :\n// | |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// : :\n// : ... :\n// : :\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |OBU e... N size| |\n// +-+-+-+-+-+-+-+-+ OBU element N data +-+-+-+-+-+-+-+-+\n// | |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n// OBU syntax:\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |0| type |X|S|-| (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// X: | TID |SID|-|-|-| (OPTIONAL)\n// +-+-+-+-+-+-+-+-+\n// |1| |\n// +-+ OBU payload |\n// S: |1| | (OPTIONAL, variable length leb128 encoded)\n// +-+ size |\n// |0| |\n// +-+-+-+-+-+-+-+-+\n// | OBU payload |\n// | ... |\n\nexport class AV1RtpPayload {\n /**\n * RtpStartsWithFragment\n * MUST be set to 1 if the first OBU element is an OBU fragment that is a continuation of an OBU fragment from the previous packet, and MUST be set to 0 otherwise.\n */\n zBit_RtpStartsWithFragment!: number;\n /**\n * RtpEndsWithFragment\n * MUST be set to 1 if the last OBU element is an OBU fragment that will continue in the next packet, and MUST be set to 0 otherwise.\n */\n yBit_RtpEndsWithFragment!: number;\n /**\n * RtpNumObus\n * two bit field that describes the number of OBU elements in the packet. This field MUST be set equal to 0 or equal to the number of OBU elements contained in the packet. If set to 0, each OBU element MUST be preceded by a length field.\n */\n w_RtpNumObus!: number;\n /**\n * RtpStartsNewCodedVideoSequence\n * MUST be set to 1 if the packet is the first packet of a coded video sequence, and MUST be set to 0 otherwise.\n */\n nBit_RtpStartsNewCodedVideoSequence!: number;\n obu_or_fragment: { data: Buffer; isFragment: boolean }[] = [];\n\n static deSerialize = (buf: Buffer) => {\n const p = new AV1RtpPayload();\n\n let offset = 0;\n\n p.zBit_RtpStartsWithFragment = getBit(buf[offset], 0);\n p.yBit_RtpEndsWithFragment = getBit(buf[offset], 1);\n p.w_RtpNumObus = getBit(buf[offset], 2, 2);\n p.nBit_RtpStartsNewCodedVideoSequence = getBit(buf[offset], 4);\n offset++;\n\n if (p.nBit_RtpStartsNewCodedVideoSequence && p.zBit_RtpStartsWithFragment) {\n throw new Error();\n }\n\n [...Array(p.w_RtpNumObus - 1).keys()].forEach((i) => {\n const [elementSize, bytes] = leb128decode(buf.subarray(offset));\n\n const start = offset + bytes;\n const end = start + elementSize;\n\n let isFragment = false;\n if (p.zBit_RtpStartsWithFragment && i === 0) {\n isFragment = true;\n }\n p.obu_or_fragment.push({ data: buf.subarray(start, end), isFragment });\n\n offset += bytes + elementSize;\n });\n let isFragment = false;\n if (\n p.yBit_RtpEndsWithFragment ||\n (p.w_RtpNumObus === 1 && p.zBit_RtpStartsWithFragment)\n ) {\n isFragment = true;\n }\n p.obu_or_fragment.push({\n data: buf.subarray(offset),\n isFragment: isFragment,\n });\n\n return p;\n };\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return this.nBit_RtpStartsNewCodedVideoSequence === 1;\n }\n\n static getFrame(payloads: AV1RtpPayload[]) {\n const frames: Buffer[] = [];\n const objects = payloads\n .flatMap((p) => p.obu_or_fragment)\n .reduce(\n (\n acc: Record<number, { data: Buffer; isFragment: boolean }>,\n cur,\n i,\n ) => {\n acc[i] = cur;\n return acc;\n },\n {},\n );\n const length = Object.keys(objects).length;\n\n for (const i of Object.keys(objects).map(Number)) {\n const exist = objects[i];\n if (!exist) continue;\n const { data, isFragment } = exist;\n if (isFragment) {\n let fragments: Buffer[] = [];\n for (let head = i; head < length; head++) {\n const target = objects[head];\n if (target.isFragment) {\n fragments.push(target.data);\n delete objects[head];\n } else {\n break;\n }\n }\n if (fragments.length <= 1) {\n log(\"fragment lost, maybe packet lost\");\n fragments = [];\n }\n frames.push(Buffer.concat(fragments));\n } else {\n frames.push(data);\n }\n }\n const obus = frames.map((f) => AV1Obu.deSerialize(f));\n const lastObu = obus.pop()!;\n return Buffer.concat([\n ...obus.map((o) => {\n o.obu_has_size_field = 1;\n return o.serialize();\n }),\n lastObu.serialize(),\n ]);\n }\n}\n\nexport class AV1Obu {\n obu_forbidden_bit!: number;\n obu_type!: OBU_TYPE;\n obu_extension_flag!: number;\n obu_has_size_field!: number;\n obu_reserved_1bit!: number;\n payload!: Buffer;\n\n static deSerialize(buf: Buffer) {\n const obu = new AV1Obu();\n let offset = 0;\n obu.obu_forbidden_bit = getBit(buf[offset], 0);\n obu.obu_type =\n OBU_TYPES[getBit(buf[offset], 1, 4) as keyof typeof OBU_TYPES];\n obu.obu_extension_flag = getBit(buf[offset], 5);\n obu.obu_has_size_field = getBit(buf[offset], 6);\n obu.obu_reserved_1bit = getBit(buf[offset], 7);\n offset++;\n\n obu.payload = buf.subarray(offset);\n\n return obu;\n }\n\n serialize() {\n const header = new BitWriter2(8)\n .set(this.obu_forbidden_bit)\n .set(OBU_TYPE_IDS[this.obu_type], 4)\n .set(this.obu_extension_flag)\n .set(this.obu_has_size_field)\n .set(this.obu_reserved_1bit).buffer;\n let obuSize: Uint8Array | Buffer = Buffer.alloc(0);\n if (this.obu_has_size_field) {\n obuSize = LEB128.encode(this.payload.length);\n }\n return Buffer.concat([header, obuSize, this.payload]);\n }\n}\n\nexport function leb128decode(buf: Buffer) {\n let value = 0;\n let leb128bytes = 0;\n for (let i = 0; i < 8; i++) {\n const leb128byte = buf.readUInt8(i);\n value |= (leb128byte & 0x7f) << (i * 7);\n leb128bytes++;\n if (!(leb128byte & 0x80)) {\n break;\n }\n }\n return [value, leb128bytes];\n}\n\nconst OBU_TYPES = {\n 0: \"Reserved\",\n 1: \"OBU_SEQUENCE_HEADER\",\n 2: \"OBU_TEMPORAL_DELIMITER\",\n 3: \"OBU_FRAME_HEADER\",\n 4: \"OBU_TILE_GROUP\",\n 5: \"OBU_METADATA\",\n 6: \"OBU_FRAME\",\n 7: \"OBU_REDUNDANT_FRAME_HEADER\",\n 8: \"OBU_TILE_LIST\",\n 15: \"OBU_PADDING\",\n} as const;\ntype OBU_TYPE = (typeof OBU_TYPES)[keyof typeof OBU_TYPES];\nconst OBU_TYPE_IDS: Record<OBU_TYPE, number> = Object.entries(OBU_TYPES).reduce(\n (acc: any, [key, value]) => {\n acc[value] = Number(key);\n return acc;\n },\n {},\n);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/h264.ts"],"names":[],"mappings":"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","sourcesContent":["// RFC 6184 - RTP Payload Format for H.264 Video\n// pion/rtp\n\nimport { BitStream, getBit } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\n// FU indicator octet\n// +---------------+\n// |0|1|2|3|4|5|6|7|\n// +-+-+-+-+-+-+-+-+\n// |F|NRI| Type |\n// +---------------+\n\n// FU header\n// +---------------+\n// |0|1|2|3|4|5|6|7|\n// +-+-+-+-+-+-+-+-+\n// |S|E|R| Type |\n// +---------------+\n\n// NAL Unit Type Content of NAL Unit NRI (binary)\n// ----------------------------------------------------------------\n// 1 non-IDR coded slice 10\n// 2 Coded slice data partition A 10\n// 3 Coded slice data partition B 01\n// 4 Coded slice data partition C 01\n\n// Payload Packet Single NAL Non-Interleaved Interleaved\n// Type Type Unit Mode Mode Mode\n// -------------------------------------------------------------\n// 0 reserved ig ig ig\n// 1-23 NAL unit yes yes no\n// 24 STAP-A no yes no\n// 25 STAP-B no no yes\n// 26 MTAP16 no no yes\n// 27 MTAP24 no no yes\n// 28 FU-A no yes yes\n// 29 FU-B no no yes\n// 30-31 reserved ig ig ig\n\nexport class H264RtpPayload implements DePacketizerBase {\n /**forbidden_zero_bit */\n f!: number;\n /**nal_ref_idc */\n nri!: number;\n /**nal_unit_types */\n nalUnitType!: number;\n /**start of a fragmented NAL unit */\n s!: number;\n /**end of a fragmented NAL unit */\n e!: number;\n r!: number;\n nalUnitPayloadType!: number;\n payload!: Buffer;\n fragment?: Buffer;\n\n static deSerialize(buf: Buffer, fragment?: Buffer) {\n const h264 = new H264RtpPayload();\n\n let offset = 0;\n\n const naluHeader = buf[offset];\n h264.f = getBit(naluHeader, 0);\n h264.nri = getBit(naluHeader, 1, 2);\n h264.nalUnitType = getBit(naluHeader, 3, 5);\n offset++;\n\n h264.s = getBit(buf[offset], 0);\n h264.e = getBit(buf[offset], 1);\n h264.r = getBit(buf[offset], 2);\n h264.nalUnitPayloadType = getBit(buf[offset], 3, 5);\n offset++;\n\n // デフォルトでは packetization-mode=0\n // packetization-mode=0だとSingle NAL Unit Packetしか来ない\n // https://datatracker.ietf.org/doc/html/rfc6184#section-6.2\n\n // Single NAL Unit Packet\n if (0 < h264.nalUnitType && h264.nalUnitType < NalUnitType.stap_a) {\n h264.payload = this.packaging(buf);\n }\n // Single-time aggregation packet\n else if (h264.nalUnitType === NalUnitType.stap_a) {\n let offset = stap_aHeaderSize;\n let result: Buffer = Buffer.alloc(0);\n while (offset < buf.length) {\n const naluSize = buf.readUInt16BE(offset);\n offset += stap_aNALULengthSize;\n\n result = Buffer.concat([\n result,\n this.packaging(buf.subarray(offset, offset + naluSize)),\n ]);\n offset += naluSize;\n }\n h264.payload = result;\n }\n // Fragmentation Units\n else if (h264.nalUnitType === NalUnitType.fu_a) {\n if (!fragment) {\n fragment = Buffer.alloc(0);\n }\n const fu = buf.subarray(offset);\n h264.fragment = Buffer.concat([fragment, fu]);\n\n if (h264.e) {\n const bitStream = new BitStream(Buffer.alloc(1))\n .writeBits(1, 0)\n .writeBits(2, h264.nri)\n .writeBits(5, h264.nalUnitPayloadType);\n const nalu = Buffer.concat([bitStream.uint8Array, h264.fragment]);\n h264.fragment = undefined;\n h264.payload = this.packaging(nalu);\n }\n }\n\n return h264;\n }\n\n private static packaging(buf: Buffer) {\n return Buffer.concat([annex_bNALUStartCode, buf]);\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return (\n this.nalUnitType === NalUnitType.idrSlice ||\n this.nalUnitPayloadType === NalUnitType.idrSlice\n );\n }\n\n get isPartitionHead() {\n if (\n this.nalUnitType === NalUnitType.fu_a ||\n this.nalUnitType === NalUnitType.fu_b\n ) {\n return this.s !== 0;\n }\n\n return true;\n }\n}\n\nexport const NalUnitType = {\n idrSlice: 5,\n stap_a: 24,\n stap_b: 25,\n mtap16: 26,\n mtap24: 27,\n fu_a: 28,\n fu_b: 29,\n} as const;\n\nconst annex_bNALUStartCode = Buffer.from([0x00, 0x00, 0x00, 0x01]);\n\nconst stap_aHeaderSize = 1;\nconst stap_aNALULengthSize = 2;\n"]}
1
+ {"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/h264.ts"],"names":[],"mappings":";AAAA,gDAAgD;AAChD,WAAW;;;AAEX,6CAAwD;AAIxD,qBAAqB;AACrB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AAEpB,YAAY;AACZ,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AAEpB,kEAAkE;AAClE,mEAAmE;AACnE,iEAAiE;AACjE,iEAAiE;AACjE,iEAAiE;AACjE,iEAAiE;AAEjE,iEAAiE;AACjE,8DAA8D;AAC9D,gEAAgE;AAChE,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAC5D,4DAA4D;AAE5D,MAAa,cAAc;IAA3B;QACE,wBAAwB;QACxB;;;;;WAAW;QACX,iBAAiB;QACjB;;;;;WAAa;QACb,oBAAoB;QACpB;;;;;WAAqB;QACrB,oCAAoC;QACpC;;;;;WAAW;QACX,kCAAkC;QAClC;;;;;WAAW;QACX;;;;;WAAW;QACX;;;;;WAA4B;QAC5B;;;;;WAAiB;QACjB;;;;;WAAkB;IA0FpB,CAAC;IAxFC,MAAM,CAAC,WAAW,CAAC,GAAW,EAAE,QAAiB;QAC/C,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;QAElC,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC,GAAG,IAAA,YAAM,EAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,GAAG,IAAA,YAAM,EAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAA,YAAM,EAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,EAAE,CAAC;QAET,IAAI,CAAC,CAAC,GAAG,IAAA,YAAM,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,GAAG,IAAA,YAAM,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,GAAG,IAAA,YAAM,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,kBAAkB,GAAG,IAAA,YAAM,EAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC;QAET,+BAA+B;QAC/B,oDAAoD;QACpD,4DAA4D;QAE5D,yBAAyB;QACzB,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,GAAG,mBAAW,CAAC,MAAM,EAAE,CAAC;YAClE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,iCAAiC;aAC5B,IAAI,IAAI,CAAC,WAAW,KAAK,mBAAW,CAAC,MAAM,EAAE,CAAC;YACjD,IAAI,MAAM,GAAG,gBAAgB,CAAC;YAC9B,IAAI,MAAM,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,IAAI,oBAAoB,CAAC;gBAE/B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;oBACrB,MAAM;oBACN,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;iBACxD,CAAC,CAAC;gBACH,MAAM,IAAI,QAAQ,CAAC;YACrB,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACxB,CAAC;QACD,sBAAsB;aACjB,IAAI,IAAI,CAAC,WAAW,KAAK,mBAAW,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAE9C,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,IAAI,eAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;qBAC7C,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;qBACf,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC;qBACtB,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACzC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,MAAM,CAAC,SAAS,CAAC,GAAW;QAClC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,+BAA+B,CAAC,MAAiB;QACtD,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,CACL,IAAI,CAAC,WAAW,KAAK,mBAAW,CAAC,QAAQ;YACzC,IAAI,CAAC,kBAAkB,KAAK,mBAAW,CAAC,QAAQ,CACjD,CAAC;IACJ,CAAC;IAED,IAAI,eAAe;QACjB,IACE,IAAI,CAAC,WAAW,KAAK,mBAAW,CAAC,IAAI;YACrC,IAAI,CAAC,WAAW,KAAK,mBAAW,CAAC,IAAI,EACrC,CAAC;YACD,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAxGD,wCAwGC;AAEY,QAAA,WAAW,GAAG;IACzB,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,EAAE;CACA,CAAC;AAEX,MAAM,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEnE,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,oBAAoB,GAAG,CAAC,CAAC","sourcesContent":["// RFC 6184 - RTP Payload Format for H.264 Video\n// pion/rtp\n\nimport { BitStream, getBit } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\n// FU indicator octet\n// +---------------+\n// |0|1|2|3|4|5|6|7|\n// +-+-+-+-+-+-+-+-+\n// |F|NRI| Type |\n// +---------------+\n\n// FU header\n// +---------------+\n// |0|1|2|3|4|5|6|7|\n// +-+-+-+-+-+-+-+-+\n// |S|E|R| Type |\n// +---------------+\n\n// NAL Unit Type Content of NAL Unit NRI (binary)\n// ----------------------------------------------------------------\n// 1 non-IDR coded slice 10\n// 2 Coded slice data partition A 10\n// 3 Coded slice data partition B 01\n// 4 Coded slice data partition C 01\n\n// Payload Packet Single NAL Non-Interleaved Interleaved\n// Type Type Unit Mode Mode Mode\n// -------------------------------------------------------------\n// 0 reserved ig ig ig\n// 1-23 NAL unit yes yes no\n// 24 STAP-A no yes no\n// 25 STAP-B no no yes\n// 26 MTAP16 no no yes\n// 27 MTAP24 no no yes\n// 28 FU-A no yes yes\n// 29 FU-B no no yes\n// 30-31 reserved ig ig ig\n\nexport class H264RtpPayload implements DePacketizerBase {\n /**forbidden_zero_bit */\n f!: number;\n /**nal_ref_idc */\n nri!: number;\n /**nal_unit_types */\n nalUnitType!: number;\n /**start of a fragmented NAL unit */\n s!: number;\n /**end of a fragmented NAL unit */\n e!: number;\n r!: number;\n nalUnitPayloadType!: number;\n payload!: Buffer;\n fragment?: Buffer;\n\n static deSerialize(buf: Buffer, fragment?: Buffer) {\n const h264 = new H264RtpPayload();\n\n let offset = 0;\n\n const naluHeader = buf[offset];\n h264.f = getBit(naluHeader, 0);\n h264.nri = getBit(naluHeader, 1, 2);\n h264.nalUnitType = getBit(naluHeader, 3, 5);\n offset++;\n\n h264.s = getBit(buf[offset], 0);\n h264.e = getBit(buf[offset], 1);\n h264.r = getBit(buf[offset], 2);\n h264.nalUnitPayloadType = getBit(buf[offset], 3, 5);\n offset++;\n\n // デフォルトでは packetization-mode=0\n // packetization-mode=0だとSingle NAL Unit Packetしか来ない\n // https://datatracker.ietf.org/doc/html/rfc6184#section-6.2\n\n // Single NAL Unit Packet\n if (0 < h264.nalUnitType && h264.nalUnitType < NalUnitType.stap_a) {\n h264.payload = this.packaging(buf);\n }\n // Single-time aggregation packet\n else if (h264.nalUnitType === NalUnitType.stap_a) {\n let offset = stap_aHeaderSize;\n let result: Buffer = Buffer.alloc(0);\n while (offset < buf.length) {\n const naluSize = buf.readUInt16BE(offset);\n offset += stap_aNALULengthSize;\n\n result = Buffer.concat([\n result,\n this.packaging(buf.subarray(offset, offset + naluSize)),\n ]);\n offset += naluSize;\n }\n h264.payload = result;\n }\n // Fragmentation Units\n else if (h264.nalUnitType === NalUnitType.fu_a) {\n if (!fragment) {\n fragment = Buffer.alloc(0);\n }\n const fu = buf.subarray(offset);\n h264.fragment = Buffer.concat([fragment, fu]);\n\n if (h264.e) {\n const bitStream = new BitStream(Buffer.alloc(1))\n .writeBits(1, 0)\n .writeBits(2, h264.nri)\n .writeBits(5, h264.nalUnitPayloadType);\n const nalu = Buffer.concat([bitStream.uint8Array, h264.fragment]);\n h264.fragment = undefined;\n h264.payload = this.packaging(nalu);\n }\n }\n\n return h264;\n }\n\n private static packaging(buf: Buffer) {\n return Buffer.concat([annex_bNALUStartCode, buf]);\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return (\n this.nalUnitType === NalUnitType.idrSlice ||\n this.nalUnitPayloadType === NalUnitType.idrSlice\n );\n }\n\n get isPartitionHead() {\n if (\n this.nalUnitType === NalUnitType.fu_a ||\n this.nalUnitType === NalUnitType.fu_b\n ) {\n return this.s !== 0;\n }\n\n return true;\n }\n}\n\nexport const NalUnitType = {\n idrSlice: 5,\n stap_a: 24,\n stap_b: 25,\n mtap16: 26,\n mtap24: 27,\n fu_a: 28,\n fu_b: 29,\n} as const;\n\nconst annex_bNALUStartCode = Buffer.from([0x00, 0x00, 0x00, 0x01]);\n\nconst stap_aHeaderSize = 1;\nconst stap_aNALULengthSize = 2;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { RtpPacket } from \"../rtp/rtp\";\nimport { AV1RtpPayload } from \"./av1\";\nimport { DePacketizerBase } from \"./base\";\nimport { H264RtpPayload } from \"./h264\";\nimport { OpusRtpPayload } from \"./opus\";\nimport { Vp8RtpPayload } from \"./vp8\";\nimport { Vp9RtpPayload } from \"./vp9\";\n\nexport * from \"./av1\";\nexport * from \"./base\";\nexport * from \"./h264\";\nexport * from \"./opus\";\nexport * from \"./vp8\";\nexport * from \"./vp9\";\n\nexport function dePacketizeRtpPackets(\n codec: DepacketizerCodec,\n packets: RtpPacket[],\n frameFragmentBuffer?: Buffer,\n): {\n isKeyframe: boolean;\n data: Buffer;\n sequence: number;\n timestamp: number;\n frameFragmentBuffer?: Buffer;\n} {\n const basicCodecParser = (Depacketizer: typeof DePacketizerBase) => {\n const partitions: DePacketizerBase[] = [];\n for (const p of packets) {\n const codec = Depacketizer.deSerialize(p.payload, frameFragmentBuffer);\n if (codec.fragment) {\n frameFragmentBuffer ??= Buffer.alloc(0);\n frameFragmentBuffer = codec.fragment;\n } else if (codec.payload) {\n frameFragmentBuffer = undefined;\n }\n partitions.push(codec);\n }\n const isKeyframe = !!partitions.find((f) => f.isKeyframe);\n const data = Buffer.concat(\n partitions.map((f) => f.payload).filter((p) => p),\n );\n\n return {\n isKeyframe,\n data,\n sequence: packets.at(-1)?.header.sequenceNumber ?? 0,\n timestamp: packets.at(-1)?.header.timestamp ?? 0,\n frameFragmentBuffer,\n };\n };\n\n switch (codec.toUpperCase()) {\n case \"AV1\": {\n const chunks = packets.map((p) => AV1RtpPayload.deSerialize(p.payload));\n const isKeyframe = !!chunks.find((f) => f.isKeyframe);\n const data = AV1RtpPayload.getFrame(chunks);\n return {\n isKeyframe,\n data,\n sequence: packets.at(-1)?.header.sequenceNumber ?? 0,\n timestamp: packets.at(-1)?.header.timestamp ?? 0,\n };\n }\n case \"MPEG4/ISO/AVC\":\n return basicCodecParser(H264RtpPayload);\n case \"VP8\":\n return basicCodecParser(Vp8RtpPayload);\n case \"VP9\":\n return basicCodecParser(Vp9RtpPayload);\n case \"OPUS\":\n return basicCodecParser(OpusRtpPayload);\n default:\n throw new Error();\n }\n}\n\nexport const depacketizerCodecs = [\n \"MPEG4/ISO/AVC\",\n \"VP8\",\n \"VP9\",\n \"OPUS\",\n \"AV1\",\n] as const;\nexport type DepacketizerCodec =\n | (typeof depacketizerCodecs)[number]\n | Lowercase<(typeof depacketizerCodecs)[number]>;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,+BAAsC;AAEtC,iCAAwC;AACxC,iCAAwC;AACxC,+BAAsC;AACtC,+BAAsC;AAEtC,wCAAsB;AACtB,yCAAuB;AACvB,yCAAuB;AACvB,yCAAuB;AACvB,wCAAsB;AACtB,wCAAsB;AAEtB,SAAgB,qBAAqB,CACnC,KAAwB,EACxB,OAAoB,EACpB,mBAA4B;IAQ5B,MAAM,gBAAgB,GAAG,CAAC,YAAqC,EAAE,EAAE;QACjE,MAAM,UAAU,GAAuB,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;YACvE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,mBAAmB,KAAnB,mBAAmB,GAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAC;gBACxC,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CAAC;YACvC,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACzB,mBAAmB,GAAG,SAAS,CAAC;YAClC,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CACxB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAClD,CAAC;QAEF,OAAO;YACL,UAAU;YACV,IAAI;YACJ,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,cAAc,IAAI,CAAC;YACpD,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,IAAI,CAAC;YAChD,mBAAmB;SACpB,CAAC;IACJ,CAAC,CAAC;IAEF,QAAQ,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5B,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAa,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACxE,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,mBAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC5C,OAAO;gBACL,UAAU;gBACV,IAAI;gBACJ,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,cAAc,IAAI,CAAC;gBACpD,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,IAAI,CAAC;aACjD,CAAC;QACJ,CAAC;QACD,KAAK,eAAe;YAClB,OAAO,gBAAgB,CAAC,qBAAc,CAAC,CAAC;QAC1C,KAAK,KAAK;YACR,OAAO,gBAAgB,CAAC,mBAAa,CAAC,CAAC;QACzC,KAAK,KAAK;YACR,OAAO,gBAAgB,CAAC,mBAAa,CAAC,CAAC;QACzC,KAAK,MAAM;YACT,OAAO,gBAAgB,CAAC,qBAAc,CAAC,CAAC;QAC1C;YACE,MAAM,IAAI,KAAK,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AA5DD,sDA4DC;AAEY,QAAA,kBAAkB,GAAG;IAChC,eAAe;IACf,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;CACG,CAAC","sourcesContent":["import { RtpPacket } from \"../rtp/rtp\";\nimport { AV1RtpPayload } from \"./av1\";\nimport { DePacketizerBase } from \"./base\";\nimport { H264RtpPayload } from \"./h264\";\nimport { OpusRtpPayload } from \"./opus\";\nimport { Vp8RtpPayload } from \"./vp8\";\nimport { Vp9RtpPayload } from \"./vp9\";\n\nexport * from \"./av1\";\nexport * from \"./base\";\nexport * from \"./h264\";\nexport * from \"./opus\";\nexport * from \"./vp8\";\nexport * from \"./vp9\";\n\nexport function dePacketizeRtpPackets(\n codec: DepacketizerCodec,\n packets: RtpPacket[],\n frameFragmentBuffer?: Buffer,\n): {\n isKeyframe: boolean;\n data: Buffer;\n sequence: number;\n timestamp: number;\n frameFragmentBuffer?: Buffer;\n} {\n const basicCodecParser = (Depacketizer: typeof DePacketizerBase) => {\n const partitions: DePacketizerBase[] = [];\n for (const p of packets) {\n const codec = Depacketizer.deSerialize(p.payload, frameFragmentBuffer);\n if (codec.fragment) {\n frameFragmentBuffer ??= Buffer.alloc(0);\n frameFragmentBuffer = codec.fragment;\n } else if (codec.payload) {\n frameFragmentBuffer = undefined;\n }\n partitions.push(codec);\n }\n const isKeyframe = !!partitions.find((f) => f.isKeyframe);\n const data = Buffer.concat(\n partitions.map((f) => f.payload).filter((p) => p),\n );\n\n return {\n isKeyframe,\n data,\n sequence: packets.at(-1)?.header.sequenceNumber ?? 0,\n timestamp: packets.at(-1)?.header.timestamp ?? 0,\n frameFragmentBuffer,\n };\n };\n\n switch (codec.toUpperCase()) {\n case \"AV1\": {\n const chunks = packets.map((p) => AV1RtpPayload.deSerialize(p.payload));\n const isKeyframe = !!chunks.find((f) => f.isKeyframe);\n const data = AV1RtpPayload.getFrame(chunks);\n return {\n isKeyframe,\n data,\n sequence: packets.at(-1)?.header.sequenceNumber ?? 0,\n timestamp: packets.at(-1)?.header.timestamp ?? 0,\n };\n }\n case \"MPEG4/ISO/AVC\":\n return basicCodecParser(H264RtpPayload);\n case \"VP8\":\n return basicCodecParser(Vp8RtpPayload);\n case \"VP9\":\n return basicCodecParser(Vp9RtpPayload);\n case \"OPUS\":\n return basicCodecParser(OpusRtpPayload);\n default:\n throw new Error();\n }\n}\n\nexport const depacketizerCodecs = [\n \"MPEG4/ISO/AVC\",\n \"VP8\",\n \"VP9\",\n \"OPUS\",\n \"AV1\",\n] as const;\nexport type DepacketizerCodec =\n | (typeof depacketizerCodecs)[number]\n | Lowercase<(typeof depacketizerCodecs)[number]>;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"opus.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/opus.ts"],"names":[],"mappings":";;;AAAA,6CAAmE;AAInE,MAAa,cAAc;IAA3B;QACE;;;;;WAAiB;IAuBnB,CAAC;IArBC,MAAM,CAAC,WAAW,CAAC,GAAW;QAC5B,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,+BAA+B,CAAC,MAAiB;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,oBAA4B,KAAK;QACzD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YACvB,IAAA,kBAAY,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,IAAA,oBAAc,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;CACF;AAxBD,wCAwBC","sourcesContent":["import { bufferWriter, bufferWriterLE } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\nexport class OpusRtpPayload implements DePacketizerBase {\n payload!: Buffer;\n\n static deSerialize(buf: Buffer) {\n const opus = new OpusRtpPayload();\n opus.payload = buf;\n return opus;\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return true;\n }\n\n get isKeyframe() {\n return true;\n }\n\n static createCodecPrivate(samplingFrequency: number = 48000) {\n return Buffer.concat([\n Buffer.from(\"OpusHead\"),\n bufferWriter([1, 1], [1, 2]),\n bufferWriterLE([2, 4, 2, 1], [312, samplingFrequency, 0, 0]),\n ]);\n }\n}\n"]}
1
+ {"version":3,"file":"opus.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/opus.ts"],"names":[],"mappings":";;;AAAA,6CAAmE;AAInE,MAAa,cAAc;IAA3B;QACE;;;;;WAAiB;IAuBnB,CAAC;IArBC,MAAM,CAAC,WAAW,CAAC,GAAW;QAC5B,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,+BAA+B,CAAC,MAAiB;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,GAAG,KAAK;QACjD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YACvB,IAAA,kBAAY,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,IAAA,oBAAc,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;CACF;AAxBD,wCAwBC","sourcesContent":["import { bufferWriter, bufferWriterLE } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\nexport class OpusRtpPayload implements DePacketizerBase {\n payload!: Buffer;\n\n static deSerialize(buf: Buffer) {\n const opus = new OpusRtpPayload();\n opus.payload = buf;\n return opus;\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return true;\n }\n\n get isKeyframe() {\n return true;\n }\n\n static createCodecPrivate(samplingFrequency = 48000) {\n return Buffer.concat([\n Buffer.from(\"OpusHead\"),\n bufferWriter([1, 1], [1, 2]),\n bufferWriterLE([2, 4, 2, 1], [312, samplingFrequency, 0, 0]),\n ]);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"vp8.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/vp8.ts"],"names":[],"mappings":"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","sourcesContent":["import { getBit, paddingByte } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\n// RFC 7741 - RTP Payload Format for VP8 Video\n\n// 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// |X|R|N|S|R| PID | (REQUIRED) |X|R|N|S|R| PID | (REQUIRED)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// X: |I|L|T|K| RSV | (OPTIONAL) X: |I|L|T|K| RSV | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// I: |M| PictureID | (OPTIONAL) I: |M| PictureID | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// L: | TL0PICIDX | (OPTIONAL) | PictureID |\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// T/K: |TID|Y| KEYIDX | (OPTIONAL) L: | TL0PICIDX | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// T/K: |TID|Y| KEYIDX | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |Size0|H| VER |P|\n// +-+-+-+-+-+-+-+-+\n// | Size1 |\n// +-+-+-+-+-+-+-+-+\n// | Size2 |\n// +-+-+-+-+-+-+-+-+\n// | Octets 4..N of|\n// | VP8 payload |\n// : :\n// +-+-+-+-+-+-+-+-+\n// | OPTIONAL RTP |\n// | padding |\n// : :\n// +-+-+-+-+-+-+-+-+\n\nexport class Vp8RtpPayload implements DePacketizerBase {\n xBit!: number;\n nBit!: number;\n sBit!: number;\n pid!: number;\n iBit?: number;\n lBit?: number;\n tBit?: number;\n kBit?: number;\n mBit?: number;\n pictureId?: number;\n payload!: Buffer;\n size0: number = 0;\n hBit?: number;\n ver?: number;\n pBit?: number;\n size1: number = 0;\n size2: number = 0;\n\n static deSerialize(buf: Buffer) {\n const p = new Vp8RtpPayload();\n\n let offset = 0;\n\n p.xBit = getBit(buf[offset], 0);\n p.nBit = getBit(buf[offset], 2);\n p.sBit = getBit(buf[offset], 3);\n p.pid = getBit(buf[offset], 5, 3);\n offset++;\n\n if (p.xBit) {\n p.iBit = getBit(buf[offset], 0);\n p.lBit = getBit(buf[offset], 1);\n p.tBit = getBit(buf[offset], 2);\n p.kBit = getBit(buf[offset], 3);\n offset++;\n }\n\n if (p.iBit) {\n p.mBit = getBit(buf[offset], 0);\n if (p.mBit) {\n const _7 = paddingByte(getBit(buf[offset], 1, 7));\n const _8 = paddingByte(buf[offset + 1]);\n p.pictureId = parseInt(_7 + _8, 2);\n offset += 2;\n } else {\n p.pictureId = getBit(buf[offset], 1, 7);\n offset++;\n }\n }\n\n if (p.lBit) {\n offset++;\n }\n\n if (p.lBit || p.kBit) {\n if (p.tBit) {\n }\n if (p.kBit) {\n }\n offset++;\n }\n\n p.payload = buf.subarray(offset);\n\n if (p.payloadHeaderExist) {\n p.size0 = getBit(buf[offset], 0, 3);\n p.hBit = getBit(buf[offset], 3);\n p.ver = getBit(buf[offset], 4, 3);\n p.pBit = getBit(buf[offset], 7);\n offset++;\n p.size1 = buf[offset];\n offset++;\n p.size2 = buf[offset];\n }\n\n return p;\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return this.pBit === 0;\n }\n\n get isPartitionHead() {\n return this.sBit === 1;\n }\n\n get payloadHeaderExist() {\n return this.sBit === 1 && this.pid === 0;\n }\n\n get size() {\n if (this.payloadHeaderExist) {\n const size = this.size0 + 8 * this.size1 + 2048 * this.size2;\n return size;\n }\n return 0;\n }\n}\n"]}
1
+ {"version":3,"file":"vp8.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/vp8.ts"],"names":[],"mappings":"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","sourcesContent":["import { getBit, paddingByte } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\n// RFC 7741 - RTP Payload Format for VP8 Video\n\n// 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// |X|R|N|S|R| PID | (REQUIRED) |X|R|N|S|R| PID | (REQUIRED)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// X: |I|L|T|K| RSV | (OPTIONAL) X: |I|L|T|K| RSV | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// I: |M| PictureID | (OPTIONAL) I: |M| PictureID | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// L: | TL0PICIDX | (OPTIONAL) | PictureID |\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// T/K: |TID|Y| KEYIDX | (OPTIONAL) L: | TL0PICIDX | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// T/K: |TID|Y| KEYIDX | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |Size0|H| VER |P|\n// +-+-+-+-+-+-+-+-+\n// | Size1 |\n// +-+-+-+-+-+-+-+-+\n// | Size2 |\n// +-+-+-+-+-+-+-+-+\n// | Octets 4..N of|\n// | VP8 payload |\n// : :\n// +-+-+-+-+-+-+-+-+\n// | OPTIONAL RTP |\n// | padding |\n// : :\n// +-+-+-+-+-+-+-+-+\n\nexport class Vp8RtpPayload implements DePacketizerBase {\n xBit!: number;\n nBit!: number;\n sBit!: number;\n pid!: number;\n iBit?: number;\n lBit?: number;\n tBit?: number;\n kBit?: number;\n mBit?: number;\n pictureId?: number;\n payload!: Buffer;\n size0 = 0;\n hBit?: number;\n ver?: number;\n pBit?: number;\n size1 = 0;\n size2 = 0;\n\n static deSerialize(buf: Buffer) {\n const p = new Vp8RtpPayload();\n\n let offset = 0;\n\n p.xBit = getBit(buf[offset], 0);\n p.nBit = getBit(buf[offset], 2);\n p.sBit = getBit(buf[offset], 3);\n p.pid = getBit(buf[offset], 5, 3);\n offset++;\n\n if (p.xBit) {\n p.iBit = getBit(buf[offset], 0);\n p.lBit = getBit(buf[offset], 1);\n p.tBit = getBit(buf[offset], 2);\n p.kBit = getBit(buf[offset], 3);\n offset++;\n }\n\n if (p.iBit) {\n p.mBit = getBit(buf[offset], 0);\n if (p.mBit) {\n const _7 = paddingByte(getBit(buf[offset], 1, 7));\n const _8 = paddingByte(buf[offset + 1]);\n p.pictureId = parseInt(_7 + _8, 2);\n offset += 2;\n } else {\n p.pictureId = getBit(buf[offset], 1, 7);\n offset++;\n }\n }\n\n if (p.lBit) {\n offset++;\n }\n\n if (p.lBit || p.kBit) {\n if (p.tBit) {\n }\n if (p.kBit) {\n }\n offset++;\n }\n\n p.payload = buf.subarray(offset);\n\n if (p.payloadHeaderExist) {\n p.size0 = getBit(buf[offset], 0, 3);\n p.hBit = getBit(buf[offset], 3);\n p.ver = getBit(buf[offset], 4, 3);\n p.pBit = getBit(buf[offset], 7);\n offset++;\n p.size1 = buf[offset];\n offset++;\n p.size2 = buf[offset];\n }\n\n return p;\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return this.pBit === 0;\n }\n\n get isPartitionHead() {\n return this.sBit === 1;\n }\n\n get payloadHeaderExist() {\n return this.sBit === 1 && this.pid === 0;\n }\n\n get size() {\n if (this.payloadHeaderExist) {\n const size = this.size0 + 8 * this.size1 + 2048 * this.size2;\n return size;\n }\n return 0;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"vp9.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/vp9.ts"],"names":[],"mappings":"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","sourcesContent":["// RTP Payload Format for VP9 Video draft-ietf-payload-vp9-16 https://datatracker.ietf.org/doc/html/draft-ietf-payload-vp9\n\nimport { getBit, paddingByte } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |I|P|L|F|B|E|V|Z| (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// I: |M| PICTURE ID | (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// M: | EXTENDED PID | (RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// L: | TID |U| SID |D| (Conditionally RECOMMENDED)\n// +-+-+-+-+-+-+-+-+ -\\\n// P,F: | P_DIFF |N| (Conditionally REQUIRED) - up to 3 times\n// +-+-+-+-+-+-+-+-+ -/\n// V: | SS |\n// | .. |\n// +-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |I|P|L|F|B|E|V|Z| (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// I: |M| PICTURE ID | (RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// M: | EXTENDED PID | (RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// L: | TID |U| SID |D| (Conditionally RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// | TL0PICIDX | (Conditionally REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// V: | SS |\n// | .. |\n// +-+-+-+-+-+-+-+-+\n\nexport class Vp9RtpPayload implements DePacketizerBase {\n /**Picture ID (PID) present */\n iBit!: number;\n /**Inter-picture predicted frame */\n pBit!: number;\n /**Layer indices present */\n lBit!: number;\n /**Flexible mode */\n fBit!: number;\n /**Start of a frame */\n bBit!: number;\n /**End of a frame */\n eBit!: number;\n /**Scalability structure */\n vBit!: number;\n zBit!: number;\n m?: number;\n pictureId?: number;\n tid?: number;\n u?: number;\n sid?: number;\n /**inter_layer_predicted */\n d?: number;\n tl0PicIdx?: number;\n pDiff: number[] = [];\n n_s?: number;\n y?: number;\n g?: number;\n width: number[] = [];\n height: number[] = [];\n n_g: number = 0;\n pgT: number[] = [];\n pgU: number[] = [];\n pgP_Diff: number[][] = [];\n payload!: Buffer;\n\n static deSerialize(buf: Buffer) {\n const { p, offset } = this.parseRtpPayload(buf);\n p.payload = buf.subarray(offset);\n return p;\n }\n\n static parseRtpPayload(buf: Buffer) {\n const p = new Vp9RtpPayload();\n let offset = 0;\n\n p.iBit = getBit(buf[offset], 0); // PictureId present .\n p.pBit = getBit(buf[offset], 1); // Inter-picture predicted.\n p.lBit = getBit(buf[offset], 2); // Layer indices present.\n p.fBit = getBit(buf[offset], 3); // Flexible mode.\n p.bBit = getBit(buf[offset], 4); // Begins frame flag.\n p.eBit = getBit(buf[offset], 5); // Ends frame flag.\n p.vBit = getBit(buf[offset], 6); // Scalability structure present.\n p.zBit = getBit(buf[offset], 7); // Not used for inter-layer prediction\n offset++;\n\n if (p.iBit) {\n p.m = getBit(buf[offset], 0);\n\n if (p.m) {\n const _7 = paddingByte(getBit(buf[offset], 1, 7));\n const _8 = paddingByte(buf[offset + 1]);\n p.pictureId = parseInt(_7 + _8, 2);\n offset += 2;\n } else {\n p.pictureId = getBit(buf[offset], 1, 7);\n offset++;\n }\n }\n\n if (p.lBit) {\n p.tid = getBit(buf[offset], 0, 3);\n p.u = getBit(buf[offset], 3);\n p.sid = getBit(buf[offset], 4, 3);\n p.d = getBit(buf[offset], 7);\n offset++;\n if (p.fBit === 0) {\n p.tl0PicIdx = buf[offset];\n offset++;\n }\n }\n\n if (p.fBit && p.pBit) {\n for (;;) {\n p.pDiff = [...p.pDiff, getBit(buf[offset], 0, 7)];\n const n = getBit(buf[offset], 7);\n offset++;\n if (n === 0) break;\n }\n }\n\n // Scalability structure (SS):\n //\n // +-+-+-+-+-+-+-+-+\n // V: | N_S |Y|G|-|-|-|\n // +-+-+-+-+-+-+-+-+ -|\n // Y: | WIDTH | (OPTIONAL) .\n // + + .\n // | | (OPTIONAL) .\n // +-+-+-+-+-+-+-+-+ . N_S + 1 times\n // | HEIGHT | (OPTIONAL) .\n // + + .\n // | | (OPTIONAL) .\n // +-+-+-+-+-+-+-+-+ -|\n // G: | N_G | (OPTIONAL)\n // +-+-+-+-+-+-+-+-+ -|\n // N_G: | T |U| R |-|-| (OPTIONAL) .\n // +-+-+-+-+-+-+-+-+ -| . N_G times\n // | P_DIFF | (OPTIONAL) . R times .\n // +-+-+-+-+-+-+-+-+ -| -|\n //\n if (p.vBit) {\n p.n_s = getBit(buf[offset], 0, 3);\n p.y = getBit(buf[offset], 3);\n p.g = getBit(buf[offset], 4);\n offset++;\n\n if (p.y) {\n [...Array(p.n_s + 1)].forEach(() => {\n p.width.push(buf.readUInt16BE(offset));\n offset += 2;\n p.height.push(buf.readUInt16BE(offset));\n offset += 2;\n });\n }\n\n if (p.g) {\n p.n_g = buf[offset];\n offset++;\n }\n\n if (p.n_g > 0) {\n [...Array(p.n_g).keys()].forEach((i) => {\n p.pgT.push(getBit(buf[offset], 0, 3));\n p.pgU.push(getBit(buf[offset], 3));\n const r = getBit(buf[offset], 4, 2);\n offset++;\n\n p.pgP_Diff[i] = [];\n if (r > 0) {\n [...Array(r)].forEach(() => {\n p.pgP_Diff[i].push(buf[offset]);\n offset++;\n });\n }\n });\n }\n }\n return { offset, p };\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return !!(!this.pBit && this.bBit && (!this.sid || !this.lBit));\n }\n\n get isPartitionHead() {\n return this.bBit && (!this.lBit || !this.d);\n }\n}\n"]}
1
+ {"version":3,"file":"vp9.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/vp9.ts"],"names":[],"mappings":"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","sourcesContent":["// RTP Payload Format for VP9 Video draft-ietf-payload-vp9-16 https://datatracker.ietf.org/doc/html/draft-ietf-payload-vp9\n\nimport { getBit, paddingByte } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |I|P|L|F|B|E|V|Z| (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// I: |M| PICTURE ID | (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// M: | EXTENDED PID | (RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// L: | TID |U| SID |D| (Conditionally RECOMMENDED)\n// +-+-+-+-+-+-+-+-+ -\\\n// P,F: | P_DIFF |N| (Conditionally REQUIRED) - up to 3 times\n// +-+-+-+-+-+-+-+-+ -/\n// V: | SS |\n// | .. |\n// +-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |I|P|L|F|B|E|V|Z| (REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// I: |M| PICTURE ID | (RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// M: | EXTENDED PID | (RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// L: | TID |U| SID |D| (Conditionally RECOMMENDED)\n// +-+-+-+-+-+-+-+-+\n// | TL0PICIDX | (Conditionally REQUIRED)\n// +-+-+-+-+-+-+-+-+\n// V: | SS |\n// | .. |\n// +-+-+-+-+-+-+-+-+\n\nexport class Vp9RtpPayload implements DePacketizerBase {\n /**Picture ID (PID) present */\n iBit!: number;\n /**Inter-picture predicted frame */\n pBit!: number;\n /**Layer indices present */\n lBit!: number;\n /**Flexible mode */\n fBit!: number;\n /**Start of a frame */\n bBit!: number;\n /**End of a frame */\n eBit!: number;\n /**Scalability structure */\n vBit!: number;\n zBit!: number;\n m?: number;\n pictureId?: number;\n tid?: number;\n u?: number;\n sid?: number;\n /**inter_layer_predicted */\n d?: number;\n tl0PicIdx?: number;\n pDiff: number[] = [];\n n_s?: number;\n y?: number;\n g?: number;\n width: number[] = [];\n height: number[] = [];\n n_g = 0;\n pgT: number[] = [];\n pgU: number[] = [];\n pgP_Diff: number[][] = [];\n payload!: Buffer;\n\n static deSerialize(buf: Buffer) {\n const { p, offset } = this.parseRtpPayload(buf);\n p.payload = buf.subarray(offset);\n return p;\n }\n\n static parseRtpPayload(buf: Buffer) {\n const p = new Vp9RtpPayload();\n let offset = 0;\n\n p.iBit = getBit(buf[offset], 0); // PictureId present .\n p.pBit = getBit(buf[offset], 1); // Inter-picture predicted.\n p.lBit = getBit(buf[offset], 2); // Layer indices present.\n p.fBit = getBit(buf[offset], 3); // Flexible mode.\n p.bBit = getBit(buf[offset], 4); // Begins frame flag.\n p.eBit = getBit(buf[offset], 5); // Ends frame flag.\n p.vBit = getBit(buf[offset], 6); // Scalability structure present.\n p.zBit = getBit(buf[offset], 7); // Not used for inter-layer prediction\n offset++;\n\n if (p.iBit) {\n p.m = getBit(buf[offset], 0);\n\n if (p.m) {\n const _7 = paddingByte(getBit(buf[offset], 1, 7));\n const _8 = paddingByte(buf[offset + 1]);\n p.pictureId = parseInt(_7 + _8, 2);\n offset += 2;\n } else {\n p.pictureId = getBit(buf[offset], 1, 7);\n offset++;\n }\n }\n\n if (p.lBit) {\n p.tid = getBit(buf[offset], 0, 3);\n p.u = getBit(buf[offset], 3);\n p.sid = getBit(buf[offset], 4, 3);\n p.d = getBit(buf[offset], 7);\n offset++;\n if (p.fBit === 0) {\n p.tl0PicIdx = buf[offset];\n offset++;\n }\n }\n\n if (p.fBit && p.pBit) {\n for (;;) {\n p.pDiff = [...p.pDiff, getBit(buf[offset], 0, 7)];\n const n = getBit(buf[offset], 7);\n offset++;\n if (n === 0) break;\n }\n }\n\n // Scalability structure (SS):\n //\n // +-+-+-+-+-+-+-+-+\n // V: | N_S |Y|G|-|-|-|\n // +-+-+-+-+-+-+-+-+ -|\n // Y: | WIDTH | (OPTIONAL) .\n // + + .\n // | | (OPTIONAL) .\n // +-+-+-+-+-+-+-+-+ . N_S + 1 times\n // | HEIGHT | (OPTIONAL) .\n // + + .\n // | | (OPTIONAL) .\n // +-+-+-+-+-+-+-+-+ -|\n // G: | N_G | (OPTIONAL)\n // +-+-+-+-+-+-+-+-+ -|\n // N_G: | T |U| R |-|-| (OPTIONAL) .\n // +-+-+-+-+-+-+-+-+ -| . N_G times\n // | P_DIFF | (OPTIONAL) . R times .\n // +-+-+-+-+-+-+-+-+ -| -|\n //\n if (p.vBit) {\n p.n_s = getBit(buf[offset], 0, 3);\n p.y = getBit(buf[offset], 3);\n p.g = getBit(buf[offset], 4);\n offset++;\n\n if (p.y) {\n [...Array(p.n_s + 1)].forEach(() => {\n p.width.push(buf.readUInt16BE(offset));\n offset += 2;\n p.height.push(buf.readUInt16BE(offset));\n offset += 2;\n });\n }\n\n if (p.g) {\n p.n_g = buf[offset];\n offset++;\n }\n\n if (p.n_g > 0) {\n [...Array(p.n_g).keys()].forEach((i) => {\n p.pgT.push(getBit(buf[offset], 0, 3));\n p.pgU.push(getBit(buf[offset], 3));\n const r = getBit(buf[offset], 4, 2);\n offset++;\n\n p.pgP_Diff[i] = [];\n if (r > 0) {\n [...Array(r)].forEach(() => {\n p.pgP_Diff[i].push(buf[offset]);\n offset++;\n });\n }\n });\n }\n }\n return { offset, p };\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return !!(!this.pBit && this.bBit && (!this.sid || !this.lBit));\n }\n\n get isPartitionHead() {\n return this.bBit && (!this.lBit || !this.d);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"container.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/container.ts"],"names":[],"mappings":"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","sourcesContent":["import Event from \"rx.mini\";\n\nimport * as MP4 from \"./mp4box\";\n\ntype DecoderConfig = AudioDecoderConfig | VideoDecoderConfig;\ntype EncodedChunk = EncodedAudioChunk | EncodedVideoChunk;\n\nexport type DataType = \"init\" | \"delta\" | \"key\";\n\nexport interface Mp4Data {\n type: DataType;\n timestamp: number;\n duration: number;\n data: Uint8Array;\n kind: \"audio\" | \"video\";\n}\n\nexport class Mp4Container {\n #mp4: MP4.ISOFile;\n #audioFrame?: EncodedAudioChunk | EncodedVideoChunk;\n #videoFrame?: EncodedAudioChunk | EncodedVideoChunk; // 1 frame buffer\n audioTrack?: number;\n videoTrack?: number;\n #audioSegment = 0;\n #videoSegment = 0;\n onData = new Event<[Mp4Data]>();\n\n constructor(\n private props: {\n track: { audio: boolean; video: boolean };\n },\n ) {\n this.#mp4 = new MP4.ISOFile();\n this.#mp4.init();\n }\n\n get tracksReady() {\n let ready = true;\n if (this.props.track.audio && !this.audioTrack) {\n ready = false;\n }\n if (this.props.track.video && !this.videoTrack) {\n ready = false;\n }\n return ready;\n }\n\n write(\n frame: (DecoderConfig | EncodedChunk) & {\n track: \"video\" | \"audio\";\n },\n ) {\n if (isDecoderConfig(frame)) {\n return this.#init(frame);\n } else {\n return this.#enqueue(frame);\n }\n }\n\n #init(\n frame: DecoderConfig & {\n track: \"video\" | \"audio\";\n },\n ) {\n let codec = frame.codec.substring(0, 4);\n if (codec == \"opus\") {\n codec = \"Opus\";\n }\n\n const options: MP4.TrackOptions = {\n type: codec,\n timescale: 1_000_000,\n };\n\n if (isVideoConfig(frame)) {\n options.width = frame.codedWidth;\n options.height = frame.codedHeight;\n } else {\n options.channel_count = frame.numberOfChannels;\n options.samplerate = frame.sampleRate;\n options.hdlr = \"soun\";\n }\n\n if (!frame.description) throw new Error(\"missing frame description\");\n const desc = frame.description as ArrayBufferLike;\n\n if (codec === \"avc1\") {\n options.avcDecoderConfigRecord = desc;\n } else if (codec === \"hev1\") {\n options.hevcDecoderConfigRecord = desc;\n } else if (codec === \"Opus\") {\n // description is an identification header: https://datatracker.ietf.org/doc/html/rfc7845#section-5.1\n // The first 8 bytes are the magic string \"OpusHead\", followed by what we actually want.\n const dops = new MP4.BoxParser.dOpsBox();\n\n // Annoyingly, the header is little endian while MP4 is big endian, so we have to parse.\n dops.parse(new MP4.Stream(desc, 8, MP4.Stream.LITTLE_ENDIAN));\n\n options.description = dops;\n } else {\n throw new Error(`unsupported codec: ${codec}`);\n }\n\n const track = this.#mp4.addTrack(options);\n if (track == undefined) {\n throw new Error(\"failed to initialize MP4 track\");\n }\n if (frame.track === \"audio\") {\n this.audioTrack = track;\n } else {\n this.videoTrack = track;\n }\n\n if (!this.tracksReady) {\n return;\n }\n\n const buffer = MP4.ISOFile.writeInitializationSegment(\n this.#mp4.ftyp!,\n this.#mp4.moov!,\n 0,\n 0,\n );\n const data = new Uint8Array(buffer);\n const res = {\n type: \"init\",\n timestamp: 0,\n duration: 0,\n data,\n kind: frame.track,\n } as const;\n this.onData.execute(res);\n }\n\n frameBuffer: (EncodedChunk & {\n track: \"video\" | \"audio\";\n })[] = [];\n\n #enqueue(\n frame: EncodedChunk & {\n track: \"video\" | \"audio\";\n },\n ) {\n this.frameBuffer.push(frame);\n if (!this.tracksReady) {\n return;\n }\n for (const frame of this.frameBuffer) {\n this._enqueue(frame);\n }\n this.frameBuffer = [];\n }\n\n private _enqueue(\n frame: EncodedChunk & {\n track: \"video\" | \"audio\";\n },\n ) {\n const track = frame.track === \"audio\" ? this.audioTrack : this.videoTrack;\n if (!track) {\n throw new Error(\"track missing\");\n }\n\n // Check if we should create a new segment\n if (frame.track === \"video\") {\n if (frame.type == \"key\") {\n this.#videoSegment += 1;\n } else if (this.#videoSegment == 0) {\n throw new Error(\"must start with keyframe\");\n }\n } else {\n this.#audioSegment += 1;\n }\n\n // We need a one frame buffer to compute the duration\n if (frame.track === \"video\") {\n if (!this.#videoFrame) {\n this.#videoFrame = frame;\n return;\n }\n } else {\n if (!this.#audioFrame) {\n this.#audioFrame = frame;\n return;\n }\n }\n\n const bufferFrame =\n frame.track === \"video\" ? this.#videoFrame : this.#audioFrame;\n\n if (!bufferFrame) {\n throw new Error(\"bufferFrame missing\");\n }\n\n const duration = frame.timestamp - bufferFrame.timestamp;\n\n // TODO avoid this extra copy by writing to the mdat directly\n // ...which means changing mp4box.js to take an offset instead of ArrayBuffer\n const buffer = new Uint8Array(bufferFrame.byteLength);\n bufferFrame.copyTo(buffer);\n\n // Add the sample to the container\n this.#mp4.addSample(track, buffer, {\n duration,\n dts: bufferFrame.timestamp,\n cts: bufferFrame.timestamp,\n is_sync: bufferFrame.type == \"key\",\n });\n\n const stream = new MP4.Stream(undefined, 0, MP4.Stream.BIG_ENDIAN);\n\n // Moof and mdat atoms are written in pairs.\n // TODO remove the moof/mdat from the Box to reclaim memory once everything works\n for (;;) {\n const moof = this.#mp4.moofs.shift();\n const mdat = this.#mp4.mdats.shift();\n\n if (!moof && !mdat) break;\n if (!moof) throw new Error(\"moof missing\");\n if (!mdat) throw new Error(\"mdat missing\");\n\n moof.write(stream);\n mdat.write(stream);\n }\n\n // TODO avoid this extra copy by writing to the buffer provided in copyTo\n const data = new Uint8Array(stream.buffer);\n\n if (frame.track === \"video\") {\n this.#videoFrame = frame;\n } else {\n this.#audioFrame = frame;\n }\n\n const res = {\n type: bufferFrame.type,\n timestamp: bufferFrame.timestamp,\n kind: frame.track,\n duration,\n data,\n };\n this.onData.execute(res);\n }\n\n /* TODO flush the last frame\n\t#flush(controller: TransformStreamDefaultController<Chunk>) {\n\t\tif (this.#frame) {\n\t\t\t// TODO guess the duration\n\t\t\tthis.#enqueue(this.#frame, 0, controller)\n\t\t}\n\t}\n\t*/\n}\n\nfunction isDecoderConfig(\n frame: DecoderConfig | EncodedChunk,\n): frame is DecoderConfig {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (frame as DecoderConfig).codec !== undefined;\n}\n\nfunction isVideoConfig(frame: DecoderConfig): frame is VideoDecoderConfig {\n return (frame as VideoDecoderConfig).codedWidth !== undefined;\n}\n\nexport interface AudioDecoderConfig {\n codec: string;\n description?: ArrayBuffer | undefined;\n numberOfChannels: number;\n sampleRate: number;\n}\n\nexport interface VideoDecoderConfig {\n codec: string;\n codedHeight?: number | undefined;\n codedWidth?: number | undefined;\n description?: ArrayBuffer | undefined;\n displayAspectHeight?: number | undefined;\n displayAspectWidth?: number | undefined;\n optimizeForLatency?: boolean | undefined;\n}\n\ninterface EncodedAudioChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedAudioChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedAudioChunkType = \"delta\" | \"key\";\n\ninterface EncodedVideoChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedVideoChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedVideoChunkType = \"delta\" | \"key\";\n\nexport const mp4SupportedCodecs = [\"avc1\", \"opus\"] as const;\nexport type Mp4SupportedCodec = (typeof mp4SupportedCodecs)[number];\n"]}
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/container.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sDAA4B;AAE5B,8CAAgC;AAehC,MAAa,YAAY;IAUvB,YACU,KAEP;;QAFD;;;;mBAAQ,KAAK;WAEZ;QAZH,oCAAkB;QAClB,2CAAoD;QACpD,2CAAoD,CAAC,iBAAiB;QACtE;;;;;WAAoB;QACpB;;;;;WAAoB;QACpB,qCAAgB,CAAC,EAAC;QAClB,qCAAgB,CAAC,EAAC;QAClB;;;;mBAAS,IAAI,iBAAK,EAAa;WAAC;QA6GhC;;;;mBAEO,EAAE;WAAC;QAxGR,uBAAA,IAAI,qBAAQ,IAAI,GAAG,CAAC,OAAO,EAAE,MAAA,CAAC;QAC9B,uBAAA,IAAI,yBAAK,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,WAAW;QACb,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC/C,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC/C,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CACH,KAEC;QAED,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,uBAAA,IAAI,mDAAM,MAAV,IAAI,EAAO,KAAK,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,OAAO,uBAAA,IAAI,sDAAS,MAAb,IAAI,EAAU,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAgGO,QAAQ,CACd,KAEC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;QAC1E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAED,0CAA0C;QAC1C,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;gBACxB,yHAAsB,CAAC,MAAA,CAAC;YAC1B,CAAC;iBAAM,IAAI,uBAAA,IAAI,kCAAc,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,yHAAsB,CAAC,MAAA,CAAC;QAC1B,CAAC;QAED,qDAAqD;QACrD,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,uBAAA,IAAI,gCAAY,EAAE,CAAC;gBACtB,uBAAA,IAAI,4BAAe,KAAK,MAAA,CAAC;gBACzB,OAAO;YACT,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,uBAAA,IAAI,gCAAY,EAAE,CAAC;gBACtB,uBAAA,IAAI,4BAAe,KAAK,MAAA,CAAC;gBACzB,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GACf,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,uBAAA,IAAI,gCAAY,CAAC,CAAC,CAAC,uBAAA,IAAI,gCAAY,CAAC;QAEhE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC;QAEzD,6DAA6D;QAC7D,6EAA6E;QAC7E,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACtD,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3B,kCAAkC;QAClC,uBAAA,IAAI,yBAAK,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE;YACjC,QAAQ;YACR,GAAG,EAAE,WAAW,CAAC,SAAS;YAC1B,GAAG,EAAE,WAAW,CAAC,SAAS;YAC1B,OAAO,EAAE,WAAW,CAAC,IAAI,IAAI,KAAK;SACnC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEnE,4CAA4C;QAC5C,iFAAiF;QACjF,SAAS,CAAC;YACR,MAAM,IAAI,GAAG,uBAAA,IAAI,yBAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,uBAAA,IAAI,yBAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAErC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM;YAC1B,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YAE3C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;QAED,yEAAyE;QACzE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3C,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC5B,uBAAA,IAAI,4BAAe,KAAK,MAAA,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,uBAAA,IAAI,4BAAe,KAAK,MAAA,CAAC;QAC3B,CAAC;QAED,MAAM,GAAG,GAAG;YACV,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,IAAI,EAAE,KAAK,CAAC,KAAK;YACjB,QAAQ;YACR,IAAI;SACL,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;CAUF;AA3OD,oCA2OC;ySAhMG,KAEC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACpB,KAAK,GAAG,MAAM,CAAC;IACjB,CAAC;IAED,MAAM,OAAO,GAAqB;QAChC,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,OAAS;KACrB,CAAC;IAEF,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;QACjC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAC/C,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACtC,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK,CAAC,WAA8B,CAAC;IAElD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IACxC,CAAC;SAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IACzC,CAAC;SAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC5B,qGAAqG;QACrG,wFAAwF;QACxF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAEzC,wFAAwF;QACxF,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAE9D,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAG,uBAAA,IAAI,yBAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,0BAA0B,CACnD,uBAAA,IAAI,yBAAK,CAAC,IAAK,EACf,uBAAA,IAAI,yBAAK,CAAC,IAAK,EACf,CAAC,EACD,CAAC,CACF,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,CAAC;QACZ,QAAQ,EAAE,CAAC;QACX,IAAI;QACJ,IAAI,EAAE,KAAK,CAAC,KAAK;KACT,CAAC;IACX,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC,yDAOC,KAEC;IAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AACxB,CAAC;AAuGH,SAAS,eAAe,CACtB,KAAmC;IAEnC,uEAAuE;IACvE,OAAQ,KAAuB,CAAC,KAAK,KAAK,SAAS,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CAAC,KAAoB;IACzC,OAAQ,KAA4B,CAAC,UAAU,KAAK,SAAS,CAAC;AAChE,CAAC;AAuCY,QAAA,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC","sourcesContent":["import Event from \"rx.mini\";\n\nimport * as MP4 from \"./mp4box\";\n\ntype DecoderConfig = AudioDecoderConfig | VideoDecoderConfig;\ntype EncodedChunk = EncodedAudioChunk | EncodedVideoChunk;\n\nexport type DataType = \"init\" | \"delta\" | \"key\";\n\nexport interface Mp4Data {\n type: DataType;\n timestamp: number;\n duration: number;\n data: Uint8Array;\n kind: \"audio\" | \"video\";\n}\n\nexport class Mp4Container {\n #mp4: MP4.ISOFile;\n #audioFrame?: EncodedAudioChunk | EncodedVideoChunk;\n #videoFrame?: EncodedAudioChunk | EncodedVideoChunk; // 1 frame buffer\n audioTrack?: number;\n videoTrack?: number;\n #audioSegment = 0;\n #videoSegment = 0;\n onData = new Event<[Mp4Data]>();\n\n constructor(\n private props: {\n track: { audio: boolean; video: boolean };\n },\n ) {\n this.#mp4 = new MP4.ISOFile();\n this.#mp4.init();\n }\n\n get tracksReady() {\n let ready = true;\n if (this.props.track.audio && !this.audioTrack) {\n ready = false;\n }\n if (this.props.track.video && !this.videoTrack) {\n ready = false;\n }\n return ready;\n }\n\n write(\n frame: (DecoderConfig | EncodedChunk) & {\n track: \"video\" | \"audio\";\n },\n ) {\n if (isDecoderConfig(frame)) {\n return this.#init(frame);\n } else {\n return this.#enqueue(frame);\n }\n }\n\n #init(\n frame: DecoderConfig & {\n track: \"video\" | \"audio\";\n },\n ) {\n let codec = frame.codec.substring(0, 4);\n if (codec == \"opus\") {\n codec = \"Opus\";\n }\n\n const options: MP4.TrackOptions = {\n type: codec,\n timescale: 1_000_000,\n };\n\n if (isVideoConfig(frame)) {\n options.width = frame.codedWidth;\n options.height = frame.codedHeight;\n } else {\n options.channel_count = frame.numberOfChannels;\n options.samplerate = frame.sampleRate;\n options.hdlr = \"soun\";\n }\n\n if (!frame.description) throw new Error(\"missing frame description\");\n const desc = frame.description as ArrayBufferLike;\n\n if (codec === \"avc1\") {\n options.avcDecoderConfigRecord = desc;\n } else if (codec === \"hev1\") {\n options.hevcDecoderConfigRecord = desc;\n } else if (codec === \"Opus\") {\n // description is an identification header: https://datatracker.ietf.org/doc/html/rfc7845#section-5.1\n // The first 8 bytes are the magic string \"OpusHead\", followed by what we actually want.\n const dops = new MP4.BoxParser.dOpsBox();\n\n // Annoyingly, the header is little endian while MP4 is big endian, so we have to parse.\n dops.parse(new MP4.Stream(desc, 8, MP4.Stream.LITTLE_ENDIAN));\n\n options.description = dops;\n } else {\n throw new Error(`unsupported codec: ${codec}`);\n }\n\n const track = this.#mp4.addTrack(options);\n if (track == undefined) {\n throw new Error(\"failed to initialize MP4 track\");\n }\n if (frame.track === \"audio\") {\n this.audioTrack = track;\n } else {\n this.videoTrack = track;\n }\n\n if (!this.tracksReady) {\n return;\n }\n\n const buffer = MP4.ISOFile.writeInitializationSegment(\n this.#mp4.ftyp!,\n this.#mp4.moov!,\n 0,\n 0,\n );\n const data = new Uint8Array(buffer);\n const res = {\n type: \"init\",\n timestamp: 0,\n duration: 0,\n data,\n kind: frame.track,\n } as const;\n this.onData.execute(res);\n }\n\n frameBuffer: (EncodedChunk & {\n track: \"video\" | \"audio\";\n })[] = [];\n\n #enqueue(\n frame: EncodedChunk & {\n track: \"video\" | \"audio\";\n },\n ) {\n this.frameBuffer.push(frame);\n if (!this.tracksReady) {\n return;\n }\n for (const frame of this.frameBuffer) {\n this._enqueue(frame);\n }\n this.frameBuffer = [];\n }\n\n private _enqueue(\n frame: EncodedChunk & {\n track: \"video\" | \"audio\";\n },\n ) {\n const track = frame.track === \"audio\" ? this.audioTrack : this.videoTrack;\n if (!track) {\n throw new Error(\"track missing\");\n }\n\n // Check if we should create a new segment\n if (frame.track === \"video\") {\n if (frame.type == \"key\") {\n this.#videoSegment += 1;\n } else if (this.#videoSegment == 0) {\n throw new Error(\"must start with keyframe\");\n }\n } else {\n this.#audioSegment += 1;\n }\n\n // We need a one frame buffer to compute the duration\n if (frame.track === \"video\") {\n if (!this.#videoFrame) {\n this.#videoFrame = frame;\n return;\n }\n } else {\n if (!this.#audioFrame) {\n this.#audioFrame = frame;\n return;\n }\n }\n\n const bufferFrame =\n frame.track === \"video\" ? this.#videoFrame : this.#audioFrame;\n\n if (!bufferFrame) {\n throw new Error(\"bufferFrame missing\");\n }\n\n const duration = frame.timestamp - bufferFrame.timestamp;\n\n // TODO avoid this extra copy by writing to the mdat directly\n // ...which means changing mp4box.js to take an offset instead of ArrayBuffer\n const buffer = new Uint8Array(bufferFrame.byteLength);\n bufferFrame.copyTo(buffer);\n\n // Add the sample to the container\n this.#mp4.addSample(track, buffer, {\n duration,\n dts: bufferFrame.timestamp,\n cts: bufferFrame.timestamp,\n is_sync: bufferFrame.type == \"key\",\n });\n\n const stream = new MP4.Stream(undefined, 0, MP4.Stream.BIG_ENDIAN);\n\n // Moof and mdat atoms are written in pairs.\n // TODO remove the moof/mdat from the Box to reclaim memory once everything works\n for (;;) {\n const moof = this.#mp4.moofs.shift();\n const mdat = this.#mp4.mdats.shift();\n\n if (!moof && !mdat) break;\n if (!moof) throw new Error(\"moof missing\");\n if (!mdat) throw new Error(\"mdat missing\");\n\n moof.write(stream);\n mdat.write(stream);\n }\n\n // TODO avoid this extra copy by writing to the buffer provided in copyTo\n const data = new Uint8Array(stream.buffer);\n\n if (frame.track === \"video\") {\n this.#videoFrame = frame;\n } else {\n this.#audioFrame = frame;\n }\n\n const res = {\n type: bufferFrame.type,\n timestamp: bufferFrame.timestamp,\n kind: frame.track,\n duration,\n data,\n };\n this.onData.execute(res);\n }\n\n /* TODO flush the last frame\n\t#flush(controller: TransformStreamDefaultController<Chunk>) {\n\t\tif (this.#frame) {\n\t\t\t// TODO guess the duration\n\t\t\tthis.#enqueue(this.#frame, 0, controller)\n\t\t}\n\t}\n\t*/\n}\n\nfunction isDecoderConfig(\n frame: DecoderConfig | EncodedChunk,\n): frame is DecoderConfig {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (frame as DecoderConfig).codec !== undefined;\n}\n\nfunction isVideoConfig(frame: DecoderConfig): frame is VideoDecoderConfig {\n return (frame as VideoDecoderConfig).codedWidth !== undefined;\n}\n\nexport interface AudioDecoderConfig {\n codec: string;\n description?: ArrayBuffer | undefined;\n numberOfChannels: number;\n sampleRate: number;\n}\n\nexport interface VideoDecoderConfig {\n codec: string;\n codedHeight?: number | undefined;\n codedWidth?: number | undefined;\n description?: ArrayBuffer | undefined;\n displayAspectHeight?: number | undefined;\n displayAspectWidth?: number | undefined;\n optimizeForLatency?: boolean | undefined;\n}\n\ninterface EncodedAudioChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedAudioChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedAudioChunkType = \"delta\" | \"key\";\n\ninterface EncodedVideoChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedVideoChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedVideoChunkType = \"delta\" | \"key\";\n\nexport const mp4SupportedCodecs = [\"avc1\", \"opus\"] as const;\nexport type Mp4SupportedCodec = (typeof mp4SupportedCodecs)[number];\n"]}