werift 0.16.0 → 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/lib/rtp/src/codec/index.d.ts +0 -4
  2. package/lib/rtp/src/codec/index.js +2 -6
  3. package/lib/rtp/src/codec/index.js.map +1 -1
  4. package/lib/rtp/src/index.d.ts +1 -6
  5. package/lib/rtp/src/index.js +1 -6
  6. package/lib/rtp/src/index.js.map +1 -1
  7. package/lib/rtp/src/processor/depacketizer.d.ts +26 -0
  8. package/lib/rtp/src/processor/depacketizer.js +114 -0
  9. package/lib/rtp/src/processor/depacketizer.js.map +1 -0
  10. package/lib/rtp/src/processor/depacketizerCallback.d.ts +13 -0
  11. package/lib/rtp/src/processor/depacketizerCallback.js +20 -0
  12. package/lib/rtp/src/processor/depacketizerCallback.js.map +1 -0
  13. package/lib/rtp/src/processor/depacketizerTransformer.d.ts +8 -0
  14. package/lib/rtp/src/processor/depacketizerTransformer.js +20 -0
  15. package/lib/rtp/src/processor/depacketizerTransformer.js.map +1 -0
  16. package/lib/rtp/src/processor/index.d.ts +9 -0
  17. package/lib/rtp/src/{processor_v2 → processor}/index.js +6 -1
  18. package/lib/rtp/src/processor/index.js.map +1 -0
  19. package/lib/rtp/src/processor/jitterBuffer.d.ts +26 -11
  20. package/lib/rtp/src/processor/jitterBuffer.js +150 -42
  21. package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
  22. package/lib/rtp/src/processor/jitterBufferCallback.d.ts +10 -0
  23. package/lib/rtp/src/processor/jitterBufferCallback.js +21 -0
  24. package/lib/rtp/src/processor/jitterBufferCallback.js.map +1 -0
  25. package/lib/rtp/src/processor/jitterBufferTransformer.d.ts +9 -0
  26. package/lib/rtp/src/processor/jitterBufferTransformer.js +22 -0
  27. package/lib/rtp/src/processor/jitterBufferTransformer.js.map +1 -0
  28. package/lib/rtp/src/{processor_v2 → processor}/source/index.d.ts +0 -0
  29. package/lib/rtp/src/{processor_v2 → processor}/source/index.js +0 -0
  30. package/lib/rtp/src/processor/source/index.js.map +1 -0
  31. package/lib/rtp/src/processor/source/rtp.d.ts +20 -0
  32. package/lib/rtp/src/processor/source/rtp.js +32 -0
  33. package/lib/rtp/src/processor/source/rtp.js.map +1 -0
  34. package/lib/rtp/src/processor/webm.d.ts +24 -24
  35. package/lib/rtp/src/processor/webm.js +78 -89
  36. package/lib/rtp/src/processor/webm.js.map +1 -1
  37. package/lib/rtp/src/processor/webmStream.d.ts +31 -0
  38. package/lib/rtp/src/processor/webmStream.js +36 -0
  39. package/lib/rtp/src/processor/webmStream.js.map +1 -0
  40. package/lib/rtp/src/rtp/rtp.d.ts +1 -0
  41. package/lib/rtp/src/rtp/rtp.js +3 -0
  42. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  43. package/lib/webrtc/src/media/rtpReceiver.d.ts +3 -2
  44. package/lib/webrtc/src/media/rtpReceiver.js +14 -6
  45. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  46. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +8 -6
  47. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  48. package/lib/webrtc/src/peerConnection.js +3 -1
  49. package/lib/webrtc/src/peerConnection.js.map +1 -1
  50. package/package.json +1 -1
  51. package/src/media/rtpReceiver.ts +23 -11
  52. package/src/nonstandard/recorder/writer/webm.ts +9 -7
  53. package/src/peerConnection.ts +3 -1
  54. package/lib/rtp/src/processor/base.d.ts +0 -18
  55. package/lib/rtp/src/processor/base.js +0 -39
  56. package/lib/rtp/src/processor/base.js.map +0 -1
  57. package/lib/rtp/src/processor/lipsync.d.ts +0 -30
  58. package/lib/rtp/src/processor/lipsync.js +0 -92
  59. package/lib/rtp/src/processor/lipsync.js.map +0 -1
  60. package/lib/rtp/src/processor/sampleBuilder.d.ts +0 -13
  61. package/lib/rtp/src/processor/sampleBuilder.js +0 -33
  62. package/lib/rtp/src/processor/sampleBuilder.js.map +0 -1
  63. package/lib/rtp/src/processor_v2/depacketizer.d.ts +0 -17
  64. package/lib/rtp/src/processor_v2/depacketizer.js +0 -84
  65. package/lib/rtp/src/processor_v2/depacketizer.js.map +0 -1
  66. package/lib/rtp/src/processor_v2/index.d.ts +0 -4
  67. package/lib/rtp/src/processor_v2/index.js.map +0 -1
  68. package/lib/rtp/src/processor_v2/jitterBuffer.d.ts +0 -33
  69. package/lib/rtp/src/processor_v2/jitterBuffer.js +0 -154
  70. package/lib/rtp/src/processor_v2/jitterBuffer.js.map +0 -1
  71. package/lib/rtp/src/processor_v2/source/base.d.ts +0 -8
  72. package/lib/rtp/src/processor_v2/source/base.js +0 -16
  73. package/lib/rtp/src/processor_v2/source/base.js.map +0 -1
  74. package/lib/rtp/src/processor_v2/source/index.js.map +0 -1
  75. package/lib/rtp/src/processor_v2/source/rtp.d.ts +0 -14
  76. package/lib/rtp/src/processor_v2/source/rtp.js +0 -24
  77. package/lib/rtp/src/processor_v2/source/rtp.js.map +0 -1
  78. package/lib/rtp/src/processor_v2/webmLive.d.ts +0 -51
  79. package/lib/rtp/src/processor_v2/webmLive.js +0 -154
  80. package/lib/rtp/src/processor_v2/webmLive.js.map +0 -1
