werift 0.15.10 → 0.16.0

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 (164) hide show
  1. package/lib/common/src/index.d.ts +2 -0
  2. package/lib/common/src/index.js +2 -0
  3. package/lib/common/src/index.js.map +1 -1
  4. package/lib/common/src/log.d.ts +11 -0
  5. package/lib/common/src/log.js +17 -0
  6. package/lib/common/src/log.js.map +1 -0
  7. package/lib/common/src/network.d.ts +7 -3
  8. package/lib/common/src/network.js +15 -7
  9. package/lib/common/src/network.js.map +1 -1
  10. package/lib/common/src/type.d.ts +3 -0
  11. package/lib/common/src/type.js +3 -0
  12. package/lib/common/src/type.js.map +1 -0
  13. package/lib/dtls/src/context/cipher.js.map +1 -1
  14. package/lib/dtls/src/flight/server/flight2.js +10 -0
  15. package/lib/dtls/src/flight/server/flight2.js.map +1 -1
  16. package/lib/ice/src/ice.d.ts +3 -0
  17. package/lib/ice/src/ice.js +9 -2
  18. package/lib/ice/src/ice.js.map +1 -1
  19. package/lib/ice/src/stun/protocol.d.ts +2 -1
  20. package/lib/ice/src/stun/protocol.js +3 -3
  21. package/lib/ice/src/stun/protocol.js.map +1 -1
  22. package/lib/ice/src/transport.d.ts +4 -2
  23. package/lib/ice/src/transport.js +8 -6
  24. package/lib/ice/src/transport.js.map +1 -1
  25. package/lib/ice/src/turn/protocol.d.ts +3 -1
  26. package/lib/ice/src/turn/protocol.js +2 -2
  27. package/lib/ice/src/turn/protocol.js.map +1 -1
  28. package/lib/ice/src/utils.d.ts +2 -1
  29. package/lib/ice/src/utils.js +2 -2
  30. package/lib/ice/src/utils.js.map +1 -1
  31. package/lib/rtp/src/codec/index.d.ts +18 -0
  32. package/lib/rtp/src/codec/index.js +81 -0
  33. package/lib/rtp/src/codec/index.js.map +1 -0
  34. package/lib/rtp/src/codec/vp8.d.ts +5 -3
  35. package/lib/rtp/src/codec/vp8.js +19 -5
  36. package/lib/rtp/src/codec/vp8.js.map +1 -1
  37. package/lib/rtp/src/container/webm.d.ts +6 -1
  38. package/lib/rtp/src/container/webm.js +9 -2
  39. package/lib/rtp/src/container/webm.js.map +1 -1
  40. package/lib/rtp/src/index.d.ts +2 -6
  41. package/lib/rtp/src/index.js +2 -6
  42. package/lib/rtp/src/index.js.map +1 -1
  43. package/lib/rtp/src/processor/base.d.ts +3 -1
  44. package/lib/rtp/src/processor/base.js +19 -6
  45. package/lib/rtp/src/processor/base.js.map +1 -1
  46. package/lib/rtp/src/processor/jitterBuffer.js +1 -2
  47. package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
  48. package/lib/rtp/src/processor/lipsync.js +22 -2
  49. package/lib/rtp/src/processor/lipsync.js.map +1 -1
  50. package/lib/rtp/src/processor/webm.d.ts +11 -7
  51. package/lib/rtp/src/processor/webm.js +16 -41
  52. package/lib/rtp/src/processor/webm.js.map +1 -1
  53. package/lib/rtp/src/processor_v2/depacketizer.d.ts +17 -0
  54. package/lib/rtp/src/processor_v2/depacketizer.js +84 -0
  55. package/lib/rtp/src/processor_v2/depacketizer.js.map +1 -0
  56. package/lib/rtp/src/processor_v2/index.d.ts +4 -0
  57. package/lib/rtp/src/processor_v2/index.js +21 -0
  58. package/lib/rtp/src/processor_v2/index.js.map +1 -0
  59. package/lib/rtp/src/processor_v2/jitterBuffer.d.ts +33 -0
  60. package/lib/rtp/src/processor_v2/jitterBuffer.js +154 -0
  61. package/lib/rtp/src/processor_v2/jitterBuffer.js.map +1 -0
  62. package/lib/rtp/src/processor_v2/source/base.d.ts +8 -0
  63. package/lib/rtp/src/processor_v2/source/base.js +16 -0
  64. package/lib/rtp/src/processor_v2/source/base.js.map +1 -0
  65. package/lib/rtp/src/processor_v2/source/index.d.ts +2 -0
  66. package/lib/rtp/src/processor_v2/source/index.js +6 -0
  67. package/lib/rtp/src/processor_v2/source/index.js.map +1 -0
  68. package/lib/rtp/src/processor_v2/source/rtp.d.ts +14 -0
  69. package/lib/rtp/src/processor_v2/source/rtp.js +24 -0
  70. package/lib/rtp/src/processor_v2/source/rtp.js.map +1 -0
  71. package/lib/rtp/src/processor_v2/webmLive.d.ts +51 -0
  72. package/lib/rtp/src/processor_v2/webmLive.js +154 -0
  73. package/lib/rtp/src/processor_v2/webmLive.js.map +1 -0
  74. package/lib/rtp/src/rtcp/header.d.ts +2 -1
  75. package/lib/rtp/src/rtcp/header.js +3 -2
  76. package/lib/rtp/src/rtcp/header.js.map +1 -1
  77. package/lib/rtp/src/rtcp/rr.d.ts +2 -0
  78. package/lib/rtp/src/rtcp/rr.js.map +1 -1
  79. package/lib/rtp/src/rtcp/rtcp.js +4 -4
  80. package/lib/rtp/src/rtcp/rtcp.js.map +1 -1
  81. package/lib/rtp/src/rtcp/rtpfb/index.js +1 -1
  82. package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
  83. package/lib/rtp/src/rtcp/rtpfb/nack.js +15 -7
  84. package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
  85. package/lib/rtp/src/rtp/red/packet.d.ts +1 -0
  86. package/lib/rtp/src/rtp/red/packet.js.map +1 -1
  87. package/lib/rtp/src/rtp/rtp.d.ts +1 -0
  88. package/lib/rtp/src/rtp/rtp.js +27 -26
  89. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  90. package/lib/rtp/src/srtp/cipher/ctr.d.ts +1 -1
  91. package/lib/rtp/src/srtp/cipher/ctr.js +14 -20
  92. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  93. package/lib/webrtc/src/dataChannel.js +1 -1
  94. package/lib/webrtc/src/dataChannel.js.map +1 -1
  95. package/lib/webrtc/src/media/extension/rtpExtension.d.ts +2 -0
  96. package/lib/webrtc/src/media/extension/rtpExtension.js +8 -1
  97. package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -1
  98. package/lib/webrtc/src/media/parameters.d.ts +2 -0
  99. package/lib/webrtc/src/media/parameters.js +1 -0
  100. package/lib/webrtc/src/media/parameters.js.map +1 -1
  101. package/lib/webrtc/src/media/receiver/nack.d.ts +10 -5
  102. package/lib/webrtc/src/media/receiver/nack.js +44 -27
  103. package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
  104. package/lib/webrtc/src/media/receiver/receiverTwcc.js +1 -1
  105. package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
  106. package/lib/webrtc/src/media/receiver/red.d.ts +1 -1
  107. package/lib/webrtc/src/media/receiver/red.js +14 -3
  108. package/lib/webrtc/src/media/receiver/red.js.map +1 -1
  109. package/lib/webrtc/src/media/router.d.ts +10 -3
  110. package/lib/webrtc/src/media/router.js +2 -0
  111. package/lib/webrtc/src/media/router.js.map +1 -1
  112. package/lib/webrtc/src/media/rtpReceiver.d.ts +11 -3
  113. package/lib/webrtc/src/media/rtpReceiver.js +42 -23
  114. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  115. package/lib/webrtc/src/media/rtpSender.d.ts +23 -2
  116. package/lib/webrtc/src/media/rtpSender.js +34 -10
  117. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  118. package/lib/webrtc/src/media/rtpTransceiver.d.ts +5 -1
  119. package/lib/webrtc/src/media/rtpTransceiver.js +9 -9
  120. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  121. package/lib/webrtc/src/media/track.js +4 -2
  122. package/lib/webrtc/src/media/track.js.map +1 -1
  123. package/lib/webrtc/src/nonstandard/recorder/index.d.ts +5 -1
  124. package/lib/webrtc/src/nonstandard/recorder/index.js +2 -2
  125. package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
  126. package/lib/webrtc/src/nonstandard/recorder/writer/index.d.ts +1 -1
  127. package/lib/webrtc/src/nonstandard/recorder/writer/index.js +1 -1
  128. package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
  129. package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +3 -3
  130. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +61 -41
  131. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  132. package/lib/webrtc/src/peerConnection.d.ts +13 -0
  133. package/lib/webrtc/src/peerConnection.js +40 -3
  134. package/lib/webrtc/src/peerConnection.js.map +1 -1
  135. package/lib/webrtc/src/sdp.d.ts +1 -0
  136. package/lib/webrtc/src/sdp.js +4 -0
  137. package/lib/webrtc/src/sdp.js.map +1 -1
  138. package/lib/webrtc/src/transport/dtls.js +6 -1
  139. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  140. package/lib/webrtc/src/transport/sctp.js +1 -1
  141. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  142. package/lib/webrtc/src/utils.d.ts +7 -2
  143. package/lib/webrtc/src/utils.js +9 -3
  144. package/lib/webrtc/src/utils.js.map +1 -1
  145. package/package.json +2 -2
  146. package/src/dataChannel.ts +1 -1
  147. package/src/media/extension/rtpExtension.ts +8 -0
  148. package/src/media/parameters.ts +3 -0
  149. package/src/media/receiver/nack.ts +45 -26
  150. package/src/media/receiver/receiverTwcc.ts +1 -1
  151. package/src/media/receiver/red.ts +14 -1
  152. package/src/media/router.ts +5 -3
  153. package/src/media/rtpReceiver.ts +59 -28
  154. package/src/media/rtpSender.ts +38 -12
  155. package/src/media/rtpTransceiver.ts +10 -8
  156. package/src/media/track.ts +6 -2
  157. package/src/nonstandard/recorder/index.ts +6 -2
  158. package/src/nonstandard/recorder/writer/index.ts +1 -1
  159. package/src/nonstandard/recorder/writer/webm.ts +105 -57
  160. package/src/peerConnection.ts +61 -7
  161. package/src/sdp.ts +3 -0
  162. package/src/transport/dtls.ts +5 -1
  163. package/src/transport/sctp.ts +1 -1
  164. package/src/utils.ts +8 -2
