werift 0.16.0 → 0.16.2

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 (84) hide show
  1. package/lib/ice/src/ice.d.ts +1 -0
  2. package/lib/ice/src/ice.js +4 -1
  3. package/lib/ice/src/ice.js.map +1 -1
  4. package/lib/rtp/src/codec/index.d.ts +0 -4
  5. package/lib/rtp/src/codec/index.js +2 -6
  6. package/lib/rtp/src/codec/index.js.map +1 -1
  7. package/lib/rtp/src/index.d.ts +1 -6
  8. package/lib/rtp/src/index.js +1 -6
  9. package/lib/rtp/src/index.js.map +1 -1
  10. package/lib/rtp/src/processor/depacketizer.d.ts +26 -0
  11. package/lib/rtp/src/processor/depacketizer.js +114 -0
  12. package/lib/rtp/src/processor/depacketizer.js.map +1 -0
  13. package/lib/rtp/src/processor/depacketizerCallback.d.ts +13 -0
  14. package/lib/rtp/src/processor/depacketizerCallback.js +20 -0
  15. package/lib/rtp/src/processor/depacketizerCallback.js.map +1 -0
  16. package/lib/rtp/src/processor/depacketizerTransformer.d.ts +8 -0
  17. package/lib/rtp/src/processor/depacketizerTransformer.js +20 -0
  18. package/lib/rtp/src/processor/depacketizerTransformer.js.map +1 -0
  19. package/lib/rtp/src/processor/index.d.ts +9 -0
  20. package/lib/rtp/src/{processor_v2 → processor}/index.js +6 -1
  21. package/lib/rtp/src/processor/index.js.map +1 -0
  22. package/lib/rtp/src/processor/jitterBuffer.d.ts +26 -11
  23. package/lib/rtp/src/processor/jitterBuffer.js +150 -42
  24. package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
  25. package/lib/rtp/src/processor/jitterBufferCallback.d.ts +10 -0
  26. package/lib/rtp/src/processor/jitterBufferCallback.js +21 -0
  27. package/lib/rtp/src/processor/jitterBufferCallback.js.map +1 -0
  28. package/lib/rtp/src/processor/jitterBufferTransformer.d.ts +9 -0
  29. package/lib/rtp/src/processor/jitterBufferTransformer.js +22 -0
  30. package/lib/rtp/src/processor/jitterBufferTransformer.js.map +1 -0
  31. package/lib/rtp/src/{processor_v2 → processor}/source/index.d.ts +0 -0
  32. package/lib/rtp/src/{processor_v2 → processor}/source/index.js +0 -0
  33. package/lib/rtp/src/processor/source/index.js.map +1 -0
  34. package/lib/rtp/src/processor/source/rtp.d.ts +20 -0
  35. package/lib/rtp/src/processor/source/rtp.js +33 -0
  36. package/lib/rtp/src/processor/source/rtp.js.map +1 -0
  37. package/lib/rtp/src/processor/webm.d.ts +24 -24
  38. package/lib/rtp/src/processor/webm.js +78 -89
  39. package/lib/rtp/src/processor/webm.js.map +1 -1
  40. package/lib/rtp/src/processor/webmStream.d.ts +31 -0
  41. package/lib/rtp/src/processor/webmStream.js +36 -0
  42. package/lib/rtp/src/processor/webmStream.js.map +1 -0
  43. package/lib/rtp/src/rtp/rtp.d.ts +1 -0
  44. package/lib/rtp/src/rtp/rtp.js +3 -0
  45. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  46. package/lib/webrtc/src/media/rtpReceiver.d.ts +3 -2
  47. package/lib/webrtc/src/media/rtpReceiver.js +14 -6
  48. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  49. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +8 -6
  50. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  51. package/lib/webrtc/src/peerConnection.d.ts +4 -0
  52. package/lib/webrtc/src/peerConnection.js +5 -1
  53. package/lib/webrtc/src/peerConnection.js.map +1 -1
  54. package/package.json +1 -1
  55. package/src/media/rtpReceiver.ts +23 -11
  56. package/src/nonstandard/recorder/writer/webm.ts +9 -7
  57. package/src/peerConnection.ts +9 -1
  58. package/lib/rtp/src/processor/base.d.ts +0 -18
  59. package/lib/rtp/src/processor/base.js +0 -39
  60. package/lib/rtp/src/processor/base.js.map +0 -1
  61. package/lib/rtp/src/processor/lipsync.d.ts +0 -30
  62. package/lib/rtp/src/processor/lipsync.js +0 -92
  63. package/lib/rtp/src/processor/lipsync.js.map +0 -1
  64. package/lib/rtp/src/processor/sampleBuilder.d.ts +0 -13
  65. package/lib/rtp/src/processor/sampleBuilder.js +0 -33
  66. package/lib/rtp/src/processor/sampleBuilder.js.map +0 -1
  67. package/lib/rtp/src/processor_v2/depacketizer.d.ts +0 -17
  68. package/lib/rtp/src/processor_v2/depacketizer.js +0 -84
  69. package/lib/rtp/src/processor_v2/depacketizer.js.map +0 -1
  70. package/lib/rtp/src/processor_v2/index.d.ts +0 -4
  71. package/lib/rtp/src/processor_v2/index.js.map +0 -1
  72. package/lib/rtp/src/processor_v2/jitterBuffer.d.ts +0 -33
  73. package/lib/rtp/src/processor_v2/jitterBuffer.js +0 -154
  74. package/lib/rtp/src/processor_v2/jitterBuffer.js.map +0 -1
  75. package/lib/rtp/src/processor_v2/source/base.d.ts +0 -8
  76. package/lib/rtp/src/processor_v2/source/base.js +0 -16
  77. package/lib/rtp/src/processor_v2/source/base.js.map +0 -1
  78. package/lib/rtp/src/processor_v2/source/index.js.map +0 -1
  79. package/lib/rtp/src/processor_v2/source/rtp.d.ts +0 -14
  80. package/lib/rtp/src/processor_v2/source/rtp.js +0 -24
  81. package/lib/rtp/src/processor_v2/source/rtp.js.map +0 -1
  82. package/lib/rtp/src/processor_v2/webmLive.d.ts +0 -51
  83. package/lib/rtp/src/processor_v2/webmLive.js +0 -154
  84. package/lib/rtp/src/processor_v2/webmLive.js.map +0 -1
