werift 0.13.7 → 0.14.2-debug0

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 (76) hide show
  1. package/lib/common/src/binary.d.ts +10 -0
  2. package/lib/common/src/binary.js +83 -1
  3. package/lib/common/src/binary.js.map +1 -1
  4. package/lib/dtls/src/context/cipher.d.ts +1 -2
  5. package/lib/dtls/src/context/cipher.js +69 -68
  6. package/lib/dtls/src/context/cipher.js.map +1 -1
  7. package/lib/ice/src/ice.js +10 -4
  8. package/lib/ice/src/ice.js.map +1 -1
  9. package/lib/rtp/src/index.d.ts +12 -9
  10. package/lib/rtp/src/index.js +12 -18
  11. package/lib/rtp/src/index.js.map +1 -1
  12. package/lib/rtp/src/processor/jitterBuffer.js +1 -1
  13. package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
  14. package/lib/rtp/src/processor/webm.d.ts +5 -1
  15. package/lib/rtp/src/processor/webm.js +12 -29
  16. package/lib/rtp/src/processor/webm.js.map +1 -1
  17. package/lib/rtp/src/rtp/red/encoder.d.ts +14 -0
  18. package/lib/rtp/src/rtp/red/encoder.js +40 -0
  19. package/lib/rtp/src/rtp/red/encoder.js.map +1 -0
  20. package/lib/rtp/src/rtp/{red.d.ts → red/packet.d.ts} +5 -5
  21. package/lib/rtp/src/rtp/red/packet.js +115 -0
  22. package/lib/rtp/src/rtp/red/packet.js.map +1 -0
  23. package/lib/rtp/src/rtp/rtp.d.ts +1 -1
  24. package/lib/rtp/src/rtp/rtp.js +1 -1
  25. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  26. package/lib/sctp/src/sctp.d.ts +2 -1
  27. package/lib/sctp/src/sctp.js +4 -2
  28. package/lib/sctp/src/sctp.js.map +1 -1
  29. package/lib/webrtc/src/const.d.ts +2 -0
  30. package/lib/webrtc/src/const.js +3 -1
  31. package/lib/webrtc/src/const.js.map +1 -1
  32. package/lib/webrtc/src/index.d.ts +1 -0
  33. package/lib/webrtc/src/index.js +1 -0
  34. package/lib/webrtc/src/index.js.map +1 -1
  35. package/lib/webrtc/src/media/parameters.d.ts +1 -1
  36. package/lib/webrtc/src/media/parameters.js +0 -1
  37. package/lib/webrtc/src/media/parameters.js.map +1 -1
  38. package/lib/webrtc/src/media/receiver/red.js +8 -6
  39. package/lib/webrtc/src/media/receiver/red.js.map +1 -1
  40. package/lib/webrtc/src/media/rtpReceiver.d.ts +1 -1
  41. package/lib/webrtc/src/media/rtpReceiver.js +3 -1
  42. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  43. package/lib/webrtc/src/media/rtpSender.d.ts +8 -6
  44. package/lib/webrtc/src/media/rtpSender.js +21 -28
  45. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  46. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +21 -1
  47. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  48. package/lib/webrtc/src/peerConnection.d.ts +10 -4
  49. package/lib/webrtc/src/peerConnection.js +39 -12
  50. package/lib/webrtc/src/peerConnection.js.map +1 -1
  51. package/lib/webrtc/src/sdp.d.ts +4 -0
  52. package/lib/webrtc/src/sdp.js +11 -9
  53. package/lib/webrtc/src/sdp.js.map +1 -1
  54. package/lib/webrtc/src/transport/dtls.d.ts +6 -1
  55. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  56. package/lib/webrtc/src/transport/sctp.d.ts +1 -0
  57. package/lib/webrtc/src/transport/sctp.js +5 -1
  58. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  59. package/lib/webrtc/src/utils.d.ts +10 -0
  60. package/lib/webrtc/src/utils.js +8 -1
  61. package/lib/webrtc/src/utils.js.map +1 -1
  62. package/package.json +1 -1
  63. package/src/const.ts +6 -0
  64. package/src/index.ts +1 -0
  65. package/src/media/parameters.ts +1 -1
  66. package/src/media/receiver/red.ts +11 -12
  67. package/src/media/rtpReceiver.ts +3 -1
  68. package/src/media/rtpSender.ts +26 -45
  69. package/src/nonstandard/recorder/writer/webm.ts +3 -0
  70. package/src/peerConnection.ts +52 -15
  71. package/src/sdp.ts +10 -8
  72. package/src/transport/dtls.ts +6 -0
  73. package/src/transport/sctp.ts +6 -1
  74. package/src/utils.ts +9 -0
  75. package/lib/rtp/src/rtp/red.js +0 -104
  76. package/lib/rtp/src/rtp/red.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"rtpReceiver.js","sourceRoot":"","sources":["../../../../src/media/rtpReceiver.ts"],"names":[],"mappings":"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","sourcesContent":["import { debug } from \"debug\";\nimport { jspack } from \"jspack\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { int } from \"../../../common/src\";\nimport {\n PictureLossIndication,\n Red,\n RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpReceiverInfo,\n RtcpRrPacket,\n RtcpSrPacket,\n RtpHeader,\n RtpPacket,\n} from \"../../../rtp/src\";\nimport { RTCDtlsTransport } from \"../transport/dtls\";\nimport { Kind } from \"../types/domain\";\nimport { compactNtp } from \"../utils\";\nimport { RTP_EXTENSION_URI } from \"./extension/rtpExtension\";\nimport { RTCRtpCodecParameters, RTCRtpReceiveParameters } from \"./parameters\";\nimport { Nack } from \"./receiver/nack\";\nimport { ReceiverTWCC } from \"./receiver/receiverTwcc\";\nimport { RedHandler } from \"./receiver/red\";\nimport { StreamStatistics } from \"./receiver/statistics\";\nimport { Extensions } from \"./router\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpReceiver.ts\");\n\nexport class RTCRtpReceiver {\n private readonly codecs: { [pt: number]: RTCRtpCodecParameters } = {};\n private readonly ssrcByRtx: { [rtxSsrc: number]: number } = {};\n private readonly nack = new Nack(this);\n private readonly redHandler = new RedHandler();\n\n readonly type = \"receiver\";\n readonly uuid = uuid();\n readonly tracks: MediaStreamTrack[] = [];\n readonly trackBySSRC: { [ssrc: string]: MediaStreamTrack } = {};\n readonly trackByRID: { [rid: string]: MediaStreamTrack } = {};\n // last senderReport\n readonly lsr: { [ssrc: number]: number } = {};\n readonly lsrTime: { [ssrc: number]: number } = {};\n readonly onPacketLost = this.nack.onPacketLost;\n readonly onRtcp = new Event<[RtcpPacket]>();\n\n sdesMid?: string;\n latestRid?: string;\n latestRepairedRid?: string;\n\n receiverTWCC?: ReceiverTWCC;\n supportTWCC = false;\n stopped = false;\n remoteStreamId?: string;\n remoteTrackId?: string;\n\n rtcpRunning = false;\n private rtcpCancel = new AbortController();\n private remoteStreams: { [ssrc: number]: StreamStatistics } = {};\n\n constructor(\n public kind: Kind,\n public dtlsTransport: RTCDtlsTransport,\n public rtcpSsrc: number\n ) {}\n\n // todo fix\n get track() {\n return this.tracks[0];\n }\n\n prepareReceive(params: RTCRtpReceiveParameters) {\n params.codecs.forEach((c) => {\n this.codecs[c.payloadType] = c;\n });\n params.encodings.forEach((e) => {\n if (e.rtx) {\n this.ssrcByRtx[e.rtx.ssrc] = e.ssrc;\n }\n });\n }\n\n /**\n * setup TWCC if supported\n */\n setupTWCC(mediaSourceSsrc?: number) {\n this.supportTWCC = !!Object.values(this.codecs).find((codec) =>\n codec.rtcpFeedback.find((v) => v.type === \"transport-cc\")\n );\n log(\"twcc support\", this.supportTWCC);\n\n if (this.supportTWCC && mediaSourceSsrc) {\n this.receiverTWCC = new ReceiverTWCC(\n this.dtlsTransport,\n this.rtcpSsrc,\n mediaSourceSsrc\n );\n }\n }\n\n addTrack(track: MediaStreamTrack) {\n const exist = this.tracks.find((t) => {\n if (t.rid) return t.rid === track.rid;\n if (t.ssrc) return t.ssrc === track.ssrc;\n });\n if (exist) return false;\n this.tracks.push(track);\n if (track.ssrc) this.trackBySSRC[track.ssrc] = track;\n if (track.rid) this.trackByRID[track.rid] = track;\n return true;\n }\n\n stop() {\n this.stopped = true;\n this.rtcpRunning = false;\n this.rtcpCancel.abort();\n\n if (this.receiverTWCC) this.receiverTWCC.twccRunning = false;\n this.nack.close();\n }\n\n async runRtcp() {\n if (this.rtcpRunning || this.stopped) return;\n this.rtcpRunning = true;\n\n try {\n while (this.rtcpRunning) {\n await setTimeout(500 + Math.random() * 1000, undefined, {\n signal: this.rtcpCancel.signal,\n });\n\n const reports = Object.entries(this.remoteStreams).map(\n ([ssrc, stream]) => {\n let lsr = 0,\n dlsr = 0;\n if (this.lsr[ssrc]) {\n lsr = this.lsr[ssrc];\n const delay = Date.now() / 1000 - this.lsrTime[ssrc];\n if (delay > 0 && delay < 65536) {\n dlsr = int(delay * 65536);\n }\n }\n\n return new RtcpReceiverInfo({\n ssrc: Number(ssrc),\n fractionLost: stream.fraction_lost,\n packetsLost: stream.packets_lost,\n highestSequence: stream.max_seq,\n jitter: stream.jitter,\n lsr,\n dlsr,\n });\n }\n );\n\n const packet = new RtcpRrPacket({ ssrc: this.rtcpSsrc, reports });\n\n try {\n await this.dtlsTransport.sendRtcp([packet]);\n } catch (error) {\n log(\"sendRtcp failed\", error);\n await setTimeout(500 + Math.random() * 1000);\n }\n }\n } catch (error) {}\n }\n\n /**todo impl */\n getStats() {}\n\n async sendRtcpPLI(mediaSsrc: number) {\n const packet = new RtcpPayloadSpecificFeedback({\n feedback: new PictureLossIndication({\n senderSsrc: this.rtcpSsrc,\n mediaSsrc,\n }),\n });\n try {\n await this.dtlsTransport.sendRtcp([packet]);\n } catch (error) {\n log(error);\n }\n }\n\n handleRtcpPacket(packet: RtcpPacket) {\n switch (packet.type) {\n case RtcpSrPacket.type:\n {\n const sr = packet as RtcpSrPacket;\n this.lsr[sr.ssrc] = compactNtp(sr.senderInfo.ntpTimestamp);\n this.lsrTime[sr.ssrc] = Date.now() / 1000;\n\n const track = this.trackBySSRC[packet.ssrc];\n if (track) {\n track.onReceiveRtcp.execute(packet);\n }\n }\n break;\n }\n this.onRtcp.execute(packet);\n }\n\n handleRtpBySsrc = (packet: RtpPacket, extensions: Extensions) => {\n const track = this.trackBySSRC[packet.header.ssrc];\n\n this.handleRTP(packet, extensions, track);\n };\n\n handleRtpByRid = (packet: RtpPacket, rid: string, extensions: Extensions) => {\n const track = this.trackByRID[rid];\n if (!this.trackBySSRC[packet.header.ssrc]) {\n this.trackBySSRC[packet.header.ssrc] = track;\n }\n\n this.handleRTP(packet, extensions, track);\n };\n\n private handleRTP(\n packet: RtpPacket,\n extensions: Extensions,\n track?: MediaStreamTrack\n ) {\n if (this.stopped) return;\n\n const codec = this.codecs[packet.header.payloadType];\n if (!codec) {\n log(\"unknown codec \" + packet.header.payloadType);\n return;\n }\n\n this.remoteStreams[packet.header.ssrc] =\n this.remoteStreams[packet.header.ssrc] ??\n new StreamStatistics(codec.clockRate);\n this.remoteStreams[packet.header.ssrc].add(packet);\n\n if (this.receiverTWCC) {\n const transportSequenceNumber = extensions[\n RTP_EXTENSION_URI.transportWideCC\n ] as number;\n if (!transportSequenceNumber == undefined) {\n throw new Error(\"undefined\");\n }\n\n this.receiverTWCC.handleTWCC(transportSequenceNumber);\n } else if (this.supportTWCC) {\n this.setupTWCC(packet.header.ssrc);\n }\n\n if (codec.name.toLowerCase() === \"rtx\") {\n const originalSsrc = this.ssrcByRtx[packet.header.ssrc];\n const rtxCodec = this.codecs[codec.parameters[\"apt\"]];\n if (packet.payload.length < 2) return;\n\n packet = unwrapRtx(packet, rtxCodec.payloadType, originalSsrc);\n track = this.trackBySSRC[originalSsrc];\n }\n\n let red: Red | undefined;\n if (codec.name.toLowerCase() === \"red\") {\n red = Red.deSerialize(packet.payload);\n }\n\n // todo fix select use or not use nack\n if (track?.kind === \"video\") {\n this.nack.addPacket(packet);\n }\n\n if (track) {\n if (red) {\n const payloads = this.redHandler.push(red, packet);\n for (const packet of payloads) {\n track.onReceiveRtp.execute(packet.clone());\n }\n } else {\n track.onReceiveRtp.execute(packet.clone());\n }\n }\n\n this.runRtcp();\n }\n}\n\nexport function unwrapRtx(rtx: RtpPacket, payloadType: number, ssrc: number) {\n const packet = new RtpPacket(\n new RtpHeader({\n payloadType,\n marker: rtx.header.marker,\n sequenceNumber: jspack.Unpack(\"!H\", rtx.payload.slice(0, 2))[0],\n timestamp: rtx.header.timestamp,\n ssrc,\n }),\n rtx.payload.slice(2)\n );\n return packet;\n}\n"]}