@@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.normalizeFamilyNodeV18 = exports.getGlobalIp = void 0;
4
4
  const ice_1 = require("./ice");
5
5
  const protocol_1 = require("./stun/protocol");
6
- async function getGlobalIp(stunServer) {
6
+ async function getGlobalIp(stunServer, interfaceAddresses) {
7
7
  const connection = new ice_1.Connection(true, {
8
8
  stunServer: stunServer ?? ["stun.l.google.com", 19302],
9
9
  });
10
10
  await connection.gatherCandidates();
11
11
  const protocol = new protocol_1.StunProtocol(connection);
12
12
  protocol.localCandidate = connection.localCandidates[0];
13
- await protocol.connectionMade(true);
13
+ await protocol.connectionMade(true, undefined, interfaceAddresses);
14
14
  const candidate = await (0, ice_1.serverReflexiveCandidate)(protocol, [
15
15
  "stun.l.google.com",
16
16
  19302,
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../ice/src/utils.ts"],"names":[],"mappings":";;;AAAA,+BAA6D;AAC7D,8CAA+C;AAGxC,KAAK,UAAU,WAAW,CAAC,UAAoB;IACpD,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,CAAC,CAAC;IACpC,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,OAAO,SAAS,EAAE,IAAI,CAAC;AACzB,CAAC;AAlBD,kCAkBC;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 { Connection, serverReflexiveCandidate } from \"./ice\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { Address } from \"./types/model\";\n\nexport async function getGlobalIp(stunServer?: Address) {\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);\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 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":";;;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,OAAO,SAAS,EAAE,IAAI,CAAC;AACzB,CAAC;AArBD,kCAqBC;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 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"]}
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" />
2
+ import { RtpPacket } from "../rtp/rtp";
3
+ import { DePacketizerBase } from "./base";
4
+ export * from "./av1";
5
+ export * from "./base";
6
+ export * from "./h264";
7
+ export * from "./opus";
8
+ export * from "./vp8";
9
+ export * from "./vp9";
10
+ export declare function dePacketizeRtpPackets(codec: string, packets: RtpPacket[]): {
11
+ isKeyframe: boolean;
12
+ data: Buffer;
13
+ partitions: DePacketizerBase[];
14
+ } | {
15
+ isKeyframe: boolean;
16
+ data: Buffer;
17
+ };
18
+ export declare function dePacketizeRtpPacket(codec: string, packet: RtpPacket): DePacketizerBase;
@@ -0,0 +1,81 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.dePacketizeRtpPacket = exports.dePacketizeRtpPackets = void 0;
18
+ const av1_1 = require("./av1");
19
+ const h264_1 = require("./h264");
20
+ const opus_1 = require("./opus");
21
+ const vp8_1 = require("./vp8");
22
+ const vp9_1 = require("./vp9");
23
+ __exportStar(require("./av1"), exports);
24
+ __exportStar(require("./base"), exports);
25
+ __exportStar(require("./h264"), exports);
26
+ __exportStar(require("./opus"), exports);
27
+ __exportStar(require("./vp8"), exports);
28
+ __exportStar(require("./vp9"), exports);
29
+ function dePacketizeRtpPackets(codec, packets) {
30
+ const basicCodecParser = (DePacketizer) => {
31
+ const partitions = packets.map((p) => DePacketizer.deSerialize(p.payload));
32
+ const isKeyframe = !!partitions.find((f) => f.isKeyframe);
33
+ const data = Buffer.concat(partitions.map((f) => f.payload));
34
+ return { isKeyframe, data, partitions };
35
+ };
36
+ switch (codec.toUpperCase()) {
37
+ case "AV1": {
38
+ const chunks = packets.map((p) => av1_1.AV1RtpPayload.deSerialize(p.payload));
39
+ const isKeyframe = !!chunks.find((f) => f.isKeyframe);
40
+ const data = av1_1.AV1RtpPayload.getFrame(chunks);
41
+ return { isKeyframe, data };
42
+ }
43
+ case "MPEG4/ISO/AVC":
44
+ return basicCodecParser(h264_1.H264RtpPayload);
45
+ case "VP8": {
46
+ const { partitions, data, isKeyframe } = basicCodecParser(vp8_1.Vp8RtpPayload);
47
+ if (!partitions[0].payloadHeaderExist) {
48
+ throw new Error();
49
+ }
50
+ return { data, isKeyframe };
51
+ }
52
+ case "VP9":
53
+ return basicCodecParser(vp9_1.Vp9RtpPayload);
54
+ case "OPUS":
55
+ return basicCodecParser(opus_1.OpusRtpPayload);
56
+ default:
57
+ throw new Error();
58
+ }
59
+ }
60
+ exports.dePacketizeRtpPackets = dePacketizeRtpPackets;
61
+ function dePacketizeRtpPacket(codec, packet) {
62
+ const depacketizer = (DePacketizer) => {
63
+ return DePacketizer.deSerialize(packet.payload);
64
+ };
65
+ switch (codec.toUpperCase()) {
66
+ case "AV1":
67
+ return depacketizer(av1_1.AV1RtpPayload);
68
+ case "MPEG4/ISO/AVC":
69
+ return depacketizer(h264_1.H264RtpPayload);
70
+ case "VP8":
71
+ return depacketizer(vp8_1.Vp8RtpPayload);
72
+ case "VP9":
73
+ return depacketizer(vp9_1.Vp9RtpPayload);
74
+ case "OPUS":
75
+ return depacketizer(opus_1.OpusRtpPayload);
76
+ default:
77
+ throw new Error();
78
+ }
79
+ }
80
+ exports.dePacketizeRtpPacket = dePacketizeRtpPacket;
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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(codec: string, packets: RtpPacket[]) {\n const basicCodecParser = (DePacketizer: typeof DePacketizerBase) => {\n const partitions = packets.map((p) => DePacketizer.deSerialize(p.payload));\n const isKeyframe = !!partitions.find((f) => f.isKeyframe);\n const data = Buffer.concat(partitions.map((f) => f.payload));\n return { isKeyframe, data, partitions };\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 { isKeyframe, data };\n }\n case \"MPEG4/ISO/AVC\":\n return basicCodecParser(H264RtpPayload);\n case \"VP8\": {\n const { partitions, data, isKeyframe } = basicCodecParser(Vp8RtpPayload);\n if (!(partitions[0] as Vp8RtpPayload).payloadHeaderExist) {\n throw new Error();\n }\n\n return { data, isKeyframe };\n }\n case \"VP9\":\n return basicCodecParser(Vp9RtpPayload);\n case \"OPUS\":\n return basicCodecParser(OpusRtpPayload);\n default:\n throw new Error();\n }\n}\n\nexport function dePacketizeRtpPacket(codec: string, packet: RtpPacket) {\n const depacketizer = (DePacketizer: typeof DePacketizerBase) => {\n return DePacketizer.deSerialize(packet.payload);\n };\n\n switch (codec.toUpperCase()) {\n case \"AV1\":\n return depacketizer(AV1RtpPayload as any);\n case \"MPEG4/ISO/AVC\":\n return depacketizer(H264RtpPayload);\n case \"VP8\":\n return depacketizer(Vp8RtpPayload);\n case \"VP9\":\n return depacketizer(Vp9RtpPayload);\n case \"OPUS\":\n return depacketizer(OpusRtpPayload);\n default:\n throw new Error();\n }\n}\n"]}
@@ -13,14 +13,16 @@ export declare class Vp8RtpPayload implements DePacketizerBase {
13
13
  mBit?: number;
14
14
  pictureId?: number;
15
15
  payload: Buffer;
16
- size0?: number;
16
+ size0: number;
17
17
  hBit?: number;
18
18
  ver?: number;
19
19
  pBit?: number;
20
- size1?: number;
21
- size2?: number;
20
+ size1: number;
21
+ size2: number;
22
22
  static deSerialize(buf: Buffer): Vp8RtpPayload;
23
23
  static isDetectedFinalPacketInSequence(header: RtpHeader): boolean;
24
24
  get isKeyframe(): boolean;
25
25
  get isPartitionHead(): boolean;
26
+ get payloadHeaderExist(): boolean;
27
+ get size(): number;
26
28
  }
@@ -34,6 +34,11 @@ const src_1 = require("../../../common/src");
34
34
  // : :
35
35
  // +-+-+-+-+-+-+-+-+
36
36
  class Vp8RtpPayload {
37
+ constructor() {
38
+ this.size0 = 0;
39
+ this.size1 = 0;
40
+ this.size2 = 0;
41
+ }
37
42
  static deSerialize(buf) {
38
43
  const p = new Vp8RtpPayload();
39
44
  let offset = 0;
@@ -73,17 +78,16 @@ class Vp8RtpPayload {
73
78
  offset++;
74
79
  }
75
80
  p.payload = buf.slice(offset);
76
- if (p.sBit === 1 && p.pid === 0) {
81
+ if (p.payloadHeaderExist) {
77
82
  p.size0 = (0, src_1.getBit)(buf[offset], 0, 3);
78
83
  p.hBit = (0, src_1.getBit)(buf[offset], 3);
79
84
  p.ver = (0, src_1.getBit)(buf[offset], 4, 3);
80
85
  p.pBit = (0, src_1.getBit)(buf[offset], 7);
81
86
  offset++;
87
+ p.size1 = buf[offset];
88
+ offset++;
89
+ p.size2 = buf[offset];
82
90
  }
83
- p.size1 = buf[offset];
84
- offset++;
85
- p.size2 = buf[offset];
86
- offset++;
87
91
  return p;
88
92
  }
89
93
  static isDetectedFinalPacketInSequence(header) {
@@ -95,6 +99,16 @@ class Vp8RtpPayload {
95
99
  get isPartitionHead() {
96
100
  return this.sBit === 1;
97
101
  }
102
+ get payloadHeaderExist() {
103
+ return this.sBit === 1 && this.pid === 0;
104
+ }
105
+ get size() {
106
+ if (this.payloadHeaderExist) {
107
+ const size = this.size0 + 8 * this.size1 + 2048 * this.size2;
108
+ return size;
109
+ }
110
+ return 0;
111
+ }
98
112
  }
99
113
  exports.Vp8RtpPayload = Vp8RtpPayload;
100
114
  //# sourceMappingURL=vp8.js.map
@@ -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;\n hBit?: number;\n ver?: number;\n pBit?: number;\n size1?: number;\n size2?: number;\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.slice(offset);\n\n if (p.sBit === 1 && p.pid === 0) {\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 }\n\n p.size1 = buf[offset];\n offset++;\n p.size2 = buf[offset];\n offset++;\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"]}
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.slice(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"]}
@@ -15,7 +15,12 @@ export declare class WEBMBuilder {
15
15
  width: number;
16
16
  height: number;
17
17
  }>): EBML.EBMLData;
18
- createSegment(duration?: number): Uint8Array;
18
+ createSegment(
19
+ /**ms */
20
+ duration?: number): Uint8Array;
21
+ createDuration(
22
+ /**ms */
23
+ duration: number): Uint8Array;
19
24
  createCuePoint(relativeTimestamp: number, trackNumber: number, clusterPosition: number, blockNumber: number): EBML.EBMLData;
20
25
  createCues(cuePoints: EBML.EBMLData[]): Uint8Array;
21
26
  createCluster(timecode: number): Uint8Array;
@@ -72,13 +72,15 @@ class WEBMBuilder {
72
72
  ]);
73
73
  return trackEntry;
74
74
  }
75
- createSegment(duration) {
75
+ createSegment(
76
+ /**ms */
77
+ duration) {
76
78
  const elements = [
77
79
  EBML.element(EBML.ID.TimecodeScale, EBML.number(millisecond)),
78
80
  EBML.element(EBML.ID.MuxingApp, EBML.string("webrtc")),
79
81
  EBML.element(EBML.ID.WritingApp, EBML.string("webrtc")),
80
82
  ];
81
- if (duration) {
83
+ if (duration != undefined) {
82
84
  elements.push(EBML.element(EBML.ID.Duration, EBML.float(duration)));
83
85
  }
84
86
  return EBML.build(EBML.unknownSizeElement(EBML.ID.Segment, [
@@ -87,6 +89,11 @@ class WEBMBuilder {
87
89
  EBML.element(EBML.ID.Tracks, this.trackEntries),
88
90
  ]));
89
91
  }
92
+ createDuration(
93
+ /**ms */
94
+ duration) {
95
+ return EBML.build(EBML.element(EBML.ID.Duration, EBML.float(duration)));
96
+ }
90
97
  createCuePoint(relativeTimestamp, trackNumber, clusterPosition, blockNumber) {
91
98
  return EBML.element(EBML.ID.CuePoint, [
92
99
  EBML.element(EBML.ID.CueTime, EBML.number(relativeTimestamp)),
@@ -1 +1 @@
1
- {"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../rtp/src/container/webm.ts"],"names":[],"mappings":"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","sourcesContent":["import * as EBML from \"@shinyoshiaki/ebml-builder\";\n\nimport { BitWriter2, BufferChain } from \"../../../common/src\";\nimport { OpusRtpPayload } from \"..\";\n\nexport class WEBMBuilder {\n readonly ebmlHeader = EBML.build(\n EBML.element(EBML.ID.EBML, [\n EBML.element(EBML.ID.EBMLVersion, EBML.number(1)),\n EBML.element(EBML.ID.EBMLReadVersion, EBML.number(1)),\n EBML.element(EBML.ID.EBMLMaxIDLength, EBML.number(4)),\n EBML.element(EBML.ID.EBMLMaxSizeLength, EBML.number(8)),\n EBML.element(EBML.ID.DocType, EBML.string(\"webm\")),\n EBML.element(EBML.ID.DocTypeVersion, EBML.number(2)),\n EBML.element(EBML.ID.DocTypeReadVersion, EBML.number(2)),\n ])\n );\n trackEntries: EBML.EBMLData[] = [];\n\n constructor(\n tracks: {\n width?: number;\n height?: number;\n kind: \"audio\" | \"video\";\n codec: SupportedCodec;\n trackNumber: number;\n }[]\n ) {\n this.trackEntries = tracks.map(\n ({ width, height, kind, codec, trackNumber }) => {\n return this.createTrackEntry(kind, trackNumber, codec, {\n width,\n height,\n });\n }\n );\n }\n\n createTrackEntry(\n kind: string,\n trackNumber: number,\n codec: string,\n { width, height }: Partial<{ kind: string; width: number; height: number }>\n ) {\n const trackElements: EBML.EBMLData[] = [];\n if (kind === \"video\") {\n trackElements.push(\n EBML.element(EBML.ID.Video, [\n EBML.element(EBML.ID.PixelWidth, EBML.number(width)),\n EBML.element(EBML.ID.PixelHeight, EBML.number(height)),\n ])\n );\n } else {\n trackElements.push(\n EBML.element(EBML.ID.Audio, [\n EBML.element(EBML.ID.SamplingFrequency, EBML.float(48000.0)),\n EBML.element(EBML.ID.Channels, EBML.number(2)),\n ])\n );\n // only support OPUS\n trackElements.push(\n EBML.element(\n EBML.ID.CodecPrivate,\n EBML.bytes(OpusRtpPayload.createCodecPrivate())\n )\n );\n }\n\n const trackEntry = EBML.element(EBML.ID.TrackEntry, [\n EBML.element(EBML.ID.TrackNumber, EBML.number(trackNumber)),\n EBML.element(EBML.ID.TrackUID, EBML.number(trackNumber)),\n EBML.element(EBML.ID.CodecName, EBML.string(codec)),\n EBML.element(EBML.ID.TrackType, EBML.number(kind === \"video\" ? 1 : 2)),\n EBML.element(\n EBML.ID.CodecID,\n EBML.string(`${kind === \"video\" ? \"V\" : \"A\"}_${codec}`)\n ),\n ...trackElements,\n ]);\n return trackEntry;\n }\n\n createSegment(duration?: number) {\n const elements = [\n EBML.element(EBML.ID.TimecodeScale, EBML.number(millisecond)),\n EBML.element(EBML.ID.MuxingApp, EBML.string(\"webrtc\")),\n EBML.element(EBML.ID.WritingApp, EBML.string(\"webrtc\")),\n ];\n if (duration) {\n elements.push(EBML.element(EBML.ID.Duration, EBML.float(duration)));\n }\n return EBML.build(\n EBML.unknownSizeElement(EBML.ID.Segment, [\n EBML.element(EBML.ID.SeekHead, []),\n EBML.element(EBML.ID.Info, elements),\n EBML.element(EBML.ID.Tracks, this.trackEntries),\n ])\n );\n }\n\n createCuePoint(\n relativeTimestamp: number,\n trackNumber: number,\n clusterPosition: number,\n blockNumber: number\n ) {\n return EBML.element(EBML.ID.CuePoint, [\n EBML.element(EBML.ID.CueTime, EBML.number(relativeTimestamp)),\n EBML.element(EBML.ID.CueTrackPositions, [\n EBML.element(EBML.ID.CueTrack, EBML.number(trackNumber)),\n EBML.element(EBML.ID.CueClusterPosition, EBML.number(clusterPosition)),\n EBML.element(EBML.ID.CueBlockNumber, EBML.number(blockNumber)),\n ]),\n ]);\n }\n\n createCues(cuePoints: EBML.EBMLData[]) {\n return EBML.build(EBML.element(EBML.ID.Cues, cuePoints));\n }\n\n createCluster(timecode: number) {\n return EBML.build(\n EBML.unknownSizeElement(EBML.ID.Cluster, [\n EBML.element(EBML.ID.Timecode, EBML.number(timecode)),\n ])\n );\n }\n\n createSimpleBlock(\n data: Buffer,\n isKeyframe: boolean,\n trackNumber: number,\n relativeTimestamp: number\n ) {\n const elementId = Buffer.from([0xa3]);\n const contentSize: Uint8Array = EBML.vintEncodedNumber(\n 1 + 2 + 1 + data.length\n ).bytes;\n\n const keyframe = isKeyframe ? 1 : 0;\n const flags = new BitWriter2(8)\n .set(keyframe)\n .set(0, 3)\n .set(0)\n .set(0, 2)\n .set(0);\n\n const simpleBlock = Buffer.concat([\n elementId,\n contentSize,\n EBML.vintEncodedNumber(trackNumber).bytes,\n new BufferChain(2).writeInt16BE(relativeTimestamp).buffer,\n new BufferChain(1).writeUInt8(flags.value).buffer,\n data,\n ]);\n return simpleBlock;\n }\n}\n\nconst supportedCodecs = [\"MPEG4/ISO/AVC\", \"VP8\", \"VP9\", \"AV1\", \"OPUS\"] as const;\nexport type SupportedCodec = typeof supportedCodecs[number];\nconst millisecond = 1000000;\n"]}
1
+ {"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../rtp/src/container/webm.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iEAAmD;AAEnD,6CAA8D;AAC9D,0BAAoC;AAEpC,MAAa,WAAW;IActB,YACE,MAMG;QApBI,eAAU,GAAG,IAAI,CAAC,KAAK,CAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;YACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SACzD,CAAC,CACH,CAAC;QACF,iBAAY,GAAoB,EAAE,CAAC;QAWjC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,GAAG,CAC5B,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE;YAC9C,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE;gBACrD,KAAK;gBACL,MAAM;aACP,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC;IAED,gBAAgB,CACd,IAAY,EACZ,WAAmB,EACnB,KAAa,EACb,EAAE,KAAK,EAAE,MAAM,EAA4D;QAE3E,MAAM,aAAa,GAAoB,EAAE,CAAC;QAC1C,IAAI,IAAI,KAAK,OAAO,EAAE;YACpB,aAAa,CAAC,IAAI,CAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;gBAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;aACvD,CAAC,CACH,CAAC;SACH;aAAM;YACL,aAAa,CAAC,IAAI,CAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;gBAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC5D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;aAC/C,CAAC,CACH,CAAC;YACF,oBAAoB;YACpB,aAAa,CAAC,IAAI,CAChB,IAAI,CAAC,OAAO,CACV,IAAI,CAAC,EAAE,CAAC,YAAY,EACpB,IAAI,CAAC,KAAK,CAAC,kBAAc,CAAC,kBAAkB,EAAE,CAAC,CAChD,CACF,CAAC;SACH;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE;YAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC3D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACxD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,IAAI,CAAC,OAAO,CACV,IAAI,CAAC,EAAE,CAAC,OAAO,EACf,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CACxD;YACD,GAAG,aAAa;SACjB,CAAC,CAAC;QACH,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,aAAa;IACX,QAAQ;IACR,QAAiB;QAEjB,MAAM,QAAQ,GAAG;YACf,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC7D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SACxD,CAAC;QACF,IAAI,QAAQ,IAAI,SAAS,EAAE;YACzB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SACrE;QACD,OAAO,IAAI,CAAC,KAAK,CACf,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE;YACvC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC;SAChD,CAAC,CACH,CAAC;IACJ,CAAC;IAED,cAAc;IACZ,QAAQ;IACR,QAAgB;QAEhB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,cAAc,CACZ,iBAAyB,EACzB,WAAmB,EACnB,eAAuB,EACvB,WAAmB;QAEnB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE;YACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC7D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE;gBACtC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBACxD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBACtE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;aAC/D,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,SAA0B;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,aAAa,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,KAAK,CACf,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE;YACvC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;SACtD,CAAC,CACH,CAAC;IACJ,CAAC;IAED,iBAAiB,CACf,IAAY,EACZ,UAAmB,EACnB,WAAmB,EACnB,iBAAyB;QAEzB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,MAAM,WAAW,GAAe,IAAI,CAAC,iBAAiB,CACpD,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CACxB,CAAC,KAAK,CAAC;QAER,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,gBAAU,CAAC,CAAC,CAAC;aAC5B,GAAG,CAAC,QAAQ,CAAC;aACb,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;aACT,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;aACT,GAAG,CAAC,CAAC,CAAC,CAAC;QAEV,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;YAChC,SAAS;YACT,WAAW;YACX,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,KAAK;YACzC,IAAI,iBAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,MAAM;YACzD,IAAI,iBAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM;YACjD,IAAI;SACL,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAlKD,kCAkKC;AAED,MAAM,eAAe,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC;AAEhF,MAAM,WAAW,GAAG,OAAO,CAAC","sourcesContent":["import * as EBML from \"@shinyoshiaki/ebml-builder\";\n\nimport { BitWriter2, BufferChain } from \"../../../common/src\";\nimport { OpusRtpPayload } from \"..\";\n\nexport class WEBMBuilder {\n readonly ebmlHeader = EBML.build(\n EBML.element(EBML.ID.EBML, [\n EBML.element(EBML.ID.EBMLVersion, EBML.number(1)),\n EBML.element(EBML.ID.EBMLReadVersion, EBML.number(1)),\n EBML.element(EBML.ID.EBMLMaxIDLength, EBML.number(4)),\n EBML.element(EBML.ID.EBMLMaxSizeLength, EBML.number(8)),\n EBML.element(EBML.ID.DocType, EBML.string(\"webm\")),\n EBML.element(EBML.ID.DocTypeVersion, EBML.number(2)),\n EBML.element(EBML.ID.DocTypeReadVersion, EBML.number(2)),\n ])\n );\n trackEntries: EBML.EBMLData[] = [];\n\n constructor(\n tracks: {\n width?: number;\n height?: number;\n kind: \"audio\" | \"video\";\n codec: SupportedCodec;\n trackNumber: number;\n }[]\n ) {\n this.trackEntries = tracks.map(\n ({ width, height, kind, codec, trackNumber }) => {\n return this.createTrackEntry(kind, trackNumber, codec, {\n width,\n height,\n });\n }\n );\n }\n\n createTrackEntry(\n kind: string,\n trackNumber: number,\n codec: string,\n { width, height }: Partial<{ kind: string; width: number; height: number }>\n ) {\n const trackElements: EBML.EBMLData[] = [];\n if (kind === \"video\") {\n trackElements.push(\n EBML.element(EBML.ID.Video, [\n EBML.element(EBML.ID.PixelWidth, EBML.number(width)),\n EBML.element(EBML.ID.PixelHeight, EBML.number(height)),\n ])\n );\n } else {\n trackElements.push(\n EBML.element(EBML.ID.Audio, [\n EBML.element(EBML.ID.SamplingFrequency, EBML.float(48000.0)),\n EBML.element(EBML.ID.Channels, EBML.number(2)),\n ])\n );\n // only support OPUS\n trackElements.push(\n EBML.element(\n EBML.ID.CodecPrivate,\n EBML.bytes(OpusRtpPayload.createCodecPrivate())\n )\n );\n }\n\n const trackEntry = EBML.element(EBML.ID.TrackEntry, [\n EBML.element(EBML.ID.TrackNumber, EBML.number(trackNumber)),\n EBML.element(EBML.ID.TrackUID, EBML.number(trackNumber)),\n EBML.element(EBML.ID.CodecName, EBML.string(codec)),\n EBML.element(EBML.ID.TrackType, EBML.number(kind === \"video\" ? 1 : 2)),\n EBML.element(\n EBML.ID.CodecID,\n EBML.string(`${kind === \"video\" ? \"V\" : \"A\"}_${codec}`)\n ),\n ...trackElements,\n ]);\n return trackEntry;\n }\n\n createSegment(\n /**ms */\n duration?: number\n ) {\n const elements = [\n EBML.element(EBML.ID.TimecodeScale, EBML.number(millisecond)),\n EBML.element(EBML.ID.MuxingApp, EBML.string(\"webrtc\")),\n EBML.element(EBML.ID.WritingApp, EBML.string(\"webrtc\")),\n ];\n if (duration != undefined) {\n elements.push(EBML.element(EBML.ID.Duration, EBML.float(duration)));\n }\n return EBML.build(\n EBML.unknownSizeElement(EBML.ID.Segment, [\n EBML.element(EBML.ID.SeekHead, []),\n EBML.element(EBML.ID.Info, elements),\n EBML.element(EBML.ID.Tracks, this.trackEntries),\n ])\n );\n }\n\n createDuration(\n /**ms */\n duration: number\n ) {\n return EBML.build(EBML.element(EBML.ID.Duration, EBML.float(duration)));\n }\n\n createCuePoint(\n relativeTimestamp: number,\n trackNumber: number,\n clusterPosition: number,\n blockNumber: number\n ) {\n return EBML.element(EBML.ID.CuePoint, [\n EBML.element(EBML.ID.CueTime, EBML.number(relativeTimestamp)),\n EBML.element(EBML.ID.CueTrackPositions, [\n EBML.element(EBML.ID.CueTrack, EBML.number(trackNumber)),\n EBML.element(EBML.ID.CueClusterPosition, EBML.number(clusterPosition)),\n EBML.element(EBML.ID.CueBlockNumber, EBML.number(blockNumber)),\n ]),\n ]);\n }\n\n createCues(cuePoints: EBML.EBMLData[]) {\n return EBML.build(EBML.element(EBML.ID.Cues, cuePoints));\n }\n\n createCluster(timecode: number) {\n return EBML.build(\n EBML.unknownSizeElement(EBML.ID.Cluster, [\n EBML.element(EBML.ID.Timecode, EBML.number(timecode)),\n ])\n );\n }\n\n createSimpleBlock(\n data: Buffer,\n isKeyframe: boolean,\n trackNumber: number,\n relativeTimestamp: number\n ) {\n const elementId = Buffer.from([0xa3]);\n const contentSize: Uint8Array = EBML.vintEncodedNumber(\n 1 + 2 + 1 + data.length\n ).bytes;\n\n const keyframe = isKeyframe ? 1 : 0;\n const flags = new BitWriter2(8)\n .set(keyframe)\n .set(0, 3)\n .set(0)\n .set(0, 2)\n .set(0);\n\n const simpleBlock = Buffer.concat([\n elementId,\n contentSize,\n EBML.vintEncodedNumber(trackNumber).bytes,\n new BufferChain(2).writeInt16BE(relativeTimestamp).buffer,\n new BufferChain(1).writeUInt8(flags.value).buffer,\n data,\n ]);\n return simpleBlock;\n }\n}\n\nconst supportedCodecs = [\"MPEG4/ISO/AVC\", \"VP8\", \"VP9\", \"AV1\", \"OPUS\"] as const;\nexport type SupportedCodec = typeof supportedCodecs[number];\nconst millisecond = 1000000;\n"]}
@@ -1,16 +1,12 @@
1
1
  import "buffer";
2
2
  export * from "../../common/src";
3
- export * from "./codec/av1";
4
- export * from "./codec/base";
5
- export * from "./codec/h264";
6
- export * from "./codec/opus";
7
- export * from "./codec/vp8";
8
- export * from "./codec/vp9";
3
+ export * from "./codec";
9
4
  export * from "./processor/base";
10
5
  export * from "./processor/jitterBuffer";
11
6
  export * from "./processor/lipsync";
12
7
  export * from "./processor/sampleBuilder";
13
8
  export * from "./processor/webm";
9
+ export * from "./processor_v2";
14
10
  export * from "./rtcp/header";
15
11
  export * from "./rtcp/psfb";
16
12
  export * from "./rtcp/psfb/pictureLossIndication";
@@ -16,17 +16,13 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  require("buffer");
18
18
  __exportStar(require("../../common/src"), exports);
19
- __exportStar(require("./codec/av1"), exports);
20
- __exportStar(require("./codec/base"), exports);
21
- __exportStar(require("./codec/h264"), exports);
22
- __exportStar(require("./codec/opus"), exports);
23
- __exportStar(require("./codec/vp8"), exports);
24
- __exportStar(require("./codec/vp9"), exports);
19
+ __exportStar(require("./codec"), exports);
25
20
  __exportStar(require("./processor/base"), exports);
26
21
  __exportStar(require("./processor/jitterBuffer"), exports);
27
22
  __exportStar(require("./processor/lipsync"), exports);
28
23
  __exportStar(require("./processor/sampleBuilder"), exports);
29
24
  __exportStar(require("./processor/webm"), exports);
25
+ __exportStar(require("./processor_v2"), exports);
30
26
  __exportStar(require("./rtcp/header"), exports);
31
27
  __exportStar(require("./rtcp/psfb"), exports);
32
28
  __exportStar(require("./rtcp/psfb/pictureLossIndication"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../rtp/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kBAAgB;AAChB,mDAAiC;AACjC,8CAA4B;AAC5B,+CAA6B;AAC7B,+CAA6B;AAC7B,+CAA6B;AAC7B,8CAA4B;AAC5B,8CAA4B;AAC5B,mDAAiC;AACjC,2DAAyC;AACzC,sDAAoC;AACpC,4DAA0C;AAC1C,mDAAiC;AACjC,gDAA8B;AAC9B,8CAA4B;AAC5B,oEAAkD;AAClD,mDAAiC;AACjC,4CAA0B;AAC1B,8CAA4B;AAC5B,+CAA6B;AAC7B,oDAAkC;AAClC,oDAAkC;AAClC,8CAA4B;AAC5B,4CAA0B;AAC1B,oDAAkC;AAClC,mDAAiC;AACjC,4CAA0B;AAC1B,+CAA6B;AAC7B,8CAA4B","sourcesContent":["import \"buffer\";\nexport * from \"../../common/src\";\nexport * from \"./codec/av1\";\nexport * from \"./codec/base\";\nexport * from \"./codec/h264\";\nexport * from \"./codec/opus\";\nexport * from \"./codec/vp8\";\nexport * from \"./codec/vp9\";\nexport * from \"./processor/base\";\nexport * from \"./processor/jitterBuffer\";\nexport * from \"./processor/lipsync\";\nexport * from \"./processor/sampleBuilder\";\nexport * from \"./processor/webm\";\nexport * from \"./rtcp/header\";\nexport * from \"./rtcp/psfb\";\nexport * from \"./rtcp/psfb/pictureLossIndication\";\nexport * from \"./rtcp/psfb/remb\";\nexport * from \"./rtcp/rr\";\nexport * from \"./rtcp/rtcp\";\nexport * from \"./rtcp/rtpfb\";\nexport * from \"./rtcp/rtpfb/nack\";\nexport * from \"./rtcp/rtpfb/twcc\";\nexport * from \"./rtcp/sdes\";\nexport * from \"./rtcp/sr\";\nexport * from \"./rtp/red/encoder\";\nexport * from \"./rtp/red/packet\";\nexport * from \"./rtp/rtp\";\nexport * from \"./srtp/srtcp\";\nexport * from \"./srtp/srtp\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../rtp/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kBAAgB;AAChB,mDAAiC;AACjC,0CAAwB;AACxB,mDAAiC;AACjC,2DAAyC;AACzC,sDAAoC;AACpC,4DAA0C;AAC1C,mDAAiC;AACjC,iDAA+B;AAC/B,gDAA8B;AAC9B,8CAA4B;AAC5B,oEAAkD;AAClD,mDAAiC;AACjC,4CAA0B;AAC1B,8CAA4B;AAC5B,+CAA6B;AAC7B,oDAAkC;AAClC,oDAAkC;AAClC,8CAA4B;AAC5B,4CAA0B;AAC1B,oDAAkC;AAClC,mDAAiC;AACjC,4CAA0B;AAC1B,+CAA6B;AAC7B,8CAA4B","sourcesContent":["import \"buffer\";\nexport * from \"../../common/src\";\nexport * from \"./codec\";\nexport * from \"./processor/base\";\nexport * from \"./processor/jitterBuffer\";\nexport * from \"./processor/lipsync\";\nexport * from \"./processor/sampleBuilder\";\nexport * from \"./processor/webm\";\nexport * from \"./processor_v2\";\nexport * from \"./rtcp/header\";\nexport * from \"./rtcp/psfb\";\nexport * from \"./rtcp/psfb/pictureLossIndication\";\nexport * from \"./rtcp/psfb/remb\";\nexport * from \"./rtcp/rr\";\nexport * from \"./rtcp/rtcp\";\nexport * from \"./rtcp/rtpfb\";\nexport * from \"./rtcp/rtpfb/nack\";\nexport * from \"./rtcp/rtpfb/twcc\";\nexport * from \"./rtcp/sdes\";\nexport * from \"./rtcp/sr\";\nexport * from \"./rtp/red/encoder\";\nexport * from \"./rtp/red/packet\";\nexport * from \"./rtp/rtp\";\nexport * from \"./srtp/srtcp\";\nexport * from \"./srtp/srtp\";\n"]}
@@ -1,7 +1,8 @@
1
- import { Event } from "rx.mini";
1
+ import Event from "rx.mini";
2
2
  import { RtcpPacket, RtpPacket } from "..";
3
3
  export declare abstract class Pipeline {
4
4
  protected children?: Pipeline | Output;
5
+ private disposer?;
5
6
  constructor(streams?: {
6
7
  rtpStream?: Event<[RtpPacket]>;
7
8
  rtcpStream?: Event<[RtcpPacket]>;
@@ -9,6 +10,7 @@ export declare abstract class Pipeline {
9
10
  pipe(children: Pipeline | Output): Pipeline | Output;
10
11
  pushRtpPackets(packets: RtpPacket[]): void;
11
12
  pushRtcpPackets(packets: RtcpPacket[]): void;
13
+ stop(): void;
12
14
  }
13
15
  export declare abstract class Output {
14
16
  pushRtpPackets?(packets: RtpPacket[]): void;
@@ -3,12 +3,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Output = exports.Pipeline = void 0;
4
4
  class Pipeline {
5
5
  constructor(streams) {
6
- streams?.rtpStream?.subscribe?.((packet) => {
7
- this.pushRtpPackets([packet]);
8
- });
9
- streams?.rtcpStream?.subscribe?.((packet) => {
10
- this.pushRtcpPackets([packet]);
11
- });
6
+ const disposers = [];
7
+ {
8
+ const { unSubscribe } = streams?.rtpStream?.subscribe?.((packet) => {
9
+ this.pushRtpPackets([packet]);
10
+ }) ?? {};
11
+ disposers.push(unSubscribe);
12
+ }
13
+ {
14
+ const { unSubscribe } = streams?.rtcpStream?.subscribe?.((packet) => {
15
+ this.pushRtcpPackets([packet]);
16
+ }) ?? {};
17
+ disposers.push(unSubscribe);
18
+ }
19
+ this.disposer = () => {
20
+ disposers.forEach((d) => d?.());
21
+ };
12
22
  }
13
23
  pipe(children) {
14
24
  this.children = children;
@@ -16,6 +26,9 @@ class Pipeline {
16
26
  }
17
27
  pushRtpPackets(packets) { }
18
28
  pushRtcpPackets(packets) { }
29
+ stop() {
30
+ this.disposer?.();
31
+ }
19
32
  }
20
33
  exports.Pipeline = Pipeline;
21
34
  class Output {
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/base.ts"],"names":[],"mappings":";;;AAIA,MAAsB,QAAQ;IAE5B,YAAY,OAGX;QACC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;YACzC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;YAC1C,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,QAA2B;QAC9B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,cAAc,CAAC,OAAoB,IAAG,CAAC;IACvC,eAAe,CAAC,OAAqB,IAAG,CAAC;CAC1C;AAnBD,4BAmBC;AAED,MAAsB,MAAM;IAC1B,cAAc,CAAE,OAAoB,IAAG,CAAC;IACxC,eAAe,CAAE,OAAqB,IAAG,CAAC;CAC3C;AAHD,wBAGC","sourcesContent":["import { Event } from \"rx.mini\";\n\nimport { RtcpPacket, RtpPacket } from \"..\";\n\nexport abstract class Pipeline {\n protected children?: Pipeline | Output;\n constructor(streams?: {\n rtpStream?: Event<[RtpPacket]>;\n rtcpStream?: Event<[RtcpPacket]>;\n }) {\n streams?.rtpStream?.subscribe?.((packet) => {\n this.pushRtpPackets([packet]);\n });\n streams?.rtcpStream?.subscribe?.((packet) => {\n this.pushRtcpPackets([packet]);\n });\n }\n pipe(children: Pipeline | Output): Pipeline | Output {\n this.children = children;\n return this;\n }\n pushRtpPackets(packets: RtpPacket[]) {}\n pushRtcpPackets(packets: RtcpPacket[]) {}\n}\n\nexport abstract class Output {\n pushRtpPackets?(packets: RtpPacket[]) {}\n pushRtcpPackets?(packets: RtcpPacket[]) {}\n}\n"]}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/base.ts"],"names":[],"mappings":";;;AAIA,MAAsB,QAAQ;IAI5B,YAAY,OAGX;QACC,MAAM,SAAS,GAAiC,EAAE,CAAC;QACnD;YACE,MAAM,EAAE,WAAW,EAAE,GACnB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;gBACzC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC7B;QACD;YACE,MAAM,EAAE,WAAW,EAAE,GACnB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1C,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACjC,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC7B;QACD,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE;YACnB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAA2B;QAC9B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,cAAc,CAAC,OAAoB,IAAG,CAAC;IACvC,eAAe,CAAC,OAAqB,IAAG,CAAC;IACzC,IAAI;QACF,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;IACpB,CAAC;CACF;AApCD,4BAoCC;AAED,MAAsB,MAAM;IAC1B,cAAc,CAAE,OAAoB,IAAG,CAAC;IACxC,eAAe,CAAE,OAAqB,IAAG,CAAC;CAC3C;AAHD,wBAGC","sourcesContent":["import Event from \"rx.mini\";\n\nimport { RtcpPacket, RtpPacket } from \"..\";\n\nexport abstract class Pipeline {\n protected children?: Pipeline | Output;\n private disposer?: () => void;\n\n constructor(streams?: {\n rtpStream?: Event<[RtpPacket]>;\n rtcpStream?: Event<[RtcpPacket]>;\n }) {\n const disposers: ((() => void) | undefined)[] = [];\n {\n const { unSubscribe } =\n streams?.rtpStream?.subscribe?.((packet) => {\n this.pushRtpPackets([packet]);\n }) ?? {};\n disposers.push(unSubscribe);\n }\n {\n const { unSubscribe } =\n streams?.rtcpStream?.subscribe?.((packet) => {\n this.pushRtcpPackets([packet]);\n }) ?? {};\n disposers.push(unSubscribe);\n }\n this.disposer = () => {\n disposers.forEach((d) => d?.());\n };\n }\n pipe(children: Pipeline | Output): Pipeline | Output {\n this.children = children;\n return this;\n }\n pushRtpPackets(packets: RtpPacket[]) {}\n pushRtcpPackets(packets: RtcpPacket[]) {}\n stop() {\n this.disposer?.();\n }\n}\n\nexport abstract class Output {\n pushRtpPackets?(packets: RtpPacket[]) {}\n pushRtcpPackets?(packets: RtcpPacket[]) {}\n}\n"]}
@@ -4,7 +4,7 @@ exports.JitterBuffer = void 0;
4
4
  const debug_1 = require("debug");
5
5
  const src_1 = require("../../../common/src");
6
6
  const base_1 = require("./base");
7
- const log = (0, debug_1.debug)("werift:packages/webrtc/src/nonstandard/jitterBuffer.ts");
7
+ const log = (0, debug_1.debug)("werift : packages/rtp/src/processor/jitterBuffer.ts");
8
8
  class JitterBuffer extends base_1.Pipeline {
9
9
  constructor() {
10
10
  super(...arguments);
@@ -18,7 +18,6 @@ class JitterBuffer extends base_1.Pipeline {
18
18
  }
19
19
  else if (p.header.sequenceNumber != (0, src_1.uint16Add)(this.head, 1)) {
20
20
  if (this.retry++ >= this.maxRetry) {
21
- log("give up packet lost");
22
21
  this.head = (0, src_1.uint16Add)(this.head, 2);
23
22
  }
24
23
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"jitterBuffer.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/jitterBuffer.ts"],"names":[],"mappings":";;;AAAA,iCAA8B;AAE9B,6CAAgD;AAGhD,iCAAkC;AAElC,MAAM,GAAG,GAAG,IAAA,aAAK,EAAC,wDAAwD,CAAC,CAAC;AAE5E,MAAa,YAAa,SAAQ,eAAQ;IAA1C;;QACU,UAAK,GAAG,CAAC,CAAC;QAEV,WAAM,GAA4C,EAAE,CAAC;QAE7D,aAAQ,GAAG,GAAG,CAAC;QAUP,UAAK,GAAG,CAAC,CAAY,EAAE,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAEzC,IAAI,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE;gBAC1B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;aACrC;iBAAM,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,IAAA,eAAS,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE;gBAC7D,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;oBACjC,GAAG,CAAC,qBAAqB,CAAC,CAAC;oBAC3B,IAAI,CAAC,IAAI,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;iBACrC;qBAAM;oBACL,OAAO;iBACR;aACF;iBAAM;gBACL,IAAI,CAAC,IAAI,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aACrC;YAED,MAAM,OAAO,GAAgB,EAAE,CAAC;YAChC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACrB,QAAS,IAAI,GAAG,IAAA,eAAS,EAAC,IAAI,EAAE,CAAC,CAAC,EAAE;gBAClC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,EAAE;oBACL,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAChB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;iBAC1B;qBAAM;oBACL,MAAM;iBACP;aACF;YACD,IAAI,CAAC,IAAI,GAAG,IAAA,eAAS,EAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEhC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC;IAvCC,cAAc,CAAC,OAAoB;QACjC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,eAAe,CAAC,OAAqB;QACnC,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;CAiCF;AA9CD,oCA8CC","sourcesContent":["import { debug } from \"debug\";\n\nimport { uint16Add } from \"../../../common/src\";\nimport { RtpPacket } from \"..\";\nimport { RtcpPacket } from \"../rtcp/rtcp\";\nimport { Pipeline } from \"./base\";\n\nconst log = debug(\"werift:packages/webrtc/src/nonstandard/jitterBuffer.ts\");\n\nexport class JitterBuffer extends Pipeline {\n private retry = 0;\n private head?: number;\n private buffer: { [sequenceNumber: number]: RtpPacket } = {};\n\n maxRetry = 100;\n\n pushRtpPackets(packets: RtpPacket[]) {\n packets.forEach(this.onRtp);\n }\n\n pushRtcpPackets(packets: RtcpPacket[]) {\n this.children?.pushRtcpPackets?.(packets);\n }\n\n private onRtp = (p: RtpPacket) => {\n this.buffer[p.header.sequenceNumber] = p;\n\n if (this.head == undefined) {\n this.head = p.header.sequenceNumber;\n } else if (p.header.sequenceNumber != uint16Add(this.head, 1)) {\n if (this.retry++ >= this.maxRetry) {\n log(\"give up packet lost\");\n this.head = uint16Add(this.head, 2);\n } else {\n return;\n }\n } else {\n this.head = uint16Add(this.head, 1);\n }\n\n const packets: RtpPacket[] = [];\n let tail = this.head;\n for (; ; tail = uint16Add(tail, 1)) {\n const p = this.buffer[tail];\n if (p) {\n packets.push(p);\n delete this.buffer[tail];\n } else {\n break;\n }\n }\n this.head = uint16Add(tail, -1);\n\n this.children?.pushRtpPackets?.(packets);\n };\n}\n"]}
1
+ {"version":3,"file":"jitterBuffer.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/jitterBuffer.ts"],"names":[],"mappings":";;;AAAA,iCAA8B;AAE9B,6CAAgD;AAGhD,iCAAkC;AAElC,MAAM,GAAG,GAAG,IAAA,aAAK,EAAC,qDAAqD,CAAC,CAAC;AAEzE,MAAa,YAAa,SAAQ,eAAQ;IAA1C;;QACU,UAAK,GAAG,CAAC,CAAC;QAEV,WAAM,GAA4C,EAAE,CAAC;QAE7D,aAAQ,GAAG,GAAG,CAAC;QAUP,UAAK,GAAG,CAAC,CAAY,EAAE,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAEzC,IAAI,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE;gBAC1B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;aACrC;iBAAM,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,IAAA,eAAS,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE;gBAC7D,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;oBACjC,IAAI,CAAC,IAAI,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;iBACrC;qBAAM;oBACL,OAAO;iBACR;aACF;iBAAM;gBACL,IAAI,CAAC,IAAI,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aACrC;YAED,MAAM,OAAO,GAAgB,EAAE,CAAC;YAChC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACrB,QAAS,IAAI,GAAG,IAAA,eAAS,EAAC,IAAI,EAAE,CAAC,CAAC,EAAE;gBAClC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,EAAE;oBACL,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAChB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;iBAC1B;qBAAM;oBACL,MAAM;iBACP;aACF;YACD,IAAI,CAAC,IAAI,GAAG,IAAA,eAAS,EAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEhC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC;IAtCC,cAAc,CAAC,OAAoB;QACjC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,eAAe,CAAC,OAAqB;QACnC,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;CAgCF;AA7CD,oCA6CC","sourcesContent":["import { debug } from \"debug\";\n\nimport { uint16Add } from \"../../../common/src\";\nimport { RtpPacket } from \"..\";\nimport { RtcpPacket } from \"../rtcp/rtcp\";\nimport { Pipeline } from \"./base\";\n\nconst log = debug(\"werift : packages/rtp/src/processor/jitterBuffer.ts\");\n\nexport class JitterBuffer extends Pipeline {\n private retry = 0;\n private head?: number;\n private buffer: { [sequenceNumber: number]: RtpPacket } = {};\n\n maxRetry = 100;\n\n pushRtpPackets(packets: RtpPacket[]) {\n packets.forEach(this.onRtp);\n }\n\n pushRtcpPackets(packets: RtcpPacket[]) {\n this.children?.pushRtcpPackets?.(packets);\n }\n\n private onRtp = (p: RtpPacket) => {\n this.buffer[p.header.sequenceNumber] = p;\n\n if (this.head == undefined) {\n this.head = p.header.sequenceNumber;\n } else if (p.header.sequenceNumber != uint16Add(this.head, 1)) {\n if (this.retry++ >= this.maxRetry) {\n this.head = uint16Add(this.head, 2);\n } else {\n return;\n }\n } else {\n this.head = uint16Add(this.head, 1);\n }\n\n const packets: RtpPacket[] = [];\n let tail = this.head;\n for (; ; tail = uint16Add(tail, 1)) {\n const p = this.buffer[tail];\n if (p) {\n packets.push(p);\n delete this.buffer[tail];\n } else {\n break;\n }\n }\n this.head = uint16Add(tail, -1);\n\n this.children?.pushRtpPackets?.(packets);\n };\n}\n"]}
@@ -4,6 +4,26 @@ exports.Max32bit = exports.ntpTime2Time = exports.LipSync = void 0;
4
4
  const src_1 = require("../../../common/src");
5
5
  const __1 = require("..");
6
6
  const base_1 = require("./base");
7
+ // #### リップシンク
8
+ // ```
9
+ // 0 1 2 3
10
+ // 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
11
+ // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
12
+ // sender | NTP timestamp, most significant word |
13
+ // info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
14
+ // | NTP timestamp, least significant word |
15
+ // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16
+ // | RTP timestamp |
17
+ // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
18
+ // | sender's packet count |
19
+ // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20
+ // | sender's octet count |
21
+ // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
22
+ // ```
23
+ // - RTCP-SRにはNTP timestampとRTCP-SRを送った時点で最後に送ったRTPパケットのtimestampが載っている
24
+ // - RTP timestampは開始時点の値がランダムなので、Audio,VideoのRTPパケットの同期にはそのままでは使えない
25
+ // - ある時点のRTP timestampのNTP timestampがRTCP-SRでわかるので、任意のRTP timestampに対応するNTP timestampを計算できる
26
+ // - Audio,VideoのRTPパケットの同期にはRTP timestampをNTP timestampに変換して行えば良い
7
27
  // WIP
8
28
  // todo impl
9
29
  class LipSync extends base_1.Pipeline {
@@ -34,8 +54,8 @@ class LipSync extends base_1.Pipeline {
34
54
  });
35
55
  if (Object.keys(this.rtpPackets).length === 2) {
36
56
  const [a, b] = Object.values(this.rtpPackets);
37
- const lastA = this.calcNtpTime(a.slice(-1)[0].header.timestamp);
38
- const lastB = this.calcNtpTime(b.slice(-1)[0].header.timestamp);
57
+ const lastA = this.calcNtpTime(a.at(-1).header.timestamp);
58
+ const lastB = this.calcNtpTime(b.at(-1).header.timestamp);
39
59
  if (lastA == undefined || lastB == undefined) {
40
60
  this.children?.pushRtpPackets?.(packets);
41
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lipsync.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/lipsync.ts"],"names":[],"mappings":"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","sourcesContent":["import Event from \"rx.mini\";\n\nimport { bufferReader, bufferWriter } from \"../../../common/src\";\nimport { RtcpSrPacket, RtpPacket } from \"..\";\nimport { RtcpPacket } from \"../rtcp/rtcp\";\nimport { Pipeline } from \"./base\";\n\n// WIP\n// todo impl\nexport class LipSync extends Pipeline {\n baseNtpTimestamp?: bigint;\n baseRtpTimestamp?: number;\n private rtpPackets: { [pt: number]: RtpPacket[] } = {};\n\n constructor(\n public clockRate: number,\n public mismatch: number,\n streams?: {\n rtpStream?: Event<[RtpPacket]>;\n rtcpStream?: Event<[RtcpPacket]>;\n }\n ) {\n super(streams);\n }\n\n pushRtcpPackets(packets: RtcpPacket[]) {\n packets.forEach((sr) => {\n if (sr instanceof RtcpSrPacket) {\n this.srReceived(sr);\n }\n });\n this.children?.pushRtcpPackets?.(packets);\n }\n\n private srReceived(sr: RtcpSrPacket) {\n const { ntpTimestamp, rtpTimestamp } = sr.senderInfo;\n this.baseNtpTimestamp = ntpTimestamp;\n this.baseRtpTimestamp = rtpTimestamp;\n }\n\n pushRtpPackets(packets: RtpPacket[]) {\n packets.forEach((p) => {\n this.rtpPackets[p.header.payloadType] =\n this.rtpPackets[p.header.payloadType] ?? [];\n this.rtpPackets[p.header.payloadType].push(p);\n });\n if (Object.keys(this.rtpPackets).length === 2) {\n const [a, b] = Object.values(this.rtpPackets);\n const lastA = this.calcNtpTime(a.slice(-1)[0].header.timestamp);\n const lastB = this.calcNtpTime(b.slice(-1)[0].header.timestamp);\n\n if (lastA == undefined || lastB == undefined) {\n this.children?.pushRtpPackets?.(packets);\n } else {\n //\n }\n }\n }\n\n private calcNtpTime(rtpTimestamp: number) {\n if (!this.baseRtpTimestamp || !this.baseNtpTimestamp) {\n return;\n }\n\n // base rtpTimestamp is rollover\n if (rtpTimestamp - this.baseRtpTimestamp > Max32bit - this.clockRate * 60) {\n this.baseRtpTimestamp += Max32bit;\n }\n // target rtpTimestamp is rollover\n else if (\n rtpTimestamp + (Max32bit - this.clockRate * 60) - this.baseRtpTimestamp <\n 0\n ) {\n rtpTimestamp += Max32bit;\n }\n\n const elapsed = (rtpTimestamp - this.baseRtpTimestamp) / this.clockRate;\n\n return ntpTime2Time(this.baseNtpTimestamp) + elapsed;\n }\n}\n\nexport const ntpTime2Time = (ntp: bigint) => {\n const [ntpSec, ntpMsec] = bufferReader(bufferWriter([8], [ntp]), [4, 4]);\n\n return Number(`${ntpSec}.${ntpMsec}`);\n};\n\n/**4294967295 */\nexport const Max32bit = Number((0x01n << 32n) - 1n);\n\nexport interface BufferResolve {\n packets: {\n packet: RtpPacket;\n offset: number;\n }[];\n /**NTP seconds */\n startAtNtpTime: number;\n}\n"]}
1
+ {"version":3,"file":"lipsync.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/lipsync.ts"],"names":[],"mappings":"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","sourcesContent":["import Event from \"rx.mini\";\n\nimport { bufferReader, bufferWriter } from \"../../../common/src\";\nimport { RtcpSrPacket, RtpPacket } from \"..\";\nimport { RtcpPacket } from \"../rtcp/rtcp\";\nimport { Pipeline } from \"./base\";\n\n// #### リップシンク\n// ```\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// sender | NTP timestamp, most significant word |\n// info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | NTP timestamp, least significant word |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | RTP timestamp |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | sender's packet count |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | sender's octet count |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// ```\n\n// - RTCP-SRにはNTP timestampとRTCP-SRを送った時点で最後に送ったRTPパケットのtimestampが載っている\n// - RTP timestampは開始時点の値がランダムなので、Audio,VideoのRTPパケットの同期にはそのままでは使えない\n// - ある時点のRTP timestampのNTP timestampがRTCP-SRでわかるので、任意のRTP timestampに対応するNTP timestampを計算できる\n// - Audio,VideoのRTPパケットの同期にはRTP timestampをNTP timestampに変換して行えば良い\n\n// WIP\n// todo impl\nexport class LipSync extends Pipeline {\n baseNtpTimestamp?: bigint;\n baseRtpTimestamp?: number;\n private rtpPackets: { [pt: number]: RtpPacket[] } = {};\n\n constructor(\n public clockRate: number,\n public mismatch: number,\n streams?: {\n rtpStream?: Event<[RtpPacket]>;\n rtcpStream?: Event<[RtcpPacket]>;\n }\n ) {\n super(streams);\n }\n\n pushRtcpPackets(packets: RtcpPacket[]) {\n packets.forEach((sr) => {\n if (sr instanceof RtcpSrPacket) {\n this.srReceived(sr);\n }\n });\n this.children?.pushRtcpPackets?.(packets);\n }\n\n private srReceived(sr: RtcpSrPacket) {\n const { ntpTimestamp, rtpTimestamp } = sr.senderInfo;\n this.baseNtpTimestamp = ntpTimestamp;\n this.baseRtpTimestamp = rtpTimestamp;\n }\n\n pushRtpPackets(packets: RtpPacket[]) {\n packets.forEach((p) => {\n this.rtpPackets[p.header.payloadType] =\n this.rtpPackets[p.header.payloadType] ?? [];\n this.rtpPackets[p.header.payloadType].push(p);\n });\n if (Object.keys(this.rtpPackets).length === 2) {\n const [a, b] = Object.values(this.rtpPackets);\n const lastA = this.calcNtpTime(a.at(-1)!.header.timestamp);\n const lastB = this.calcNtpTime(b.at(-1)!.header.timestamp);\n\n if (lastA == undefined || lastB == undefined) {\n this.children?.pushRtpPackets?.(packets);\n } else {\n //\n }\n }\n }\n\n private calcNtpTime(rtpTimestamp: number) {\n if (!this.baseRtpTimestamp || !this.baseNtpTimestamp) {\n return;\n }\n\n // base rtpTimestamp is rollover\n if (rtpTimestamp - this.baseRtpTimestamp > Max32bit - this.clockRate * 60) {\n this.baseRtpTimestamp += Max32bit;\n }\n // target rtpTimestamp is rollover\n else if (\n rtpTimestamp + (Max32bit - this.clockRate * 60) - this.baseRtpTimestamp <\n 0\n ) {\n rtpTimestamp += Max32bit;\n }\n\n const elapsed = (rtpTimestamp - this.baseRtpTimestamp) / this.clockRate;\n\n return ntpTime2Time(this.baseNtpTimestamp) + elapsed;\n }\n}\n\nexport const ntpTime2Time = (ntp: bigint) => {\n const [ntpSec, ntpMsec] = bufferReader(bufferWriter([8], [ntp]), [4, 4]);\n\n return Number(`${ntpSec}.${ntpMsec}`);\n};\n\n/**4294967295 */\nexport const Max32bit = Number((0x01n << 32n) - 1n);\n\nexport interface BufferResolve {\n packets: {\n packet: RtpPacket;\n offset: number;\n }[];\n /**NTP seconds */\n startAtNtpTime: number;\n}\n"]}
@@ -1,10 +1,17 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { BinaryLike } from "crypto";
1
4
  import Event from "rx.mini";
2
5
  import { RtpPacket } from "..";
3
6
  import { SupportedCodec } from "../container/webm";
4
7
  import { Output } from "./base";
8
+ export interface FileIO {
9
+ writeFile: (path: string, bin: BinaryLike) => Promise<void>;
10
+ appendFile: (path: string, bin: BinaryLike) => Promise<void>;
11
+ readFile: (path: string) => Promise<Buffer>;
12
+ }
5
13
  export declare class WebmOutput implements Output {
6
- /**fs/promises */
7
- private fs;
14
+ private writer;
8
15
  path: string;
9
16
  tracks: {
10
17
  width?: number;
@@ -23,9 +30,7 @@ export declare class WebmOutput implements Output {
23
30
  private cuePoints;
24
31
  private position;
25
32
  stopped: boolean;
26
- constructor(
27
- /**fs/promises */
28
- fs: any, path: string, tracks: {
33
+ constructor(writer: FileIO, path: string, tracks: {
29
34
  width?: number;
30
35
  height?: number;
31
36
  kind: "audio" | "video";
@@ -37,8 +42,7 @@ export declare class WebmOutput implements Output {
37
42
  rtpStream?: Event<[RtpPacket]>;
38
43
  });
39
44
  private init;
40
- stop(): Promise<void>;
45
+ stop(insertDuration?: boolean): Promise<void>;
41
46
  pushRtpPackets(packets: RtpPacket[]): void;
42
47
  private onRtpPackets;
43
- private dePacketizeRtpPackets;
44
48
  }