@@ -10,9 +10,5 @@ export * from "./vp9";
10
10
  export declare function dePacketizeRtpPackets(codec: string, packets: RtpPacket[]): {
11
11
  isKeyframe: boolean;
12
12
  data: Buffer;
13
- partitions: DePacketizerBase[];
14
- } | {
15
- isKeyframe: boolean;
16
- data: Buffer;
17
13
  };
18
14
  export declare function dePacketizeRtpPacket(codec: string, packet: RtpPacket): DePacketizerBase;
@@ -31,7 +31,7 @@ function dePacketizeRtpPackets(codec, packets) {
31
31
  const partitions = packets.map((p) => DePacketizer.deSerialize(p.payload));
32
32
  const isKeyframe = !!partitions.find((f) => f.isKeyframe);
33
33
  const data = Buffer.concat(partitions.map((f) => f.payload));
34
- return { isKeyframe, data, partitions };
34
+ return { isKeyframe, data };
35
35
  };
36
36
  switch (codec.toUpperCase()) {
37
37
  case "AV1": {
@@ -43,11 +43,7 @@ function dePacketizeRtpPackets(codec, packets) {
43
43
  case "MPEG4/ISO/AVC":
44
44
  return basicCodecParser(h264_1.H264RtpPayload);
45
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 };
46
+ return basicCodecParser(vp8_1.Vp8RtpPayload);
51
47
  }
52
48
  case "VP9":
53
49
  return basicCodecParser(vp9_1.Vp9RtpPayload);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { RtpPacket } from \"../rtp/rtp\";\nimport { AV1RtpPayload } from \"./av1\";\nimport { DePacketizerBase } from \"./base\";\nimport { H264RtpPayload } from \"./h264\";\nimport { OpusRtpPayload } from \"./opus\";\nimport { Vp8RtpPayload } from \"./vp8\";\nimport { Vp9RtpPayload } from \"./vp9\";\n\nexport * from \"./av1\";\nexport * from \"./base\";\nexport * from \"./h264\";\nexport * from \"./opus\";\nexport * from \"./vp8\";\nexport * from \"./vp9\";\n\nexport function dePacketizeRtpPackets(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"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,+BAAsC;AAEtC,iCAAwC;AACxC,iCAAwC;AACxC,+BAAsC;AACtC,+BAAsC;AAEtC,wCAAsB;AACtB,yCAAuB;AACvB,yCAAuB;AACvB,yCAAuB;AACvB,wCAAsB;AACtB,wCAAsB;AAEtB,SAAgB,qBAAqB,CAAC,KAAa,EAAE,OAAoB;IACvE,MAAM,gBAAgB,GAAG,CAAC,YAAqC,EAAE,EAAE;QACjE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC9B,CAAC,CAAC;IAEF,QAAQ,KAAK,CAAC,WAAW,EAAE,EAAE;QAC3B,KAAK,KAAK,CAAC,CAAC;YACV,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAa,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACxE,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,mBAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC5C,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;SAC7B;QACD,KAAK,eAAe;YAClB,OAAO,gBAAgB,CAAC,qBAAc,CAAC,CAAC;QAC1C,KAAK,KAAK,CAAC,CAAC;YACV,OAAO,gBAAgB,CAAC,mBAAa,CAAC,CAAC;SACxC;QACD,KAAK,KAAK;YACR,OAAO,gBAAgB,CAAC,mBAAa,CAAC,CAAC;QACzC,KAAK,MAAM;YACT,OAAO,gBAAgB,CAAC,qBAAc,CAAC,CAAC;QAC1C;YACE,MAAM,IAAI,KAAK,EAAE,CAAC;KACrB;AACH,CAAC;AA3BD,sDA2BC;AAED,SAAgB,oBAAoB,CAAC,KAAa,EAAE,MAAiB;IACnE,MAAM,YAAY,GAAG,CAAC,YAAqC,EAAE,EAAE;QAC7D,OAAO,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC,CAAC;IAEF,QAAQ,KAAK,CAAC,WAAW,EAAE,EAAE;QAC3B,KAAK,KAAK;YACR,OAAO,YAAY,CAAC,mBAAoB,CAAC,CAAC;QAC5C,KAAK,eAAe;YAClB,OAAO,YAAY,CAAC,qBAAc,CAAC,CAAC;QACtC,KAAK,KAAK;YACR,OAAO,YAAY,CAAC,mBAAa,CAAC,CAAC;QACrC,KAAK,KAAK;YACR,OAAO,YAAY,CAAC,mBAAa,CAAC,CAAC;QACrC,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,qBAAc,CAAC,CAAC;QACtC;YACE,MAAM,IAAI,KAAK,EAAE,CAAC;KACrB;AACH,CAAC;AAnBD,oDAmBC","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 };\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 return basicCodecParser(Vp8RtpPayload);\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"]}
