werift 0.12.8 → 0.13.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 (162) hide show
  1. package/lib/common/src/binary.d.ts +9 -0
  2. package/lib/common/src/binary.js +37 -1
  3. package/lib/common/src/binary.js.map +1 -1
  4. package/lib/dtls/src/context/srtp.d.ts +6 -2
  5. package/lib/dtls/src/context/srtp.js +9 -3
  6. package/lib/dtls/src/context/srtp.js.map +1 -1
  7. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  8. package/lib/dtls/src/flight/server/flight2.js.map +1 -1
  9. package/lib/dtls/src/socket.d.ts +3 -3
  10. package/lib/dtls/src/socket.js +6 -8
  11. package/lib/dtls/src/socket.js.map +1 -1
  12. package/lib/ice/src/utils.d.ts +1 -0
  13. package/lib/ice/src/utils.js +5 -1
  14. package/lib/ice/src/utils.js.map +1 -1
  15. package/lib/rtp/src/codec/base.d.ts +8 -0
  16. package/lib/rtp/src/codec/base.js +16 -0
  17. package/lib/rtp/src/codec/base.js.map +1 -0
  18. package/lib/rtp/src/codec/h264.d.ts +23 -2
  19. package/lib/rtp/src/codec/h264.js +66 -3
  20. package/lib/rtp/src/codec/h264.js.map +1 -1
  21. package/lib/rtp/src/codec/opus.d.ts +9 -0
  22. package/lib/rtp/src/codec/opus.js +18 -0
  23. package/lib/rtp/src/codec/opus.js.map +1 -0
  24. package/lib/rtp/src/codec/vp8.d.ts +18 -11
  25. package/lib/rtp/src/codec/vp8.js +51 -29
  26. package/lib/rtp/src/codec/vp8.js.map +1 -1
  27. package/lib/rtp/src/codec/vp9.d.ts +38 -10
  28. package/lib/rtp/src/codec/vp9.js +115 -26
  29. package/lib/rtp/src/codec/vp9.js.map +1 -1
  30. package/lib/rtp/src/index.d.ts +2 -0
  31. package/lib/rtp/src/index.js +2 -0
  32. package/lib/rtp/src/index.js.map +1 -1
  33. package/lib/rtp/src/rtcp/psfb/index.d.ts +2 -2
  34. package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
  35. package/lib/rtp/src/rtcp/rr.d.ts +2 -2
  36. package/lib/rtp/src/rtcp/rr.js.map +1 -1
  37. package/lib/rtp/src/rtcp/rtpfb/index.d.ts +2 -2
  38. package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
  39. package/lib/rtp/src/rtcp/sdes.d.ts +2 -2
  40. package/lib/rtp/src/rtcp/sdes.js.map +1 -1
  41. package/lib/rtp/src/rtcp/sr.d.ts +2 -2
  42. package/lib/rtp/src/rtcp/sr.js +36 -0
  43. package/lib/rtp/src/rtcp/sr.js.map +1 -1
  44. package/lib/rtp/src/rtp/rtp.d.ts +2 -0
  45. package/lib/rtp/src/rtp/rtp.js +2 -0
  46. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  47. package/lib/rtp/src/srtp/cipher/ctr.d.ts +17 -0
  48. package/lib/rtp/src/srtp/cipher/ctr.js +103 -0
  49. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -0
  50. package/lib/rtp/src/srtp/cipher/gcm.d.ts +15 -0
  51. package/lib/rtp/src/srtp/cipher/gcm.js +106 -0
  52. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -0
  53. package/lib/rtp/src/srtp/cipher/index.d.ts +14 -0
  54. package/lib/rtp/src/srtp/cipher/index.js +25 -0
  55. package/lib/rtp/src/srtp/cipher/index.js.map +1 -0
  56. package/lib/rtp/src/srtp/const.d.ts +5 -0
  57. package/lib/rtp/src/srtp/const.js +23 -0
  58. package/lib/rtp/src/srtp/const.js.map +1 -0
  59. package/lib/rtp/src/srtp/context/context.d.ts +13 -11
  60. package/lib/rtp/src/srtp/context/context.js +23 -23
  61. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  62. package/lib/rtp/src/srtp/context/srtcp.d.ts +3 -2
  63. package/lib/rtp/src/srtp/context/srtcp.js +10 -34
  64. package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
  65. package/lib/rtp/src/srtp/context/srtp.d.ts +4 -3
  66. package/lib/rtp/src/srtp/context/srtp.js +9 -28
  67. package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
  68. package/lib/rtp/src/srtp/srtp.js +2 -2
  69. package/lib/rtp/src/srtp/srtp.js.map +1 -1
  70. package/lib/webrtc/src/const.d.ts +4 -3
  71. package/lib/webrtc/src/const.js +5 -4
  72. package/lib/webrtc/src/const.js.map +1 -1
  73. package/lib/webrtc/src/helper.d.ts +2 -2
  74. package/lib/webrtc/src/helper.js +2 -2
  75. package/lib/webrtc/src/helper.js.map +1 -1
  76. package/lib/webrtc/src/index.d.ts +6 -2
  77. package/lib/webrtc/src/index.js +6 -2
  78. package/lib/webrtc/src/index.js.map +1 -1
  79. package/lib/webrtc/src/{extension → media/extension}/rtcpFeedback.d.ts +1 -1
  80. package/lib/webrtc/src/{extension → media/extension}/rtcpFeedback.js +0 -0
  81. package/lib/webrtc/src/media/extension/rtcpFeedback.js.map +1 -0
  82. package/lib/webrtc/src/{extension → media/extension}/rtpExtension.d.ts +1 -1
  83. package/lib/webrtc/src/{extension → media/extension}/rtpExtension.js +1 -1
  84. package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -0
  85. package/lib/webrtc/src/media/{nack.d.ts → receiver/nack.d.ts} +2 -2
  86. package/lib/webrtc/src/media/{nack.js → receiver/nack.js} +2 -2
  87. package/lib/webrtc/src/media/receiver/nack.js.map +1 -0
  88. package/lib/webrtc/src/media/{statistics.d.ts → receiver/statistics.d.ts} +1 -1
  89. package/lib/webrtc/src/media/{statistics.js → receiver/statistics.js} +1 -1
  90. package/lib/webrtc/src/media/receiver/statistics.js.map +1 -0
  91. package/lib/webrtc/src/media/router.js +1 -1
  92. package/lib/webrtc/src/media/router.js.map +1 -1
  93. package/lib/webrtc/src/media/rtpReceiver.d.ts +4 -2
  94. package/lib/webrtc/src/media/rtpReceiver.js +13 -6
  95. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  96. package/lib/webrtc/src/media/rtpSender.d.ts +4 -4
  97. package/lib/webrtc/src/media/rtpSender.js +12 -6
  98. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  99. package/lib/webrtc/src/media/{senderBWE → sender}/cumulativeResult.d.ts +0 -0
  100. package/lib/webrtc/src/media/{senderBWE → sender}/cumulativeResult.js +0 -0
  101. package/lib/webrtc/src/media/sender/cumulativeResult.js.map +1 -0
  102. package/lib/webrtc/src/media/{senderBWE → sender}/senderBWE.d.ts +0 -0
  103. package/lib/webrtc/src/media/{senderBWE → sender}/senderBWE.js +0 -0
  104. package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -0
  105. package/lib/webrtc/src/media/track.d.ts +3 -0
  106. package/lib/webrtc/src/media/track.js +2 -0
  107. package/lib/webrtc/src/media/track.js.map +1 -1
  108. package/lib/webrtc/src/nonstandard/jitterBuffer.d.ts +12 -0
  109. package/lib/webrtc/src/nonstandard/jitterBuffer.js +48 -0
  110. package/lib/webrtc/src/nonstandard/jitterBuffer.js.map +1 -0
  111. package/lib/webrtc/src/nonstandard/lipsync.d.ts +20 -0
  112. package/lib/webrtc/src/nonstandard/lipsync.js +39 -0
  113. package/lib/webrtc/src/nonstandard/lipsync.js.map +1 -0
  114. package/lib/webrtc/src/nonstandard/recorder.d.ts +18 -0
  115. package/lib/webrtc/src/nonstandard/recorder.js +25 -0
  116. package/lib/webrtc/src/nonstandard/recorder.js.map +1 -0
  117. package/lib/webrtc/src/nonstandard/sampleBuilder.d.ts +18 -0
  118. package/lib/webrtc/src/nonstandard/sampleBuilder.js +60 -0
  119. package/lib/webrtc/src/nonstandard/sampleBuilder.js.map +1 -0
  120. package/lib/webrtc/src/nonstandard/userMedia.d.ts +15 -0
  121. package/lib/webrtc/src/nonstandard/userMedia.js +67 -0
  122. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -0
  123. package/lib/webrtc/src/nonstandard/webm.d.ts +24 -0
  124. package/lib/webrtc/src/nonstandard/webm.js +308 -0
  125. package/lib/webrtc/src/nonstandard/webm.js.map +1 -0
  126. package/lib/webrtc/src/peerConnection.js +1 -0
  127. package/lib/webrtc/src/peerConnection.js.map +1 -1
  128. package/lib/webrtc/src/transport/dtls.d.ts +2 -1
  129. package/lib/webrtc/src/transport/dtls.js +7 -3
  130. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  131. package/lib/webrtc/src/utils.d.ts +3 -0
  132. package/lib/webrtc/src/utils.js +13 -9
  133. package/lib/webrtc/src/utils.js.map +1 -1
  134. package/package.json +5 -4
  135. package/src/const.ts +8 -3
  136. package/src/helper.ts +4 -4
  137. package/src/index.ts +6 -2
  138. package/src/{extension → media/extension}/rtcpFeedback.ts +1 -1
  139. package/src/{extension → media/extension}/rtpExtension.ts +1 -1
  140. package/src/media/{nack.ts → receiver/nack.ts} +3 -3
  141. package/src/media/{statistics.ts → receiver/statistics.ts} +2 -2
  142. package/src/media/router.ts +1 -1
  143. package/src/media/rtpReceiver.ts +11 -7
  144. package/src/media/rtpSender.ts +19 -9
  145. package/src/media/{senderBWE → sender}/cumulativeResult.ts +0 -0
  146. package/src/media/{senderBWE → sender}/senderBWE.ts +0 -0
  147. package/src/media/track.ts +6 -0
  148. package/src/nonstandard/jitterBuffer.ts +47 -0
  149. package/src/nonstandard/lipsync.ts +55 -0
  150. package/src/nonstandard/recorder.ts +26 -0
  151. package/src/nonstandard/sampleBuilder.ts +71 -0
  152. package/src/nonstandard/userMedia.ts +74 -0
  153. package/src/nonstandard/webm.ts +421 -0
  154. package/src/peerConnection.ts +3 -1
  155. package/src/transport/dtls.ts +12 -4
  156. package/src/utils.ts +20 -12
  157. package/lib/webrtc/src/extension/rtcpFeedback.js.map +0 -1
  158. package/lib/webrtc/src/extension/rtpExtension.js.map +0 -1
  159. package/lib/webrtc/src/media/nack.js.map +0 -1
  160. package/lib/webrtc/src/media/senderBWE/cumulativeResult.js.map +0 -1
  161. package/lib/webrtc/src/media/senderBWE/senderBWE.js.map +0 -1
  162. package/lib/webrtc/src/media/statistics.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"senderBWE.js","sourceRoot":"","sources":["../../../../../src/media/sender/senderBWE.ts"],"names":[],"mappings":"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","sourcesContent":["import Event from \"rx.mini\";\n\nimport { TransportWideCC } from \"../../../../rtp/src\";\nimport { Int } from \"../../../../rtp/src/helper\";\nimport { milliTime } from \"../../utils\";\nimport { CumulativeResult } from \"./cumulativeResult\";\n\nconst COUNTER_MAX = 20;\nconst SCORE_MAX = 10;\n\nexport class SenderBandwidthEstimator {\n congestion = false;\n\n readonly onAvailableBitrate = new Event<[number]>();\n /**congestion occur or not */\n readonly onCongestion = new Event<[boolean]>();\n readonly onCongestionScore = new Event<[number]>();\n\n private congestionCounter = 0;\n private cumulativeResult = new CumulativeResult();\n private sentInfos: { [key: number]: SentInfo } = {};\n private _congestionScore = 1;\n /**1~10 big is worth*/\n get congestionScore() {\n return this._congestionScore;\n }\n set congestionScore(v: number) {\n this._congestionScore = v;\n this.onCongestionScore.execute(v);\n }\n private _availableBitrate: number = 0;\n get availableBitrate() {\n return this._availableBitrate;\n }\n set availableBitrate(v: number) {\n this._availableBitrate = v;\n this.onAvailableBitrate.execute(v);\n }\n\n constructor() {}\n\n receiveTWCC(feedback: TransportWideCC) {\n const nowMs = milliTime();\n const elapsedMs = nowMs - this.cumulativeResult.firstPacketSentAtMs;\n if (elapsedMs > 1000) {\n this.cumulativeResult.reset();\n\n // Congestion may be occurring.\n\n if (this.congestionCounter < COUNTER_MAX) {\n this.congestionCounter++;\n } else if (this.congestionScore < SCORE_MAX) {\n this.congestionScore++;\n }\n\n if (this.congestionCounter >= COUNTER_MAX && !this.congestion) {\n this.congestion = true;\n this.onCongestion.execute(this.congestion);\n }\n }\n\n for (const result of feedback.packetResults) {\n if (!result.received) continue;\n\n const wideSeq = result.sequenceNumber;\n const info = this.sentInfos[wideSeq];\n if (!info) continue;\n if (!result.receivedAtMs) continue;\n\n this.cumulativeResult.addPacket(\n info.size,\n info.sendingAtMs,\n result.receivedAtMs\n );\n }\n\n if (elapsedMs >= 100 && this.cumulativeResult.numPackets >= 20) {\n this.availableBitrate = Math.min(\n this.cumulativeResult.sendBitrate,\n this.cumulativeResult.receiveBitrate\n );\n this.cumulativeResult.reset();\n\n if (this.congestionCounter > -COUNTER_MAX) {\n const maxBonus = Int(COUNTER_MAX / 2) + 1;\n const minBonus = Int(COUNTER_MAX / 4) + 1;\n const bonus =\n maxBonus - ((maxBonus - minBonus) / 10) * this.congestionScore;\n\n this.congestionCounter = this.congestionCounter - bonus;\n }\n\n if (this.congestionCounter <= -COUNTER_MAX) {\n if (this.congestionScore > 1) {\n this.congestionScore--;\n this.onCongestion.execute(false);\n }\n this.congestionCounter = 0;\n }\n\n if (this.congestionCounter <= 0 && this.congestion) {\n this.congestion = false;\n this.onCongestion.execute(this.congestion);\n }\n }\n }\n\n rtpPacketSent(sentInfo: SentInfo) {\n Object.keys(sentInfo)\n .map((v) => Number(v))\n .sort()\n .filter((seq) => seq < sentInfo.wideSeq)\n .forEach((seq) => {\n delete this.sentInfos[seq];\n });\n this.sentInfos[sentInfo.wideSeq] = sentInfo;\n }\n}\n\nexport interface SentInfo {\n wideSeq: number;\n /**\n * byte\n */\n size: number;\n isProbation?: boolean;\n sendingAtMs: number;\n sentAtMs: number;\n}\n"]}