@@ -1,18 +0,0 @@
1
- import Event from "rx.mini";
2
- import { RtcpPacket, RtpPacket } from "..";
3
- export declare abstract class Pipeline {
4
- protected children?: Pipeline | Output;
5
- private disposer?;
6
- constructor(streams?: {
7
- rtpStream?: Event<[RtpPacket]>;
8
- rtcpStream?: Event<[RtcpPacket]>;
9
- });
10
- pipe(children: Pipeline | Output): Pipeline | Output;
11
- pushRtpPackets(packets: RtpPacket[]): void;
12
- pushRtcpPackets(packets: RtcpPacket[]): void;
13
- stop(): void;
14
- }
15
- export declare abstract class Output {
16
- pushRtpPackets?(packets: RtpPacket[]): void;
17
- pushRtcpPackets?(packets: RtcpPacket[]): void;
18
- }
@@ -1,39 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Output = exports.Pipeline = void 0;
4
- class Pipeline {
5
- constructor(streams) {
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
- };
22
- }
23
- pipe(children) {
24
- this.children = children;
25
- return this;
26
- }
27
- pushRtpPackets(packets) { }
28
- pushRtcpPackets(packets) { }
29
- stop() {
30
- this.disposer?.();
31
- }
32
- }
33
- exports.Pipeline = Pipeline;
34
- class Output {
35
- pushRtpPackets(packets) { }
36
- pushRtcpPackets(packets) { }
37
- }
38
- exports.Output = Output;
39
- //# sourceMappingURL=base.js.map
@@ -1 +0,0 @@
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"]}
@@ -1,30 +0,0 @@
1
- import Event from "rx.mini";
2
- import { RtpPacket } from "..";
3
- import { RtcpPacket } from "../rtcp/rtcp";
4
- import { Pipeline } from "./base";
5
- export declare class LipSync extends Pipeline {
6
- clockRate: number;
7
- mismatch: number;
8
- baseNtpTimestamp?: bigint;
9
- baseRtpTimestamp?: number;
10
- private rtpPackets;
11
- constructor(clockRate: number, mismatch: number, streams?: {
12
- rtpStream?: Event<[RtpPacket]>;
13
- rtcpStream?: Event<[RtcpPacket]>;
14
- });
15
- pushRtcpPackets(packets: RtcpPacket[]): void;
16
- private srReceived;
17
- pushRtpPackets(packets: RtpPacket[]): void;
18
- private calcNtpTime;
19
- }
20
- export declare const ntpTime2Time: (ntp: bigint) => number;
21
- /**4294967295 */
22
- export declare const Max32bit: number;
23
- export interface BufferResolve {
24
- packets: {
25
- packet: RtpPacket;
26
- offset: number;
27
- }[];
28
- /**NTP seconds */
29
- startAtNtpTime: number;
30
- }
@@ -1,92 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Max32bit = exports.ntpTime2Time = exports.LipSync = void 0;
4
- const src_1 = require("../../../common/src");
5
- const __1 = require("..");
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に変換して行えば良い
27
- // WIP
28
- // todo impl
29
- class LipSync extends base_1.Pipeline {
30
- constructor(clockRate, mismatch, streams) {
31
- super(streams);
32
- this.clockRate = clockRate;
33
- this.mismatch = mismatch;
34
- this.rtpPackets = {};
35
- }
36
- pushRtcpPackets(packets) {
37
- packets.forEach((sr) => {
38
- if (sr instanceof __1.RtcpSrPacket) {
39
- this.srReceived(sr);
40
- }
41
- });
42
- this.children?.pushRtcpPackets?.(packets);
43
- }
44
- srReceived(sr) {
45
- const { ntpTimestamp, rtpTimestamp } = sr.senderInfo;
46
- this.baseNtpTimestamp = ntpTimestamp;
47
- this.baseRtpTimestamp = rtpTimestamp;
48
- }
49
- pushRtpPackets(packets) {
50
- packets.forEach((p) => {
51
- this.rtpPackets[p.header.payloadType] =
52
- this.rtpPackets[p.header.payloadType] ?? [];
53
- this.rtpPackets[p.header.payloadType].push(p);
54
- });
55
- if (Object.keys(this.rtpPackets).length === 2) {
56
- const [a, b] = Object.values(this.rtpPackets);
57
- const lastA = this.calcNtpTime(a.at(-1).header.timestamp);
58
- const lastB = this.calcNtpTime(b.at(-1).header.timestamp);
59
- if (lastA == undefined || lastB == undefined) {
60
- this.children?.pushRtpPackets?.(packets);
61
- }
62
- else {
63
- //
64
- }
65
- }
66
- }
67
- calcNtpTime(rtpTimestamp) {
68
- if (!this.baseRtpTimestamp || !this.baseNtpTimestamp) {
69
- return;
70
- }
71
- // base rtpTimestamp is rollover
72
- if (rtpTimestamp - this.baseRtpTimestamp > exports.Max32bit - this.clockRate * 60) {
73
- this.baseRtpTimestamp += exports.Max32bit;
74
- }
75
- // target rtpTimestamp is rollover
76
- else if (rtpTimestamp + (exports.Max32bit - this.clockRate * 60) - this.baseRtpTimestamp <
77
- 0) {
78
- rtpTimestamp += exports.Max32bit;
79
- }
80
- const elapsed = (rtpTimestamp - this.baseRtpTimestamp) / this.clockRate;
81
- return (0, exports.ntpTime2Time)(this.baseNtpTimestamp) + elapsed;
82
- }
83
- }
84
- exports.LipSync = LipSync;
85
- const ntpTime2Time = (ntp) => {
86
- const [ntpSec, ntpMsec] = (0, src_1.bufferReader)((0, src_1.bufferWriter)([8], [ntp]), [4, 4]);
87
- return Number(`${ntpSec}.${ntpMsec}`);
88
- };
89
- exports.ntpTime2Time = ntpTime2Time;
90
- /**4294967295 */
91
- exports.Max32bit = Number((0x01n << 32n) - 1n);
92
- //# sourceMappingURL=lipsync.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lipsync.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/lipsync.ts"],"names":[],"mappings":";;;AAEA,6CAAiE;AACjE,0BAA6C;AAE7C,iCAAkC;AAElC,cAAc;AACd,MAAM;AACN,wEAAwE;AACxE,0EAA0E;AAC1E,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,MAAM;AAEN,uEAAuE;AACvE,oEAAoE;AACpE,gGAAgG;AAChG,kEAAkE;AAElE,MAAM;AACN,YAAY;AACZ,MAAa,OAAQ,SAAQ,eAAQ;IAKnC,YACS,SAAiB,EACjB,QAAgB,EACvB,OAGC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QAPR,cAAS,GAAT,SAAS,CAAQ;QACjB,aAAQ,GAAR,QAAQ,CAAQ;QAJjB,eAAU,GAAkC,EAAE,CAAC;IAWvD,CAAC;IAED,eAAe,CAAC,OAAqB;QACnC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACrB,IAAI,EAAE,YAAY,gBAAY,EAAE;gBAC9B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;aACrB;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAEO,UAAU,CAAC,EAAgB;QACjC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC;QACrD,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;QACrC,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;IACvC,CAAC;IAED,cAAc,CAAC,OAAoB;QACjC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;gBACnC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7C,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAE3D,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,SAAS,EAAE;gBAC5C,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC;aAC1C;iBAAM;gBACL,EAAE;aACH;SACF;IACH,CAAC;IAEO,WAAW,CAAC,YAAoB;QACtC,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACpD,OAAO;SACR;QAED,gCAAgC;QAChC,IAAI,YAAY,GAAG,IAAI,CAAC,gBAAgB,GAAG,gBAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,EAAE,EAAE;YACzE,IAAI,CAAC,gBAAgB,IAAI,gBAAQ,CAAC;SACnC;QACD,kCAAkC;aAC7B,IACH,YAAY,GAAG,CAAC,gBAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,gBAAgB;YACvE,CAAC,EACD;YACA,YAAY,IAAI,gBAAQ,CAAC;SAC1B;QAED,MAAM,OAAO,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QAExE,OAAO,IAAA,oBAAY,EAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC;IACvD,CAAC;CACF;AAvED,0BAuEC;AAEM,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;IAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAA,kBAAY,EAAC,IAAA,kBAAY,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEzE,OAAO,MAAM,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC;AACxC,CAAC,CAAC;AAJW,QAAA,YAAY,gBAIvB;AAEF,gBAAgB;AACH,QAAA,QAAQ,GAAG,MAAM,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC","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,13 +0,0 @@
1
- import Event from "rx.mini";
2
- import { RtcpPacket, RtpHeader, RtpPacket } from "..";
3
- import { Pipeline } from "./base";
4
- export declare class SampleBuilder extends Pipeline {
5
- private isFinalPacketInSequence;
6
- private buffering;
7
- constructor(isFinalPacketInSequence: (header: RtpHeader) => boolean, streams?: {
8
- rtpStream?: Event<[RtpPacket]>;
9
- rtcpStream?: Event<[RtcpPacket]>;
10
- });
11
- pushRtpPackets(incoming: RtpPacket[]): void;
12
- pushRtcpPackets(packets: RtcpPacket[]): void;
13
- }
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SampleBuilder = void 0;
4
- const helper_1 = require("../helper");
5
- const base_1 = require("./base");
6
- class SampleBuilder extends base_1.Pipeline {
7
- constructor(isFinalPacketInSequence, streams) {
8
- super(streams);
9
- this.isFinalPacketInSequence = isFinalPacketInSequence;
10
- this.buffering = [];
11
- }
12
- pushRtpPackets(incoming) {
13
- this.buffering = [...this.buffering, ...incoming];
14
- let tail;
15
- for (const [i, p] of (0, helper_1.enumerate)(this.buffering)) {
16
- if (this.isFinalPacketInSequence(p.header)) {
17
- tail = i;
18
- break;
19
- }
20
- }
21
- if (tail == undefined) {
22
- return;
23
- }
24
- const packets = this.buffering.slice(0, tail + 1);
25
- this.buffering = this.buffering.slice(tail + 1);
26
- this.children?.pushRtpPackets?.(packets);
27
- }
28
- pushRtcpPackets(packets) {
29
- this.children?.pushRtcpPackets?.(packets);
30
- }
31
- }
32
- exports.SampleBuilder = SampleBuilder;
33
- //# sourceMappingURL=sampleBuilder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sampleBuilder.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/sampleBuilder.ts"],"names":[],"mappings":";;;AAGA,sCAAsC;AACtC,iCAAkC;AAElC,MAAa,aAAc,SAAQ,eAAQ;IAGzC,YACU,uBAAuD,EAC/D,OAGC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QANP,4BAAuB,GAAvB,uBAAuB,CAAgC;QAHzD,cAAS,GAAgB,EAAE,CAAC;IAUpC,CAAC;IAED,cAAc,CAAC,QAAqB;QAClC,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,CAAC;QAElD,IAAI,IAAwB,CAAC;QAC7B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAA,kBAAS,EAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YAC9C,IAAI,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;gBAC1C,IAAI,GAAG,CAAC,CAAC;gBACT,MAAM;aACP;SACF;QACD,IAAI,IAAI,IAAI,SAAS,EAAE;YACrB,OAAO;SACR;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAEhD,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,eAAe,CAAC,OAAqB;QACnC,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;CACF;AApCD,sCAoCC","sourcesContent":["import Event from \"rx.mini\";\n\nimport { RtcpPacket, RtpHeader, RtpPacket } from \"..\";\nimport { enumerate } from \"../helper\";\nimport { Pipeline } from \"./base\";\n\nexport class SampleBuilder extends Pipeline {\n private buffering: RtpPacket[] = [];\n\n constructor(\n private isFinalPacketInSequence: (header: RtpHeader) => boolean,\n streams?: {\n rtpStream?: Event<[RtpPacket]>;\n rtcpStream?: Event<[RtcpPacket]>;\n }\n ) {\n super(streams);\n }\n\n pushRtpPackets(incoming: RtpPacket[]) {\n this.buffering = [...this.buffering, ...incoming];\n\n let tail: number | undefined;\n for (const [i, p] of enumerate(this.buffering)) {\n if (this.isFinalPacketInSequence(p.header)) {\n tail = i;\n break;\n }\n }\n if (tail == undefined) {\n return;\n }\n\n const packets = this.buffering.slice(0, tail + 1);\n this.buffering = this.buffering.slice(tail + 1);\n\n this.children?.pushRtpPackets?.(packets);\n }\n\n pushRtcpPackets(packets: RtcpPacket[]) {\n this.children?.pushRtcpPackets?.(packets);\n }\n}\n"]}
@@ -1,17 +0,0 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- import { TransformStream } from "stream/web";
4
- import { RtpHeader } from "..";
5
- import { RtpOutput } from "./source/rtp";
6
- export declare type DepacketizerInput = RtpOutput;
7
- export interface DepacketizerOutput {
8
- frame?: {
9
- data: Buffer;
10
- isKeyframe: boolean;
11
- timestamp: number;
12
- };
13
- eol?: boolean;
14
- }
15
- export declare const depacketizeTransformer: (isFinalPacketInSequence: (header: RtpHeader) => boolean, codec: string, options?: {
16
- waitForKeyframe?: boolean | undefined;
17
- } | undefined) => TransformStream<RtpOutput, DepacketizerOutput>;
@@ -1,84 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.depacketizeTransformer = void 0;
7
- const debug_1 = __importDefault(require("debug"));
8
- const web_1 = require("stream/web");
9
- const __1 = require("..");
10
- const codec_1 = require("../codec");
11
- const helper_1 = require("../helper");
12
- const srcPath = `werift-rtp : packages/rtp/src/processor_v2/depacketizer.ts`;
13
- const log = (0, debug_1.default)(srcPath);
14
- const depacketizeTransformer = (...args) => new DepacketizeTransformer(...args).transform;
15
- exports.depacketizeTransformer = depacketizeTransformer;
16
- class DepacketizeTransformer {
17
- constructor(isFinalPacketInSequence, codec, options = {}) {
18
- this.isFinalPacketInSequence = isFinalPacketInSequence;
19
- this.buffering = [];
20
- this.packetLostHappened = false;
21
- this.transform = new web_1.TransformStream({
22
- transform: (input, output) => {
23
- if (!input.rtp) {
24
- if (input.eol) {
25
- output.enqueue({ eol: true });
26
- }
27
- return;
28
- }
29
- const packets = this.onRtp(input.rtp);
30
- if (packets) {
31
- try {
32
- const { data, isKeyframe } = (0, codec_1.dePacketizeRtpPackets)(codec, packets);
33
- if (this.packetLostHappened) {
34
- if (isKeyframe) {
35
- this.packetLostHappened = false;
36
- }
37
- else if (options.waitForKeyframe) {
38
- return;
39
- }
40
- }
41
- output.enqueue({
42
- frame: {
43
- data,
44
- isKeyframe,
45
- timestamp: packets[0].header.timestamp,
46
- },
47
- });
48
- }
49
- catch (error) { }
50
- }
51
- },
52
- });
53
- }
54
- onRtp(rtp) {
55
- const { sequenceNumber } = rtp.header;
56
- if (this.lastSeqNum != undefined) {
57
- const expect = (0, __1.uint16Add)(this.lastSeqNum, 1);
58
- if (sequenceNumber < expect) {
59
- return;
60
- }
61
- if (sequenceNumber > expect) {
62
- log("packet lost happened", { expect, sequenceNumber });
63
- this.packetLostHappened = true;
64
- this.buffering = [];
65
- }
66
- }
67
- this.buffering.push(rtp);
68
- this.lastSeqNum = sequenceNumber;
69
- let finalPacket;
70
- for (const [i, p] of (0, helper_1.enumerate)(this.buffering)) {
71
- if (this.isFinalPacketInSequence(p.header)) {
72
- finalPacket = i;
73
- break;
74
- }
75
- }
76
- if (finalPacket == undefined) {
77
- return;
78
- }
79
- const packets = this.buffering;
80
- this.buffering = [];
81
- return packets;
82
- }
83
- }
84
- //# sourceMappingURL=depacketizer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"depacketizer.js","sourceRoot":"","sources":["../../../../../rtp/src/processor_v2/depacketizer.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { TransformStream } from \"stream/web\";\n\nimport { uint16Add } from \"..\";\nimport { RtpHeader, RtpPacket } from \"..\";\nimport { dePacketizeRtpPackets } from \"../codec\";\nimport { enumerate } from \"../helper\";\nimport { RtpOutput } from \"./source/rtp\";\n\nconst srcPath = `werift-rtp : packages/rtp/src/processor_v2/depacketizer.ts`;\nconst log = debug(srcPath);\n\nexport type DepacketizerInput = RtpOutput;\n\nexport interface DepacketizerOutput {\n frame?: { data: Buffer; isKeyframe: boolean; timestamp: number };\n eol?: boolean;\n}\n\nexport const depacketizeTransformer = (\n ...args: ConstructorParameters<typeof DepacketizeTransformer>\n) => new DepacketizeTransformer(...args).transform;\n\nclass DepacketizeTransformer {\n private buffering: RtpPacket[] = [];\n\n transform: TransformStream<DepacketizerInput, DepacketizerOutput>;\n packetLostHappened = false;\n\n constructor(\n private isFinalPacketInSequence: (header: RtpHeader) => boolean,\n codec: string,\n options: { waitForKeyframe?: boolean } = {}\n ) {\n this.transform = new TransformStream({\n transform: (input, output) => {\n if (!input.rtp) {\n if (input.eol) {\n output.enqueue({ eol: true });\n }\n return;\n }\n\n const packets = this.onRtp(input.rtp);\n if (packets) {\n try {\n const { data, isKeyframe } = dePacketizeRtpPackets(codec, packets);\n\n if (this.packetLostHappened) {\n if (isKeyframe) {\n this.packetLostHappened = false;\n } else if (options.waitForKeyframe) {\n return;\n }\n }\n\n output.enqueue({\n frame: {\n data,\n isKeyframe,\n timestamp: packets[0].header.timestamp,\n },\n });\n } catch (error) {}\n }\n },\n });\n }\n\n lastSeqNum?: number;\n private onRtp(rtp: RtpPacket) {\n const { sequenceNumber } = rtp.header;\n if (this.lastSeqNum != undefined) {\n const expect = uint16Add(this.lastSeqNum, 1);\n if (sequenceNumber < expect) {\n return;\n }\n if (sequenceNumber > expect) {\n log(\"packet lost happened\", { expect, sequenceNumber });\n this.packetLostHappened = true;\n this.buffering = [];\n }\n }\n\n this.buffering.push(rtp);\n this.lastSeqNum = sequenceNumber;\n\n let finalPacket: number | undefined;\n for (const [i, p] of enumerate(this.buffering)) {\n if (this.isFinalPacketInSequence(p.header)) {\n finalPacket = i;\n break;\n }\n }\n if (finalPacket == undefined) {\n return;\n }\n\n const packets = this.buffering;\n this.buffering = [];\n\n return packets;\n }\n}\n"]}
@@ -1,4 +0,0 @@
1
- export * from "./depacketizer";
2
- export * from "./jitterBuffer";
3
- export * from "./source";
4
- export * from "./webmLive";
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../rtp/src/processor_v2/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,iDAA+B;AAC/B,2CAAyB;AACzB,6CAA2B","sourcesContent":["export * from \"./depacketizer\";\nexport * from \"./jitterBuffer\";\nexport * from \"./source\";\nexport * from \"./webmLive\";\n"]}
@@ -1,33 +0,0 @@
1
- /// <reference types="node" />
2
- import { TransformStream } from "stream/web";
3
- import { RtpPacket } from "..";
4
- import { RtpOutput } from "./source/rtp";
5
- export declare type JitterBufferInput = RtpOutput;
6
- export interface JitterBufferOutput extends RtpOutput {
7
- isPacketLost?: {
8
- from: number;
9
- to: number;
10
- };
11
- }
12
- export declare const jitterBufferTransformer: (clockRate: number, options?: Partial<JitterBufferOptions> | undefined) => TransformStream<RtpOutput, JitterBufferOutput>;
13
- export declare class JitterBufferTransformer {
14
- clockRate: number;
15
- transform: TransformStream<JitterBufferInput, JitterBufferOutput>;
16
- options: JitterBufferOptions;
17
- presentSeqNum?: number;
18
- rtpBuffer: {
19
- [sequenceNumber: number]: RtpPacket;
20
- };
21
- private get expectNextSeqNum();
22
- constructor(clockRate: number, options?: Partial<JitterBufferOptions>);
23
- private processRtp;
24
- private pushRtpBuffer;
25
- private resolveBuffer;
26
- private sortAndClearBuffer;
27
- private disposeTimeoutPackets;
28
- }
29
- export interface JitterBufferOptions {
30
- /**milliseconds */
31
- latency: number;
32
- bufferSize: number;
33
- }
@@ -1,154 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.JitterBufferTransformer = exports.jitterBufferTransformer = void 0;
7
- const debug_1 = __importDefault(require("debug"));
8
- const web_1 = require("stream/web");
9
- const __1 = require("..");
10
- const srcPath = `werift-rtp : packages/rtp/src/processor_v2/jitterBuffer.ts`;
11
- const log = (0, debug_1.default)(srcPath);
12
- const jitterBufferTransformer = (...args) => new JitterBufferTransformer(...args).transform;
13
- exports.jitterBufferTransformer = jitterBufferTransformer;
14
- class JitterBufferTransformer {
15
- constructor(clockRate, options = {}) {
16
- this.clockRate = clockRate;
17
- this.rtpBuffer = {};
18
- this.options = {
19
- latency: options.latency ?? 200,
20
- bufferSize: options.bufferSize ?? 10000,
21
- };
22
- this.transform = new web_1.TransformStream({
23
- transform: (input, output) => {
24
- if (!input.rtp) {
25
- if (input.eol) {
26
- const packets = this.sortAndClearBuffer(this.rtpBuffer);
27
- packets.forEach((rtp) => output.enqueue({ rtp }));
28
- output.enqueue({ eol: true });
29
- }
30
- return;
31
- }
32
- const { packets, timeoutSeqNum } = this.processRtp(input.rtp);
33
- if (timeoutSeqNum != undefined) {
34
- const isPacketLost = {
35
- from: this.expectNextSeqNum,
36
- to: timeoutSeqNum,
37
- };
38
- this.presentSeqNum = input.rtp.header.sequenceNumber;
39
- output.enqueue({ isPacketLost });
40
- if (packets) {
41
- [...packets, input.rtp].forEach((rtp) => output.enqueue({ rtp }));
42
- }
43
- }
44
- else {
45
- if (packets) {
46
- packets.forEach((rtp) => output.enqueue({ rtp }));
47
- }
48
- }
49
- },
50
- });
51
- }
52
- get expectNextSeqNum() {
53
- return (0, __1.uint16Add)(this.presentSeqNum, 1);
54
- }
55
- processRtp(rtp) {
56
- const { sequenceNumber, timestamp } = rtp.header;
57
- if (this.presentSeqNum == undefined) {
58
- this.presentSeqNum = sequenceNumber;
59
- return { packets: [rtp] };
60
- }
61
- if (sequenceNumber <= this.presentSeqNum) {
62
- return { nothing: undefined };
63
- }
64
- if (sequenceNumber === this.expectNextSeqNum) {
65
- this.presentSeqNum = sequenceNumber;
66
- const rtpBuffer = this.resolveBuffer((0, __1.uint16Add)(sequenceNumber, 1));
67
- this.presentSeqNum =
68
- rtpBuffer.at(-1)?.header.sequenceNumber ?? this.presentSeqNum;
69
- return { packets: [rtp, ...rtpBuffer] };
70
- }
71
- this.pushRtpBuffer(rtp);
72
- const { latestTimeoutSeqNum, sorted } = this.disposeTimeoutPackets(timestamp);
73
- if (latestTimeoutSeqNum) {
74
- return { timeoutSeqNum: latestTimeoutSeqNum, packets: sorted };
75
- }
76
- else {
77
- return { nothing: undefined };
78
- }
79
- }
80
- pushRtpBuffer(rtp) {
81
- if (Object.values(this.rtpBuffer).length > this.options.bufferSize) {
82
- return;
83
- }
84
- this.rtpBuffer[rtp.header.sequenceNumber] = rtp;
85
- }
86
- resolveBuffer(seqNumFrom) {
87
- const resolve = [];
88
- for (let index = seqNumFrom;; index = (0, __1.uint16Add)(index, 1)) {
89
- const rtp = this.rtpBuffer[index];
90
- if (rtp) {
91
- resolve.push(rtp);
92
- delete this.rtpBuffer[index];
93
- }
94
- else {
95
- break;
96
- }
97
- }
98
- return resolve;
99
- }
100
- sortAndClearBuffer(rtpBuffer) {
101
- const buffer = [];
102
- for (let index = this.presentSeqNum ?? 0;; index = (0, __1.uint16Add)(index, 1)) {
103
- const rtp = rtpBuffer[index];
104
- if (rtp) {
105
- buffer.push(rtp);
106
- delete rtpBuffer[index];
107
- }
108
- if (Object.values(rtpBuffer).length === 0) {
109
- break;
110
- }
111
- }
112
- return buffer;
113
- }
114
- disposeTimeoutPackets(baseTimestamp) {
115
- let latestTimeoutSeqNum;
116
- const packets = Object.values(this.rtpBuffer)
117
- .map((rtp) => {
118
- const { timestamp, sequenceNumber } = rtp.header;
119
- if ((0, __1.uint32Gt)(timestamp, baseTimestamp)) {
120
- log("gap", { timestamp, baseTimestamp });
121
- return;
122
- }
123
- const elapsedSec = (0, __1.uint32Add)(baseTimestamp, -timestamp) / this.clockRate;
124
- if (elapsedSec * 1000 > this.options.latency) {
125
- log("timeout packet", {
126
- sequenceNumber,
127
- elapsedSec,
128
- baseTimestamp,
129
- timestamp,
130
- });
131
- if (latestTimeoutSeqNum == undefined) {
132
- latestTimeoutSeqNum = sequenceNumber;
133
- }
134
- // 現在のSeqNumとの差が最も大きいSeqNumを探す
135
- if ((0, __1.uint16Add)(sequenceNumber, -this.presentSeqNum) >
136
- (0, __1.uint16Add)(latestTimeoutSeqNum, -this.presentSeqNum)) {
137
- latestTimeoutSeqNum = sequenceNumber;
138
- }
139
- const packet = this.rtpBuffer[sequenceNumber];
140
- delete this.rtpBuffer[sequenceNumber];
141
- return packet;
142
- }
143
- })
144
- .flatMap((p) => p)
145
- .filter((p) => p);
146
- const sorted = this.sortAndClearBuffer(packets.reduce((acc, cur) => {
147
- acc[cur.header.sequenceNumber] = cur;
148
- return acc;
149
- }, {}));
150
- return { latestTimeoutSeqNum, sorted };
151
- }
152
- }
153
- exports.JitterBufferTransformer = JitterBufferTransformer;
154
- //# sourceMappingURL=jitterBuffer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jitterBuffer.js","sourceRoot":"","sources":["../../../../../rtp/src/processor_v2/jitterBuffer.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { TransformStream } from \"stream/web\";\n\nimport {\n RequireAtLeastOne,\n RtpPacket,\n uint16Add,\n uint32Add,\n uint32Gt,\n} from \"..\";\nimport { RtpOutput } from \"./source/rtp\";\n\nconst srcPath = `werift-rtp : packages/rtp/src/processor_v2/jitterBuffer.ts`;\nconst log = debug(srcPath);\n\nexport type JitterBufferInput = RtpOutput;\n\nexport interface JitterBufferOutput extends RtpOutput {\n isPacketLost?: { from: number; to: number };\n}\n\nexport const jitterBufferTransformer = (\n ...args: ConstructorParameters<typeof JitterBufferTransformer>\n) => new JitterBufferTransformer(...args).transform;\n\nexport class JitterBufferTransformer {\n transform: TransformStream<JitterBufferInput, JitterBufferOutput>;\n options: JitterBufferOptions;\n presentSeqNum?: number;\n rtpBuffer: { [sequenceNumber: number]: RtpPacket } = {};\n\n private get expectNextSeqNum() {\n return uint16Add(this.presentSeqNum!, 1);\n }\n\n constructor(\n public clockRate: number,\n options: Partial<JitterBufferOptions> = {}\n ) {\n this.options = {\n latency: options.latency ?? 200,\n bufferSize: options.bufferSize ?? 10000,\n };\n\n this.transform = new TransformStream({\n transform: (input, output) => {\n if (!input.rtp) {\n if (input.eol) {\n const packets = this.sortAndClearBuffer(this.rtpBuffer);\n packets.forEach((rtp) => output.enqueue({ rtp }));\n output.enqueue({ eol: true });\n }\n return;\n }\n\n const { packets, timeoutSeqNum } = this.processRtp(input.rtp);\n\n if (timeoutSeqNum != undefined) {\n const isPacketLost = {\n from: this.expectNextSeqNum,\n to: timeoutSeqNum,\n };\n this.presentSeqNum = input.rtp.header.sequenceNumber;\n output.enqueue({ isPacketLost });\n if (packets) {\n [...packets, input.rtp].forEach((rtp) => output.enqueue({ rtp }));\n }\n } else {\n if (packets) {\n packets.forEach((rtp) => output.enqueue({ rtp }));\n }\n }\n },\n });\n }\n\n private processRtp(rtp: RtpPacket): RequireAtLeastOne<{\n packets: RtpPacket[];\n timeoutSeqNum: number;\n nothing: undefined;\n }> {\n const { sequenceNumber, timestamp } = rtp.header;\n\n if (this.presentSeqNum == undefined) {\n this.presentSeqNum = sequenceNumber;\n return { packets: [rtp] };\n }\n\n if (sequenceNumber <= this.presentSeqNum) {\n return { nothing: undefined };\n }\n\n if (sequenceNumber === this.expectNextSeqNum) {\n this.presentSeqNum = sequenceNumber;\n\n const rtpBuffer = this.resolveBuffer(uint16Add(sequenceNumber, 1));\n this.presentSeqNum =\n rtpBuffer.at(-1)?.header.sequenceNumber ?? this.presentSeqNum;\n\n return { packets: [rtp, ...rtpBuffer] };\n }\n\n this.pushRtpBuffer(rtp);\n\n const { latestTimeoutSeqNum, sorted } =\n this.disposeTimeoutPackets(timestamp);\n\n if (latestTimeoutSeqNum) {\n return { timeoutSeqNum: latestTimeoutSeqNum, packets: sorted };\n } else {\n return { nothing: undefined };\n }\n }\n\n private pushRtpBuffer(rtp: RtpPacket) {\n if (Object.values(this.rtpBuffer).length > this.options.bufferSize) {\n return;\n }\n\n this.rtpBuffer[rtp.header.sequenceNumber] = rtp;\n }\n\n private resolveBuffer(seqNumFrom: number) {\n const resolve: RtpPacket[] = [];\n\n for (let index = seqNumFrom; ; index = uint16Add(index, 1)) {\n const rtp = this.rtpBuffer[index];\n if (rtp) {\n resolve.push(rtp);\n delete this.rtpBuffer[index];\n } else {\n break;\n }\n }\n return resolve;\n }\n\n private sortAndClearBuffer(rtpBuffer: {\n [sequenceNumber: number]: RtpPacket;\n }) {\n const buffer: RtpPacket[] = [];\n for (let index = this.presentSeqNum ?? 0; ; index = uint16Add(index, 1)) {\n const rtp = rtpBuffer[index];\n if (rtp) {\n buffer.push(rtp);\n delete rtpBuffer[index];\n }\n if (Object.values(rtpBuffer).length === 0) {\n break;\n }\n }\n return buffer;\n }\n\n private disposeTimeoutPackets(baseTimestamp: number) {\n let latestTimeoutSeqNum: number | undefined;\n\n const packets = Object.values(this.rtpBuffer)\n .map((rtp) => {\n const { timestamp, sequenceNumber } = rtp.header;\n\n if (uint32Gt(timestamp, baseTimestamp)) {\n log(\"gap\", { timestamp, baseTimestamp });\n return;\n }\n\n const elapsedSec =\n uint32Add(baseTimestamp, -timestamp) / this.clockRate;\n\n if (elapsedSec * 1000 > this.options.latency) {\n log(\"timeout packet\", {\n sequenceNumber,\n elapsedSec,\n baseTimestamp,\n timestamp,\n });\n\n if (latestTimeoutSeqNum == undefined) {\n latestTimeoutSeqNum = sequenceNumber;\n }\n // 現在のSeqNumとの差が最も大きいSeqNumを探す\n if (\n uint16Add(sequenceNumber, -this.presentSeqNum!) >\n uint16Add(latestTimeoutSeqNum, -this.presentSeqNum!)\n ) {\n latestTimeoutSeqNum = sequenceNumber;\n }\n\n const packet = this.rtpBuffer[sequenceNumber];\n delete this.rtpBuffer[sequenceNumber];\n return packet;\n }\n })\n .flatMap((p): RtpPacket => p as RtpPacket)\n .filter((p) => p);\n\n const sorted = this.sortAndClearBuffer(\n packets.reduce((acc, cur) => {\n acc[cur.header.sequenceNumber] = cur;\n return acc;\n }, {})\n );\n\n return { latestTimeoutSeqNum, sorted };\n }\n}\n\nexport interface JitterBufferOptions {\n /**milliseconds */\n latency: number;\n bufferSize: number;\n}\n"]}
@@ -1,8 +0,0 @@
1
- /// <reference types="node" />
2
- import { ReadableStream, ReadableStreamController } from "stream/web";
3
- export declare class SourceStream<T> {
4
- readable: ReadableStream<T>;
5
- write: (chunk: T) => void;
6
- protected controller: ReadableStreamController<T>;
7
- constructor();
8
- }
@@ -1,16 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SourceStream = void 0;
4
- const web_1 = require("stream/web");
5
- class SourceStream {
6
- constructor() {
7
- this.readable = new web_1.ReadableStream({
8
- start: (controller) => {
9
- this.controller = controller;
10
- this.write = (chunk) => controller.enqueue(chunk);
11
- },
12
- });
13
- }
14
- }
15
- exports.SourceStream = SourceStream;
16
- //# sourceMappingURL=base.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../../../rtp/src/processor_v2/source/base.ts"],"names":[],"mappings":";;;AAAA,oCAAsE;AAEtE,MAAa,YAAY;IAKvB;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAc,CAAC;YACjC,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE;gBACpB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;gBAC7B,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF;AAbD,oCAaC","sourcesContent":["import { ReadableStream, ReadableStreamController } from \"stream/web\";\n\nexport class SourceStream<T> {\n readable: ReadableStream<T>;\n write!: (chunk: T) => void;\n protected controller!: ReadableStreamController<T>;\n\n constructor() {\n this.readable = new ReadableStream({\n start: (controller) => {\n this.controller = controller;\n this.write = (chunk) => controller.enqueue(chunk);\n },\n });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../rtp/src/processor_v2/source/index.ts"],"names":[],"mappings":";;;AAAA,+BAAwC;AAE/B,gGAFA,qBAAe,OAEA","sourcesContent":["import { RtpSourceStream } from \"./rtp\";\n\nexport { RtpSourceStream };\n"]}