@@ -1,12 +1,7 @@
1
1
  import "buffer";
2
2
  export * from "../../common/src";
3
3
  export * from "./codec";
4
- export * from "./processor/base";
5
- export * from "./processor/jitterBuffer";
6
- export * from "./processor/lipsync";
7
- export * from "./processor/sampleBuilder";
8
- export * from "./processor/webm";
9
- export * from "./processor_v2";
4
+ export * from "./processor";
10
5
  export * from "./rtcp/header";
11
6
  export * from "./rtcp/psfb";
12
7
  export * from "./rtcp/psfb/pictureLossIndication";
@@ -17,12 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  require("buffer");
18
18
  __exportStar(require("../../common/src"), exports);
19
19
  __exportStar(require("./codec"), exports);
20
- __exportStar(require("./processor/base"), exports);
21
- __exportStar(require("./processor/jitterBuffer"), exports);
22
- __exportStar(require("./processor/lipsync"), exports);
23
- __exportStar(require("./processor/sampleBuilder"), exports);
24
- __exportStar(require("./processor/webm"), exports);
25
- __exportStar(require("./processor_v2"), exports);
20
+ __exportStar(require("./processor"), exports);
26
21
  __exportStar(require("./rtcp/header"), exports);
27
22
  __exportStar(require("./rtcp/psfb"), exports);