@@ -6,6 +6,8 @@ import { Kind } from "../types/domain";
6
6
  import { RTCRtpCodecParameters } from "./parameters";
7
7
  export declare class MediaStreamTrack extends EventTarget {
8
8
  readonly uuid: string;
9
+ /**MediaStream ID*/
10
+ streamId?: string;
9
11
  remote: boolean;
10
12
  label: string;
11
13
  kind: Kind;
@@ -18,6 +20,7 @@ export declare class MediaStreamTrack extends EventTarget {
18
20
  /**todo impl */
19
21
  enabled: boolean;
20
22
  readonly onReceiveRtp: Event<[RtpPacket]>;
23
+ readonly onSourceChanged: Event<[Pick<RtpHeader, "sequenceNumber" | "timestamp">]>;
21
24
  stopped: boolean;
22
25
  muted: boolean;
23
26
  constructor(props: Partial<MediaStreamTrack> & Pick<MediaStreamTrack, "kind">);
@@ -16,6 +16,7 @@ class MediaStreamTrack extends helper_1.EventTarget {
16
16
  /**todo impl */
17
17
  this.enabled = true;
18
18
  this.onReceiveRtp = new rx_mini_1.default();
19
+ this.onSourceChanged = new rx_mini_1.default();
19
20
  this.stopped = false;
20
21
  this.muted = true;
21
22
  this.stop = () => {
@@ -47,6 +48,7 @@ class MediaStream {
47
48
  Object.assign(this, props);
48
49
  }
49
50
  addTrack(track) {
51
+ track.streamId = this.id;
50
52
  this.tracks.push(track);
51
53
  }
52
54
  getTracks() {
@@ -1 +1 @@
1
- {"version":3,"file":"track.js","sourceRoot":"","sources":["../../../../src/media/track.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA4B;AAC5B,+BAA0B;AAE1B,0CAAwD;AACxD,sCAAwC;AAIxC,MAAa,gBAAiB,SAAQ,oBAAW;IAmB/C,YACE,KAAiE;QAEjE,KAAK,EAAE,CAAC;QArBD,SAAI,GAAG,SAAE,EAAE,CAAC;QACrB,WAAM,GAAG,KAAK,CAAC;QASf,eAAe;QACf,YAAO,GAAG,IAAI,CAAC;QAEN,iBAAY,GAAG,IAAI,iBAAK,EAAe,CAAC;QAEjD,YAAO,GAAG,KAAK,CAAC;QAChB,UAAK,GAAG,IAAI,CAAC;QAgBb,SAAI,GAAG,GAAG,EAAE;YACV,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC;QAEF,aAAQ,GAAG,CAAC,GAAuB,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO;YAExC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YACnD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC,CAAC;QAvBA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE3B,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;YAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAClE,CAAC;CAgBF;AA/CD,4CA+CC;AAED,MAAa,WAAW;IAItB,YAAY,KAAqD;QAFjE,WAAM,GAAuB,EAAE,CAAC;QAG9B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ,CAAC,KAAuB;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAfD,kCAeC","sourcesContent":["import Event from \"rx.mini\";\nimport { v4 } from \"uuid\";\n\nimport { RtpHeader, RtpPacket } from \"../../../rtp/src\";\nimport { EventTarget } from \"../helper\";\nimport { Kind } from \"../types/domain\";\nimport { RTCRtpCodecParameters } from \"./parameters\";\n\nexport class MediaStreamTrack extends EventTarget {\n readonly uuid = v4();\n remote = false;\n label: string;\n kind!: Kind;\n id?: string;\n /**mediaSsrc */\n ssrc?: number;\n rid?: string;\n header?: RtpHeader;\n codec?: RTCRtpCodecParameters;\n /**todo impl */\n enabled = true;\n\n readonly onReceiveRtp = new Event<[RtpPacket]>();\n\n stopped = false;\n muted = true;\n\n constructor(\n props: Partial<MediaStreamTrack> & Pick<MediaStreamTrack, \"kind\">\n ) {\n super();\n Object.assign(this, props);\n\n this.onReceiveRtp.subscribe((rtp) => {\n this.muted = false;\n this.header = rtp.header;\n });\n\n this.label = `${this.remote ? \"remote\" : \"local\"} ${this.kind}`;\n }\n\n stop = () => {\n this.stopped = true;\n this.muted = true;\n this.onReceiveRtp.complete();\n };\n\n writeRtp = (rtp: RtpPacket | Buffer) => {\n if (this.remote) throw new Error(\"this is remoteTrack\");\n if (!this.codec || this.stopped) return;\n\n const packet = Buffer.isBuffer(rtp) ? RtpPacket.deSerialize(rtp) : rtp;\n packet.header.payloadType = this.codec.payloadType;\n this.onReceiveRtp.execute(packet);\n };\n}\n\nexport class MediaStream {\n id!: string;\n tracks: MediaStreamTrack[] = [];\n\n constructor(props: Partial<MediaStream> & Pick<MediaStream, \"id\">) {\n Object.assign(this, props);\n }\n\n addTrack(track: MediaStreamTrack) {\n this.tracks.push(track);\n }\n\n getTracks() {\n return this.tracks;\n }\n}\n"]}
1
+ {"version":3,"file":"track.js","sourceRoot":"","sources":["../../../../src/media/track.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA4B;AAC5B,+BAA0B;AAE1B,0CAAwD;AACxD,sCAAwC;AAIxC,MAAa,gBAAiB,SAAQ,oBAAW;IAwB/C,YACE,KAAiE;QAEjE,KAAK,EAAE,CAAC;QA1BD,SAAI,GAAG,SAAE,EAAE,CAAC;QAGrB,WAAM,GAAG,KAAK,CAAC;QASf,eAAe;QACf,YAAO,GAAG,IAAI,CAAC;QAEN,iBAAY,GAAG,IAAI,iBAAK,EAAe,CAAC;QACxC,oBAAe,GAAG,IAAI,iBAAK,EAEjC,CAAC;QAEJ,YAAO,GAAG,KAAK,CAAC;QAChB,UAAK,GAAG,IAAI,CAAC;QAgBb,SAAI,GAAG,GAAG,EAAE;YACV,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC/B,CAAC,CAAC;QAEF,aAAQ,GAAG,CAAC,GAAuB,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO;YAExC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YACnD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC,CAAC;QAvBA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE3B,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;YAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAClE,CAAC;CAgBF;AApDD,4CAoDC;AAED,MAAa,WAAW;IAItB,YAAY,KAAqD;QAFjE,WAAM,GAAuB,EAAE,CAAC;QAG9B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ,CAAC,KAAuB;QAC9B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAhBD,kCAgBC","sourcesContent":["import Event from \"rx.mini\";\nimport { v4 } from \"uuid\";\n\nimport { RtpHeader, RtpPacket } from \"../../../rtp/src\";\nimport { EventTarget } from \"../helper\";\nimport { Kind } from \"../types/domain\";\nimport { RTCRtpCodecParameters } from \"./parameters\";\n\nexport class MediaStreamTrack extends EventTarget {\n readonly uuid = v4();\n /**MediaStream ID*/\n streamId?: string;\n remote = false;\n label: string;\n kind!: Kind;\n id?: string;\n /**mediaSsrc */\n ssrc?: number;\n rid?: string;\n header?: RtpHeader;\n codec?: RTCRtpCodecParameters;\n /**todo impl */\n enabled = true;\n\n readonly onReceiveRtp = new Event<[RtpPacket]>();\n readonly onSourceChanged = new Event<\n [Pick<RtpHeader, \"sequenceNumber\" | \"timestamp\">]\n >();\n\n stopped = false;\n muted = true;\n\n constructor(\n props: Partial<MediaStreamTrack> & Pick<MediaStreamTrack, \"kind\">\n ) {\n super();\n Object.assign(this, props);\n\n this.onReceiveRtp.subscribe((rtp) => {\n this.muted = false;\n this.header = rtp.header;\n });\n\n this.label = `${this.remote ? \"remote\" : \"local\"} ${this.kind}`;\n }\n\n stop = () => {\n this.stopped = true;\n this.muted = true;\n this.onReceiveRtp.complete();\n };\n\n writeRtp = (rtp: RtpPacket | Buffer) => {\n if (this.remote) throw new Error(\"this is remoteTrack\");\n if (!this.codec || this.stopped) return;\n\n const packet = Buffer.isBuffer(rtp) ? RtpPacket.deSerialize(rtp) : rtp;\n packet.header.payloadType = this.codec.payloadType;\n this.onReceiveRtp.execute(packet);\n };\n}\n\nexport class MediaStream {\n id!: string;\n tracks: MediaStreamTrack[] = [];\n\n constructor(props: Partial<MediaStream> & Pick<MediaStream, \"id\">) {\n Object.assign(this, props);\n }\n\n addTrack(track: MediaStreamTrack) {\n track.streamId = this.id;\n this.tracks.push(track);\n }\n\n getTracks() {\n return this.tracks;\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { RtpPacket } from "../../../rtp/src";
2
+ export declare class JitterBuffer {
3
+ maxRetry: number;
4
+ static MaxRetry: number;
5
+ retry: number;
6
+ head?: number;
7
+ buffer: {
8
+ [sequenceNumber: number]: RtpPacket;
9
+ };
10
+ constructor(maxRetry?: number);
11
+ push(p: RtpPacket): RtpPacket[];
12
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ 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 log = debug_1.debug("werift:packages/webrtc/src/nonstandard/jitterBuffer.ts");
7
+ class JitterBuffer {
8
+ constructor(maxRetry = JitterBuffer.MaxRetry) {
9
+ this.maxRetry = maxRetry;
10
+ this.retry = 0;
11
+ this.buffer = {};
12
+ }
13
+ push(p) {
14
+ this.buffer[p.header.sequenceNumber] = p;
15
+ if (this.head == undefined) {
16
+ this.head = p.header.sequenceNumber;
17
+ }
18
+ else if (p.header.sequenceNumber != src_1.uint16Add(this.head, 1)) {
19
+ if (this.retry++ >= this.maxRetry) {
20
+ log("give up packet lost");
21
+ this.head = src_1.uint16Add(this.head, 2);
22
+ }
23
+ else {
24
+ return [];
25
+ }
26
+ }
27
+ else {
28
+ this.head = src_1.uint16Add(this.head, 1);
29
+ }
30
+ const packets = [];
31
+ let tail = this.head;
32
+ for (;; tail = src_1.uint16Add(tail, 1)) {
33
+ const p = this.buffer[tail];
34
+ if (p) {
35
+ packets.push(p);
36
+ delete this.buffer[tail];
37
+ }
38
+ else {
39
+ break;
40
+ }
41
+ }
42
+ this.head = src_1.uint16Add(tail, -1);
43
+ return packets;
44
+ }
45
+ }
46
+ exports.JitterBuffer = JitterBuffer;
47
+ JitterBuffer.MaxRetry = 100;
48
+ //# sourceMappingURL=jitterBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jitterBuffer.js","sourceRoot":"","sources":["../../../../src/nonstandard/jitterBuffer.ts"],"names":[],"mappings":";;;AAAA,iCAA8B;AAE9B,6CAAgD;AAGhD,MAAM,GAAG,GAAG,aAAK,CAAC,wDAAwD,CAAC,CAAC;AAE5E,MAAa,YAAY;IAMvB,YAAmB,WAAW,YAAY,CAAC,QAAQ;QAAhC,aAAQ,GAAR,QAAQ,CAAwB;QAJnD,UAAK,GAAG,CAAC,CAAC;QAEV,WAAM,GAA4C,EAAE,CAAC;IAEC,CAAC;IAEvD,IAAI,CAAC,CAAY;QACf,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE;YAC1B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;SACrC;aAAM,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,eAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE;YAC7D,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjC,GAAG,CAAC,qBAAqB,CAAC,CAAC;gBAC3B,IAAI,CAAC,IAAI,GAAG,eAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aACrC;iBAAM;gBACL,OAAO,EAAE,CAAC;aACX;SACF;aAAM;YACL,IAAI,CAAC,IAAI,GAAG,eAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;SACrC;QAED,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,QAAS,IAAI,GAAG,eAAS,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE;YAClC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,EAAE;gBACL,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;aAC1B;iBAAM;gBACL,MAAM;aACP;SACF;QACD,IAAI,CAAC,IAAI,GAAG,eAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhC,OAAO,OAAO,CAAC;IACjB,CAAC;;AAtCH,oCAuCC;AAtCQ,qBAAQ,GAAG,GAAG,CAAC","sourcesContent":["import { debug } from \"debug\";\n\nimport { uint16Add } from \"../../../common/src\";\nimport { RtpPacket } from \"../../../rtp/src\";\n\nconst log = debug(\"werift:packages/webrtc/src/nonstandard/jitterBuffer.ts\");\n\nexport class JitterBuffer {\n static MaxRetry = 100;\n retry = 0;\n head?: number;\n buffer: { [sequenceNumber: number]: RtpPacket } = {};\n\n constructor(public maxRetry = JitterBuffer.MaxRetry) {}\n\n push(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 return packets;\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { RtcpSrPacket, RtpPacket } from "../../../rtp/src";
2
+ export declare class LipSync {
3
+ clockRate: number;
4
+ baseNtpTimestamp?: bigint;
5
+ baseRtpTimestamp?: number;
6
+ constructor(clockRate: number);
7
+ srReceived(sr: RtcpSrPacket): void;
8
+ calcNtpTime(rtpTimestamp: number): number;
9
+ }
10
+ export declare const ntpTime2Time: (ntp: bigint) => number;
11
+ /**4294967295 */
12
+ export declare const Max32bit: number;
13
+ export interface BufferResolve {
14
+ packets: {
15
+ packet: RtpPacket;
16
+ offset: number;
17
+ }[];
18
+ /**NTP seconds */
19
+ startAtNtpTime: number;
20
+ }
@@ -0,0 +1,39 @@
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
+ class LipSync {
6
+ constructor(clockRate) {
7
+ this.clockRate = clockRate;
8
+ }
9
+ srReceived(sr) {
10
+ const { ntpTimestamp, rtpTimestamp } = sr.senderInfo;
11
+ this.baseNtpTimestamp = ntpTimestamp;
12
+ this.baseRtpTimestamp = rtpTimestamp;
13
+ }
14
+ calcNtpTime(rtpTimestamp) {
15
+ if (!this.baseRtpTimestamp || !this.baseNtpTimestamp) {
16
+ return 0;
17
+ }
18
+ // base rtpTimestamp is rollover
19
+ if (rtpTimestamp - this.baseRtpTimestamp > exports.Max32bit - this.clockRate * 60) {
20
+ this.baseRtpTimestamp += exports.Max32bit;
21
+ }
22
+ // target rtpTimestamp is rollover
23
+ else if (rtpTimestamp + (exports.Max32bit - this.clockRate * 60) - this.baseRtpTimestamp <
24
+ 0) {
25
+ rtpTimestamp += exports.Max32bit;
26
+ }
27
+ const elapsed = (rtpTimestamp - this.baseRtpTimestamp) / this.clockRate;
28
+ return exports.ntpTime2Time(this.baseNtpTimestamp) + elapsed;
29
+ }
30
+ }
31
+ exports.LipSync = LipSync;
32
+ const ntpTime2Time = (ntp) => {
33
+ const [ntpSec, ntpMsec] = src_1.bufferReader(src_1.bufferWriter([8], [ntp]), [4, 4]);
34
+ return Number(`${ntpSec}.${ntpMsec}`);
35
+ };
36
+ exports.ntpTime2Time = ntpTime2Time;
37
+ /**4294967295 */
38
+ exports.Max32bit = Number((0x01n << 32n) - 1n);
39
+ //# sourceMappingURL=lipsync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lipsync.js","sourceRoot":"","sources":["../../../../src/nonstandard/lipsync.ts"],"names":[],"mappings":";;;AAAA,6CAAiE;AAGjE,MAAa,OAAO;IAIlB,YAAmB,SAAiB;QAAjB,cAAS,GAAT,SAAS,CAAQ;IAAG,CAAC;IAExC,UAAU,CAAC,EAAgB;QACzB,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,WAAW,CAAC,YAAoB;QAC9B,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACpD,OAAO,CAAC,CAAC;SACV;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,oBAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC;IACvD,CAAC;CACF;AAjCD,0BAiCC;AAEM,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;IAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAY,CAAC,kBAAY,CAAC,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 { bufferReader, bufferWriter } from \"../../../common/src\";\nimport { RtcpSrPacket, RtpPacket } from \"../../../rtp/src\";\n\nexport class LipSync {\n baseNtpTimestamp?: bigint;\n baseRtpTimestamp?: number;\n\n constructor(public clockRate: number) {}\n\n srReceived(sr: RtcpSrPacket) {\n const { ntpTimestamp, rtpTimestamp } = sr.senderInfo;\n this.baseNtpTimestamp = ntpTimestamp;\n this.baseRtpTimestamp = rtpTimestamp;\n }\n\n calcNtpTime(rtpTimestamp: number) {\n if (!this.baseRtpTimestamp || !this.baseNtpTimestamp) {\n return 0;\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"]}
@@ -0,0 +1,18 @@
1
+ import { MediaStreamTrack } from "../media/track";
2
+ import { WebmFactory } from "./webm";
3
+ export declare class MediaRecorder {
4
+ tracks: MediaStreamTrack[];
5
+ path: string;
6
+ options: Partial<{
7
+ width: number;
8
+ height: number;
9
+ }>;
10
+ webm?: WebmFactory;
11
+ constructor(tracks: MediaStreamTrack[], path: string, options?: Partial<{
12
+ width: number;
13
+ height: number;
14
+ }>);
15
+ addTrack(track: MediaStreamTrack): void;
16
+ start(): Promise<void>;
17
+ stop(): Promise<void>;
18
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MediaRecorder = void 0;
4
+ const webm_1 = require("./webm");
5
+ class MediaRecorder {
6
+ constructor(tracks, path, options = {}) {
7
+ this.tracks = tracks;
8
+ this.path = path;
9
+ this.options = options;
10
+ }
11
+ addTrack(track) {
12
+ this.tracks.push(track);
13
+ }
14
+ async start() {
15
+ this.webm = new webm_1.WebmFactory(this.tracks, this.path, this.options);
16
+ await this.webm.start();
17
+ }
18
+ async stop() {
19
+ if (!this.webm)
20
+ throw new Error();
21
+ await this.webm.stop();
22
+ }
23
+ }
24
+ exports.MediaRecorder = MediaRecorder;
25
+ //# sourceMappingURL=recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../../../src/nonstandard/recorder.ts"],"names":[],"mappings":";;;AACA,iCAAqC;AAErC,MAAa,aAAa;IAGxB,YACS,MAA0B,EAC1B,IAAY,EACZ,UAAsD,EAAE;QAFxD,WAAM,GAAN,MAAM,CAAoB;QAC1B,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAiD;IAC9D,CAAC;IAEJ,QAAQ,CAAC,KAAuB;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,GAAG,IAAI,kBAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;CACF;AAtBD,sCAsBC","sourcesContent":["import { MediaStreamTrack } from \"../media/track\";\nimport { WebmFactory } from \"./webm\";\n\nexport class MediaRecorder {\n webm?: WebmFactory;\n\n constructor(\n public tracks: MediaStreamTrack[],\n public path: string,\n public options: Partial<{ width: number; height: number }> = {}\n ) {}\n\n addTrack(track: MediaStreamTrack) {\n this.tracks.push(track);\n }\n\n async start() {\n this.webm = new WebmFactory(this.tracks, this.path, this.options);\n await this.webm.start();\n }\n\n async stop() {\n if (!this.webm) throw new Error();\n await this.webm.stop();\n }\n}\n"]}
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" />
2
+ import { DePacketizerBase, RtpPacket } from "../../../rtp/src";
3
+ export declare class SampleBuilder {
4
+ readonly DePacketizer: typeof DePacketizerBase;
5
+ clockRate: number;
6
+ private readonly jitterBuffer;
7
+ private buffer;
8
+ private baseTimestamp?;
9
+ relativeTimestamp: number;
10
+ constructor(DePacketizer: typeof DePacketizerBase, clockRate: number);
11
+ push(p: RtpPacket): void;
12
+ resetTimestamp(): void;
13
+ build(): {
14
+ data: Buffer;
15
+ relativeTimestamp: number;
16
+ isKeyframe: boolean;
17
+ } | undefined;
18
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SampleBuilder = void 0;
4
+ const debug_1 = require("debug");
5
+ const src_1 = require("../../../common/src");
6
+ const helper_1 = require("../helper");
7
+ const jitterBuffer_1 = require("./jitterBuffer");
8
+ const log = debug_1.debug("werift:packages/webrtc/src/nonstandard/sampleBuilder.ts");
9
+ class SampleBuilder {
10
+ constructor(DePacketizer, clockRate) {
11
+ this.DePacketizer = DePacketizer;
12
+ this.clockRate = clockRate;
13
+ this.jitterBuffer = new jitterBuffer_1.JitterBuffer();
14
+ this.buffer = [];
15
+ this.relativeTimestamp = 0;
16
+ }
17
+ push(p) {
18
+ const buf = this.jitterBuffer.push(p);
19
+ this.buffer = [...this.buffer, ...buf];
20
+ }
21
+ resetTimestamp() {
22
+ this.baseTimestamp = undefined;
23
+ this.relativeTimestamp = 0;
24
+ }
25
+ build() {
26
+ let tail;
27
+ for (const [i, p] of helper_1.enumerate(this.buffer)) {
28
+ if (this.DePacketizer.isDetectedFinalPacketInSequence(p.header)) {
29
+ tail = i;
30
+ break;
31
+ }
32
+ }
33
+ if (tail == undefined)
34
+ return;
35
+ if (this.baseTimestamp == undefined) {
36
+ this.baseTimestamp = this.buffer[tail].header.timestamp;
37
+ }
38
+ const tailTimestamp = this.buffer[tail].header.timestamp;
39
+ const rotate = Math.abs(tailTimestamp - this.baseTimestamp) > (Max32Uint / 4) * 3;
40
+ if (rotate)
41
+ log({ rotate }, tailTimestamp, this.baseTimestamp);
42
+ const elapsed = rotate
43
+ ? tailTimestamp + Max32Uint - this.baseTimestamp
44
+ : tailTimestamp - this.baseTimestamp;
45
+ const relativeTimestamp = src_1.int((elapsed / this.clockRate) * 1000);
46
+ this.relativeTimestamp = relativeTimestamp;
47
+ const frames = this.buffer.slice(0, tail + 1).map((p) => {
48
+ const frame = this.DePacketizer.deSerialize(p.payload);
49
+ return frame;
50
+ });
51
+ const isKeyframe = !!frames.find((f) => f.isKeyframe);
52
+ const data = Buffer.concat(frames.map((f) => f.payload));
53
+ this.buffer = this.buffer.slice(tail + 1);
54
+ return { data, relativeTimestamp, isKeyframe };
55
+ }
56
+ }
57
+ exports.SampleBuilder = SampleBuilder;
58
+ /**4294967295 */
59
+ const Max32Uint = Number(0x01n << 32n) - 1;
60
+ //# sourceMappingURL=sampleBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampleBuilder.js","sourceRoot":"","sources":["../../../../src/nonstandard/sampleBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import { debug } from \"debug\";\n\nimport { int } from \"../../../common/src\";\nimport { DePacketizerBase, RtpPacket } from \"../../../rtp/src\";\nimport { enumerate } from \"../helper\";\nimport { JitterBuffer } from \"./jitterBuffer\";\n\nconst log = debug(\"werift:packages/webrtc/src/nonstandard/sampleBuilder.ts\");\n\nexport class SampleBuilder {\n private readonly jitterBuffer = new JitterBuffer();\n private buffer: RtpPacket[] = [];\n private baseTimestamp?: number;\n relativeTimestamp = 0;\n\n constructor(\n readonly DePacketizer: typeof DePacketizerBase,\n public clockRate: number\n ) {}\n\n push(p: RtpPacket) {\n const buf = this.jitterBuffer.push(p);\n this.buffer = [...this.buffer, ...buf];\n }\n\n resetTimestamp() {\n this.baseTimestamp = undefined;\n this.relativeTimestamp = 0;\n }\n\n build() {\n let tail: number | undefined;\n for (const [i, p] of enumerate(this.buffer)) {\n if (this.DePacketizer.isDetectedFinalPacketInSequence(p.header)) {\n tail = i;\n break;\n }\n }\n\n if (tail == undefined) return;\n if (this.baseTimestamp == undefined) {\n this.baseTimestamp = this.buffer[tail].header.timestamp;\n }\n\n const tailTimestamp = this.buffer[tail].header.timestamp;\n const rotate =\n Math.abs(tailTimestamp - this.baseTimestamp) > (Max32Uint / 4) * 3;\n if (rotate) log({ rotate }, tailTimestamp, this.baseTimestamp);\n\n const elapsed = rotate\n ? tailTimestamp + Max32Uint - this.baseTimestamp\n : tailTimestamp - this.baseTimestamp;\n\n const relativeTimestamp = int((elapsed / this.clockRate) * 1000);\n this.relativeTimestamp = relativeTimestamp;\n\n const frames = this.buffer.slice(0, tail + 1).map((p) => {\n const frame = this.DePacketizer.deSerialize(p.payload);\n return frame;\n });\n const isKeyframe = !!frames.find((f) => f.isKeyframe);\n const data = Buffer.concat(frames.map((f) => f.payload));\n\n this.buffer = this.buffer.slice(tail + 1);\n\n return { data, relativeTimestamp, isKeyframe };\n }\n}\n\n/**4294967295 */\nconst Max32Uint = Number(0x01n << 32n) - 1;\n"]}
@@ -0,0 +1,15 @@
1
+ import { MediaStreamTrack } from "../media/track";
2
+ export declare const getUserMp4: (path: string, loop?: boolean | undefined) => Promise<MediaMp4>;
3
+ declare class MediaMp4 {
4
+ private videoPort;
5
+ private audioPort;
6
+ private path;
7
+ private loop?;
8
+ private streamId;
9
+ audio: MediaStreamTrack;
10
+ video: MediaStreamTrack;
11
+ constructor(videoPort: number, audioPort: number, path: string, loop?: boolean | undefined);
12
+ private setupTrack;
13
+ start(): Promise<void>;
14
+ }
15
+ export {};
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getUserMp4 = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const dgram_1 = require("dgram");
6
+ const promises_1 = require("timers/promises");
7
+ const uuid_1 = require("uuid");
8
+ const src_1 = require("../../../ice/src");
9
+ const src_2 = require("../../../rtp/src");
10
+ const track_1 = require("../media/track");
11
+ const getUserMp4 = async (path, loop) => {
12
+ const audioPort = await src_1.randomPort();
13
+ const videoPort = await src_1.randomPort();
14
+ return new MediaMp4(audioPort, videoPort, path, loop);
15
+ };
16
+ exports.getUserMp4 = getUserMp4;
17
+ class MediaMp4 {
18
+ constructor(videoPort, audioPort, path, loop) {
19
+ this.videoPort = videoPort;
20
+ this.audioPort = audioPort;
21
+ this.path = path;
22
+ this.loop = loop;
23
+ this.streamId = uuid_1.v4();
24
+ this.audio = new track_1.MediaStreamTrack({ kind: "audio", streamId: this.streamId });
25
+ this.video = new track_1.MediaStreamTrack({ kind: "video", streamId: this.streamId });
26
+ this.setupTrack = (port, track) => {
27
+ let payloadType = 0;
28
+ const socket = dgram_1.createSocket("udp4");
29
+ socket.bind(port);
30
+ socket.on("message", async (buf) => {
31
+ const rtp = src_2.RtpPacket.deSerialize(buf);
32
+ if (!payloadType) {
33
+ payloadType = rtp.header.payloadType;
34
+ }
35
+ // detect gStreamer restarted
36
+ if (payloadType !== rtp.header.payloadType) {
37
+ payloadType = rtp.header.payloadType;
38
+ track.onSourceChanged.execute(rtp.header);
39
+ }
40
+ track.writeRtp(buf);
41
+ });
42
+ };
43
+ this.setupTrack(audioPort, this.audio);
44
+ this.setupTrack(videoPort, this.video);
45
+ }
46
+ async start() {
47
+ let payloadType = 96;
48
+ const run = async () => {
49
+ if (payloadType > 100)
50
+ payloadType = 96;
51
+ const cmd = `gst-launch-1.0 filesrc location= ${this.path} ! \
52
+ qtdemux name=d ! \
53
+ queue ! h264parse ! rtph264pay config-interval=10 pt=${payloadType++} ! \
54
+ udpsink host=127.0.0.1 port=${this.videoPort} d. ! \
55
+ queue ! aacparse ! avdec_aac ! audioresample ! audioconvert ! opusenc ! rtpopuspay pt=${payloadType++} ! \
56
+ udpsink host=127.0.0.1 port=${this.audioPort}`;
57
+ const process = child_process_1.exec(cmd);
58
+ if (this.loop) {
59
+ await new Promise((r) => process.on("close", r));
60
+ run();
61
+ }
62
+ };
63
+ await promises_1.setImmediate();
64
+ run();
65
+ }
66
+ }
67
+ //# sourceMappingURL=userMedia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userMedia.js","sourceRoot":"","sources":["../../../../src/nonstandard/userMedia.ts"],"names":[],"mappings":"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","sourcesContent":["import { exec } from \"child_process\";\nimport { createSocket } from \"dgram\";\nimport { setImmediate } from \"timers/promises\";\nimport { v4 } from \"uuid\";\n\nimport { randomPort } from \"../../../ice/src\";\nimport { RtpPacket } from \"../../../rtp/src\";\nimport { MediaStreamTrack } from \"../media/track\";\n\nexport const getUserMp4 = async (path: string, loop?: boolean) => {\n const audioPort = await randomPort();\n const videoPort = await randomPort();\n\n return new MediaMp4(audioPort, videoPort, path, loop);\n};\n\nclass MediaMp4 {\n private streamId = v4();\n audio = new MediaStreamTrack({ kind: \"audio\", streamId: this.streamId });\n video = new MediaStreamTrack({ kind: \"video\", streamId: this.streamId });\n\n constructor(\n private videoPort: number,\n private audioPort: number,\n private path: string,\n private loop?: boolean\n ) {\n this.setupTrack(audioPort, this.audio);\n this.setupTrack(videoPort, this.video);\n }\n\n private setupTrack = (port: number, track: MediaStreamTrack) => {\n let payloadType = 0;\n\n const socket = createSocket(\"udp4\");\n socket.bind(port);\n socket.on(\"message\", async (buf) => {\n const rtp = RtpPacket.deSerialize(buf);\n if (!payloadType) {\n payloadType = rtp.header.payloadType;\n }\n\n // detect gStreamer restarted\n if (payloadType !== rtp.header.payloadType) {\n payloadType = rtp.header.payloadType;\n track.onSourceChanged.execute(rtp.header);\n }\n\n track.writeRtp(buf);\n });\n };\n\n async start() {\n let payloadType = 96;\n const run = async () => {\n if (payloadType > 100) payloadType = 96;\n\n const cmd = `gst-launch-1.0 filesrc location= ${this.path} ! \\\nqtdemux name=d ! \\\nqueue ! h264parse ! rtph264pay config-interval=10 pt=${payloadType++} ! \\\nudpsink host=127.0.0.1 port=${this.videoPort} d. ! \\\nqueue ! aacparse ! avdec_aac ! audioresample ! audioconvert ! opusenc ! rtpopuspay pt=${payloadType++} ! \\\nudpsink host=127.0.0.1 port=${this.audioPort}`;\n const process = exec(cmd);\n\n if (this.loop) {\n await new Promise((r) => process.on(\"close\", r));\n run();\n }\n };\n await setImmediate();\n run();\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import { MediaStreamTrack } from "../media/track";
2
+ export declare class WebmFactory {
3
+ path: string;
4
+ options: TrackOptions;
5
+ private relativeTimestamp;
6
+ private disposer?;
7
+ private position;
8
+ private staticPartOffset;
9
+ private queue;
10
+ /**video cuePoints (keyframe) */
11
+ private cuePoints;
12
+ private tracks;
13
+ constructor(tracks: MediaStreamTrack[], path: string, options?: TrackOptions);
14
+ start(): Promise<void>;
15
+ stop(): Promise<void>;
16
+ private write;
17
+ private appendCluster;
18
+ private appendCuePoint;
19
+ }
20
+ declare type TrackOptions = Partial<{
21
+ width: number;
22
+ height: number;
23
+ }>;
24
+ export {};