1
+ {"version":3,"file":"rtpReceiver.js","sourceRoot":"","sources":["../../../../src/media/rtpReceiver.ts"],"names":[],"mappings":";;;;;;AAAA,iCAA8B;AAC9B,mCAAgC;AAChC,sDAA4B;AAC5B,8CAA6C;AAC7C,+BAAkC;AAElC,6CAA0C;AAC1C,0CAU0B;AAC1B,0BAA+C;AAG/C,oCAAsC;AACtC,2DAA6D;AAE7D,0CAAuC;AACvC,0DAAuD;AACvD,wCAA4C;AAC5C,sDAAyD;AAIzD,MAAM,GAAG,GAAG,IAAA,aAAK,EAAC,iDAAiD,CAAC,CAAC;AAErE,MAAa,cAAc;IA+BzB,YACS,IAAU,EACV,aAA+B,EAC/B,QAAgB;QAFhB,SAAI,GAAJ,IAAI,CAAM;QACV,kBAAa,GAAb,aAAa,CAAkB;QAC/B,aAAQ,GAAR,QAAQ,CAAQ;QAjCR,WAAM,GAA4C,EAAE,CAAC;QACrD,cAAS,GAAkC,EAAE,CAAC;QAC9C,SAAI,GAAG,IAAI,WAAI,CAAC,IAAI,CAAC,CAAC;QACtB,eAAU,GAAG,IAAI,gBAAU,EAAE,CAAC;QAEtC,SAAI,GAAG,UAAU,CAAC;QAClB,SAAI,GAAG,IAAA,SAAI,GAAE,CAAC;QACd,WAAM,GAAuB,EAAE,CAAC;QAChC,gBAAW,GAAyC,EAAE,CAAC;QACvD,eAAU,GAAwC,EAAE,CAAC;QAC9D,oBAAoB;QACX,QAAG,GAA+B,EAAE,CAAC;QACrC,YAAO,GAA+B,EAAE,CAAC;QACzC,iBAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QACtC,WAAM,GAAG,IAAI,iBAAK,EAAgB,CAAC;QAO5C,gBAAW,GAAG,KAAK,CAAC;QACpB,YAAO,GAAG,KAAK,CAAC;QAIhB,gBAAW,GAAG,KAAK,CAAC;QACZ,eAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,kBAAa,GAAyC,EAAE,CAAC;QAgJjE,oBAAe,GAAG,CAAC,MAAiB,EAAE,UAAsB,EAAE,EAAE;YAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEnD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC;QAEF,mBAAc,GAAG,CAAC,MAAiB,EAAE,GAAW,EAAE,UAAsB,EAAE,EAAE;YAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBACzC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;aAC9C;YAED,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC;IAvJC,CAAC;IAEJ,WAAW;IACX,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,cAAc,CAAC,MAA+B;QAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,IAAI,CAAC,CAAC,GAAG,EAAE;gBACT,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;aACrC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,eAAwB;QAChC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7D,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,CAC1D,CAAC;QACF,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAEtC,IAAI,IAAI,CAAC,WAAW,IAAI,eAAe,EAAE;YACvC,IAAI,CAAC,YAAY,GAAG,IAAI,2BAAY,CAClC,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,QAAQ,EACb,eAAe,CAChB,CAAC;SACH;IACH,CAAC;IAED,QAAQ,CAAC,KAAuB;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACnC,IAAI,CAAC,CAAC,GAAG;gBAAE,OAAO,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC;YACtC,IAAI,CAAC,CAAC,IAAI;gBAAE,OAAO,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC;QAC3C,CAAC,CAAC,CAAC;QACH,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,IAAI;YAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACrD,IAAI,KAAK,CAAC,GAAG;YAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAExB,IAAI,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,KAAK,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,IAAI;YACF,OAAO,IAAI,CAAC,WAAW,EAAE;gBACvB,MAAM,IAAA,qBAAU,EAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE;oBACtD,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;iBAC/B,CAAC,CAAC;gBAEH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CACpD,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;oBACjB,IAAI,GAAG,GAAG,CAAC,EACT,IAAI,GAAG,CAAC,CAAC;oBACX,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;wBAClB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBACrB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBACrD,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,KAAK,EAAE;4BAC9B,IAAI,GAAG,IAAA,SAAG,EAAC,KAAK,GAAG,KAAK,CAAC,CAAC;yBAC3B;qBACF;oBAED,OAAO,IAAI,sBAAgB,CAAC;wBAC1B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;wBAClB,YAAY,EAAE,MAAM,CAAC,aAAa;wBAClC,WAAW,EAAE,MAAM,CAAC,YAAY;wBAChC,eAAe,EAAE,MAAM,CAAC,OAAO;wBAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,GAAG;wBACH,IAAI;qBACL,CAAC,CAAC;gBACL,CAAC,CACF,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAI,kBAAY,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;gBAElE,IAAI;oBACF,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;iBAC7C;gBAAC,OAAO,KAAK,EAAE;oBACd,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;oBAC9B,MAAM,IAAA,qBAAU,EAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;iBAC9C;aACF;SACF;QAAC,OAAO,KAAK,EAAE,GAAE;IACpB,CAAC;IAED,eAAe;IACf,QAAQ,KAAI,CAAC;IAEb,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,MAAM,MAAM,GAAG,IAAI,iCAA2B,CAAC;YAC7C,QAAQ,EAAE,IAAI,2BAAqB,CAAC;gBAClC,UAAU,EAAE,IAAI,CAAC,QAAQ;gBACzB,SAAS;aACV,CAAC;SACH,CAAC,CAAC;QACH,IAAI;YACF,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;SAC7C;QAAC,OAAO,KAAK,EAAE;YACd,GAAG,CAAC,KAAK,CAAC,CAAC;SACZ;IACH,CAAC;IAED,gBAAgB,CAAC,MAAkB;QACjC,QAAQ,MAAM,CAAC,IAAI,EAAE;YACnB,KAAK,kBAAY,CAAC,IAAI;gBACpB;oBACE,MAAM,EAAE,GAAG,MAAsB,CAAC;oBAClC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAA,kBAAU,EAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;oBAC3D,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;oBAE1C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC5C,IAAI,KAAK,EAAE;wBACT,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;qBACrC;iBACF;gBACD,MAAM;SACT;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAiBO,SAAS,CACf,MAAiB,EACjB,UAAsB,EACtB,KAAwB;QAExB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,EAAE;YACV,GAAG,CAAC,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAClD,OAAO;SACR;QAED,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACpC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACtC,IAAI,6BAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEnD,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,MAAM,uBAAuB,GAAG,UAAU,CACxC,gCAAiB,CAAC,eAAe,CACxB,CAAC;YACZ,IAAI,CAAC,uBAAuB,IAAI,SAAS,EAAE;gBACzC,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;aAC9B;YAED,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;SACvD;aAAM,IAAI,IAAI,CAAC,WAAW,EAAE;YAC3B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACpC;QAED,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE;YACtC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,IAAA,6BAAyB,EAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO;YAEtC,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC/D,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;SACxC;QAED,IAAI,GAAoB,CAAC;QACzB,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE;YACtC,GAAG,GAAG,SAAG,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;SACvC;QAED,sCAAsC;QACtC,IAAI,KAAK,EAAE,IAAI,KAAK,OAAO,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;SAC7B;QAED,IAAI,KAAK,EAAE;YACT,IAAI,GAAG,EAAE;gBACP,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACnD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE;oBAC7B,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;iBAC5C;aACF;iBAAM;gBACL,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;aAC5C;SACF;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;CACF;AA5PD,wCA4PC;AAED,SAAgB,SAAS,CAAC,GAAc,EAAE,WAAmB,EAAE,IAAY;IACzE,MAAM,MAAM,GAAG,IAAI,eAAS,CAC1B,IAAI,eAAS,CAAC;QACZ,WAAW;QACX,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;QACzB,cAAc,EAAE,eAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;QAC/B,IAAI;KACL,CAAC,EACF,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CACrB,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAZD,8BAYC","sourcesContent":["import { debug } from \"debug\";\nimport { jspack } from \"jspack\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { int } from \"../../../common/src\";\nimport {\n PictureLossIndication,\n Red,\n RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpReceiverInfo,\n RtcpRrPacket,\n RtcpSrPacket,\n RtpHeader,\n RtpPacket,\n} from \"../../../rtp/src\";\nimport { codecParametersFromString } from \"..\";\nimport { RTCDtlsTransport } from \"../transport/dtls\";\nimport { Kind } from \"../types/domain\";\nimport { compactNtp } from \"../utils\";\nimport { RTP_EXTENSION_URI } from \"./extension/rtpExtension\";\nimport { RTCRtpCodecParameters, RTCRtpReceiveParameters } from \"./parameters\";\nimport { Nack } from \"./receiver/nack\";\nimport { ReceiverTWCC } from \"./receiver/receiverTwcc\";\nimport { RedHandler } from \"./receiver/red\";\nimport { StreamStatistics } from \"./receiver/statistics\";\nimport { Extensions } from \"./router\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpReceiver.ts\");\n\nexport class RTCRtpReceiver {\n private readonly codecs: { [pt: number]: RTCRtpCodecParameters } = {};\n private readonly ssrcByRtx: { [rtxSsrc: number]: number } = {};\n private readonly nack = new Nack(this);\n private readonly redHandler = new RedHandler();\n\n readonly type = \"receiver\";\n readonly uuid = uuid();\n readonly tracks: MediaStreamTrack[] = [];\n readonly trackBySSRC: { [ssrc: string]: MediaStreamTrack } = {};\n readonly trackByRID: { [rid: string]: MediaStreamTrack } = {};\n // last senderReport\n readonly lsr: { [ssrc: number]: number } = {};\n readonly lsrTime: { [ssrc: number]: number } = {};\n readonly onPacketLost = this.nack.onPacketLost;\n readonly onRtcp = new Event<[RtcpPacket]>();\n\n sdesMid?: string;\n latestRid?: string;\n latestRepairedRid?: string;\n\n receiverTWCC?: ReceiverTWCC;\n supportTWCC = false;\n stopped = false;\n remoteStreamId?: string;\n remoteTrackId?: string;\n\n rtcpRunning = false;\n private rtcpCancel = new AbortController();\n private remoteStreams: { [ssrc: number]: StreamStatistics } = {};\n\n constructor(\n public kind: Kind,\n public dtlsTransport: RTCDtlsTransport,\n public rtcpSsrc: number\n ) {}\n\n // todo fix\n get track() {\n return this.tracks[0];\n }\n\n prepareReceive(params: RTCRtpReceiveParameters) {\n params.codecs.forEach((c) => {\n this.codecs[c.payloadType] = c;\n });\n params.encodings.forEach((e) => {\n if (e.rtx) {\n this.ssrcByRtx[e.rtx.ssrc] = e.ssrc;\n }\n });\n }\n\n /**\n * setup TWCC if supported\n */\n setupTWCC(mediaSourceSsrc?: number) {\n this.supportTWCC = !!Object.values(this.codecs).find((codec) =>\n codec.rtcpFeedback.find((v) => v.type === \"transport-cc\")\n );\n log(\"twcc support\", this.supportTWCC);\n\n if (this.supportTWCC && mediaSourceSsrc) {\n this.receiverTWCC = new ReceiverTWCC(\n this.dtlsTransport,\n this.rtcpSsrc,\n mediaSourceSsrc\n );\n }\n }\n\n addTrack(track: MediaStreamTrack) {\n const exist = this.tracks.find((t) => {\n if (t.rid) return t.rid === track.rid;\n if (t.ssrc) return t.ssrc === track.ssrc;\n });\n if (exist) return false;\n this.tracks.push(track);\n if (track.ssrc) this.trackBySSRC[track.ssrc] = track;\n if (track.rid) this.trackByRID[track.rid] = track;\n return true;\n }\n\n stop() {\n this.stopped = true;\n this.rtcpRunning = false;\n this.rtcpCancel.abort();\n\n if (this.receiverTWCC) this.receiverTWCC.twccRunning = false;\n this.nack.close();\n }\n\n async runRtcp() {\n if (this.rtcpRunning || this.stopped) return;\n this.rtcpRunning = true;\n\n try {\n while (this.rtcpRunning) {\n await setTimeout(500 + Math.random() * 1000, undefined, {\n signal: this.rtcpCancel.signal,\n });\n\n const reports = Object.entries(this.remoteStreams).map(\n ([ssrc, stream]) => {\n let lsr = 0,\n dlsr = 0;\n if (this.lsr[ssrc]) {\n lsr = this.lsr[ssrc];\n const delay = Date.now() / 1000 - this.lsrTime[ssrc];\n if (delay > 0 && delay < 65536) {\n dlsr = int(delay * 65536);\n }\n }\n\n return new RtcpReceiverInfo({\n ssrc: Number(ssrc),\n fractionLost: stream.fraction_lost,\n packetsLost: stream.packets_lost,\n highestSequence: stream.max_seq,\n jitter: stream.jitter,\n lsr,\n dlsr,\n });\n }\n );\n\n const packet = new RtcpRrPacket({ ssrc: this.rtcpSsrc, reports });\n\n try {\n await this.dtlsTransport.sendRtcp([packet]);\n } catch (error) {\n log(\"sendRtcp failed\", error);\n await setTimeout(500 + Math.random() * 1000);\n }\n }\n } catch (error) {}\n }\n\n /**todo impl */\n getStats() {}\n\n async sendRtcpPLI(mediaSsrc: number) {\n const packet = new RtcpPayloadSpecificFeedback({\n feedback: new PictureLossIndication({\n senderSsrc: this.rtcpSsrc,\n mediaSsrc,\n }),\n });\n try {\n await this.dtlsTransport.sendRtcp([packet]);\n } catch (error) {\n log(error);\n }\n }\n\n handleRtcpPacket(packet: RtcpPacket) {\n switch (packet.type) {\n case RtcpSrPacket.type:\n {\n const sr = packet as RtcpSrPacket;\n this.lsr[sr.ssrc] = compactNtp(sr.senderInfo.ntpTimestamp);\n this.lsrTime[sr.ssrc] = Date.now() / 1000;\n\n const track = this.trackBySSRC[packet.ssrc];\n if (track) {\n track.onReceiveRtcp.execute(packet);\n }\n }\n break;\n }\n this.onRtcp.execute(packet);\n }\n\n handleRtpBySsrc = (packet: RtpPacket, extensions: Extensions) => {\n const track = this.trackBySSRC[packet.header.ssrc];\n\n this.handleRTP(packet, extensions, track);\n };\n\n handleRtpByRid = (packet: RtpPacket, rid: string, extensions: Extensions) => {\n const track = this.trackByRID[rid];\n if (!this.trackBySSRC[packet.header.ssrc]) {\n this.trackBySSRC[packet.header.ssrc] = track;\n }\n\n this.handleRTP(packet, extensions, track);\n };\n\n private handleRTP(\n packet: RtpPacket,\n extensions: Extensions,\n track?: MediaStreamTrack\n ) {\n if (this.stopped) return;\n\n const codec = this.codecs[packet.header.payloadType];\n if (!codec) {\n log(\"unknown codec \" + packet.header.payloadType);\n return;\n }\n\n this.remoteStreams[packet.header.ssrc] =\n this.remoteStreams[packet.header.ssrc] ??\n new StreamStatistics(codec.clockRate);\n this.remoteStreams[packet.header.ssrc].add(packet);\n\n if (this.receiverTWCC) {\n const transportSequenceNumber = extensions[\n RTP_EXTENSION_URI.transportWideCC\n ] as number;\n if (!transportSequenceNumber == undefined) {\n throw new Error(\"undefined\");\n }\n\n this.receiverTWCC.handleTWCC(transportSequenceNumber);\n } else if (this.supportTWCC) {\n this.setupTWCC(packet.header.ssrc);\n }\n\n if (codec.name.toLowerCase() === \"rtx\") {\n const originalSsrc = this.ssrcByRtx[packet.header.ssrc];\n const codecParams = codecParametersFromString(codec.parameters ?? \"\");\n const rtxCodec = this.codecs[codecParams[\"apt\"]];\n if (packet.payload.length < 2) return;\n\n packet = unwrapRtx(packet, rtxCodec.payloadType, originalSsrc);\n track = this.trackBySSRC[originalSsrc];\n }\n\n let red: Red | undefined;\n if (codec.name.toLowerCase() === \"red\") {\n red = Red.deSerialize(packet.payload);\n }\n\n // todo fix select use or not use nack\n if (track?.kind === \"video\") {\n this.nack.addPacket(packet);\n }\n\n if (track) {\n if (red) {\n const payloads = this.redHandler.push(red, packet);\n for (const packet of payloads) {\n track.onReceiveRtp.execute(packet.clone());\n }\n } else {\n track.onReceiveRtp.execute(packet.clone());\n }\n }\n\n this.runRtcp();\n }\n}\n\nexport function unwrapRtx(rtx: RtpPacket, payloadType: number, ssrc: number) {\n const packet = new RtpPacket(\n new RtpHeader({\n payloadType,\n marker: rtx.header.marker,\n sequenceNumber: jspack.Unpack(\"!H\", rtx.payload.slice(0, 2))[0],\n timestamp: rtx.header.timestamp,\n ssrc,\n }),\n rtx.payload.slice(2)\n );\n return packet;\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  /// <reference types="node" />
2
2
  import Event from "rx.mini";
3
- import { GenericNack, Red, RtcpPacket, RtpHeader, RtpPacket } from "../../../rtp/src";
3
+ import { GenericNack, RedEncoder, RtcpPacket, RtpHeader, RtpPacket } from "../../../rtp/src";
4
4
  import { RTCDtlsTransport } from "../transport/dtls";
5
5
  import { Kind } from "../types/domain";
6
- import { RTCRtpSendParameters } from "./parameters";
6
+ import { RTCRtpCodecParameters, RTCRtpSendParameters } from "./parameters";
7
7
  import { SenderBandwidthEstimator } from "./sender/senderBWE";
8
8
  import { MediaStreamTrack } from "./track";
9
9
  export declare class RTCRtpSender {
@@ -26,8 +26,9 @@ export declare class RTCRtpSender {
26
26
  private repairedRtpStreamId?;
27
27
  private rtxPayloadType?;
28
28
  private rtxSequenceNumber;
29
- private redRedundantPayloadType?;
30
- redDistance: number;
29
+ redRedundantPayloadType?: number;
30
+ private _redDistance;
31
+ redEncoder: RedEncoder;
31
32
  private headerExtensions;
32
33
  private disposeTrack?;
33
34
  private lsr?;
@@ -43,12 +44,14 @@ export declare class RTCRtpSender {
43
44
  private timestampOffset;
44
45
  private seqOffset;
45
46
  private rtpCache;
46
- private codec?;
47
+ codec?: RTCRtpCodecParameters;
47
48
  track?: MediaStreamTrack;
48
49
  stopped: boolean;
49
50
  rtcpRunning: boolean;
50
51
  private rtcpCancel;
51
52
  constructor(trackOrKind: Kind | MediaStreamTrack, dtlsTransport: RTCDtlsTransport);
53
+ get redDistance(): number;
54
+ set redDistance(n: number);
52
55
  prepareSend(params: RTCRtpSendParameters): void;
53
56
  registerTrack(track: MediaStreamTrack): void;
54
57
  replaceTrack(track: MediaStreamTrack | null): Promise<void>;
@@ -59,4 +62,3 @@ export declare class RTCRtpSender {
59
62
  handleRtcpPacket(rtcpPacket: RtcpPacket): void;
60
63
  }
61
64
  export declare function wrapRtx(packet: RtpPacket, payloadType: number, sequenceNumber: number, ssrc: number): RtpPacket;
62
- export declare function buildRedPacket(redundantPackets: RtpPacket[], blockPT: number, presentPacket: RtpPacket): Red;
@@ -22,7 +22,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
22
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
23
23
  };
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.buildRedPacket = exports.wrapRtx = exports.RTCRtpSender = void 0;
25
+ exports.wrapRtx = exports.RTCRtpSender = void 0;
26
26
  const crypto_1 = require("crypto");
27
27
  const debug_1 = __importDefault(require("debug"));
28
28
  const jspack_1 = require("jspack");
@@ -31,6 +31,7 @@ const promises_1 = require("timers/promises");
31
31
  const uuid = __importStar(require("uuid"));
32
32
  const src_1 = require("../../../common/src");
33
33
  const src_2 = require("../../../rtp/src");
34
+ const __1 = require("..");
34
35
  const utils_1 = require("../utils");
35
36
  const rtpExtension_1 = require("./extension/rtpExtension");
36
37
  const senderBWE_1 = require("./sender/senderBWE");
@@ -56,7 +57,8 @@ class RTCRtpSender {
56
57
  this.onGenericNack = new rx_mini_1.default();
57
58
  this.senderBWE = new senderBWE_1.SenderBandwidthEstimator();
58
59
  this.rtxSequenceNumber = (0, src_1.random16)();
59
- this.redDistance = 2;
60
+ this._redDistance = 2;
61
+ this.redEncoder = new src_2.RedEncoder(this._redDistance);
60
62
  this.headerExtensions = [];
61
63
  this.lsrTime = Date.now() / 1000;
62
64
  this.ntpTimestamp = 0n;
@@ -82,6 +84,13 @@ class RTCRtpSender {
82
84
  this.registerTrack(trackOrKind);
83
85
  }
84
86
  }
87
+ get redDistance() {
88
+ return this._redDistance;
89
+ }
90
+ set redDistance(n) {
91
+ this._redDistance = n;
92
+ this.redEncoder.distance = n;
93
+ }
85
94
  prepareSend(params) {
86
95
  this.cname = params.rtcp?.cname;
87
96
  this.mid = params.muxId;
@@ -92,13 +101,14 @@ class RTCRtpSender {
92
101
  if (this.track) {
93
102
  this.track.codec = this.codec;
94
103
  }
95
- params.codecs.forEach((codec, i) => {
104
+ params.codecs.forEach((codec) => {
105
+ const codecParams = (0, __1.codecParametersFromString)(codec.parameters ?? "");
96
106
  if (codec.name.toLowerCase() === "rtx" &&
97
- codec.parameters["apt"] === this.codec.payloadType) {
107
+ codecParams["apt"] === this.codec?.payloadType) {
98
108
  this.rtxPayloadType = codec.payloadType;
99
109
  }
100
110
  if (codec.name.toLowerCase() === "red") {
101
- this.redRedundantPayloadType = params.codecs[i + 1].payloadType;
111
+ this.redRedundantPayloadType = Number((codec.parameters ?? "").split("/")[0]);
102
112
  }
103
113
  });
104
114
  }
@@ -252,13 +262,12 @@ class RTCRtpSender {
252
262
  this.rtpCache = this.rtpCache.slice(-RTP_HISTORY_SIZE);
253
263
  let rtpPayload = rtp.payload;
254
264
  if (this.redRedundantPayloadType) {
255
- const redundantPackets = [...Array(this.redDistance).keys()]
256
- .map((i) => {
257
- return this.rtpCache.find((c) => c.header.sequenceNumber ===
258
- header.sequenceNumber - (this.redDistance - i));
259
- })
260
- .filter((p) => typeof p !== "undefined");
261
- const red = buildRedPacket(redundantPackets, this.redRedundantPayloadType, rtp);
265
+ this.redEncoder.push({
266
+ block: rtpPayload,
267
+ timestamp: header.timestamp,
268
+ blockPT: this.redRedundantPayloadType,
269
+ });
270
+ const red = this.redEncoder.build();
262
271
  rtpPayload = red.serialize();
263
272
  }
264
273
  const size = this.dtlsTransport.sendRtp(rtpPayload, header);
@@ -360,20 +369,4 @@ function wrapRtx(packet, payloadType, sequenceNumber, ssrc) {
360
369
  return rtx;
361
370
  }
362
371
  exports.wrapRtx = wrapRtx;
363
- function buildRedPacket(redundantPackets, blockPT, presentPacket) {
364
- const red = new src_2.Red();
365
- redundantPackets.forEach((redundant) => {
366
- red.payloads.push({
367
- bin: redundant.payload,
368
- blockPT,
369
- timestampOffset: (0, src_1.uint32Add)(presentPacket.header.timestamp, -redundant.header.timestamp),
370
- });
371
- });
372
- red.payloads.push({
373
- bin: presentPacket.payload,
374
- blockPT,
375
- });
376
- return red;
377
- }
378
- exports.buildRedPacket = buildRedPacket;
379
372
  //# sourceMappingURL=rtpSender.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rtpSender.js","sourceRoot":"","sources":["../../../../src/media/rtpSender.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\nimport * as uuid from \"uuid\";\n\nimport {\n bufferWriter,\n random16,\n uint16Add,\n uint32Add,\n} from \"../../../common/src\";\nimport {\n Extension,\n GenericNack,\n PictureLossIndication,\n ReceiverEstimatedMaxBitrate,\n Red,\n RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpRrPacket,\n RtcpSenderInfo,\n RtcpSourceDescriptionPacket,\n RtcpSrPacket,\n RtcpTransportLayerFeedback,\n RtpHeader,\n RtpPacket,\n SourceDescriptionChunk,\n SourceDescriptionItem,\n TransportWideCC,\n} from \"../../../rtp/src\";\nimport { RTCDtlsTransport } from \"../transport/dtls\";\nimport { Kind } from \"../types/domain\";\nimport { compactNtp, milliTime, ntpTime } from \"../utils\";\nimport { RTP_EXTENSION_URI } from \"./extension/rtpExtension\";\nimport {\n RTCRtpCodecParameters,\n RTCRtpHeaderExtensionParameters,\n RTCRtpSendParameters,\n} from \"./parameters\";\nimport { SenderBandwidthEstimator, SentInfo } from \"./sender/senderBWE\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpSender.ts\");\n\nconst RTP_HISTORY_SIZE = 128;\nconst RTT_ALPHA = 0.85;\n\nexport class RTCRtpSender {\n readonly type = \"sender\";\n readonly kind =\n typeof this.trackOrKind === \"string\"\n ? this.trackOrKind\n : this.trackOrKind.kind;\n readonly ssrc = jspack.Unpack(\"!L\", randomBytes(4))[0];\n readonly rtxSsrc = jspack.Unpack(\"!L\", randomBytes(4))[0];\n streamId = uuid.v4();\n readonly trackId = uuid.v4();\n readonly onReady = new Event();\n readonly onRtcp = new Event<[RtcpPacket]>();\n readonly onPictureLossIndication = new Event<[]>();\n readonly onGenericNack = new Event<[GenericNack]>();\n readonly senderBWE = new SenderBandwidthEstimator();\n\n private cname?: string;\n private mid?: string;\n private rtpStreamId?: string;\n private repairedRtpStreamId?: string;\n private rtxPayloadType?: number;\n private rtxSequenceNumber = random16();\n private redRedundantPayloadType?: number;\n redDistance = 2;\n private headerExtensions: RTCRtpHeaderExtensionParameters[] = [];\n private disposeTrack?: () => void;\n\n // # stats\n private lsr?: number;\n private lsrTime: number = Date.now() / 1000;\n private ntpTimestamp = 0n;\n private rtpTimestamp = 0;\n private octetCount = 0;\n private packetCount = 0;\n private rtt?: number;\n receiverEstimatedMaxBitrate: bigint = 0n;\n\n // rtp\n private sequenceNumber?: number;\n private timestamp?: number;\n private timestampOffset = 0;\n private seqOffset = 0;\n private rtpCache: RtpPacket[] = [];\n private codec?: RTCRtpCodecParameters;\n\n track?: MediaStreamTrack;\n stopped = false;\n rtcpRunning = false;\n private rtcpCancel = new AbortController();\n\n constructor(\n public trackOrKind: Kind | MediaStreamTrack,\n public dtlsTransport: RTCDtlsTransport\n ) {\n dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"connected\") {\n this.onReady.execute();\n }\n });\n if (trackOrKind instanceof MediaStreamTrack) {\n if (trackOrKind.streamId) {\n this.streamId = trackOrKind.streamId;\n }\n this.registerTrack(trackOrKind);\n }\n }\n\n prepareSend(params: RTCRtpSendParameters) {\n this.cname = params.rtcp?.cname;\n this.mid = params.muxId;\n this.headerExtensions = params.headerExtensions;\n this.rtpStreamId = params.rtpStreamId;\n this.repairedRtpStreamId = params.repairedRtpStreamId;\n\n this.codec = params.codecs[0];\n if (this.track) {\n this.track.codec = this.codec;\n }\n\n params.codecs.forEach((codec, i) => {\n if (\n codec.name.toLowerCase() === \"rtx\" &&\n codec.parameters[\"apt\"] === this.codec!.payloadType\n ) {\n this.rtxPayloadType = codec.payloadType;\n }\n if (codec.name.toLowerCase() === \"red\") {\n this.redRedundantPayloadType = params.codecs[i + 1].payloadType;\n }\n });\n }\n\n registerTrack(track: MediaStreamTrack) {\n if (track.stopped) throw new Error(\"track is ended\");\n\n if (this.disposeTrack) {\n this.disposeTrack();\n }\n\n track.id = this.trackId;\n\n const { unSubscribe } = track.onReceiveRtp.subscribe((rtp) => {\n this.sendRtp(rtp);\n });\n this.track = track;\n this.disposeTrack = unSubscribe;\n\n if (this.codec) {\n track.codec = this.codec;\n }\n\n track.onSourceChanged.subscribe((header) => {\n this.replaceRTP(header);\n });\n }\n\n async replaceTrack(track: MediaStreamTrack | null) {\n if (track === null) {\n // todo impl\n return;\n }\n\n if (track.stopped) throw new Error(\"track is ended\");\n\n if (this.sequenceNumber != undefined) {\n const header =\n track.header || (await track.onReceiveRtp.asPromise())[0].header;\n\n this.replaceRTP(header);\n }\n\n this.registerTrack(track);\n log(\"replaceTrack\", \"ssrc\", track.ssrc, \"rid\", track.rid);\n }\n\n stop() {\n this.stopped = true;\n this.rtcpRunning = false;\n this.rtcpCancel.abort();\n\n this.track = undefined;\n }\n\n async runRtcp() {\n if (this.rtcpRunning || this.stopped) return;\n this.rtcpRunning = true;\n\n try {\n while (this.rtcpRunning) {\n await setTimeout(500 + Math.random() * 1000, undefined, {\n signal: this.rtcpCancel.signal,\n });\n\n const packets: RtcpPacket[] = [\n new RtcpSrPacket({\n ssrc: this.ssrc,\n senderInfo: new RtcpSenderInfo({\n ntpTimestamp: this.ntpTimestamp,\n rtpTimestamp: this.rtpTimestamp,\n packetCount: this.packetCount,\n octetCount: this.octetCount,\n }),\n }),\n ];\n this.lsr = compactNtp(this.ntpTimestamp);\n this.lsrTime = Date.now() / 1000;\n\n if (this.cname) {\n packets.push(\n new RtcpSourceDescriptionPacket({\n chunks: [\n new SourceDescriptionChunk({\n source: this.ssrc,\n items: [\n new SourceDescriptionItem({ type: 1, text: this.cname }),\n ],\n }),\n ],\n })\n );\n }\n\n try {\n await this.dtlsTransport.sendRtcp(packets);\n } catch (error) {\n log(\"sendRtcp failed\", error);\n await setTimeout(500 + Math.random() * 1000);\n }\n }\n } catch (error) {}\n }\n\n replaceRTP({\n sequenceNumber,\n timestamp,\n }: Pick<RtpHeader, \"sequenceNumber\" | \"timestamp\">) {\n if (this.sequenceNumber != undefined) {\n this.seqOffset = uint16Add(this.sequenceNumber, -sequenceNumber);\n }\n if (this.timestamp != undefined) {\n this.timestampOffset = uint32Add(this.timestamp, -timestamp);\n }\n this.rtpCache = [];\n log(\"replaceRTP\", this.sequenceNumber, sequenceNumber, this.seqOffset);\n }\n\n sendRtp(rtp: Buffer | RtpPacket) {\n if (this.dtlsTransport.state !== \"connected\" || !this.codec) {\n return;\n }\n\n rtp = Buffer.isBuffer(rtp) ? RtpPacket.deSerialize(rtp) : rtp;\n\n const header = rtp.header;\n header.ssrc = this.ssrc;\n header.payloadType = this.codec.payloadType;\n header.timestamp = uint32Add(header.timestamp, this.timestampOffset);\n header.sequenceNumber = uint16Add(header.sequenceNumber, this.seqOffset);\n this.timestamp = header.timestamp;\n this.sequenceNumber = header.sequenceNumber;\n\n header.extensions = this.headerExtensions\n .map((extension) => {\n const payload = (() => {\n switch (extension.uri) {\n case RTP_EXTENSION_URI.sdesMid:\n if (this.mid) {\n return Buffer.from(this.mid);\n }\n return;\n // todo : sender simulcast unsupported now\n case RTP_EXTENSION_URI.sdesRTPStreamID:\n if (this.rtpStreamId) {\n return Buffer.from(this.rtpStreamId);\n }\n return;\n // todo : sender simulcast unsupported now\n case RTP_EXTENSION_URI.repairedRtpStreamId:\n if (this.repairedRtpStreamId) {\n return Buffer.from(this.repairedRtpStreamId);\n }\n return;\n case RTP_EXTENSION_URI.transportWideCC:\n this.dtlsTransport.transportSequenceNumber = uint16Add(\n this.dtlsTransport.transportSequenceNumber,\n 1\n );\n return bufferWriter(\n [2],\n [this.dtlsTransport.transportSequenceNumber]\n );\n case RTP_EXTENSION_URI.absSendTime:\n const buf = Buffer.alloc(3);\n const time = (ntpTime() >> 14n) & 0x00ffffffn;\n buf.writeUIntBE(Number(time), 0, 3);\n return buf;\n }\n })();\n\n if (payload) return { id: extension.id, payload };\n })\n .filter((v) => v) as Extension[];\n\n this.ntpTimestamp = ntpTime();\n this.rtpTimestamp = rtp.header.timestamp;\n this.octetCount += rtp.payload.length;\n this.packetCount = uint32Add(this.packetCount, 1);\n\n rtp.header = header;\n\n this.rtpCache.push(rtp);\n this.rtpCache = this.rtpCache.slice(-RTP_HISTORY_SIZE);\n\n let rtpPayload = rtp.payload;\n\n if (this.redRedundantPayloadType) {\n const redundantPackets = [...Array(this.redDistance).keys()]\n .map((i) => {\n return this.rtpCache.find(\n (c) =>\n c.header.sequenceNumber ===\n header.sequenceNumber - (this.redDistance - i)\n );\n })\n .filter((p): p is NonNullable<typeof p> => typeof p !== \"undefined\");\n const red = buildRedPacket(\n redundantPackets,\n this.redRedundantPayloadType,\n rtp\n );\n rtpPayload = red.serialize();\n }\n\n const size = this.dtlsTransport.sendRtp(rtpPayload, header);\n\n this.runRtcp();\n const sentInfo: SentInfo = {\n wideSeq: this.dtlsTransport.transportSequenceNumber,\n size,\n sendingAtMs: milliTime(),\n sentAtMs: milliTime(),\n };\n this.senderBWE.rtpPacketSent(sentInfo);\n }\n\n handleRtcpPacket(rtcpPacket: RtcpPacket) {\n switch (rtcpPacket.type) {\n case RtcpSrPacket.type:\n case RtcpRrPacket.type:\n {\n const packet = rtcpPacket as RtcpSrPacket | RtcpRrPacket;\n packet.reports\n .filter((report) => report.ssrc === this.ssrc)\n .forEach((report) => {\n if (this.lsr === report.lsr && report.dlsr) {\n const rtt =\n Date.now() / 1000 - this.lsrTime - report.dlsr / 65536;\n if (this.rtt === undefined) {\n this.rtt = rtt;\n } else {\n this.rtt = RTT_ALPHA * this.rtt + (1 - RTT_ALPHA) * rtt;\n }\n }\n });\n }\n break;\n case RtcpTransportLayerFeedback.type:\n {\n const packet = rtcpPacket as RtcpTransportLayerFeedback;\n switch (packet.feedback.count) {\n case TransportWideCC.count:\n {\n const feedback = packet.feedback as TransportWideCC;\n this.senderBWE.receiveTWCC(feedback);\n }\n break;\n case GenericNack.count:\n {\n const feedback = packet.feedback as GenericNack;\n feedback.lost.forEach((seqNum) => {\n let packet = this.rtpCache.find(\n (rtp) => rtp.header.sequenceNumber === seqNum\n );\n if (packet) {\n if (this.rtxPayloadType != undefined) {\n packet = wrapRtx(\n packet,\n this.rtxPayloadType,\n this.rtxSequenceNumber,\n this.rtxSsrc\n );\n this.rtxSequenceNumber = uint16Add(\n this.rtxSequenceNumber,\n 1\n );\n }\n this.dtlsTransport.sendRtp(packet.payload, packet.header);\n }\n });\n this.onGenericNack.execute(feedback);\n }\n break;\n }\n }\n break;\n case RtcpPayloadSpecificFeedback.type:\n {\n const packet = rtcpPacket as RtcpPayloadSpecificFeedback;\n switch (packet.feedback.count) {\n case ReceiverEstimatedMaxBitrate.count:\n {\n const feedback = packet.feedback as ReceiverEstimatedMaxBitrate;\n this.receiverEstimatedMaxBitrate = feedback.bitrate;\n }\n break;\n case PictureLossIndication.count:\n {\n this.onPictureLossIndication.execute();\n }\n break;\n }\n }\n break;\n }\n this.onRtcp.execute(rtcpPacket);\n }\n}\n\nexport function wrapRtx(\n packet: RtpPacket,\n payloadType: number,\n sequenceNumber: number,\n ssrc: number\n) {\n const rtx = new RtpPacket(\n new RtpHeader({\n payloadType,\n marker: packet.header.marker,\n sequenceNumber,\n timestamp: packet.header.timestamp,\n ssrc,\n csrc: packet.header.csrc,\n extensions: packet.header.extensions,\n }),\n Buffer.concat([\n Buffer.from(jspack.Pack(\"!H\", [packet.header.sequenceNumber])),\n packet.payload,\n ])\n );\n return rtx;\n}\n\nexport function buildRedPacket(\n redundantPackets: RtpPacket[],\n blockPT: number,\n presentPacket: RtpPacket\n) {\n const red = new Red();\n redundantPackets.forEach((redundant) => {\n red.payloads.push({\n bin: redundant.payload,\n blockPT,\n timestampOffset: uint32Add(\n presentPacket.header.timestamp,\n -redundant.header.timestamp\n ),\n });\n });\n\n red.payloads.push({\n bin: presentPacket.payload,\n blockPT,\n });\n return red;\n}\n"]}
1
+ {"version":3,"file":"rtpSender.js","sourceRoot":"","sources":["../../../../src/media/rtpSender.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\nimport debug from \"debug\";\nimport { jspack } from \"jspack\";\nimport Event from \"rx.mini\";\nimport { setTimeout } from \"timers/promises\";\nimport * as uuid from \"uuid\";\n\nimport {\n bufferWriter,\n random16,\n uint16Add,\n uint32Add,\n} from \"../../../common/src\";\nimport {\n Extension,\n GenericNack,\n PictureLossIndication,\n ReceiverEstimatedMaxBitrate,\n RedEncoder,\n RtcpPacket,\n RtcpPayloadSpecificFeedback,\n RtcpRrPacket,\n RtcpSenderInfo,\n RtcpSourceDescriptionPacket,\n RtcpSrPacket,\n RtcpTransportLayerFeedback,\n RtpHeader,\n RtpPacket,\n SourceDescriptionChunk,\n SourceDescriptionItem,\n TransportWideCC,\n} from \"../../../rtp/src\";\nimport { codecParametersFromString } from \"..\";\nimport { RTCDtlsTransport } from \"../transport/dtls\";\nimport { Kind } from \"../types/domain\";\nimport { compactNtp, milliTime, ntpTime } from \"../utils\";\nimport { RTP_EXTENSION_URI } from \"./extension/rtpExtension\";\nimport {\n RTCRtpCodecParameters,\n RTCRtpHeaderExtensionParameters,\n RTCRtpSendParameters,\n} from \"./parameters\";\nimport { SenderBandwidthEstimator, SentInfo } from \"./sender/senderBWE\";\nimport { MediaStreamTrack } from \"./track\";\n\nconst log = debug(\"werift:packages/webrtc/src/media/rtpSender.ts\");\n\nconst RTP_HISTORY_SIZE = 128;\nconst RTT_ALPHA = 0.85;\n\nexport class RTCRtpSender {\n readonly type = \"sender\";\n readonly kind =\n typeof this.trackOrKind === \"string\"\n ? this.trackOrKind\n : this.trackOrKind.kind;\n readonly ssrc = jspack.Unpack(\"!L\", randomBytes(4))[0];\n readonly rtxSsrc = jspack.Unpack(\"!L\", randomBytes(4))[0];\n streamId = uuid.v4();\n readonly trackId = uuid.v4();\n readonly onReady = new Event();\n readonly onRtcp = new Event<[RtcpPacket]>();\n readonly onPictureLossIndication = new Event<[]>();\n readonly onGenericNack = new Event<[GenericNack]>();\n readonly senderBWE = new SenderBandwidthEstimator();\n\n private cname?: string;\n private mid?: string;\n private rtpStreamId?: string;\n private repairedRtpStreamId?: string;\n private rtxPayloadType?: number;\n private rtxSequenceNumber = random16();\n redRedundantPayloadType?: number;\n private _redDistance = 2;\n redEncoder = new RedEncoder(this._redDistance);\n private headerExtensions: RTCRtpHeaderExtensionParameters[] = [];\n private disposeTrack?: () => void;\n\n // # stats\n private lsr?: number;\n private lsrTime: number = Date.now() / 1000;\n private ntpTimestamp = 0n;\n private rtpTimestamp = 0;\n private octetCount = 0;\n private packetCount = 0;\n private rtt?: number;\n receiverEstimatedMaxBitrate: bigint = 0n;\n\n // rtp\n private sequenceNumber?: number;\n private timestamp?: number;\n private timestampOffset = 0;\n private seqOffset = 0;\n private rtpCache: RtpPacket[] = [];\n codec?: RTCRtpCodecParameters;\n\n track?: MediaStreamTrack;\n stopped = false;\n rtcpRunning = false;\n private rtcpCancel = new AbortController();\n\n constructor(\n public trackOrKind: Kind | MediaStreamTrack,\n public dtlsTransport: RTCDtlsTransport\n ) {\n dtlsTransport.onStateChange.subscribe((state) => {\n if (state === \"connected\") {\n this.onReady.execute();\n }\n });\n if (trackOrKind instanceof MediaStreamTrack) {\n if (trackOrKind.streamId) {\n this.streamId = trackOrKind.streamId;\n }\n this.registerTrack(trackOrKind);\n }\n }\n\n get redDistance() {\n return this._redDistance;\n }\n set redDistance(n: number) {\n this._redDistance = n;\n this.redEncoder.distance = n;\n }\n\n prepareSend(params: RTCRtpSendParameters) {\n this.cname = params.rtcp?.cname;\n this.mid = params.muxId;\n this.headerExtensions = params.headerExtensions;\n this.rtpStreamId = params.rtpStreamId;\n this.repairedRtpStreamId = params.repairedRtpStreamId;\n\n this.codec = params.codecs[0];\n if (this.track) {\n this.track.codec = this.codec;\n }\n\n params.codecs.forEach((codec) => {\n const codecParams = codecParametersFromString(codec.parameters ?? \"\");\n if (\n codec.name.toLowerCase() === \"rtx\" &&\n codecParams[\"apt\"] === this.codec?.payloadType\n ) {\n this.rtxPayloadType = codec.payloadType;\n }\n if (codec.name.toLowerCase() === \"red\") {\n this.redRedundantPayloadType = Number(\n (codec.parameters ?? \"\").split(\"/\")[0]\n );\n }\n });\n }\n\n registerTrack(track: MediaStreamTrack) {\n if (track.stopped) throw new Error(\"track is ended\");\n\n if (this.disposeTrack) {\n this.disposeTrack();\n }\n\n track.id = this.trackId;\n\n const { unSubscribe } = track.onReceiveRtp.subscribe((rtp) => {\n this.sendRtp(rtp);\n });\n this.track = track;\n this.disposeTrack = unSubscribe;\n\n if (this.codec) {\n track.codec = this.codec;\n }\n\n track.onSourceChanged.subscribe((header) => {\n this.replaceRTP(header);\n });\n }\n\n async replaceTrack(track: MediaStreamTrack | null) {\n if (track === null) {\n // todo impl\n return;\n }\n\n if (track.stopped) throw new Error(\"track is ended\");\n\n if (this.sequenceNumber != undefined) {\n const header =\n track.header || (await track.onReceiveRtp.asPromise())[0].header;\n\n this.replaceRTP(header);\n }\n\n this.registerTrack(track);\n log(\"replaceTrack\", \"ssrc\", track.ssrc, \"rid\", track.rid);\n }\n\n stop() {\n this.stopped = true;\n this.rtcpRunning = false;\n this.rtcpCancel.abort();\n\n this.track = undefined;\n }\n\n async runRtcp() {\n if (this.rtcpRunning || this.stopped) return;\n this.rtcpRunning = true;\n\n try {\n while (this.rtcpRunning) {\n await setTimeout(500 + Math.random() * 1000, undefined, {\n signal: this.rtcpCancel.signal,\n });\n\n const packets: RtcpPacket[] = [\n new RtcpSrPacket({\n ssrc: this.ssrc,\n senderInfo: new RtcpSenderInfo({\n ntpTimestamp: this.ntpTimestamp,\n rtpTimestamp: this.rtpTimestamp,\n packetCount: this.packetCount,\n octetCount: this.octetCount,\n }),\n }),\n ];\n this.lsr = compactNtp(this.ntpTimestamp);\n this.lsrTime = Date.now() / 1000;\n\n if (this.cname) {\n packets.push(\n new RtcpSourceDescriptionPacket({\n chunks: [\n new SourceDescriptionChunk({\n source: this.ssrc,\n items: [\n new SourceDescriptionItem({ type: 1, text: this.cname }),\n ],\n }),\n ],\n })\n );\n }\n\n try {\n await this.dtlsTransport.sendRtcp(packets);\n } catch (error) {\n log(\"sendRtcp failed\", error);\n await setTimeout(500 + Math.random() * 1000);\n }\n }\n } catch (error) {}\n }\n\n replaceRTP({\n sequenceNumber,\n timestamp,\n }: Pick<RtpHeader, \"sequenceNumber\" | \"timestamp\">) {\n if (this.sequenceNumber != undefined) {\n this.seqOffset = uint16Add(this.sequenceNumber, -sequenceNumber);\n }\n if (this.timestamp != undefined) {\n this.timestampOffset = uint32Add(this.timestamp, -timestamp);\n }\n this.rtpCache = [];\n log(\"replaceRTP\", this.sequenceNumber, sequenceNumber, this.seqOffset);\n }\n\n sendRtp(rtp: Buffer | RtpPacket) {\n if (this.dtlsTransport.state !== \"connected\" || !this.codec) {\n return;\n }\n\n rtp = Buffer.isBuffer(rtp) ? RtpPacket.deSerialize(rtp) : rtp;\n\n const header = rtp.header;\n header.ssrc = this.ssrc;\n header.payloadType = this.codec.payloadType;\n header.timestamp = uint32Add(header.timestamp, this.timestampOffset);\n header.sequenceNumber = uint16Add(header.sequenceNumber, this.seqOffset);\n this.timestamp = header.timestamp;\n this.sequenceNumber = header.sequenceNumber;\n\n header.extensions = this.headerExtensions\n .map((extension) => {\n const payload = (() => {\n switch (extension.uri) {\n case RTP_EXTENSION_URI.sdesMid:\n if (this.mid) {\n return Buffer.from(this.mid);\n }\n return;\n // todo : sender simulcast unsupported now\n case RTP_EXTENSION_URI.sdesRTPStreamID:\n if (this.rtpStreamId) {\n return Buffer.from(this.rtpStreamId);\n }\n return;\n // todo : sender simulcast unsupported now\n case RTP_EXTENSION_URI.repairedRtpStreamId:\n if (this.repairedRtpStreamId) {\n return Buffer.from(this.repairedRtpStreamId);\n }\n return;\n case RTP_EXTENSION_URI.transportWideCC:\n this.dtlsTransport.transportSequenceNumber = uint16Add(\n this.dtlsTransport.transportSequenceNumber,\n 1\n );\n return bufferWriter(\n [2],\n [this.dtlsTransport.transportSequenceNumber]\n );\n case RTP_EXTENSION_URI.absSendTime:\n const buf = Buffer.alloc(3);\n const time = (ntpTime() >> 14n) & 0x00ffffffn;\n buf.writeUIntBE(Number(time), 0, 3);\n return buf;\n }\n })();\n\n if (payload) return { id: extension.id, payload };\n })\n .filter((v) => v) as Extension[];\n\n this.ntpTimestamp = ntpTime();\n this.rtpTimestamp = rtp.header.timestamp;\n this.octetCount += rtp.payload.length;\n this.packetCount = uint32Add(this.packetCount, 1);\n\n rtp.header = header;\n\n this.rtpCache.push(rtp);\n this.rtpCache = this.rtpCache.slice(-RTP_HISTORY_SIZE);\n\n let rtpPayload = rtp.payload;\n\n if (this.redRedundantPayloadType) {\n this.redEncoder.push({\n block: rtpPayload,\n timestamp: header.timestamp,\n blockPT: this.redRedundantPayloadType,\n });\n const red = this.redEncoder.build();\n rtpPayload = red.serialize();\n }\n\n const size = this.dtlsTransport.sendRtp(rtpPayload, header);\n\n this.runRtcp();\n const sentInfo: SentInfo = {\n wideSeq: this.dtlsTransport.transportSequenceNumber,\n size,\n sendingAtMs: milliTime(),\n sentAtMs: milliTime(),\n };\n this.senderBWE.rtpPacketSent(sentInfo);\n }\n\n handleRtcpPacket(rtcpPacket: RtcpPacket) {\n switch (rtcpPacket.type) {\n case RtcpSrPacket.type:\n case RtcpRrPacket.type:\n {\n const packet = rtcpPacket as RtcpSrPacket | RtcpRrPacket;\n packet.reports\n .filter((report) => report.ssrc === this.ssrc)\n .forEach((report) => {\n if (this.lsr === report.lsr && report.dlsr) {\n const rtt =\n Date.now() / 1000 - this.lsrTime - report.dlsr / 65536;\n if (this.rtt === undefined) {\n this.rtt = rtt;\n } else {\n this.rtt = RTT_ALPHA * this.rtt + (1 - RTT_ALPHA) * rtt;\n }\n }\n });\n }\n break;\n case RtcpTransportLayerFeedback.type:\n {\n const packet = rtcpPacket as RtcpTransportLayerFeedback;\n switch (packet.feedback.count) {\n case TransportWideCC.count:\n {\n const feedback = packet.feedback as TransportWideCC;\n this.senderBWE.receiveTWCC(feedback);\n }\n break;\n case GenericNack.count:\n {\n const feedback = packet.feedback as GenericNack;\n feedback.lost.forEach((seqNum) => {\n let packet = this.rtpCache.find(\n (rtp) => rtp.header.sequenceNumber === seqNum\n );\n if (packet) {\n if (this.rtxPayloadType != undefined) {\n packet = wrapRtx(\n packet,\n this.rtxPayloadType,\n this.rtxSequenceNumber,\n this.rtxSsrc\n );\n this.rtxSequenceNumber = uint16Add(\n this.rtxSequenceNumber,\n 1\n );\n }\n this.dtlsTransport.sendRtp(packet.payload, packet.header);\n }\n });\n this.onGenericNack.execute(feedback);\n }\n break;\n }\n }\n break;\n case RtcpPayloadSpecificFeedback.type:\n {\n const packet = rtcpPacket as RtcpPayloadSpecificFeedback;\n switch (packet.feedback.count) {\n case ReceiverEstimatedMaxBitrate.count:\n {\n const feedback = packet.feedback as ReceiverEstimatedMaxBitrate;\n this.receiverEstimatedMaxBitrate = feedback.bitrate;\n }\n break;\n case PictureLossIndication.count:\n {\n this.onPictureLossIndication.execute();\n }\n break;\n }\n }\n break;\n }\n this.onRtcp.execute(rtcpPacket);\n }\n}\n\nexport function wrapRtx(\n packet: RtpPacket,\n payloadType: number,\n sequenceNumber: number,\n ssrc: number\n) {\n const rtx = new RtpPacket(\n new RtpHeader({\n payloadType,\n marker: packet.header.marker,\n sequenceNumber,\n timestamp: packet.header.timestamp,\n ssrc,\n csrc: packet.header.csrc,\n extensions: packet.header.extensions,\n }),\n Buffer.concat([\n Buffer.from(jspack.Pack(\"!H\", [packet.header.sequenceNumber])),\n packet.payload,\n ])\n );\n return rtx;\n}\n"]}
@@ -1,11 +1,31 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
2
21
  Object.defineProperty(exports, "__esModule", { value: true });
3
22
  exports.WebmFactory = void 0;
23
+ const fs = __importStar(require("fs/promises"));
4
24
  const __1 = require("../../..");
5
25
  const _1 = require(".");
6
26
  class WebmFactory extends _1.MediaWriter {
7
27
  start(tracks) {
8
- this.webm = new __1.WebmOutput("./test.webm", tracks.map((track, i) => {
28
+ this.webm = new __1.WebmOutput(fs, "./test.webm", tracks.map((track, i) => {
9
29
  const trackNumber = i + 1;
10
30
  const payloadType = track.codec.payloadType;
11
31
  if (track.kind === "video") {
@@ -1 +1 @@
1
- {"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/webm.ts"],"names":[],"mappings":";;;AACA,gCAKkB;AAClB,wBAAgC;AAEhC,MAAa,WAAY,SAAQ,cAAW;IAG1C,KAAK,CAAC,MAA0B;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,cAAU,CACxB,aAAa,EACb,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACtB,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,WAAW,GAAG,KAAK,CAAC,KAAM,CAAC,WAAW,CAAC;YAE7C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;gBAC1B,MAAM,KAAK,GAAG,CAAC,GAAmB,EAAE;oBAClC,QAAQ,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAyB,EAAE;wBAC9D,KAAK,KAAK;4BACR,OAAO,KAAK,CAAC;wBACf,KAAK,KAAK;4BACR,OAAO,KAAK,CAAC;wBACf,KAAK,MAAM;4BACT,OAAO,eAAe,CAAC;wBACzB,KAAK,MAAM;4BACT,OAAO,KAAK,CAAC;wBACf;4BACE,MAAM,IAAI,KAAK,EAAE,CAAC;qBACrB;gBACH,CAAC,CAAC,EAAE,CAAC;gBACL,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,KAAK;oBAChB,WAAW;oBACX,WAAW;oBACX,KAAK;oBACL,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;oBACzB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;iBAC5B,CAAC;aACH;iBAAM;gBACL,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,KAAK;oBAChB,WAAW;oBACX,WAAW;oBACX,KAAK,EAAE,MAAM;iBACd,CAAC;aACH;QACH,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,MAAM,aAAa,GACjB,KAAK,CAAC,IAAI,KAAK,OAAO;gBACpB,CAAC,CAAC,IAAI,iBAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC;gBACvD,CAAC,CAAC,IAAI,iBAAa,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC;YACrD,IAAI,gBAAY,CAAC;gBACf,SAAS,EAAE,KAAK,CAAC,YAAY;gBAC7B,UAAU,EAAE,KAAK,CAAC,aAAa;aAChC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,IAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;CACF;AA7DD,kCA6DC;AAED,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC","sourcesContent":["import { SupportedCodec } from \"../../../../../rtp/src/container/webm\";\nimport {\n JitterBuffer,\n MediaStreamTrack,\n SampleBuilder,\n WebmOutput,\n} from \"../../..\";\nimport { MediaWriter } from \".\";\n\nexport class WebmFactory extends MediaWriter {\n webm?: WebmOutput;\n\n start(tracks: MediaStreamTrack[]) {\n this.webm = new WebmOutput(\n \"./test.webm\",\n tracks.map((track, i) => {\n const trackNumber = i + 1;\n const payloadType = track.codec!.payloadType;\n\n if (track.kind === \"video\") {\n const codec = ((): SupportedCodec => {\n switch (track.codec?.name.toLowerCase() as SupportedVideoCodec) {\n case \"vp8\":\n return \"VP8\";\n case \"vp9\":\n return \"VP9\";\n case \"h264\":\n return \"MPEG4/ISO/AVC\";\n case \"av1x\":\n return \"AV1\";\n default:\n throw new Error();\n }\n })();\n return {\n kind: \"video\",\n clockRate: 90000,\n payloadType,\n trackNumber,\n codec,\n width: this.options.width,\n height: this.options.height,\n };\n } else {\n return {\n kind: \"audio\",\n clockRate: 48000,\n payloadType,\n trackNumber,\n codec: \"OPUS\",\n };\n }\n })\n );\n\n tracks.forEach((track) => {\n const sampleBuilder =\n track.kind === \"video\"\n ? new SampleBuilder((h) => !!h.marker).pipe(this.webm!)\n : new SampleBuilder(() => true).pipe(this.webm!);\n new JitterBuffer({\n rtpStream: track.onReceiveRtp,\n rtcpStream: track.onReceiveRtcp,\n }).pipe(sampleBuilder);\n });\n }\n\n async stop() {\n await this.webm!.stop();\n }\n}\n\nconst supportedVideoCodecs = [\"h264\", \"vp8\", \"vp9\", \"av1x\"] as const;\ntype SupportedVideoCodec = typeof supportedVideoCodecs[number];\n"]}
1
+ {"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../src/nonstandard/recorder/writer/webm.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAGlC,gCAKkB;AAClB,wBAAgC;AAEhC,MAAa,WAAY,SAAQ,cAAW;IAG1C,KAAK,CAAC,MAA0B;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,cAAU,CACxB,EAAE,EACF,aAAa,EACb,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACtB,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,WAAW,GAAG,KAAK,CAAC,KAAM,CAAC,WAAW,CAAC;YAE7C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;gBAC1B,MAAM,KAAK,GAAG,CAAC,GAAmB,EAAE;oBAClC,QAAQ,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAyB,EAAE;wBAC9D,KAAK,KAAK;4BACR,OAAO,KAAK,CAAC;wBACf,KAAK,KAAK;4BACR,OAAO,KAAK,CAAC;wBACf,KAAK,MAAM;4BACT,OAAO,eAAe,CAAC;wBACzB,KAAK,MAAM;4BACT,OAAO,KAAK,CAAC;wBACf;4BACE,MAAM,IAAI,KAAK,EAAE,CAAC;qBACrB;gBACH,CAAC,CAAC,EAAE,CAAC;gBACL,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,KAAK;oBAChB,WAAW;oBACX,WAAW;oBACX,KAAK;oBACL,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;oBACzB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;iBAC5B,CAAC;aACH;iBAAM;gBACL,OAAO;oBACL,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,KAAK;oBAChB,WAAW;oBACX,WAAW;oBACX,KAAK,EAAE,MAAM;iBACd,CAAC;aACH;QACH,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,MAAM,aAAa,GACjB,KAAK,CAAC,IAAI,KAAK,OAAO;gBACpB,CAAC,CAAC,IAAI,iBAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC;gBACvD,CAAC,CAAC,IAAI,iBAAa,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC;YACrD,IAAI,gBAAY,CAAC;gBACf,SAAS,EAAE,KAAK,CAAC,YAAY;gBAC7B,UAAU,EAAE,KAAK,CAAC,aAAa;aAChC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,IAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;CACF;AA9DD,kCA8DC;AAED,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC","sourcesContent":["import * as fs from \"fs/promises\";\n\nimport { SupportedCodec } from \"../../../../../rtp/src/container/webm\";\nimport {\n JitterBuffer,\n MediaStreamTrack,\n SampleBuilder,\n WebmOutput,\n} from \"../../..\";\nimport { MediaWriter } from \".\";\n\nexport class WebmFactory extends MediaWriter {\n webm?: WebmOutput;\n\n start(tracks: MediaStreamTrack[]) {\n this.webm = new WebmOutput(\n fs,\n \"./test.webm\",\n tracks.map((track, i) => {\n const trackNumber = i + 1;\n const payloadType = track.codec!.payloadType;\n\n if (track.kind === \"video\") {\n const codec = ((): SupportedCodec => {\n switch (track.codec?.name.toLowerCase() as SupportedVideoCodec) {\n case \"vp8\":\n return \"VP8\";\n case \"vp9\":\n return \"VP9\";\n case \"h264\":\n return \"MPEG4/ISO/AVC\";\n case \"av1x\":\n return \"AV1\";\n default:\n throw new Error();\n }\n })();\n return {\n kind: \"video\",\n clockRate: 90000,\n payloadType,\n trackNumber,\n codec,\n width: this.options.width,\n height: this.options.height,\n };\n } else {\n return {\n kind: \"audio\",\n clockRate: 48000,\n payloadType,\n trackNumber,\n codec: \"OPUS\",\n };\n }\n })\n );\n\n tracks.forEach((track) => {\n const sampleBuilder =\n track.kind === \"video\"\n ? new SampleBuilder((h) => !!h.marker).pipe(this.webm!)\n : new SampleBuilder(() => true).pipe(this.webm!);\n new JitterBuffer({\n rtpStream: track.onReceiveRtp,\n rtcpStream: track.onReceiveRtcp,\n }).pipe(sampleBuilder);\n });\n }\n\n async stop() {\n await this.webm!.stop();\n }\n}\n\nconst supportedVideoCodecs = [\"h264\", \"vp8\", \"vp9\", \"av1x\"] as const;\ntype SupportedVideoCodec = typeof supportedVideoCodecs[number];\n"]}
@@ -1,4 +1,5 @@
1
1
  import Event from "rx.mini";
2
+ import { DtlsKeys } from ".";
2
3
  import { RTCDataChannel } from "./dataChannel";
3
4
  import { EventTarget } from "./helper";
4
5
  import { RTCRtpCodecParameters, RTCRtpHeaderExtensionParameters } from "./media/parameters";
@@ -28,7 +29,7 @@ export declare class RTCPeerConnection extends EventTarget {
28
29
  readonly iceGatheringStateChange: Event<["new" | "complete" | "gathering"]>;
29
30
  readonly iceConnectionStateChange: Event<["disconnected" | "closed" | "completed" | "new" | "connected" | "failed" | "checking"]>;
30
31
  readonly signalingStateChange: Event<["closed" | "stable" | "have-local-offer" | "have-remote-offer" | "have-local-pranswer" | "have-remote-pranswer"]>;
31
- readonly connectionStateChange: Event<["disconnected" | "closed" | "new" | "connected" | "failed" | "connecting"]>;
32
+ readonly connectionStateChange: Event<["disconnected" | "closed" | "new" | "connected" | "connecting" | "failed"]>;
32
33
  readonly onDataChannel: Event<[RTCDataChannel]>;
33
34
  readonly onRemoteTransceiverAdded: Event<[RTCRtpTransceiver]>;
34
35
  /**
@@ -47,7 +48,7 @@ export declare class RTCPeerConnection extends EventTarget {
47
48
  onconnectionstatechange?: Callback;
48
49
  private readonly router;
49
50
  private readonly certificates;
50
- private sctpRemotePort?;
51
+ sctpRemotePort?: number;
51
52
  private seenMid;
52
53
  private currentLocalDescription?;
53
54
  private currentRemoteDescription?;
@@ -55,7 +56,7 @@ export declare class RTCPeerConnection extends EventTarget {
55
56
  private pendingRemoteDescription?;
56
57
  private isClosed;
57
58
  private shouldNegotiationneeded;
58
- constructor({ codecs, headerExtensions, iceServers, iceTransportPolicy, icePortRange, }?: Partial<PeerConfig>);
59
+ constructor({ codecs, headerExtensions, iceServers, iceTransportPolicy, icePortRange, dtls, }?: Partial<PeerConfig>);
59
60
  get localDescription(): import("./sdp").RTCSessionDescription | undefined;
60
61
  get remoteDescription(): import("./sdp").RTCSessionDescription | undefined;
61
62
  private get _localDescription();
@@ -94,7 +95,9 @@ export declare class RTCPeerConnection extends EventTarget {
94
95
  getTransceivers(): RTCRtpTransceiver[];
95
96
  getSenders(): RTCRtpSender[];
96
97
  getReceivers(): RTCRtpReceiver[];
97
- addTrack(track: MediaStreamTrack, ms?: MediaStream): RTCRtpSender;
98
+ addTrack(track: MediaStreamTrack,
99
+ /**todo impl */
100
+ ms?: MediaStream): RTCRtpSender;
98
101
  createAnswer(): Promise<import("./sdp").RTCSessionDescription>;
99
102
  close(): Promise<void>;
100
103
  private assertNotClosed;
@@ -121,6 +124,9 @@ export interface PeerConfig {
121
124
  iceServers: RTCIceServer[];
122
125
  /**Minimum port and Maximum port must not be the same value */
123
126
  icePortRange: [number, number] | undefined;
127
+ dtls: Partial<{
128
+ keys: DtlsKeys;
129
+ }>;
124
130
  }
125
131
  export declare const findCodecByMimeType: (codecs: RTCRtpCodecParameters[], target: RTCRtpCodecParameters) => RTCRtpCodecParameters | undefined;
126
132
  export declare type RTCIceServer = {
@@ -27,6 +27,7 @@ const debug_1 = __importDefault(require("debug"));
27
27
  const lodash_1 = require("lodash");
28
28
  const rx_mini_1 = __importDefault(require("rx.mini"));
29
29
  const uuid = __importStar(require("uuid"));
30
+ const _1 = require(".");
30
31
  const const_1 = require("./const");
31
32
  const dataChannel_1 = require("./dataChannel");
32
33
  const helper_1 = require("./helper");
@@ -43,7 +44,7 @@ const sctp_1 = require("./transport/sctp");
43
44
  const utils_1 = require("./utils");
44
45
  const log = (0, debug_1.default)("werift:packages/webrtc/src/peerConnection.ts");
45
46
  class RTCPeerConnection extends helper_1.EventTarget {
46
- constructor({ codecs, headerExtensions, iceServers, iceTransportPolicy, icePortRange, } = {}) {
47
+ constructor({ codecs, headerExtensions, iceServers, iceTransportPolicy, icePortRange, dtls, } = {}) {
47
48
  super();
48
49
  this.cname = uuid.v4();
49
50
  this.masterTransportEstablished = false;
@@ -101,15 +102,26 @@ class RTCPeerConnection extends helper_1.EventTarget {
101
102
  this.configuration.codecs.audio = codecs.audio;
102
103
  if (codecs?.video)
103
104
  this.configuration.codecs.video = codecs.video;
104
- [
105
+ for (const [i, codecParams] of (0, helper_1.enumerate)([
105
106
  ...(this.configuration.codecs.audio || []),
106
107
  ...(this.configuration.codecs.video || []),
107
- ].forEach((v, i) => {
108
- v.payloadType = 96 + i;
109
- if (v.name.toLowerCase() === "rtx") {
110
- v.parameters = { apt: v.payloadType - 1 };
108
+ ])) {
109
+ codecParams.payloadType = 96 + i;
110
+ switch (codecParams.name.toLowerCase()) {
111
+ case "rtx":
112
+ {
113
+ codecParams.parameters = `apt=${codecParams.payloadType - 1}`;
114
+ }
115
+ break;
116
+ case "red":
117
+ {
118
+ const redundant = codecParams.payloadType + 1;
119
+ codecParams.parameters = `${redundant}/${redundant}`;
120
+ codecParams.payloadType = 63;
121
+ }
122
+ break;
111
123
  }
112
- });
124
+ }
113
125
  if (headerExtensions?.audio)
114
126
  this.configuration.headerExtensions.audio = headerExtensions.audio;
115
127
  if (headerExtensions?.video)
@@ -120,6 +132,12 @@ class RTCPeerConnection extends helper_1.EventTarget {
120
132
  ].forEach((v, i) => {
121
133
  v.id = 1 + i;
122
134
  });
135
+ if (dtls) {
136
+ const { keys } = dtls;
137
+ if (keys) {
138
+ this.certificates.push(new dtls_1.RTCCertificate(keys.keyPem, keys.certPem, keys.signatureHash));
139
+ }
140
+ }
123
141
  this.iceConnectionStateChange.subscribe((state) => {
124
142
  switch (state) {
125
143
  case "disconnected":
@@ -441,7 +459,8 @@ class RTCPeerConnection extends helper_1.EventTarget {
441
459
  headerExtensions: transceiver.headerExtensions,
442
460
  encodings: Object.values(transceiver.codecs.reduce((acc, codec) => {
443
461
  if (codec.name.toLowerCase() === "rtx") {
444
- const apt = acc[codec.parameters["apt"]];
462
+ const params = (0, _1.codecParametersFromString)(codec.parameters ?? "");
463
+ const apt = acc[params["apt"]];
445
464
  if (apt && media.ssrc.length === 2) {
446
465
  apt.rtx = new parameters_1.RTCRtpRtxParameters({ ssrc: media.ssrc[1].ssrc });
447
466
  }
@@ -486,7 +505,8 @@ class RTCPeerConnection extends helper_1.EventTarget {
486
505
  if (!existCodec)
487
506
  return false;
488
507
  if (existCodec?.name.toLowerCase() === "rtx") {
489
- const pt = existCodec.parameters["apt"];
508
+ const params = (0, _1.codecParametersFromString)(existCodec.parameters ?? "");
509
+ const pt = params["apt"];
490
510
  const origin = remoteMedia.rtp.codecs.find((c) => c.payloadType === pt);
491
511
  if (!origin)
492
512
  return false;
@@ -535,14 +555,18 @@ class RTCPeerConnection extends helper_1.EventTarget {
535
555
  transceiver.receiver.setupTWCC(remoteMedia.ssrc[0]?.ssrc);
536
556
  }
537
557
  else if (remoteMedia.kind === "application") {
558
+ // # configure sctp
559
+ this.sctpRemotePort = remoteMedia.sctpPort;
538
560
  if (!this.sctpTransport) {
561
+ if (!this.sctpRemotePort) {
562
+ throw new Error("sctpRemotePort not exist");
563
+ }
539
564
  this.sctpTransport = this.createSctpTransport();
565
+ this.sctpTransport.setRemotePort(this.sctpRemotePort);
540
566
  }
541
567
  if (!this.sctpTransport.mid) {
542
568
  this.sctpTransport.mid = remoteMedia.rtp.muxId;
543
569
  }
544
- // # configure sctp
545
- this.sctpRemotePort = remoteMedia.sctpPort;
546
570
  }
547
571
  if (remoteMedia.iceParams && remoteMedia.dtlsParams) {
548
572
  this.iceTransport.setRemoteParams(remoteMedia.iceParams);
@@ -666,7 +690,9 @@ class RTCPeerConnection extends helper_1.EventTarget {
666
690
  return this.getTransceivers().map((t) => t.receiver);
667
691
  }
668
692
  // todo fix
669
- addTrack(track, ms) {
693
+ addTrack(track,
694
+ /**todo impl */
695
+ ms) {
670
696
  if (this.isClosed)
671
697
  throw new Error("is closed");
672
698
  if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {
@@ -927,5 +953,6 @@ exports.defaultPeerConfig = {
927
953
  iceTransportPolicy: "all",
928
954
  iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
929
955
  icePortRange: undefined,
956
+ dtls: {},
930
957
  };
931
958
  //# sourceMappingURL=peerConnection.js.map