28
23
  __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,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
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../rtp/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kBAAgB;AAChB,mDAAiC;AACjC,0CAAwB;AACxB,8CAA4B;AAC5B,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\";\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"]}
@@ -0,0 +1,26 @@
1
+ /// <reference types="node" />
2
+ import { RtpHeader } from "..";
3
+ import { RtpOutput } from "./source/rtp";
4
+ export declare type DepacketizerInput = RtpOutput;
5
+ export interface DepacketizerOutput {
6
+ frame?: {
7
+ data: Buffer;
8
+ isKeyframe: boolean;
9
+ timestamp: number;
10
+ };
11
+ eol?: boolean;
12
+ }
13
+ export declare class DepacketizeBase {
14
+ private codec;
15
+ private options;
16
+ private buffering;
17
+ private lastSeqNum?;
18
+ private packetLostHappened;
19
+ constructor(codec: string, options?: {
20
+ waitForKeyframe?: boolean;
21
+ isFinalPacketInSequence?: (header: RtpHeader) => boolean;
22
+ });
23
+ processInput(input: DepacketizerInput): DepacketizerOutput[];
24
+ private clearBuffer;
25
+ private checkFinalPacket;
26
+ }
@@ -0,0 +1,114 @@
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.DepacketizeBase = void 0;
7
+ const debug_1 = __importDefault(require("debug"));
8
+ const __1 = require("..");
9
+ const codec_1 = require("../codec");
10
+ const helper_1 = require("../helper");
11
+ const srcPath = `werift-rtp : packages/rtp/src/processor_v2/depacketizer.ts`;
12
+ const log = (0, debug_1.default)(srcPath);
13
+ class DepacketizeBase {
14
+ constructor(codec, options = {}) {
15
+ this.codec = codec;
16
+ this.options = options;
17
+ this.buffering = [];
18
+ this.packetLostHappened = false;
19
+ }
20
+ processInput(input) {
21
+ const output = [];
22
+ if (!input.rtp) {
23
+ if (input.eol) {
24
+ output.push({ eol: true });
25
+ }
26
+ return output;
27
+ }
28
+ if (this.options.isFinalPacketInSequence) {
29
+ const isFinal = this.checkFinalPacket(input.rtp);
30
+ if (isFinal) {
31
+ try {
32
+ const { timestamp } = this.buffering[0].header;
33
+ const { data, isKeyframe } = (0, codec_1.dePacketizeRtpPackets)(this.codec, this.buffering);
34
+ this.clearBuffer();
35
+ if (this.packetLostHappened) {
36
+ if (isKeyframe) {
37
+ this.packetLostHappened = false;
38
+ }
39
+ else if (this.options.waitForKeyframe) {
40
+ return [];
41
+ }
42
+ }
43
+ output.push({
44
+ frame: {
45
+ data,
46
+ isKeyframe,
47
+ timestamp,
48
+ },
49
+ });
50
+ return output;
51
+ }
52
+ catch (error) {
53
+ log("error", error, input);
54
+ this.clearBuffer();
55
+ }
56
+ }
57
+ }
58
+ else {
59
+ try {
60
+ const { data, isKeyframe } = (0, codec_1.dePacketizeRtpPackets)(this.codec, [
61
+ input.rtp,
62
+ ]);
63
+ output.push({
64
+ frame: {
65
+ data,
66
+ isKeyframe,
67
+ timestamp: input.rtp.header.timestamp,
68
+ },
69
+ });
70
+ return output;
71
+ }
72
+ catch (error) {
73
+ log("error", error, input);
74
+ }
75
+ }
76
+ return [];
77
+ }
78
+ clearBuffer() {
79
+ this.buffering.forEach((b) => b.clear());
80
+ this.buffering = [];
81
+ }
82
+ checkFinalPacket(rtp) {
83
+ if (!this.options.isFinalPacketInSequence) {
84
+ throw new Error("isFinalPacketInSequence not exist");
85
+ }
86
+ const { sequenceNumber } = rtp.header;
87
+ if (this.lastSeqNum != undefined) {
88
+ const expect = (0, __1.uint16Add)(this.lastSeqNum, 1);
89
+ if (sequenceNumber < expect) {
90
+ return false;
91
+ }
92
+ if (sequenceNumber > expect) {
93
+ log("packet lost happened", { expect, sequenceNumber });
94
+ this.packetLostHappened = true;
95
+ this.clearBuffer();
96
+ }
97
+ }
98
+ this.buffering.push(rtp);
99
+ this.lastSeqNum = sequenceNumber;
100
+ let finalPacket;
101
+ for (const [i, p] of (0, helper_1.enumerate)(this.buffering)) {
102
+ if (this.options.isFinalPacketInSequence(p.header)) {
103
+ finalPacket = i;
104
+ break;
105
+ }
106
+ }
107
+ if (finalPacket == undefined) {
108
+ return false;
109
+ }
110
+ return true;
111
+ }
112
+ }
113
+ exports.DepacketizeBase = DepacketizeBase;
114
+ //# sourceMappingURL=depacketizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depacketizer.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/depacketizer.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\n\nimport { RtpHeader, RtpPacket, uint16Add } 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 class DepacketizeBase {\n private buffering: RtpPacket[] = [];\n private lastSeqNum?: number;\n private packetLostHappened = false;\n\n constructor(\n private codec: string,\n private options: {\n waitForKeyframe?: boolean;\n isFinalPacketInSequence?: (header: RtpHeader) => boolean;\n } = {}\n ) {}\n\n processInput(input: DepacketizerInput): DepacketizerOutput[] {\n const output: DepacketizerOutput[] = [];\n if (!input.rtp) {\n if (input.eol) {\n output.push({ eol: true });\n }\n return output;\n }\n\n if (this.options.isFinalPacketInSequence) {\n const isFinal = this.checkFinalPacket(input.rtp);\n if (isFinal) {\n try {\n const { timestamp } = this.buffering[0].header;\n const { data, isKeyframe } = dePacketizeRtpPackets(\n this.codec,\n this.buffering\n );\n this.clearBuffer();\n\n if (this.packetLostHappened) {\n if (isKeyframe) {\n this.packetLostHappened = false;\n } else if (this.options.waitForKeyframe) {\n return [];\n }\n }\n\n output.push({\n frame: {\n data,\n isKeyframe,\n timestamp,\n },\n });\n return output;\n } catch (error) {\n log(\"error\", error, input);\n this.clearBuffer();\n }\n }\n } else {\n try {\n const { data, isKeyframe } = dePacketizeRtpPackets(this.codec, [\n input.rtp,\n ]);\n output.push({\n frame: {\n data,\n isKeyframe,\n timestamp: input.rtp.header.timestamp,\n },\n });\n return output;\n } catch (error) {\n log(\"error\", error, input);\n }\n }\n return [];\n }\n\n private clearBuffer() {\n this.buffering.forEach((b) => b.clear());\n this.buffering = [];\n }\n\n private checkFinalPacket(rtp: RtpPacket): boolean {\n if (!this.options.isFinalPacketInSequence) {\n throw new Error(\"isFinalPacketInSequence not exist\");\n }\n\n const { sequenceNumber } = rtp.header;\n if (this.lastSeqNum != undefined) {\n const expect = uint16Add(this.lastSeqNum, 1);\n if (sequenceNumber < expect) {\n return false;\n }\n if (sequenceNumber > expect) {\n log(\"packet lost happened\", { expect, sequenceNumber });\n this.packetLostHappened = true;\n this.clearBuffer();\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.options.isFinalPacketInSequence(p.header)) {\n finalPacket = i;\n break;\n }\n }\n if (finalPacket == undefined) {\n return false;\n }\n\n return true;\n }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import { RtpHeader } from "..";
2
+ import { DepacketizeBase, DepacketizerInput, DepacketizerOutput } from "./depacketizer";
3
+ export declare class DepacketizeCallback extends DepacketizeBase {
4
+ private cb;
5
+ constructor(codec: string, options?: {
6
+ waitForKeyframe?: boolean;
7
+ isFinalPacketInSequence?: (header: RtpHeader) => boolean;
8
+ });
9
+ pipe: (instance: {
10
+ input: (input: DepacketizerOutput) => void;
11
+ }) => this;
12
+ input: (input: DepacketizerInput) => void;
13
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DepacketizeCallback = void 0;
4
+ const depacketizer_1 = require("./depacketizer");
5
+ class DepacketizeCallback extends depacketizer_1.DepacketizeBase {
6
+ constructor(codec, options = {}) {
7
+ super(codec, options);
8
+ this.pipe = (instance) => {
9
+ this.cb = instance.input;
10
+ return this;
11
+ };
12
+ this.input = (input) => {
13
+ for (const output of this.processInput(input)) {
14
+ this.cb(output);
15
+ }
16
+ };
17
+ }
18
+ }
19
+ exports.DepacketizeCallback = DepacketizeCallback;
20
+ //# sourceMappingURL=depacketizerCallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depacketizerCallback.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/depacketizerCallback.ts"],"names":[],"mappings":";;;AACA,iDAIwB;AAExB,MAAa,mBAAoB,SAAQ,8BAAe;IAGtD,YACE,KAAa,EACb,UAGI,EAAE;QAEN,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAGxB,SAAI,GAAG,CAAC,QAAwD,EAAE,EAAE;YAClE,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,UAAK,GAAG,CAAC,KAAwB,EAAE,EAAE;YACnC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;gBAC7C,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;aACjB;QACH,CAAC,CAAC;IAXF,CAAC;CAYF;AAvBD,kDAuBC","sourcesContent":["import { RtpHeader } from \"..\";\nimport {\n DepacketizeBase,\n DepacketizerInput,\n DepacketizerOutput,\n} from \"./depacketizer\";\n\nexport class DepacketizeCallback extends DepacketizeBase {\n private cb!: (input: DepacketizerOutput) => void;\n\n constructor(\n codec: string,\n options: {\n waitForKeyframe?: boolean;\n isFinalPacketInSequence?: (header: RtpHeader) => boolean;\n } = {}\n ) {\n super(codec, options);\n }\n\n pipe = (instance: { input: (input: DepacketizerOutput) => void }) => {\n this.cb = instance.input;\n return this;\n };\n\n input = (input: DepacketizerInput) => {\n for (const output of this.processInput(input)) {\n this.cb(output);\n }\n };\n}\n"]}
@@ -0,0 +1,8 @@
1
+ /// <reference types="node" />
2
+ import { TransformStream } from "stream/web";
3
+ import { RtpHeader } from "..";
4
+ import { DepacketizerOutput } from "./depacketizer";
5
+ export declare const depacketizeTransformer: (codec: string, options?: {
6
+ waitForKeyframe?: boolean | undefined;
7
+ isFinalPacketInSequence?: ((header: RtpHeader) => boolean) | undefined;
8
+ } | undefined) => TransformStream<import("./source/rtp").RtpOutput, DepacketizerOutput>;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.depacketizeTransformer = void 0;
4
+ const web_1 = require("stream/web");
5
+ const depacketizer_1 = require("./depacketizer");
6
+ const depacketizeTransformer = (...args) => new DepacketizeTransformer(...args).transform;
7
+ exports.depacketizeTransformer = depacketizeTransformer;
8
+ class DepacketizeTransformer extends depacketizer_1.DepacketizeBase {
9
+ constructor(codec, options = {}) {
10
+ super(codec, options);
11
+ this.transform = new web_1.TransformStream({
12
+ transform: (input, output) => {
13
+ for (const res of this.processInput(input)) {
14
+ output.enqueue(res);
15
+ }
16
+ },
17
+ });
18
+ }
19
+ }
20
+ //# sourceMappingURL=depacketizerTransformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depacketizerTransformer.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/depacketizerTransformer.ts"],"names":[],"mappings":";;;AAAA,oCAA6C;AAG7C,iDAIwB;AAEjB,MAAM,sBAAsB,GAAG,CACpC,GAAG,IAA0D,EAC7D,EAAE,CAAC,IAAI,sBAAsB,CAAC,GAAG,IAAI,CAAC,CAAC,SAAS,CAAC;AAFtC,QAAA,sBAAsB,0BAEgB;AAEnD,MAAM,sBAAuB,SAAQ,8BAAe;IAGlD,YACE,KAAa,EACb,UAGI,EAAE;QAEN,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEtB,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAe,CAAC;YACnC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;oBAC1C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;iBACrB;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import { TransformStream } from \"stream/web\";\n\nimport { RtpHeader } from \"..\";\nimport {\n DepacketizeBase,\n DepacketizerInput,\n DepacketizerOutput,\n} from \"./depacketizer\";\n\nexport const depacketizeTransformer = (\n ...args: ConstructorParameters<typeof DepacketizeTransformer>\n) => new DepacketizeTransformer(...args).transform;\n\nclass DepacketizeTransformer extends DepacketizeBase {\n transform: TransformStream<DepacketizerInput, DepacketizerOutput>;\n\n constructor(\n codec: string,\n options: {\n waitForKeyframe?: boolean;\n isFinalPacketInSequence?: (header: RtpHeader) => boolean;\n } = {}\n ) {\n super(codec, options);\n\n this.transform = new TransformStream({\n transform: (input, output) => {\n for (const res of this.processInput(input)) {\n output.enqueue(res);\n }\n },\n });\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ export * from "./depacketizer";
2
+ export * from "./depacketizerCallback";
3
+ export * from "./depacketizerTransformer";
4
+ export * from "./jitterBuffer";
5
+ export * from "./jitterBufferCallback";
6
+ export * from "./jitterBufferTransformer";
7
+ export * from "./source";
8
+ export * from "./webm";
9
+ export * from "./webmStream";
@@ -15,7 +15,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./depacketizer"), exports);
18
+ __exportStar(require("./depacketizerCallback"), exports);
19
+ __exportStar(require("./depacketizerTransformer"), exports);
18
20
  __exportStar(require("./jitterBuffer"), exports);
21
+ __exportStar(require("./jitterBufferCallback"), exports);
22
+ __exportStar(require("./jitterBufferTransformer"), exports);
19
23
  __exportStar(require("./source"), exports);
20
- __exportStar(require("./webmLive"), exports);
24
+ __exportStar(require("./webm"), exports);
25
+ __exportStar(require("./webmStream"), exports);
21
26
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,yDAAuC;AACvC,4DAA0C;AAC1C,iDAA+B;AAC/B,yDAAuC;AACvC,4DAA0C;AAC1C,2CAAyB;AACzB,yCAAuB;AACvB,+CAA6B","sourcesContent":["export * from \"./depacketizer\";\nexport * from \"./depacketizerCallback\";\nexport * from \"./depacketizerTransformer\";\nexport * from \"./jitterBuffer\";\nexport * from \"./jitterBufferCallback\";\nexport * from \"./jitterBufferTransformer\";\nexport * from \"./source\";\nexport * from \"./webm\";\nexport * from \"./webmStream\";\n"]}
@@ -1,12 +1,27 @@
1
- import { RtpPacket } from "..";
2
- import { RtcpPacket } from "../rtcp/rtcp";
3
- import { Pipeline } from "./base";
4
- export declare class JitterBuffer extends Pipeline {
5
- private retry;
6
- private head?;
7
- private buffer;
8
- maxRetry: number;
9
- pushRtpPackets(packets: RtpPacket[]): void;
10
- pushRtcpPackets(packets: RtcpPacket[]): void;
11
- private onRtp;
1
+ import { RtpOutput } from "./source/rtp";
2
+ export declare type JitterBufferInput = RtpOutput;
3
+ export interface JitterBufferOutput extends RtpOutput {
4
+ isPacketLost?: {
5
+ from: number;
6
+ to: number;
7
+ };
8
+ }
9
+ export declare class JitterBufferBase {
10
+ clockRate: number;
11
+ private options;
12
+ private presentSeqNum?;
13
+ private rtpBuffer;
14
+ private get expectNextSeqNum();
15
+ constructor(clockRate: number, options?: Partial<JitterBufferOptions>);
16
+ processInput(input: JitterBufferInput): JitterBufferOutput[];
17
+ private processRtp;
18
+ private pushRtpBuffer;
19
+ private resolveBuffer;
20
+ private sortAndClearBuffer;
21
+ private disposeTimeoutPackets;
22
+ }
23
+ export interface JitterBufferOptions {
24
+ /**milliseconds */
25
+ latency: number;
26
+ bufferSize: number;
12
27
  }
@@ -1,54 +1,162 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.JitterBuffer = void 0;
4
- const debug_1 = require("debug");
5
- const src_1 = require("../../../common/src");
6
- const base_1 = require("./base");
7
- const log = (0, debug_1.debug)("werift : packages/rtp/src/processor/jitterBuffer.ts");
8
- class JitterBuffer extends base_1.Pipeline {
9
- constructor() {
10
- super(...arguments);
11
- this.retry = 0;
12
- this.buffer = {};
13
- this.maxRetry = 100;
14
- this.onRtp = (p) => {
15
- this.buffer[p.header.sequenceNumber] = p;
16
- if (this.head == undefined) {
17
- this.head = p.header.sequenceNumber;
18
- }
19
- else if (p.header.sequenceNumber != (0, src_1.uint16Add)(this.head, 1)) {
20
- if (this.retry++ >= this.maxRetry) {
21
- this.head = (0, src_1.uint16Add)(this.head, 2);
22
- }
23
- else {
24
- return;
6
+ exports.JitterBufferBase = void 0;
7
+ const debug_1 = __importDefault(require("debug"));
8
+ const __1 = require("..");
9
+ const srcPath = `werift-rtp : packages/rtp/src/processor_v2/jitterBuffer.ts`;
10
+ const log = (0, debug_1.default)(srcPath);
11
+ class JitterBufferBase {
12
+ constructor(clockRate, options = {}) {
13
+ this.clockRate = clockRate;
14
+ this.rtpBuffer = {};
15
+ this.options = {
16
+ latency: options.latency ?? 200,
17
+ bufferSize: options.bufferSize ?? 10000,
18
+ };
19
+ }
20
+ get expectNextSeqNum() {
21
+ return (0, __1.uint16Add)(this.presentSeqNum, 1);
22
+ }
23
+ processInput(input) {
24
+ const output = [];
25
+ if (!input.rtp) {
26
+ if (input.eol) {
27
+ const packets = this.sortAndClearBuffer(this.rtpBuffer);
28
+ for (const rtp of packets) {
29
+ output.push({ rtp });
25
30
  }
31
+ output.push({ eol: true });
26
32
  }
27
- else {
28
- this.head = (0, src_1.uint16Add)(this.head, 1);
29
- }
30
- const packets = [];
31
- let tail = this.head;
32
- for (;; tail = (0, src_1.uint16Add)(tail, 1)) {
33
- const p = this.buffer[tail];
34
- if (p) {
35
- packets.push(p);
36
- delete this.buffer[tail];
33
+ return output;
34
+ }
35
+ const { packets, timeoutSeqNum } = this.processRtp(input.rtp);
36
+ if (timeoutSeqNum != undefined) {
37
+ const isPacketLost = {
38
+ from: this.expectNextSeqNum,
39
+ to: timeoutSeqNum,
40
+ };
41
+ this.presentSeqNum = input.rtp.header.sequenceNumber;
42
+ output.push({ isPacketLost });
43
+ if (packets) {
44
+ for (const rtp of [...packets, input.rtp]) {
45
+ output.push({ rtp });
37
46
  }
38
- else {
39
- break;
47
+ }
48
+ return output;
49
+ }
50
+ else {
51
+ if (packets) {
52
+ for (const rtp of packets) {
53
+ output.push({ rtp });
40
54
  }
55
+ return output;
41
56
  }
42
- this.head = (0, src_1.uint16Add)(tail, -1);
43
- this.children?.pushRtpPackets?.(packets);
44
- };
57
+ return [];
58
+ }
59
+ }
60
+ processRtp(rtp) {
61
+ const { sequenceNumber, timestamp } = rtp.header;
62
+ // init
63
+ if (this.presentSeqNum == undefined) {
64
+ this.presentSeqNum = sequenceNumber;
65
+ return { packets: [rtp] };
66
+ }
67
+ // duplicate
68
+ if (sequenceNumber <= this.presentSeqNum) {
69
+ return { nothing: undefined };
70
+ }
71
+ // expect
72
+ if (sequenceNumber === this.expectNextSeqNum) {
73
+ this.presentSeqNum = sequenceNumber;
74
+ const rtpBuffer = this.resolveBuffer((0, __1.uint16Add)(sequenceNumber, 1));
75
+ this.presentSeqNum =
76
+ rtpBuffer.at(-1)?.header.sequenceNumber ?? this.presentSeqNum;
77
+ return { packets: [rtp, ...rtpBuffer] };
78
+ }
79
+ this.pushRtpBuffer(rtp);
80
+ const { latestTimeoutSeqNum, sorted } = this.disposeTimeoutPackets(timestamp);
81
+ if (latestTimeoutSeqNum) {
82
+ return { timeoutSeqNum: latestTimeoutSeqNum, packets: sorted };
83
+ }
84
+ else {
85
+ return { nothing: undefined };
86
+ }
45
87
  }
46
- pushRtpPackets(packets) {
47
- packets.forEach(this.onRtp);
88
+ pushRtpBuffer(rtp) {
89
+ if (Object.values(this.rtpBuffer).length > this.options.bufferSize) {
90
+ return;
91
+ }
92
+ this.rtpBuffer[rtp.header.sequenceNumber] = rtp;
48
93
  }
49
- pushRtcpPackets(packets) {
50
- this.children?.pushRtcpPackets?.(packets);
94
+ resolveBuffer(seqNumFrom) {
95
+ const resolve = [];
96
+ for (let index = seqNumFrom;; index = (0, __1.uint16Add)(index, 1)) {
97
+ const rtp = this.rtpBuffer[index];
98
+ if (rtp) {
99
+ resolve.push(rtp);
100
+ delete this.rtpBuffer[index];
101
+ }
102
+ else {
103
+ break;
104
+ }
105
+ }
106
+ return resolve;
107
+ }
108
+ sortAndClearBuffer(rtpBuffer) {
109
+ const buffer = [];
110
+ for (let index = this.presentSeqNum ?? 0;; index = (0, __1.uint16Add)(index, 1)) {
111
+ const rtp = rtpBuffer[index];
112
+ if (rtp) {
113
+ buffer.push(rtp);
114
+ delete rtpBuffer[index];
115
+ }
116
+ if (Object.values(rtpBuffer).length === 0) {
117
+ break;
118
+ }
119
+ }
120
+ return buffer;
121
+ }
122
+ disposeTimeoutPackets(baseTimestamp) {
123
+ let latestTimeoutSeqNum;
124
+ const packets = Object.values(this.rtpBuffer)
125
+ .map((rtp) => {
126
+ const { timestamp, sequenceNumber } = rtp.header;
127
+ if ((0, __1.uint32Gt)(timestamp, baseTimestamp)) {
128
+ log("gap", { timestamp, baseTimestamp });
129
+ return;
130
+ }
131
+ const elapsedSec = (0, __1.uint32Add)(baseTimestamp, -timestamp) / this.clockRate;
132
+ if (elapsedSec * 1000 > this.options.latency) {
133
+ log("timeout packet", {
134
+ sequenceNumber,
135
+ elapsedSec,
136
+ baseTimestamp,
137
+ timestamp,
138
+ });
139
+ if (latestTimeoutSeqNum == undefined) {
140
+ latestTimeoutSeqNum = sequenceNumber;
141
+ }
142
+ // 現在のSeqNumとの差が最も大きいSeqNumを探す
143
+ if ((0, __1.uint16Add)(sequenceNumber, -this.presentSeqNum) >
144
+ (0, __1.uint16Add)(latestTimeoutSeqNum, -this.presentSeqNum)) {
145
+ latestTimeoutSeqNum = sequenceNumber;
146
+ }
147
+ const packet = this.rtpBuffer[sequenceNumber];
148
+ delete this.rtpBuffer[sequenceNumber];
149
+ return packet;
150
+ }
151
+ })
152
+ .flatMap((p) => p)
153
+ .filter((p) => p);
154
+ const sorted = this.sortAndClearBuffer(packets.reduce((acc, cur) => {
155
+ acc[cur.header.sequenceNumber] = cur;
156
+ return acc;
157
+ }, {}));
158
+ return { latestTimeoutSeqNum, sorted };
51
159
  }
52
160
  }
53
- exports.JitterBuffer = JitterBuffer;
161
+ exports.JitterBufferBase = JitterBufferBase;
54
162
  //# sourceMappingURL=jitterBuffer.js.map