werift 0.14.0 → 0.14.1-debug
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.
- package/lib/common/src/binary.d.ts +10 -0
- package/lib/common/src/binary.js +83 -1
- package/lib/common/src/binary.js.map +1 -1
- package/lib/dtls/src/context/cipher.d.ts +1 -2
- package/lib/dtls/src/context/cipher.js +69 -68
- package/lib/dtls/src/context/cipher.js.map +1 -1
- package/lib/ice/src/ice.js +10 -4
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/rtp/src/index.d.ts +12 -9
- package/lib/rtp/src/index.js +12 -18
- package/lib/rtp/src/index.js.map +1 -1
- package/lib/rtp/src/processor/jitterBuffer.js +1 -1
- package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
- package/lib/rtp/src/rtp/red/encoder.d.ts +18 -0
- package/lib/rtp/src/rtp/red/encoder.js +40 -0
- package/lib/rtp/src/rtp/red/encoder.js.map +1 -0
- package/lib/rtp/src/rtp/{red.d.ts → red/packet.d.ts} +5 -5
- package/lib/rtp/src/rtp/red/packet.js +115 -0
- package/lib/rtp/src/rtp/red/packet.js.map +1 -0
- package/lib/rtp/src/rtp/rtp.d.ts +1 -1
- package/lib/rtp/src/rtp/rtp.js +1 -1
- package/lib/rtp/src/rtp/rtp.js.map +1 -1
- package/lib/webrtc/src/const.d.ts +2 -0
- package/lib/webrtc/src/const.js +3 -1
- package/lib/webrtc/src/const.js.map +1 -1
- package/lib/webrtc/src/index.d.ts +1 -0
- package/lib/webrtc/src/index.js +1 -0
- package/lib/webrtc/src/index.js.map +1 -1
- package/lib/webrtc/src/media/receiver/red.js +8 -6
- package/lib/webrtc/src/media/receiver/red.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +3 -3
- package/lib/webrtc/src/media/rtpSender.js +4 -4
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +9 -3
- package/lib/webrtc/src/peerConnection.js +11 -2
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sdp.js +2 -1
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.d.ts +5 -0
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +10 -0
- package/lib/webrtc/src/utils.js +8 -1
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/const.ts +6 -0
- package/src/index.ts +1 -0
- package/src/media/receiver/red.ts +11 -12
- package/src/media/rtpSender.ts +6 -6
- package/src/peerConnection.ts +22 -4
- package/src/sdp.ts +2 -1
- package/src/transport/dtls.ts +6 -0
- package/src/utils.ts +9 -0
- package/lib/rtp/src/rtp/red.js +0 -104
- package/lib/rtp/src/rtp/red.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packet.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtp/red/packet.ts"],"names":[],"mappings":"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","sourcesContent":["// rfc2198\n\nimport { debug } from \"debug\";\n\nimport { BitStream } from \"../../../../common/src\";\n\nconst log = debug(\"packages/rtp/src/rtp/red/packet.ts\");\n\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |F| block PT | timestamp offset | block length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |0| Block PT |\n// +-+-+-+-+-+-+-+-+\n\nexport class Red {\n header!: RedHeader;\n blocks: {\n block: Buffer;\n blockPT: number;\n /**14bit */\n timestampOffset?: number;\n }[] = [];\n\n static deSerialize(bufferOrArrayBuffer: Buffer | ArrayBuffer) {\n const buf =\n bufferOrArrayBuffer instanceof ArrayBuffer\n ? Buffer.from(bufferOrArrayBuffer)\n : bufferOrArrayBuffer;\n\n const red = new Red();\n let offset = 0;\n [red.header, offset] = RedHeader.deSerialize(buf);\n\n red.header.fields.forEach(({ blockLength, timestampOffset, blockPT }) => {\n if (blockLength && timestampOffset) {\n const block = buf.slice(offset, offset + blockLength);\n red.blocks.push({ block, blockPT, timestampOffset });\n offset += blockLength;\n } else {\n const block = buf.slice(offset);\n red.blocks.push({ block, blockPT });\n }\n });\n\n return red;\n }\n\n serialize() {\n this.header = new RedHeader();\n\n for (const { timestampOffset, blockPT, block } of this.blocks) {\n if (timestampOffset) {\n this.header.fields.push({\n fBit: 1,\n blockPT,\n blockLength: block.length,\n timestampOffset,\n });\n } else {\n this.header.fields.push({ fBit: 0, blockPT });\n }\n }\n\n let buf = this.header.serialize();\n for (const { block } of this.blocks) {\n buf = Buffer.concat([buf, block]);\n }\n\n return buf;\n }\n}\n\nexport class RedHeader {\n fields: RedHeaderField[] = [];\n\n static deSerialize(buf: Buffer) {\n let offset = 0;\n const header = new RedHeader();\n\n for (;;) {\n const field: RedHeaderField = {} as any;\n header.fields.push(field);\n\n const bitStream = new BitStream(buf.slice(offset));\n field.fBit = bitStream.readBits(1);\n field.blockPT = bitStream.readBits(7);\n\n offset++;\n\n if (field.fBit === 0) {\n break;\n }\n\n field.timestampOffset = bitStream.readBits(14);\n field.blockLength = bitStream.readBits(10);\n\n offset += 3;\n }\n\n return [header, offset] as const;\n }\n\n serialize() {\n let buf = Buffer.alloc(0);\n for (const field of this.fields) {\n try {\n if (field.timestampOffset && field.blockLength) {\n const bitStream = new BitStream(Buffer.alloc(4))\n .writeBits(1, field.fBit)\n .writeBits(7, field.blockPT)\n .writeBits(14, field.timestampOffset)\n .writeBits(10, field.blockLength);\n buf = Buffer.concat([buf, bitStream.uint8Array]);\n } else {\n const bitStream = new BitStream(Buffer.alloc(1))\n .writeBits(1, 0)\n .writeBits(7, field.blockPT);\n buf = Buffer.concat([buf, bitStream.uint8Array]);\n }\n } catch (error: any) {\n log(error?.message);\n continue;\n }\n }\n return buf;\n }\n}\n\ninterface RedHeaderField {\n fBit: number;\n blockPT: number;\n /**14bit */\n timestampOffset?: number;\n /**10bit */\n blockLength?: number;\n}\n"]}
|
package/lib/rtp/src/rtp/rtp.d.ts
CHANGED
package/lib/rtp/src/rtp/rtp.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtp.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/rtp.ts"],"names":[],"mappings":";;;AAAA,6CAAwD;AAI3C,QAAA,iBAAiB,GAAG;IAC/B,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM,EAAE,OAAO;CAChB,CAAC;AAIX,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB;;;;;;;;;;;;;GAaG;AAEH,MAAa,SAAS;IAkBpB,YAAY,QAA4B,EAAE;QAjB1C,YAAO,GAAW,CAAC,CAAC;QACpB,YAAO,GAAY,KAAK,CAAC;QACzB,gBAAW,GAAW,CAAC,CAAC;QACxB,cAAS,GAAY,KAAK,CAAC;QAC3B,WAAM,GAAY,KAAK,CAAC;QACxB,kBAAa,GAAW,CAAC,CAAC;QAC1B,gBAAW,GAAW,CAAC,CAAC;QACxB,WAAW;QACX,mBAAc,GAAW,CAAC,CAAC;QAC3B,WAAW;QACX,cAAS,GAAW,CAAC,CAAC;QACtB,SAAI,GAAW,CAAC,CAAC;QACjB,SAAI,GAAa,EAAE,CAAC;QACpB,qBAAgB,GAAqB,yBAAiB,CAAC,OAAO,CAAC;QAG/D,eAAU,GAAgB,EAAE,CAAC;QAE3B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,SAAiB;QAClC,MAAM,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,OAAO,GAAG,IAAA,YAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,OAAO,GAAG,IAAA,YAAM,EAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC,CAAC,SAAS,GAAG,IAAA,YAAM,EAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,IAAA,YAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;YAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAChD,UAAU,IAAI,CAAC,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,UAAU,IAAI,UAAU,GAAG,CAAC,CAAC;QAE7B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,MAAM,GAAG,IAAA,YAAM,EAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,WAAW,GAAG,IAAA,YAAM,EAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEnC,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACxD,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QACtD,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,MAAM,GAAG,UAAU,GAAG,CAAC,GAAG,UAAU,CAAC;YAC3C,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,CAAC;SACpD;QACD,IAAI,CAAC,CAAC,SAAS,EAAE;YACf,CAAC,CAAC,gBAAgB,GAAG,SAAS;iBAC3B,KAAK,CAAC,UAAU,CAAC;iBACjB,YAAY,EAAsB,CAAC;YACtC,UAAU,IAAI,CAAC,CAAC;YAChB,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YACvE,CAAC,CAAC,eAAe,GAAG,eAAe,CAAC;YACpC,UAAU,IAAI,CAAC,CAAC;YAEhB,QAAQ,CAAC,CAAC,gBAAgB,EAAE;gBAC1B,yCAAyC;gBACzC,KAAK,yBAAiB,CAAC,OAAO;oBAC5B;wBACE,MAAM,GAAG,GAAG,UAAU,GAAG,eAAe,CAAC;wBACzC,OAAO,UAAU,GAAG,GAAG,EAAE;4BACvB,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;gCAClC,UAAU,EAAE,CAAC;gCACb,SAAS;6BACV;4BAED,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;4BACzC,MAAM,GAAG,GAAG,aAAa;6BACvB,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;4BAC/D,UAAU,EAAE,CAAC;4BACb,IAAI,KAAK,KAAK,GAAG,EAAE;gCACjB,MAAM;6BACP;4BACD,MAAM,SAAS,GAAc;gCAC3B,EAAE,EAAE,KAAK;gCACT,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC;6BACvD,CAAC;4BACF,CAAC,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;4BAC5C,UAAU,IAAI,GAAG,CAAC;yBACnB;qBACF;oBACD,MAAM;gBACR,yCAAyC;gBACzC,KAAK,yBAAiB,CAAC,OAAO;oBAC5B;wBACE,MAAM,GAAG,GAAG,UAAU,GAAG,eAAe,CAAC;wBACzC,OAAO,UAAU,GAAG,GAAG,EAAE;4BACvB,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;gCAClC,UAAU,EAAE,CAAC;gCACb,SAAS;6BACV;4BACD,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;4BACpC,UAAU,EAAE,CAAC;4BACb,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;4BAClC,UAAU,EAAE,CAAC;4BAEb,MAAM,SAAS,GAAc;gCAC3B,EAAE,EAAE,KAAK;gCACT,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,GAAG,CAAC;6BACvD,CAAC;4BACF,CAAC,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;4BAC5C,UAAU,IAAI,GAAG,CAAC;yBACnB;qBACF;oBACD,MAAM;gBACR;oBACE;wBACE,MAAM,SAAS,GAAc;4BAC3B,EAAE,EAAE,CAAC;4BACL,OAAO,EAAE,SAAS,CAAC,KAAK,CACtB,UAAU,EACV,UAAU,GAAG,eAAe,CAC7B;yBACF,CAAC;wBACF,CAAC,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;wBAC5C,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;qBAC9C;oBACD,MAAM;aACT;SACF;QACD,CAAC,CAAC,aAAa,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,CAAC,OAAO,EAAE;YACb,CAAC,CAAC,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACjD;QAED,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,aAAa;QACf,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAEpD,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;QAEzC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;YACpD,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,QAAQ,gBAAgB,EAAE;gBACxB,KAAK,yBAAiB,CAAC,OAAO;oBAC5B,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;wBAC/B,OAAO,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;oBAC1C,CAAC,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,yBAAiB,CAAC,OAAO;oBAC5B,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;wBAC/B,OAAO,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;oBAC1C,CAAC,CAAC,CAAC;oBACH,MAAM;gBACR;oBACE,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;aAC3C;YACD,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;SAC3C;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,MAAM,QAAQ,GAAG,IAAI,eAAS,CAAC,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtD,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAEzC,MAAM,IAAI,GAAG,IAAI,eAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAErC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,CAAC;QACZ,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACnD,MAAM,IAAI,CAAC,CAAC;QACZ,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,CAAC;QAEZ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACzB,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAChC,MAAM,IAAI,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,YAAY,GAAG,MAAM,CAAC;YAC5B,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,CAAC;YACZ,MAAM,kBAAkB,GAAG,MAAM,CAAC;YAElC,QAAQ,IAAI,CAAC,gBAAgB,EAAE;gBAC7B,KAAK,yBAAiB,CAAC,OAAO;oBAC5B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;wBACpC,GAAG,CAAC,UAAU,CACZ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EACpD,MAAM,EAAE,CACT,CAAC;wBACF,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;wBACpC,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;oBACrC,CAAC,CAAC,CAAC;oBACH,MAAM;gBACR,KAAK,yBAAiB,CAAC,OAAO,EAAE,qBAAqB;oBACnD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;wBACpC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;wBACvC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;wBACnD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;wBACpC,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;oBACrC,CAAC,CAAC,CAAC;oBACH,MAAM;gBACR;oBACE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;oBACjD,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE;wBACnB,MAAM,IAAI,KAAK,EAAE,CAAC;qBACnB;oBACD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;oBAC7C,MAAM,IAAI,MAAM,CAAC;aACpB;YAED,MAAM,OAAO,GAAG,MAAM,GAAG,kBAAkB,CAAC;YAC5C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAEzD,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;YACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE;gBACjD,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC1B,MAAM,EAAE,CAAC;aACV;SACF;QACD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAzOD,8BAyOC;AAED,MAAa,SAAS;IACpB,YAAmB,MAAiB,EAAS,OAAe;QAAzC,WAAM,GAAN,MAAM,CAAW;QAAS,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAEhE,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IACzD,CAAC;IAED,KAAK;QACH,OAAO,IAAI,SAAS,CAAC,IAAI,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC;IAED,SAAS;QACP,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAC7B,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAChD,CAAC;QACF,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACvB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACtD,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;YACzE,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;SACrC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,GAAW;QAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,SAAS,CACrB,MAAM,EACN,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CACjE,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAlCD,8BAkCC","sourcesContent":["import { BitWriter, getBit } from \"../../../common/src\";\n\nexport type Extension = { id: number; payload: Buffer };\n\nexport const ExtensionProfiles = {\n OneByte: 0xbede, // 48862\n TwoByte: 0x1000, // 4096\n} as const;\ntype ExtensionProfile =\n typeof ExtensionProfiles[keyof typeof ExtensionProfiles];\n\nconst seqNumOffset = 2;\nconst timestampOffset = 4;\nconst ssrcOffset = 8;\nconst csrcOffset = 12;\nconst csrcLength = 4;\n\n/*\n * 0 1 2 3\n * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |V=2|P|X| CC |M| PT | sequence number |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | timestamp |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | synchronization source (SSRC) identifier |\n * +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n * | contributing source (CSRC) identifiers |\n * | .... |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class RtpHeader {\n version: number = 2;\n padding: boolean = false;\n paddingSize: number = 0;\n extension: boolean = false;\n marker: boolean = false;\n payloadOffset: number = 0;\n payloadType: number = 0;\n /**16bit */\n sequenceNumber: number = 0;\n /**32bit */\n timestamp: number = 0;\n ssrc: number = 0;\n csrc: number[] = [];\n extensionProfile: ExtensionProfile = ExtensionProfiles.OneByte;\n /**deserialize only */\n extensionLength?: number;\n extensions: Extension[] = [];\n constructor(props: Partial<RtpHeader> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(rawPacket: Buffer) {\n const h = new RtpHeader();\n let currOffset = 0;\n const v_p_x_cc = rawPacket[currOffset++];\n h.version = getBit(v_p_x_cc, 0, 2);\n h.padding = getBit(v_p_x_cc, 2) > 0;\n h.extension = getBit(v_p_x_cc, 3) > 0;\n const cc = getBit(v_p_x_cc, 4, 4);\n h.csrc = [...Array(cc)].map(() => {\n const csrc = rawPacket.readUInt32BE(currOffset);\n currOffset += 4;\n return csrc;\n });\n currOffset += csrcOffset - 1;\n\n const m_pt = rawPacket[1];\n h.marker = getBit(m_pt, 0) > 0;\n h.payloadType = getBit(m_pt, 1, 7);\n\n h.sequenceNumber = rawPacket.readUInt16BE(seqNumOffset);\n h.timestamp = rawPacket.readUInt32BE(timestampOffset);\n h.ssrc = rawPacket.readUInt32BE(ssrcOffset);\n\n for (let i = 0; i < h.csrc.length; i++) {\n const offset = csrcOffset + i * csrcLength;\n h.csrc[i] = rawPacket.slice(offset).readUInt32BE();\n }\n if (h.extension) {\n h.extensionProfile = rawPacket\n .slice(currOffset)\n .readUInt16BE() as ExtensionProfile;\n currOffset += 2;\n const extensionLength = rawPacket.slice(currOffset).readUInt16BE() * 4;\n h.extensionLength = extensionLength;\n currOffset += 2;\n\n switch (h.extensionProfile) {\n // RFC 8285 RTP One Byte Header Extension\n case ExtensionProfiles.OneByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n\n const extId = rawPacket[currOffset] >> 4;\n const len = // and not &^\n (rawPacket[currOffset] & (rawPacket[currOffset] ^ 0xf0)) + 1;\n currOffset++;\n if (extId === 0xf) {\n break;\n }\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n // RFC 8285 RTP Two Byte Header Extension\n case ExtensionProfiles.TwoByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n const extId = rawPacket[currOffset];\n currOffset++;\n const len = rawPacket[currOffset];\n currOffset++;\n\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n default:\n {\n const extension: Extension = {\n id: 0,\n payload: rawPacket.slice(\n currOffset,\n currOffset + extensionLength\n ),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += h.extensions[0].payload.length;\n }\n break;\n }\n }\n h.payloadOffset = currOffset;\n if (h.padding) {\n h.paddingSize = rawPacket[rawPacket.length - 1];\n }\n\n return h;\n }\n\n get serializeSize() {\n const { csrc, extensionProfile, extensions } = this;\n\n let size = 12 + csrc.length * csrcLength;\n\n if (extensions.length > 0 || this.extension === true) {\n let extSize = 4;\n switch (extensionProfile) {\n case ExtensionProfiles.OneByte:\n extensions.forEach((extension) => {\n extSize += 1 + extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte:\n extensions.forEach((extension) => {\n extSize += 2 + extension.payload.length;\n });\n break;\n default:\n extSize += extensions[0].payload.length;\n }\n size += Math.floor((extSize + 3) / 4) * 4;\n }\n\n return size;\n }\n\n serialize(size: number) {\n const buf = Buffer.alloc(size);\n let offset = 0;\n\n const v_p_x_cc = new BitWriter(8);\n v_p_x_cc.set(2, 0, this.version);\n if (this.padding) v_p_x_cc.set(1, 2, 1);\n if (this.extensions.length > 0) this.extension = true;\n if (this.extension) v_p_x_cc.set(1, 3, 1);\n v_p_x_cc.set(4, 4, this.csrc.length);\n buf.writeUInt8(v_p_x_cc.value, offset++);\n\n const m_pt = new BitWriter(8);\n if (this.marker) m_pt.set(1, 0, 1);\n m_pt.set(7, 1, this.payloadType);\n buf.writeUInt8(m_pt.value, offset++);\n\n buf.writeUInt16BE(this.sequenceNumber, seqNumOffset);\n offset += 2;\n buf.writeUInt32BE(this.timestamp, timestampOffset);\n offset += 4;\n buf.writeUInt32BE(this.ssrc, ssrcOffset);\n offset += 4;\n\n this.csrc.forEach((csrc) => {\n buf.writeUInt32BE(csrc, offset);\n offset += 4;\n });\n\n if (this.extension) {\n const extHeaderPos = offset;\n buf.writeUInt16BE(this.extensionProfile, offset);\n offset += 4;\n const startExtensionsPos = offset;\n\n switch (this.extensionProfile) {\n case ExtensionProfiles.OneByte:\n this.extensions.forEach((extension) => {\n buf.writeUInt8(\n (extension.id << 4) | (extension.payload.length - 1),\n offset++\n );\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte: // 1バイトで収まらなくなった歴史的経緯\n this.extensions.forEach((extension) => {\n buf.writeUInt8(extension.id, offset++);\n buf.writeUInt8(extension.payload.length, offset++);\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n default:\n const extLen = this.extensions[0].payload.length;\n if (extLen % 4 != 0) {\n throw new Error();\n }\n this.extensions[0].payload.copy(buf, offset);\n offset += extLen;\n }\n\n const extSize = offset - startExtensionsPos;\n const roundedExtSize = Math.floor((extSize + 3) / 4) * 4;\n\n buf.writeUInt16BE(Math.floor(roundedExtSize / 4), extHeaderPos + 2);\n for (let i = 0; i < roundedExtSize - extSize; i++) {\n buf.writeUInt8(0, offset);\n offset++;\n }\n }\n this.payloadOffset = offset;\n return buf;\n }\n}\n\nexport class RtpPacket {\n constructor(public header: RtpHeader, public payload: Buffer) {}\n\n get serializeSize() {\n return this.header.serializeSize + this.payload.length;\n }\n\n clone() {\n return new RtpPacket(new RtpHeader({ ...this.header }), this.payload);\n }\n\n serialize() {\n let buf = this.header.serialize(\n this.header.serializeSize + this.payload.length\n );\n const { payloadOffset } = this.header;\n this.payload.copy(buf, payloadOffset);\n if (this.header.padding) {\n const padding = Buffer.alloc(this.header.paddingSize);\n padding.writeUInt8(this.header.paddingSize, this.header.paddingSize - 1);\n buf = Buffer.concat([buf, padding]);\n }\n\n return buf;\n }\n\n static deSerialize(buf: Buffer) {\n const header = RtpHeader.deSerialize(buf);\n const p = new RtpPacket(\n header,\n buf.slice(header.payloadOffset, buf.length - header.paddingSize)\n );\n return p;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rtp.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/rtp.ts"],"names":[],"mappings":"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","sourcesContent":["import { BitWriter, getBit } from \"../../../common/src\";\n\nexport type Extension = { id: number; payload: Buffer };\n\nexport const ExtensionProfiles = {\n OneByte: 0xbede, // 48862\n TwoByte: 0x1000, // 4096\n} as const;\ntype ExtensionProfile =\n typeof ExtensionProfiles[keyof typeof ExtensionProfiles];\n\nconst seqNumOffset = 2;\nconst timestampOffset = 4;\nconst ssrcOffset = 8;\nconst csrcOffset = 12;\nconst csrcLength = 4;\n\n/*\n * 0 1 2 3\n * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |V=2|P|X| CC |M| PT | sequence number |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | timestamp |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | synchronization source (SSRC) identifier |\n * +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n * | contributing source (CSRC) identifiers |\n * | .... |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class RtpHeader {\n version: number = 2;\n padding: boolean = false;\n paddingSize: number = 0;\n extension: boolean = false;\n marker: boolean = false;\n payloadOffset: number = 0;\n payloadType: number = 0;\n /**16bit */\n sequenceNumber: number = 0;\n /**32bit milliseconds/1000 */\n timestamp: number = 0;\n ssrc: number = 0;\n csrc: number[] = [];\n extensionProfile: ExtensionProfile = ExtensionProfiles.OneByte;\n /**deserialize only */\n extensionLength?: number;\n extensions: Extension[] = [];\n constructor(props: Partial<RtpHeader> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(rawPacket: Buffer) {\n const h = new RtpHeader();\n let currOffset = 0;\n const v_p_x_cc = rawPacket[currOffset++];\n h.version = getBit(v_p_x_cc, 0, 2);\n h.padding = getBit(v_p_x_cc, 2) > 0;\n h.extension = getBit(v_p_x_cc, 3) > 0;\n const cc = getBit(v_p_x_cc, 4, 4);\n h.csrc = [...Array(cc)].map(() => {\n const csrc = rawPacket.readUInt32BE(currOffset);\n currOffset += 4;\n return csrc;\n });\n currOffset += csrcOffset - 1;\n\n const m_pt = rawPacket[1];\n h.marker = getBit(m_pt, 0) > 0;\n h.payloadType = getBit(m_pt, 1, 7);\n\n h.sequenceNumber = rawPacket.readUInt16BE(seqNumOffset);\n h.timestamp = rawPacket.readUInt32BE(timestampOffset);\n h.ssrc = rawPacket.readUInt32BE(ssrcOffset);\n\n for (let i = 0; i < h.csrc.length; i++) {\n const offset = csrcOffset + i * csrcLength;\n h.csrc[i] = rawPacket.slice(offset).readUInt32BE();\n }\n if (h.extension) {\n h.extensionProfile = rawPacket\n .slice(currOffset)\n .readUInt16BE() as ExtensionProfile;\n currOffset += 2;\n const extensionLength = rawPacket.slice(currOffset).readUInt16BE() * 4;\n h.extensionLength = extensionLength;\n currOffset += 2;\n\n switch (h.extensionProfile) {\n // RFC 8285 RTP One Byte Header Extension\n case ExtensionProfiles.OneByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n\n const extId = rawPacket[currOffset] >> 4;\n const len = // and not &^\n (rawPacket[currOffset] & (rawPacket[currOffset] ^ 0xf0)) + 1;\n currOffset++;\n if (extId === 0xf) {\n break;\n }\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n // RFC 8285 RTP Two Byte Header Extension\n case ExtensionProfiles.TwoByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n const extId = rawPacket[currOffset];\n currOffset++;\n const len = rawPacket[currOffset];\n currOffset++;\n\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n default:\n {\n const extension: Extension = {\n id: 0,\n payload: rawPacket.slice(\n currOffset,\n currOffset + extensionLength\n ),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += h.extensions[0].payload.length;\n }\n break;\n }\n }\n h.payloadOffset = currOffset;\n if (h.padding) {\n h.paddingSize = rawPacket[rawPacket.length - 1];\n }\n\n return h;\n }\n\n get serializeSize() {\n const { csrc, extensionProfile, extensions } = this;\n\n let size = 12 + csrc.length * csrcLength;\n\n if (extensions.length > 0 || this.extension === true) {\n let extSize = 4;\n switch (extensionProfile) {\n case ExtensionProfiles.OneByte:\n extensions.forEach((extension) => {\n extSize += 1 + extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte:\n extensions.forEach((extension) => {\n extSize += 2 + extension.payload.length;\n });\n break;\n default:\n extSize += extensions[0].payload.length;\n }\n size += Math.floor((extSize + 3) / 4) * 4;\n }\n\n return size;\n }\n\n serialize(size: number) {\n const buf = Buffer.alloc(size);\n let offset = 0;\n\n const v_p_x_cc = new BitWriter(8);\n v_p_x_cc.set(2, 0, this.version);\n if (this.padding) v_p_x_cc.set(1, 2, 1);\n if (this.extensions.length > 0) this.extension = true;\n if (this.extension) v_p_x_cc.set(1, 3, 1);\n v_p_x_cc.set(4, 4, this.csrc.length);\n buf.writeUInt8(v_p_x_cc.value, offset++);\n\n const m_pt = new BitWriter(8);\n if (this.marker) m_pt.set(1, 0, 1);\n m_pt.set(7, 1, this.payloadType);\n buf.writeUInt8(m_pt.value, offset++);\n\n buf.writeUInt16BE(this.sequenceNumber, seqNumOffset);\n offset += 2;\n buf.writeUInt32BE(this.timestamp, timestampOffset);\n offset += 4;\n buf.writeUInt32BE(this.ssrc, ssrcOffset);\n offset += 4;\n\n this.csrc.forEach((csrc) => {\n buf.writeUInt32BE(csrc, offset);\n offset += 4;\n });\n\n if (this.extension) {\n const extHeaderPos = offset;\n buf.writeUInt16BE(this.extensionProfile, offset);\n offset += 4;\n const startExtensionsPos = offset;\n\n switch (this.extensionProfile) {\n case ExtensionProfiles.OneByte:\n this.extensions.forEach((extension) => {\n buf.writeUInt8(\n (extension.id << 4) | (extension.payload.length - 1),\n offset++\n );\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte: // 1バイトで収まらなくなった歴史的経緯\n this.extensions.forEach((extension) => {\n buf.writeUInt8(extension.id, offset++);\n buf.writeUInt8(extension.payload.length, offset++);\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n default:\n const extLen = this.extensions[0].payload.length;\n if (extLen % 4 != 0) {\n throw new Error();\n }\n this.extensions[0].payload.copy(buf, offset);\n offset += extLen;\n }\n\n const extSize = offset - startExtensionsPos;\n const roundedExtSize = Math.floor((extSize + 3) / 4) * 4;\n\n buf.writeUInt16BE(Math.floor(roundedExtSize / 4), extHeaderPos + 2);\n for (let i = 0; i < roundedExtSize - extSize; i++) {\n buf.writeUInt8(0, offset);\n offset++;\n }\n }\n this.payloadOffset = offset;\n return buf;\n }\n}\n\nexport class RtpPacket {\n constructor(public header: RtpHeader, public payload: Buffer) {}\n\n get serializeSize() {\n return this.header.serializeSize + this.payload.length;\n }\n\n clone() {\n return new RtpPacket(new RtpHeader({ ...this.header }), this.payload);\n }\n\n serialize() {\n let buf = this.header.serialize(\n this.header.serializeSize + this.payload.length\n );\n const { payloadOffset } = this.header;\n this.payload.copy(buf, payloadOffset);\n if (this.header.padding) {\n const padding = Buffer.alloc(this.header.paddingSize);\n padding.writeUInt8(this.header.paddingSize, this.header.paddingSize - 1);\n buf = Buffer.concat([buf, padding]);\n }\n\n return buf;\n }\n\n static deSerialize(buf: Buffer) {\n const header = RtpHeader.deSerialize(buf);\n const p = new RtpPacket(\n header,\n buf.slice(header.payloadOffset, buf.length - header.paddingSize)\n );\n return p;\n }\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { HashAlgorithms, SignatureAlgorithm } from "../../dtls/src/cipher/const";
|
|
1
2
|
import { DtlsRole } from "./transport/dtls";
|
|
2
3
|
export declare const DATA_CHANNEL_ACK = 2;
|
|
3
4
|
export declare const DATA_CHANNEL_OPEN = 3;
|
|
@@ -32,3 +33,4 @@ export declare const SRTP_PROFILE: {
|
|
|
32
33
|
};
|
|
33
34
|
export declare const SenderDirections: string[];
|
|
34
35
|
export declare const NotSenderDirections: string[];
|
|
36
|
+
export { HashAlgorithms, SignatureAlgorithm };
|
package/lib/webrtc/src/const.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NotSenderDirections = exports.SenderDirections = exports.SRTP_PROFILE = exports.SSRC_INFO_ATTRS = exports.FMTP_INT_PARAMETERS = exports.DTLS_SETUP_ROLE = exports.DTLS_ROLE_SETUP = exports.DIRECTIONS = exports.MEDIA_KINDS = exports.DISCARD_PORT = exports.DISCARD_HOST = exports.WEBRTC_BINARY_EMPTY = exports.WEBRTC_STRING_EMPTY = exports.WEBRTC_BINARY = exports.WEBRTC_STRING = exports.WEBRTC_DCEP = exports.DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED = exports.DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED = exports.DATA_CHANNEL_RELIABLE_UNORDERED = exports.DATA_CHANNEL_PARTIAL_RELIABLE_TIMED = exports.DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT = exports.DATA_CHANNEL_RELIABLE = exports.DATA_CHANNEL_OPEN = exports.DATA_CHANNEL_ACK = void 0;
|
|
3
|
+
exports.SignatureAlgorithm = exports.NotSenderDirections = exports.SenderDirections = exports.SRTP_PROFILE = exports.SSRC_INFO_ATTRS = exports.FMTP_INT_PARAMETERS = exports.DTLS_SETUP_ROLE = exports.DTLS_ROLE_SETUP = exports.DIRECTIONS = exports.MEDIA_KINDS = exports.DISCARD_PORT = exports.DISCARD_HOST = exports.WEBRTC_BINARY_EMPTY = exports.WEBRTC_STRING_EMPTY = exports.WEBRTC_BINARY = exports.WEBRTC_STRING = exports.WEBRTC_DCEP = exports.DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED = exports.DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED = exports.DATA_CHANNEL_RELIABLE_UNORDERED = exports.DATA_CHANNEL_PARTIAL_RELIABLE_TIMED = exports.DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT = exports.DATA_CHANNEL_RELIABLE = exports.DATA_CHANNEL_OPEN = exports.DATA_CHANNEL_ACK = void 0;
|
|
4
|
+
const const_1 = require("../../dtls/src/cipher/const");
|
|
5
|
+
Object.defineProperty(exports, "SignatureAlgorithm", { enumerable: true, get: function () { return const_1.SignatureAlgorithm; } });
|
|
4
6
|
const srtp_1 = require("../../dtls/src/context/srtp");
|
|
5
7
|
// data channel export constants
|
|
6
8
|
exports.DATA_CHANNEL_ACK = 2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../src/const.ts"],"names":[],"mappings":";;;AAAA,sDAGqC;AAGrC,gCAAgC;AACnB,QAAA,gBAAgB,GAAG,CAAC,CAAC;AACrB,QAAA,iBAAiB,GAAG,CAAC,CAAC;AAEnC,kCAAkC;AACrB,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,oCAAoC,GAAG,IAAI,CAAC;AAC5C,QAAA,mCAAmC,GAAG,IAAI,CAAC;AAC3C,QAAA,+BAA+B,GAAG,IAAI,CAAC;AACvC,QAAA,8CAA8C,GAAG,IAAI,CAAC;AACtD,QAAA,6CAA6C,GAAG,IAAI,CAAC;AAErD,QAAA,WAAW,GAAG,EAAE,CAAC;AACjB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AACzB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AAEzB,QAAA,YAAY,GAAG,SAAS,CAAC;AACzB,QAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAEjC,QAAA,UAAU,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC9D,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,SAAS;CAClB,CAAC;AACW,QAAA,eAAe,GAAgC,MAAM,CAAC,IAAI,CACrE,uBAAe,CAChB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACpB,MAAM,GAAG,GAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC1C,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC,EAAE,EAAS,CAAC,CAAC;AACD,QAAA,mBAAmB,GAAG;IACjC,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,iBAAiB;IACjB,UAAU;IACV,QAAQ;IACR,cAAc;CACf,CAAC;AAEW,QAAA,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAExD,QAAA,YAAY,GAAG;IAC1B,2BAA2B,EAAE,2CAAoC;IACjE,qBAAqB,EAAE,qCAA8B;CAC7C,CAAC;AAEE,QAAA,gBAAgB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC5C,QAAA,mBAAmB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC","sourcesContent":["import {\n ProtectionProfileAeadAes128Gcm,\n ProtectionProfileAes128CmHmacSha1_80,\n} from \"../../dtls/src/context/srtp\";\nimport { DtlsRole } from \"./transport/dtls\";\n\n// data channel export constants\nexport const DATA_CHANNEL_ACK = 2;\nexport const DATA_CHANNEL_OPEN = 3;\n\n// 5.1. DATA_CHANNEL_OPEN Message\nexport const DATA_CHANNEL_RELIABLE = 0x00;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT = 0x01;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED = 0x02;\nexport const DATA_CHANNEL_RELIABLE_UNORDERED = 0x80;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED = 0x81;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED = 0x82;\n\nexport const WEBRTC_DCEP = 50;\nexport const WEBRTC_STRING = 51;\nexport const WEBRTC_BINARY = 53;\nexport const WEBRTC_STRING_EMPTY = 56;\nexport const WEBRTC_BINARY_EMPTY = 57;\n\nexport const DISCARD_HOST = \"0.0.0.0\";\nexport const DISCARD_PORT = 9;\nexport const MEDIA_KINDS = [\"audio\", \"video\"];\n\nexport const DIRECTIONS = [\"inactive\", \"sendonly\", \"recvonly\", \"sendrecv\"];\nexport const DTLS_ROLE_SETUP = {\n auto: \"actpass\",\n client: \"active\",\n server: \"passive\",\n};\nexport const DTLS_SETUP_ROLE: { [key: string]: DtlsRole } = Object.keys(\n DTLS_ROLE_SETUP\n).reduce((acc, cur) => {\n const key = (DTLS_ROLE_SETUP as any)[cur];\n acc[key] = cur;\n return acc;\n}, {} as any);\nexport const FMTP_INT_PARAMETERS = [\n \"apt\",\n \"max-fr\",\n \"max-fs\",\n \"maxplaybackrate\",\n \"minptime\",\n \"stereo\",\n \"useinbandfec\",\n];\n\nexport const SSRC_INFO_ATTRS = [\"cname\", \"msid\", \"mslabel\", \"label\"];\n\nexport const SRTP_PROFILE = {\n SRTP_AES128_CM_HMAC_SHA1_80: ProtectionProfileAes128CmHmacSha1_80,\n SRTP_AEAD_AES_128_GCM: ProtectionProfileAeadAes128Gcm,\n} as const;\n\nexport const SenderDirections = [\"sendonly\", \"sendrecv\"];\nexport const NotSenderDirections = [\"inactive\", \"recvonly\"];\n"]}
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../src/const.ts"],"names":[],"mappings":";;;AAAA,uDAGqC;AA8DZ,mGA/DvB,0BAAkB,OA+DuB;AA7D3C,sDAGqC;AAGrC,gCAAgC;AACnB,QAAA,gBAAgB,GAAG,CAAC,CAAC;AACrB,QAAA,iBAAiB,GAAG,CAAC,CAAC;AAEnC,kCAAkC;AACrB,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,oCAAoC,GAAG,IAAI,CAAC;AAC5C,QAAA,mCAAmC,GAAG,IAAI,CAAC;AAC3C,QAAA,+BAA+B,GAAG,IAAI,CAAC;AACvC,QAAA,8CAA8C,GAAG,IAAI,CAAC;AACtD,QAAA,6CAA6C,GAAG,IAAI,CAAC;AAErD,QAAA,WAAW,GAAG,EAAE,CAAC;AACjB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AACzB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AAEzB,QAAA,YAAY,GAAG,SAAS,CAAC;AACzB,QAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAEjC,QAAA,UAAU,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC9D,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,SAAS;CAClB,CAAC;AACW,QAAA,eAAe,GAAgC,MAAM,CAAC,IAAI,CACrE,uBAAe,CAChB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACpB,MAAM,GAAG,GAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC1C,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC,EAAE,EAAS,CAAC,CAAC;AACD,QAAA,mBAAmB,GAAG;IACjC,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,iBAAiB;IACjB,UAAU;IACV,QAAQ;IACR,cAAc;CACf,CAAC;AAEW,QAAA,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAExD,QAAA,YAAY,GAAG;IAC1B,2BAA2B,EAAE,2CAAoC;IACjE,qBAAqB,EAAE,qCAA8B;CAC7C,CAAC;AAEE,QAAA,gBAAgB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC5C,QAAA,mBAAmB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC","sourcesContent":["import {\n HashAlgorithms,\n SignatureAlgorithm,\n} from \"../../dtls/src/cipher/const\";\nimport {\n ProtectionProfileAeadAes128Gcm,\n ProtectionProfileAes128CmHmacSha1_80,\n} from \"../../dtls/src/context/srtp\";\nimport { DtlsRole } from \"./transport/dtls\";\n\n// data channel export constants\nexport const DATA_CHANNEL_ACK = 2;\nexport const DATA_CHANNEL_OPEN = 3;\n\n// 5.1. DATA_CHANNEL_OPEN Message\nexport const DATA_CHANNEL_RELIABLE = 0x00;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT = 0x01;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED = 0x02;\nexport const DATA_CHANNEL_RELIABLE_UNORDERED = 0x80;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED = 0x81;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED = 0x82;\n\nexport const WEBRTC_DCEP = 50;\nexport const WEBRTC_STRING = 51;\nexport const WEBRTC_BINARY = 53;\nexport const WEBRTC_STRING_EMPTY = 56;\nexport const WEBRTC_BINARY_EMPTY = 57;\n\nexport const DISCARD_HOST = \"0.0.0.0\";\nexport const DISCARD_PORT = 9;\nexport const MEDIA_KINDS = [\"audio\", \"video\"];\n\nexport const DIRECTIONS = [\"inactive\", \"sendonly\", \"recvonly\", \"sendrecv\"];\nexport const DTLS_ROLE_SETUP = {\n auto: \"actpass\",\n client: \"active\",\n server: \"passive\",\n};\nexport const DTLS_SETUP_ROLE: { [key: string]: DtlsRole } = Object.keys(\n DTLS_ROLE_SETUP\n).reduce((acc, cur) => {\n const key = (DTLS_ROLE_SETUP as any)[cur];\n acc[key] = cur;\n return acc;\n}, {} as any);\nexport const FMTP_INT_PARAMETERS = [\n \"apt\",\n \"max-fr\",\n \"max-fs\",\n \"maxplaybackrate\",\n \"minptime\",\n \"stereo\",\n \"useinbandfec\",\n];\n\nexport const SSRC_INFO_ATTRS = [\"cname\", \"msid\", \"mslabel\", \"label\"];\n\nexport const SRTP_PROFILE = {\n SRTP_AES128_CM_HMAC_SHA1_80: ProtectionProfileAes128CmHmacSha1_80,\n SRTP_AEAD_AES_128_GCM: ProtectionProfileAeadAes128Gcm,\n} as const;\n\nexport const SenderDirections = [\"sendonly\", \"sendrecv\"];\nexport const NotSenderDirections = [\"inactive\", \"recvonly\"];\n\nexport { HashAlgorithms, SignatureAlgorithm };\n"]}
|
package/lib/webrtc/src/index.js
CHANGED
|
@@ -11,6 +11,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
11
11
|
};
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
__exportStar(require("../../common/src"), exports);
|
|
14
|
+
__exportStar(require("../../dtls/src/cipher/const"), exports);
|
|
14
15
|
__exportStar(require("../../ice/src"), exports);
|
|
15
16
|
__exportStar(require("../../rtp/src"), exports);
|
|
16
17
|
__exportStar(require("./dataChannel"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAiC;AACjC,gDAA8B;AAC9B,gDAA8B;AAC9B,gDAA8B;AAC9B,iEAA+C;AAC/C,iEAA+C;AAC/C,qDAAmC;AACnC,yDAAuC;AACvC,gDAA8B;AAC9B,yDAAuC;AACvC,0DAAwC;AACxC,mDAAiC;AACjC,wCAAsB;AACtB,mDAAiC;AACjC,kDAAgC;AAChC,mDAAiC;AACjC,iDAA+B;AAC/B,0CAAwB","sourcesContent":["export * from \"../../common/src\";\nexport * from \"../../ice/src\";\nexport * from \"../../rtp/src\";\nexport * from \"./dataChannel\";\nexport * from \"./media/extension/rtcpFeedback\";\nexport * from \"./media/extension/rtpExtension\";\nexport * from \"./media/parameters\";\nexport * from \"./media/rtpTransceiver\";\nexport * from \"./media/track\";\nexport * from \"./nonstandard/recorder\";\nexport * from \"./nonstandard/userMedia\";\nexport * from \"./peerConnection\";\nexport * from \"./sdp\";\nexport * from \"./transport/dtls\";\nexport * from \"./transport/ice\";\nexport * from \"./transport/sctp\";\nexport * from \"./types/domain\";\nexport * from \"./utils\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAAiC;AACjC,8DAA4C;AAC5C,gDAA8B;AAC9B,gDAA8B;AAC9B,gDAA8B;AAC9B,iEAA+C;AAC/C,iEAA+C;AAC/C,qDAAmC;AACnC,yDAAuC;AACvC,gDAA8B;AAC9B,yDAAuC;AACvC,0DAAwC;AACxC,mDAAiC;AACjC,wCAAsB;AACtB,mDAAiC;AACjC,kDAAgC;AAChC,mDAAiC;AACjC,iDAA+B;AAC/B,0CAAwB","sourcesContent":["export * from \"../../common/src\";\nexport * from \"../../dtls/src/cipher/const\";\nexport * from \"../../ice/src\";\nexport * from \"../../rtp/src\";\nexport * from \"./dataChannel\";\nexport * from \"./media/extension/rtcpFeedback\";\nexport * from \"./media/extension/rtpExtension\";\nexport * from \"./media/parameters\";\nexport * from \"./media/rtpTransceiver\";\nexport * from \"./media/track\";\nexport * from \"./nonstandard/recorder\";\nexport * from \"./nonstandard/userMedia\";\nexport * from \"./peerConnection\";\nexport * from \"./sdp\";\nexport * from \"./transport/dtls\";\nexport * from \"./transport/ice\";\nexport * from \"./transport/sctp\";\nexport * from \"./types/domain\";\nexport * from \"./utils\";\n"]}
|
|
@@ -9,27 +9,28 @@ class RedHandler {
|
|
|
9
9
|
}
|
|
10
10
|
push(red, rtp) {
|
|
11
11
|
const packets = [];
|
|
12
|
-
red.
|
|
12
|
+
red.blocks.forEach(({ blockPT, timestampOffset, block }, i) => {
|
|
13
|
+
const sequenceNumber = (0, __1.uint16Add)(rtp.header.sequenceNumber, -(red.blocks.length - (i + 1)));
|
|
13
14
|
if (timestampOffset) {
|
|
14
15
|
packets.push(new __1.RtpPacket(new __1.RtpHeader({
|
|
15
16
|
timestamp: (0, __1.uint32Add)(rtp.header.timestamp, -timestampOffset),
|
|
16
17
|
payloadType: blockPT,
|
|
17
18
|
ssrc: rtp.header.ssrc,
|
|
18
|
-
sequenceNumber
|
|
19
|
+
sequenceNumber,
|
|
19
20
|
marker: true,
|
|
20
|
-
}),
|
|
21
|
+
}), block));
|
|
21
22
|
}
|
|
22
23
|
else {
|
|
23
24
|
packets.push(new __1.RtpPacket(new __1.RtpHeader({
|
|
24
25
|
timestamp: rtp.header.timestamp,
|
|
25
26
|
payloadType: blockPT,
|
|
26
27
|
ssrc: rtp.header.ssrc,
|
|
27
|
-
sequenceNumber
|
|
28
|
+
sequenceNumber,
|
|
28
29
|
marker: true,
|
|
29
|
-
}),
|
|
30
|
+
}), block));
|
|
30
31
|
}
|
|
31
32
|
});
|
|
32
|
-
|
|
33
|
+
const filtered = packets.filter((p) => {
|
|
33
34
|
if (this.sequenceNumbers.includes(p.header.sequenceNumber)) {
|
|
34
35
|
return false;
|
|
35
36
|
}
|
|
@@ -41,6 +42,7 @@ class RedHandler {
|
|
|
41
42
|
return true;
|
|
42
43
|
}
|
|
43
44
|
});
|
|
45
|
+
return filtered;
|
|
44
46
|
}
|
|
45
47
|
}
|
|
46
48
|
exports.RedHandler = RedHandler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"red.js","sourceRoot":"","sources":["../../../../../src/media/receiver/red.ts"],"names":[],"mappings":";;;AAAA,6BAAwE;AAExE,MAAa,UAAU;IAAvB;QACmB,SAAI,GAAG,GAAG,CAAC;QACpB,oBAAe,GAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"red.js","sourceRoot":"","sources":["../../../../../src/media/receiver/red.ts"],"names":[],"mappings":";;;AAAA,6BAAwE;AAExE,MAAa,UAAU;IAAvB;QACmB,SAAI,GAAG,GAAG,CAAC;QACpB,oBAAe,GAAa,EAAE,CAAC;IAoDzC,CAAC;IAlDC,IAAI,CAAC,GAAQ,EAAE,GAAc;QAC3B,MAAM,OAAO,GAAgB,EAAE,CAAC;QAEhC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;YAC5D,MAAM,cAAc,GAAG,IAAA,aAAS,EAC9B,GAAG,CAAC,MAAM,CAAC,cAAc,EACzB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAC/B,CAAC;YACF,IAAI,eAAe,EAAE;gBACnB,OAAO,CAAC,IAAI,CACV,IAAI,aAAS,CACX,IAAI,aAAS,CAAC;oBACZ,SAAS,EAAE,IAAA,aAAS,EAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC;oBAC5D,WAAW,EAAE,OAAO;oBACpB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;oBACrB,cAAc;oBACd,MAAM,EAAE,IAAI;iBACb,CAAC,EACF,KAAK,CACN,CACF,CAAC;aACH;iBAAM;gBACL,OAAO,CAAC,IAAI,CACV,IAAI,aAAS,CACX,IAAI,aAAS,CAAC;oBACZ,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;oBAC/B,WAAW,EAAE,OAAO;oBACpB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;oBACrB,cAAc;oBACd,MAAM,EAAE,IAAI;iBACb,CAAC,EACF,KAAK,CACN,CACF,CAAC;aACH;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;gBAC1D,OAAO,KAAK,CAAC;aACd;iBAAM;gBACL,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE;oBAC3C,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;iBAC9B;gBACD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gBACnD,OAAO,IAAI,CAAC;aACb;QACH,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAtDD,gCAsDC","sourcesContent":["import { Red, RtpHeader, RtpPacket, uint16Add, uint32Add } from \"../..\";\n\nexport class RedHandler {\n private readonly size = 150;\n private sequenceNumbers: number[] = [];\n\n push(red: Red, rtp: RtpPacket) {\n const packets: RtpPacket[] = [];\n\n red.blocks.forEach(({ blockPT, timestampOffset, block }, i) => {\n const sequenceNumber = uint16Add(\n rtp.header.sequenceNumber,\n -(red.blocks.length - (i + 1))\n );\n if (timestampOffset) {\n packets.push(\n new RtpPacket(\n new RtpHeader({\n timestamp: uint32Add(rtp.header.timestamp, -timestampOffset),\n payloadType: blockPT,\n ssrc: rtp.header.ssrc,\n sequenceNumber,\n marker: true,\n }),\n block\n )\n );\n } else {\n packets.push(\n new RtpPacket(\n new RtpHeader({\n timestamp: rtp.header.timestamp,\n payloadType: blockPT,\n ssrc: rtp.header.ssrc,\n sequenceNumber,\n marker: true,\n }),\n block\n )\n );\n }\n });\n\n const filtered = packets.filter((p) => {\n if (this.sequenceNumbers.includes(p.header.sequenceNumber)) {\n return false;\n } else {\n if (this.sequenceNumbers.length > this.size) {\n this.sequenceNumbers.shift();\n }\n this.sequenceNumbers.push(p.header.sequenceNumber);\n return true;\n }\n });\n return filtered;\n }\n}\n"]}
|
|
@@ -3,7 +3,7 @@ import Event from "rx.mini";
|
|
|
3
3
|
import { GenericNack, Red, 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,7 +26,7 @@ export declare class RTCRtpSender {
|
|
|
26
26
|
private repairedRtpStreamId?;
|
|
27
27
|
private rtxPayloadType?;
|
|
28
28
|
private rtxSequenceNumber;
|
|
29
|
-
|
|
29
|
+
redRedundantPayloadType?: number;
|
|
30
30
|
redDistance: number;
|
|
31
31
|
private headerExtensions;
|
|
32
32
|
private disposeTrack?;
|
|
@@ -43,7 +43,7 @@ export declare class RTCRtpSender {
|
|
|
43
43
|
private timestampOffset;
|
|
44
44
|
private seqOffset;
|
|
45
45
|
private rtpCache;
|
|
46
|
-
|
|
46
|
+
codec?: RTCRtpCodecParameters;
|
|
47
47
|
track?: MediaStreamTrack;
|
|
48
48
|
stopped: boolean;
|
|
49
49
|
rtcpRunning: boolean;
|
|
@@ -365,14 +365,14 @@ exports.wrapRtx = wrapRtx;
|
|
|
365
365
|
function buildRedPacket(redundantPackets, blockPT, presentPacket) {
|
|
366
366
|
const red = new src_2.Red();
|
|
367
367
|
redundantPackets.forEach((redundant) => {
|
|
368
|
-
red.
|
|
369
|
-
|
|
368
|
+
red.blocks.push({
|
|
369
|
+
block: redundant.payload,
|
|
370
370
|
blockPT,
|
|
371
371
|
timestampOffset: (0, src_1.uint32Add)(presentPacket.header.timestamp, -redundant.header.timestamp),
|
|
372
372
|
});
|
|
373
373
|
});
|
|
374
|
-
red.
|
|
375
|
-
|
|
374
|
+
red.blocks.push({
|
|
375
|
+
block: presentPacket.payload,
|
|
376
376
|
blockPT,
|
|
377
377
|
});
|
|
378
378
|
return red;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtpSender.js","sourceRoot":"","sources":["../../../../src/media/rtpSender.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAqC;AACrC,kDAA0B;AAC1B,mCAAgC;AAChC,sDAA4B;AAC5B,8CAA6C;AAC7C,2CAA6B;AAE7B,6CAK6B;AAC7B,0CAkB0B;AAC1B,0BAA+C;AAG/C,oCAA0D;AAC1D,2DAA6D;AAM7D,kDAAwE;AACxE,mCAA2C;AAE3C,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,+CAA+C,CAAC,CAAC;AAEnE,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,MAAa,YAAY;IAkDvB,YACS,WAAoC,EACpC,aAA+B;QAD/B,gBAAW,GAAX,WAAW,CAAyB;QACpC,kBAAa,GAAb,aAAa,CAAkB;QAnD/B,SAAI,GAAG,QAAQ,CAAC;QAChB,SAAI,GACX,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;YAClC,CAAC,CAAC,IAAI,CAAC,WAAW;YAClB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACnB,SAAI,GAAG,eAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAA,oBAAW,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,YAAO,GAAG,eAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAA,oBAAW,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,aAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACZ,YAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACpB,YAAO,GAAG,IAAI,iBAAK,EAAE,CAAC;QACtB,WAAM,GAAG,IAAI,iBAAK,EAAgB,CAAC;QACnC,4BAAuB,GAAG,IAAI,iBAAK,EAAM,CAAC;QAC1C,kBAAa,GAAG,IAAI,iBAAK,EAAiB,CAAC;QAC3C,cAAS,GAAG,IAAI,oCAAwB,EAAE,CAAC;QAO5C,sBAAiB,GAAG,IAAA,cAAQ,GAAE,CAAC;QAEvC,gBAAW,GAAG,CAAC,CAAC;QACR,qBAAgB,GAAsC,EAAE,CAAC;QAKzD,YAAO,GAAW,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACpC,iBAAY,GAAG,EAAE,CAAC;QAClB,iBAAY,GAAG,CAAC,CAAC;QACjB,eAAU,GAAG,CAAC,CAAC;QACf,gBAAW,GAAG,CAAC,CAAC;QAExB,gCAA2B,GAAW,EAAE,CAAC;QAKjC,oBAAe,GAAG,CAAC,CAAC;QACpB,cAAS,GAAG,CAAC,CAAC;QACd,aAAQ,GAAgB,EAAE,CAAC;QAInC,YAAO,GAAG,KAAK,CAAC;QAChB,gBAAW,GAAG,KAAK,CAAC;QACZ,eAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QAMzC,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9C,IAAI,KAAK,KAAK,WAAW,EAAE;gBACzB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aACxB;QACH,CAAC,CAAC,CAAC;QACH,IAAI,WAAW,YAAY,wBAAgB,EAAE;YAC3C,IAAI,WAAW,CAAC,QAAQ,EAAE;gBACxB,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;aACtC;YACD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;SACjC;IACH,CAAC;IAED,WAAW,CAAC,MAA4B;QACtC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;QAEtD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;SAC/B;QAED,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9B,MAAM,WAAW,GAAG,IAAA,6BAAyB,EAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YACtE,IACE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK;gBAClC,WAAW,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,WAAW,EAC9C;gBACA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC;aACzC;YACD,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE;gBACtC,IAAI,CAAC,uBAAuB,GAAG,MAAM,CACnC,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACvC,CAAC;aACH;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,KAAuB;QACnC,IAAI,KAAK,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAErD,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,YAAY,EAAE,CAAC;SACrB;QAED,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAExB,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;YAC3D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAEhC,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;SAC1B;QAED,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;YACzC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAA8B;QAC/C,IAAI,KAAK,KAAK,IAAI,EAAE;YAClB,YAAY;YACZ,OAAO;SACR;QAED,IAAI,KAAK,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAErD,IAAI,IAAI,CAAC,cAAc,IAAI,SAAS,EAAE;YACpC,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAEnE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;SACzB;QAED,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1B,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5D,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,CAAC,KAAK,GAAG,SAAS,CAAC;IACzB,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,GAAiB;oBAC5B,IAAI,kBAAY,CAAC;wBACf,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,UAAU,EAAE,IAAI,oBAAc,CAAC;4BAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;4BAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;4BAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;4BAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;yBAC5B,CAAC;qBACH,CAAC;iBACH,CAAC;gBACF,IAAI,CAAC,GAAG,GAAG,IAAA,kBAAU,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;gBAEjC,IAAI,IAAI,CAAC,KAAK,EAAE;oBACd,OAAO,CAAC,IAAI,CACV,IAAI,iCAA2B,CAAC;wBAC9B,MAAM,EAAE;4BACN,IAAI,4BAAsB,CAAC;gCACzB,MAAM,EAAE,IAAI,CAAC,IAAI;gCACjB,KAAK,EAAE;oCACL,IAAI,2BAAqB,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;iCACzD;6BACF,CAAC;yBACH;qBACF,CAAC,CACH,CAAC;iBACH;gBAED,IAAI;oBACF,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;iBAC5C;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,UAAU,CAAC,EACT,cAAc,EACd,SAAS,GACuC;QAChD,IAAI,IAAI,CAAC,cAAc,IAAI,SAAS,EAAE;YACpC,IAAI,CAAC,SAAS,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,cAAc,EAAE,CAAC,cAAc,CAAC,CAAC;SAClE;QACD,IAAI,IAAI,CAAC,SAAS,IAAI,SAAS,EAAE;YAC/B,IAAI,CAAC,eAAe,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC;SAC9D;QACD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,CAAC,GAAuB;QAC7B,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YAC3D,OAAO;SACR;QAED,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE9D,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAC1B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACxB,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QAC5C,MAAM,CAAC,SAAS,GAAG,IAAA,eAAS,EAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACrE,MAAM,CAAC,cAAc,GAAG,IAAA,eAAS,EAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACzE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAE5C,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB;aACtC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YACjB,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE;gBACpB,QAAQ,SAAS,CAAC,GAAG,EAAE;oBACrB,KAAK,gCAAiB,CAAC,OAAO;wBAC5B,IAAI,IAAI,CAAC,GAAG,EAAE;4BACZ,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;yBAC9B;wBACD,OAAO;oBACT,0CAA0C;oBAC1C,KAAK,gCAAiB,CAAC,eAAe;wBACpC,IAAI,IAAI,CAAC,WAAW,EAAE;4BACpB,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;yBACtC;wBACD,OAAO;oBACT,0CAA0C;oBAC1C,KAAK,gCAAiB,CAAC,mBAAmB;wBACxC,IAAI,IAAI,CAAC,mBAAmB,EAAE;4BAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;yBAC9C;wBACD,OAAO;oBACT,KAAK,gCAAiB,CAAC,eAAe;wBACpC,IAAI,CAAC,aAAa,CAAC,uBAAuB,GAAG,IAAA,eAAS,EACpD,IAAI,CAAC,aAAa,CAAC,uBAAuB,EAC1C,CAAC,CACF,CAAC;wBACF,OAAO,IAAA,kBAAY,EACjB,CAAC,CAAC,CAAC,EACH,CAAC,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAC7C,CAAC;oBACJ,KAAK,gCAAiB,CAAC,WAAW;wBAChC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC5B,MAAM,IAAI,GAAG,CAAC,IAAA,eAAO,GAAE,IAAI,GAAG,CAAC,GAAG,WAAW,CAAC;wBAC9C,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;wBACpC,OAAO,GAAG,CAAC;iBACd;YACH,CAAC,CAAC,EAAE,CAAC;YAEL,IAAI,OAAO;gBAAE,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;QACpD,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAgB,CAAC;QAEnC,IAAI,CAAC,YAAY,GAAG,IAAA,eAAO,GAAE,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;QACzC,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAElD,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QAEpB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAEvD,IAAI,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC;QAE7B,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAChC,MAAM,gBAAgB,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;iBACzD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,MAAM,CAAC,cAAc;oBACvB,MAAM,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CACjD,CAAC;YACJ,CAAC,CAAC;iBACD,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,OAAO,CAAC,KAAK,WAAW,CAAC,CAAC;YACvE,MAAM,GAAG,GAAG,cAAc,CACxB,gBAAgB,EAChB,IAAI,CAAC,uBAAuB,EAC5B,GAAG,CACJ,CAAC;YACF,UAAU,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;SAC9B;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAE5D,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,QAAQ,GAAa;YACzB,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,uBAAuB;YACnD,IAAI;YACJ,WAAW,EAAE,IAAA,iBAAS,GAAE;YACxB,QAAQ,EAAE,IAAA,iBAAS,GAAE;SACtB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,gBAAgB,CAAC,UAAsB;QACrC,QAAQ,UAAU,CAAC,IAAI,EAAE;YACvB,KAAK,kBAAY,CAAC,IAAI,CAAC;YACvB,KAAK,kBAAY,CAAC,IAAI;gBACpB;oBACE,MAAM,MAAM,GAAG,UAAyC,CAAC;oBACzD,MAAM,CAAC,OAAO;yBACX,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;yBAC7C,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;wBAClB,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE;4BAC1C,MAAM,GAAG,GACP,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;4BACzD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE;gCAC1B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;6BAChB;iCAAM;gCACL,IAAI,CAAC,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC;6BACzD;yBACF;oBACH,CAAC,CAAC,CAAC;iBACN;gBACD,MAAM;YACR,KAAK,gCAA0B,CAAC,IAAI;gBAClC;oBACE,MAAM,MAAM,GAAG,UAAwC,CAAC;oBACxD,QAAQ,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;wBAC7B,KAAK,qBAAe,CAAC,KAAK;4BACxB;gCACE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAA2B,CAAC;gCACpD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;6BACtC;4BACD,MAAM;wBACR,KAAK,iBAAW,CAAC,KAAK;4BACpB;gCACE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAuB,CAAC;gCAChD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;oCAC/B,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAC7B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,KAAK,MAAM,CAC9C,CAAC;oCACF,IAAI,MAAM,EAAE;wCACV,IAAI,IAAI,CAAC,cAAc,IAAI,SAAS,EAAE;4CACpC,MAAM,GAAG,OAAO,CACd,MAAM,EACN,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,OAAO,CACb,CAAC;4CACF,IAAI,CAAC,iBAAiB,GAAG,IAAA,eAAS,EAChC,IAAI,CAAC,iBAAiB,EACtB,CAAC,CACF,CAAC;yCACH;wCACD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;qCAC3D;gCACH,CAAC,CAAC,CAAC;gCACH,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;6BACtC;4BACD,MAAM;qBACT;iBACF;gBACD,MAAM;YACR,KAAK,iCAA2B,CAAC,IAAI;gBACnC;oBACE,MAAM,MAAM,GAAG,UAAyC,CAAC;oBACzD,QAAQ,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;wBAC7B,KAAK,iCAA2B,CAAC,KAAK;4BACpC;gCACE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAuC,CAAC;gCAChE,IAAI,CAAC,2BAA2B,GAAG,QAAQ,CAAC,OAAO,CAAC;6BACrD;4BACD,MAAM;wBACR,KAAK,2BAAqB,CAAC,KAAK;4BAC9B;gCACE,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,CAAC;6BACxC;4BACD,MAAM;qBACT;iBACF;gBACD,MAAM;SACT;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;CACF;AArYD,oCAqYC;AAED,SAAgB,OAAO,CACrB,MAAiB,EACjB,WAAmB,EACnB,cAAsB,EACtB,IAAY;IAEZ,MAAM,GAAG,GAAG,IAAI,eAAS,CACvB,IAAI,eAAS,CAAC;QACZ,WAAW;QACX,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;QAC5B,cAAc;QACd,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;QAClC,IAAI;QACJ,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;QACxB,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU;KACrC,CAAC,EACF,MAAM,CAAC,MAAM,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO;KACf,CAAC,CACH,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAtBD,0BAsBC;AAED,SAAgB,cAAc,CAC5B,gBAA6B,EAC7B,OAAe,EACf,aAAwB;IAExB,MAAM,GAAG,GAAG,IAAI,SAAG,EAAE,CAAC;IACtB,gBAAgB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QACrC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChB,GAAG,EAAE,SAAS,CAAC,OAAO;YACtB,OAAO;YACP,eAAe,EAAE,IAAA,eAAS,EACxB,aAAa,CAAC,MAAM,CAAC,SAAS,EAC9B,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAC5B;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAChB,GAAG,EAAE,aAAa,CAAC,OAAO;QAC1B,OAAO;KACR,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC;AAtBD,wCAsBC","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 { 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 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) => {\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 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 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 { 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 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 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) => {\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 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.blocks.push({\n block: redundant.payload,\n blockPT,\n timestampOffset: uint32Add(\n presentPacket.header.timestamp,\n -redundant.header.timestamp\n ),\n });\n });\n\n red.blocks.push({\n block: presentPacket.payload,\n blockPT,\n });\n return red;\n}\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";
|
|
@@ -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
|
-
|
|
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,
|
|
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 = {
|
|
@@ -44,7 +44,7 @@ const sctp_1 = require("./transport/sctp");
|
|
|
44
44
|
const utils_1 = require("./utils");
|
|
45
45
|
const log = (0, debug_1.default)("werift:packages/webrtc/src/peerConnection.ts");
|
|
46
46
|
class RTCPeerConnection extends helper_1.EventTarget {
|
|
47
|
-
constructor({ codecs, headerExtensions, iceServers, iceTransportPolicy, icePortRange, } = {}) {
|
|
47
|
+
constructor({ codecs, headerExtensions, iceServers, iceTransportPolicy, icePortRange, dtls, } = {}) {
|
|
48
48
|
super();
|
|
49
49
|
this.cname = uuid.v4();
|
|
50
50
|
this.masterTransportEstablished = false;
|
|
@@ -132,6 +132,12 @@ class RTCPeerConnection extends helper_1.EventTarget {
|
|
|
132
132
|
].forEach((v, i) => {
|
|
133
133
|
v.id = 1 + i;
|
|
134
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
|
+
}
|
|
135
141
|
this.iceConnectionStateChange.subscribe((state) => {
|
|
136
142
|
switch (state) {
|
|
137
143
|
case "disconnected":
|
|
@@ -680,7 +686,9 @@ class RTCPeerConnection extends helper_1.EventTarget {
|
|
|
680
686
|
return this.getTransceivers().map((t) => t.receiver);
|
|
681
687
|
}
|
|
682
688
|
// todo fix
|
|
683
|
-
addTrack(track,
|
|
689
|
+
addTrack(track,
|
|
690
|
+
/**todo impl */
|
|
691
|
+
ms) {
|
|
684
692
|
if (this.isClosed)
|
|
685
693
|
throw new Error("is closed");
|
|
686
694
|
if (this.getSenders().find((sender) => sender.track?.uuid === track.uuid)) {
|
|
@@ -941,5 +949,6 @@ exports.defaultPeerConfig = {
|
|
|
941
949
|
iceTransportPolicy: "all",
|
|
942
950
|
iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
|
|
943
951
|
icePortRange: undefined,
|
|
952
|
+
dtls: {},
|
|
944
953
|
};
|
|
945
954
|
//# sourceMappingURL=peerConnection.js.map
|