werift 0.22.3 → 0.22.5
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/log.js +1 -4
- package/lib/common/src/log.js.map +1 -1
- package/lib/common/src/transport.d.ts +2 -2
- package/lib/common/src/transport.js +4 -7
- package/lib/common/src/transport.js.map +1 -1
- package/lib/dtls/src/cipher/create.js +1 -4
- package/lib/dtls/src/cipher/create.js.map +1 -1
- package/lib/dtls/src/cipher/namedCurve.js +2 -5
- package/lib/dtls/src/cipher/namedCurve.js.map +1 -1
- package/lib/dtls/src/cipher/prf.js +2 -5
- package/lib/dtls/src/cipher/prf.js.map +1 -1
- package/lib/dtls/src/cipher/suites/aead.js +1 -34
- package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
- package/lib/dtls/src/context/cipher.js +1 -34
- package/lib/dtls/src/context/cipher.js.map +1 -1
- package/lib/ice/src/dns/lookup.d.ts +2 -2
- package/lib/ice/src/dns/lookup.js +4 -7
- package/lib/ice/src/dns/lookup.js.map +1 -1
- package/lib/ice/src/ice.js +8 -44
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/stun/attributes.js +6 -42
- package/lib/ice/src/stun/attributes.js.map +1 -1
- package/lib/ice/src/stun/message.js +1 -4
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/utils.d.ts +1 -1
- package/lib/ice/src/utils.js +4 -7
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/index.mjs +35 -26
- package/lib/nonstandard/index.mjs +13 -10
- package/lib/rtp/src/extra/container/mp4/container.js +1 -34
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.js +1 -4
- package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/sps-parser.js +1 -4
- package/lib/rtp/src/extra/container/mp4/sps-parser.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/container.js +1 -34
- package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/util.js +1 -34
- package/lib/rtp/src/extra/container/webm/util.js.map +1 -1
- package/lib/rtp/src/srtp/context/context.js +4 -7
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/sctp/src/chunk.js +1 -4
- package/lib/sctp/src/chunk.js.map +1 -1
- package/lib/sctp/src/index.d.ts +1 -0
- package/lib/sctp/src/index.js +4 -1
- package/lib/sctp/src/index.js.map +1 -1
- package/lib/webrtc/src/helper.d.ts +1 -1
- package/lib/webrtc/src/helper.js +2 -5
- package/lib/webrtc/src/helper.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +3 -0
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/peerConnection.js +1 -1
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sdp.js +1 -34
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.js +9 -1
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.js +1 -1
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../../../ice/src/stun/message.ts"],"names":[],"mappings":";;;;;;AAwBA,oCAsEC;AAwGD,sCAOC;AA7MD,mCAAoC;AACpC,YAAY;AACZ,gEAAiC;AAEjC,sCAA2D;AAC3D,6CAQsB;AACtB,mCAQiB;AAEjB,SAAgB,YAAY,CAC1B,IAAY,EACZ,YAAqB;IAErB,IAAI,IAAI,CAAC,MAAM,GAAG,qBAAa,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAEpC,IAAI,IAAI,CAAC,MAAM,KAAK,qBAAa,GAAG,MAAM,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAC/B,IAAI,CAAC,KAAK,CAAC,qBAAa,GAAG,EAAE,EAAE,qBAAa,CAAC,CAC9C,CAAC;IAEF,MAAM,mBAAmB,GAAG,IAAI,gCAAmB,EAAE,CAAC;IAEtD,KAAK,IAAI,GAAG,GAAG,qBAAa,EAAE,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAI,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;QAC3D,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,+BAAkB,CAAC,CAAC;QACxD,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,EAAE,QAAQ,EAAE,AAAD,EAAG,UAAU,CAAC,GAAG,+BAAkB,CAAC,QAAQ,CAAC,CAAC;YAChE,IAAI,UAAU,CAAC,IAAI,KAAK,6BAAgB,CAAC,IAAI,EAAE,CAAC;gBAC9C,mBAAmB,CAAC,YAAY,CAC9B,QAAwB,EACxB,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CACnC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,mBAAmB,CAAC,YAAY,CAC9B,QAAwB,EACxB,UAAU,CAAC,OAAO,CAAC,CACpB,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC/B,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC3D,MAAM,MAAM,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;gBACpE,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;oBAC3B,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC;iBAAM,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;gBAC5C,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC;oBACrE,MAAM,MAAM,GACV,mBAAmB,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;oBAC7D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC9B,OAAO,SAAS,CAAC;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED,MAAM,UAAU,GAAG,mBAAmB,CAAC,aAAa,EAAE,CAAC;IACvD,mBAAmB,CAAC,KAAK,EAAE,CAAC;IAE5B,OAAO,IAAI,OAAO,CAChB,WAAW,GAAG,MAAM,EACpB,WAAW,GAAG,MAAM,EACpB,aAAa,EACb,UAAU,CACX,CAAC;AACJ,CAAC;AAED,MAAa,OAAQ,SAAQ,gCAAmB;IAC9C,YACS,aAAsB,EACtB,YAAqB,EACrB,gBAAwB,IAAA,4BAAmB,GAAE,EACpD,aAA8B,EAAE;QAEhC,KAAK,CAAC,UAAU,CAAC,CAAC;QALlB;;;;mBAAO,aAAa;WAAS;QAC7B;;;;mBAAO,YAAY;WAAS;QAC5B;;;;mBAAO,aAAa;WAAgC;IAItD,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,IAAI;QACN,OAAO;YACL,aAAa,EAAE,eAAO,CAAC,IAAI,CAAC,aAAa,CAAC;YAC1C,YAAY,EAAE,eAAO,CAAC,IAAI,CAAC,YAAY,CAAC;YACxC,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;IACJ,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,KAAK;QACP,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,CAAC,QAAQ,EAAE,AAAD,EAAG,QAAQ,CAAC,GAAG,+BAAkB,CAAC,QAAQ,CAAC,CAAC;YAC5D,MAAM,CAAC,GACL,QAAQ,CAAC,IAAI,KAAK,2BAAc,CAAC,IAAI;gBACnC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC;gBACzC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC1B,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;YACzB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;YAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACtC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAC7D,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAClC,GAAG,CAAC,aAAa,CAAC,cAAM,EAAE,CAAC,CAAC,CAAC;QAE7B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,mBAAmB,CAAC,GAAW;QAC7B,IAAI,CAAC,YAAY,CAAC,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,GAAW;QAC1B,MAAM,SAAS,GAAG,aAAa,CAC7B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,qBAAa,GAAG,wBAAgB,CACrD,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAChB,IAAA,mBAAU,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACvD,KAAK,CACN,CAAC;IACJ,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;CACF;AArED,0BAqEC;AAED,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE;IACrD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,SAAS,GAAG,aAAa,CAC7B,IAAI,EACJ,IAAI,CAAC,MAAM,GAAG,qBAAa,GAAG,0BAAkB,CACjD,CAAC;IACF,MAAM,QAAQ,GAAG,IAAA,sBAAK,EAAC,SAAS,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,YAAY,CAAC,uBAAe,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,IAAA,kBAAS,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,OAAO,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,GAAW;IACjD,MAAM,SAAS,GAAG,aAAa,CAC7B,IAAI,EACJ,IAAI,CAAC,MAAM,GAAG,qBAAa,GAAG,wBAAgB,CAC/C,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAChB,IAAA,mBAAU,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACvD,KAAK,CACN,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa,CAAC,MAAc;IAC1C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC;IACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,IAAI,CAAC;IAClB,CAAC;AACH,CAAC","sourcesContent":["import { createHmac } from \"crypto\";\n//@ts-ignore\nimport crc32 from \"buffer-crc32\";\n\nimport { bufferXor, randomTransactionId } from \"../helper\";\nimport {\n ATTRIBUTES_BY_NAME,\n ATTRIBUTES_BY_TYPE,\n type AttributeKey,\n type AttributePair,\n AttributeRepository,\n packXorAddress,\n unpackXorAddress,\n} from \"./attributes\";\nimport {\n COOKIE,\n FINGERPRINT_LENGTH,\n FINGERPRINT_XOR,\n HEADER_LENGTH,\n INTEGRITY_LENGTH,\n classes,\n methods,\n} from \"./const\";\n\nexport function parseMessage(\n data: Buffer,\n integrityKey?: Buffer,\n): Message | undefined {\n if (data.length < HEADER_LENGTH) {\n return undefined;\n }\n\n const length = data.readUint16BE(2);\n\n if (data.length !== HEADER_LENGTH + length) {\n return undefined;\n }\n\n const messageType = data.readUint16BE(0);\n const transactionId = Buffer.from(\n data.slice(HEADER_LENGTH - 12, HEADER_LENGTH),\n );\n\n const attributeRepository = new AttributeRepository();\n\n for (let pos = HEADER_LENGTH; pos <= data.length - 4; ) {\n const attrType = data.readUInt16BE(pos);\n const attrLen = data.readUInt16BE(pos + 2);\n const payload = data.slice(pos + 4, pos + 4 + attrLen);\n const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;\n const attributesTypes = Object.keys(ATTRIBUTES_BY_TYPE);\n if (attributesTypes.includes(attrType.toString())) {\n const [, attrName, , attrUnpack] = ATTRIBUTES_BY_TYPE[attrType];\n if (attrUnpack.name === unpackXorAddress.name) {\n attributeRepository.setAttribute(\n attrName as AttributeKey,\n attrUnpack(payload, transactionId),\n );\n } else {\n attributeRepository.setAttribute(\n attrName as AttributeKey,\n attrUnpack(payload),\n );\n }\n\n if (attrName === \"FINGERPRINT\") {\n const fingerprint = messageFingerprint(data.slice(0, pos));\n const expect = attributeRepository.getAttributeValue(\"FINGERPRINT\");\n if (expect !== fingerprint) {\n return undefined;\n }\n } else if (attrName === \"MESSAGE-INTEGRITY\") {\n if (integrityKey) {\n const integrity = messageIntegrity(data.slice(0, pos), integrityKey);\n const expect =\n attributeRepository.getAttributeValue(\"MESSAGE-INTEGRITY\");\n if (!integrity.equals(expect)) {\n return undefined;\n }\n }\n }\n }\n pos += 4 + attrLen + padLen;\n }\n\n const attributes = attributeRepository.getAttributes();\n attributeRepository.clear();\n\n return new Message(\n messageType & 0x3eef,\n messageType & 0x0110,\n transactionId,\n attributes,\n );\n}\n\nexport class Message extends AttributeRepository {\n constructor(\n public messageMethod: methods,\n public messageClass: classes,\n public transactionId: Buffer = randomTransactionId(),\n attributes: AttributePair[] = [],\n ) {\n super(attributes);\n }\n\n toJSON() {\n return this.json;\n }\n\n get json() {\n return {\n messageMethod: methods[this.messageMethod],\n messageClass: classes[this.messageClass],\n attributes: this.attributes,\n };\n }\n\n get transactionIdHex() {\n return this.transactionId.toString(\"hex\");\n }\n\n get bytes() {\n let data = Buffer.from([]);\n for (const attrName of this.attributesKeys) {\n const attrValue = this.getAttributeValue(attrName);\n const [attrType, , attrPack] = ATTRIBUTES_BY_NAME[attrName];\n const v =\n attrPack.name === packXorAddress.name\n ? attrPack(attrValue, this.transactionId)\n : attrPack(attrValue);\n const attrLen = v.length;\n const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;\n const attrHeader = Buffer.alloc(4);\n attrHeader.writeUInt16BE(attrType, 0);\n attrHeader.writeUInt16BE(attrLen, 2);\n data = Buffer.concat([data, attrHeader, v, Buffer.alloc(padLen, 0)]);\n }\n const buf = Buffer.alloc(8);\n buf.writeUInt16BE(this.messageMethod | this.messageClass, 0);\n buf.writeUInt16BE(data.length, 2);\n buf.writeUInt32BE(COOKIE, 4);\n\n return Buffer.concat([buf, this.transactionId, data]);\n }\n\n addMessageIntegrity(key: Buffer) {\n this.setAttribute(\"MESSAGE-INTEGRITY\", this.messageIntegrity(key));\n return this;\n }\n\n messageIntegrity(key: Buffer) {\n const checkData = setBodyLength(\n this.bytes,\n this.bytes.length - HEADER_LENGTH + INTEGRITY_LENGTH,\n );\n return Buffer.from(\n createHmac(\"sha1\", key).update(checkData).digest(\"hex\"),\n \"hex\",\n );\n }\n\n addFingerprint() {\n this.setAttribute(\"FINGERPRINT\", messageFingerprint(this.bytes));\n }\n}\n\nconst setBodyLength = (data: Buffer, length: number) => {\n const output = Buffer.alloc(data.length);\n data.copy(output, 0, 0, 2);\n output.writeUInt16BE(length, 2);\n data.copy(output, 4, 4);\n return output;\n};\n\nfunction messageFingerprint(data: Buffer) {\n const checkData = setBodyLength(\n data,\n data.length - HEADER_LENGTH + FINGERPRINT_LENGTH,\n );\n const crc32Buf = crc32(checkData);\n const xorBuf = Buffer.alloc(4);\n xorBuf.writeInt32BE(FINGERPRINT_XOR, 0);\n const fingerprint = bufferXor(crc32Buf, xorBuf);\n return fingerprint.readUInt32BE(0);\n}\n\nfunction messageIntegrity(data: Buffer, key: Buffer) {\n const checkData = setBodyLength(\n data,\n data.length - HEADER_LENGTH + INTEGRITY_LENGTH,\n );\n return Buffer.from(\n createHmac(\"sha1\", key).update(checkData).digest(\"hex\"),\n \"hex\",\n );\n}\n\nexport function paddingLength(length: number) {\n const rest = length % 4;\n if (rest === 0) {\n return 0;\n } else {\n return 4 - rest;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../../../ice/src/stun/message.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac } from \"crypto\";\n//@ts-ignore\nimport crc32 from \"buffer-crc32\";\n\nimport { bufferXor, randomTransactionId } from \"../helper\";\nimport {\n ATTRIBUTES_BY_NAME,\n ATTRIBUTES_BY_TYPE,\n type AttributeKey,\n type AttributePair,\n AttributeRepository,\n packXorAddress,\n unpackXorAddress,\n} from \"./attributes\";\nimport {\n COOKIE,\n FINGERPRINT_LENGTH,\n FINGERPRINT_XOR,\n HEADER_LENGTH,\n INTEGRITY_LENGTH,\n classes,\n methods,\n} from \"./const\";\n\nexport function parseMessage(\n data: Buffer,\n integrityKey?: Buffer,\n): Message | undefined {\n if (data.length < HEADER_LENGTH) {\n return undefined;\n }\n\n const length = data.readUint16BE(2);\n\n if (data.length !== HEADER_LENGTH + length) {\n return undefined;\n }\n\n const messageType = data.readUint16BE(0);\n const transactionId = Buffer.from(\n data.slice(HEADER_LENGTH - 12, HEADER_LENGTH),\n );\n\n const attributeRepository = new AttributeRepository();\n\n for (let pos = HEADER_LENGTH; pos <= data.length - 4; ) {\n const attrType = data.readUInt16BE(pos);\n const attrLen = data.readUInt16BE(pos + 2);\n const payload = data.slice(pos + 4, pos + 4 + attrLen);\n const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;\n const attributesTypes = Object.keys(ATTRIBUTES_BY_TYPE);\n if (attributesTypes.includes(attrType.toString())) {\n const [, attrName, , attrUnpack] = ATTRIBUTES_BY_TYPE[attrType];\n if (attrUnpack.name === unpackXorAddress.name) {\n attributeRepository.setAttribute(\n attrName as AttributeKey,\n attrUnpack(payload, transactionId),\n );\n } else {\n attributeRepository.setAttribute(\n attrName as AttributeKey,\n attrUnpack(payload),\n );\n }\n\n if (attrName === \"FINGERPRINT\") {\n const fingerprint = messageFingerprint(data.slice(0, pos));\n const expect = attributeRepository.getAttributeValue(\"FINGERPRINT\");\n if (expect !== fingerprint) {\n return undefined;\n }\n } else if (attrName === \"MESSAGE-INTEGRITY\") {\n if (integrityKey) {\n const integrity = messageIntegrity(data.slice(0, pos), integrityKey);\n const expect =\n attributeRepository.getAttributeValue(\"MESSAGE-INTEGRITY\");\n if (!integrity.equals(expect)) {\n return undefined;\n }\n }\n }\n }\n pos += 4 + attrLen + padLen;\n }\n\n const attributes = attributeRepository.getAttributes();\n attributeRepository.clear();\n\n return new Message(\n messageType & 0x3eef,\n messageType & 0x0110,\n transactionId,\n attributes,\n );\n}\n\nexport class Message extends AttributeRepository {\n constructor(\n public messageMethod: methods,\n public messageClass: classes,\n public transactionId: Buffer = randomTransactionId(),\n attributes: AttributePair[] = [],\n ) {\n super(attributes);\n }\n\n toJSON() {\n return this.json;\n }\n\n get json() {\n return {\n messageMethod: methods[this.messageMethod],\n messageClass: classes[this.messageClass],\n attributes: this.attributes,\n };\n }\n\n get transactionIdHex() {\n return this.transactionId.toString(\"hex\");\n }\n\n get bytes() {\n let data = Buffer.from([]);\n for (const attrName of this.attributesKeys) {\n const attrValue = this.getAttributeValue(attrName);\n const [attrType, , attrPack] = ATTRIBUTES_BY_NAME[attrName];\n const v =\n attrPack.name === packXorAddress.name\n ? attrPack(attrValue, this.transactionId)\n : attrPack(attrValue);\n const attrLen = v.length;\n const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;\n const attrHeader = Buffer.alloc(4);\n attrHeader.writeUInt16BE(attrType, 0);\n attrHeader.writeUInt16BE(attrLen, 2);\n data = Buffer.concat([data, attrHeader, v, Buffer.alloc(padLen, 0)]);\n }\n const buf = Buffer.alloc(8);\n buf.writeUInt16BE(this.messageMethod | this.messageClass, 0);\n buf.writeUInt16BE(data.length, 2);\n buf.writeUInt32BE(COOKIE, 4);\n\n return Buffer.concat([buf, this.transactionId, data]);\n }\n\n addMessageIntegrity(key: Buffer) {\n this.setAttribute(\"MESSAGE-INTEGRITY\", this.messageIntegrity(key));\n return this;\n }\n\n messageIntegrity(key: Buffer) {\n const checkData = setBodyLength(\n this.bytes,\n this.bytes.length - HEADER_LENGTH + INTEGRITY_LENGTH,\n );\n return Buffer.from(\n createHmac(\"sha1\", key).update(checkData).digest(\"hex\"),\n \"hex\",\n );\n }\n\n addFingerprint() {\n this.setAttribute(\"FINGERPRINT\", messageFingerprint(this.bytes));\n }\n}\n\nconst setBodyLength = (data: Buffer, length: number) => {\n const output = Buffer.alloc(data.length);\n data.copy(output, 0, 0, 2);\n output.writeUInt16BE(length, 2);\n data.copy(output, 4, 4);\n return output;\n};\n\nfunction messageFingerprint(data: Buffer) {\n const checkData = setBodyLength(\n data,\n data.length - HEADER_LENGTH + FINGERPRINT_LENGTH,\n );\n const crc32Buf = crc32(checkData);\n const xorBuf = Buffer.alloc(4);\n xorBuf.writeInt32BE(FINGERPRINT_XOR, 0);\n const fingerprint = bufferXor(crc32Buf, xorBuf);\n return fingerprint.readUInt32BE(0);\n}\n\nfunction messageIntegrity(data: Buffer, key: Buffer) {\n const checkData = setBodyLength(\n data,\n data.length - HEADER_LENGTH + INTEGRITY_LENGTH,\n );\n return Buffer.from(\n createHmac(\"sha1\", key).update(checkData).digest(\"hex\"),\n \"hex\",\n );\n}\n\nexport function paddingLength(length: number) {\n const rest = length % 4;\n if (rest === 0) {\n return 0;\n } else {\n return 4 - rest;\n }\n}\n"]}
|
package/lib/ice/src/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import os from "os";
|
|
1
|
+
import * as os from "node:os";
|
|
2
2
|
import { type Address, type InterfaceAddresses } from "./imports/common";
|
|
3
3
|
export declare function getGlobalIp(stunServer?: Address, interfaceAddresses?: InterfaceAddresses): Promise<string>;
|
|
4
4
|
export declare function isLinkLocalAddress(info: os.NetworkInterfaceInfo): boolean;
|
package/lib/ice/src/utils.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.url2Address = void 0;
|
|
7
4
|
exports.getGlobalIp = getGlobalIp;
|
|
8
5
|
exports.isLinkLocalAddress = isLinkLocalAddress;
|
|
9
6
|
exports.nodeIpAddress = nodeIpAddress;
|
|
10
7
|
exports.getHostAddresses = getHostAddresses;
|
|
11
|
-
const
|
|
12
|
-
const
|
|
8
|
+
const os = require("node:os");
|
|
9
|
+
const nodeIp = require("ip");
|
|
13
10
|
const common_1 = require("./imports/common");
|
|
14
11
|
const const_1 = require("./stun/const");
|
|
15
12
|
const message_1 = require("./stun/message");
|
|
@@ -34,7 +31,7 @@ function nodeIpAddress(family, { useLinkLocalAddress, } = {}) {
|
|
|
34
31
|
// https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/network.cc#236
|
|
35
32
|
const costlyNetworks = ["ipsec", "tun", "utun", "tap"];
|
|
36
33
|
const banNetworks = ["vmnet", "veth"];
|
|
37
|
-
const interfaces =
|
|
34
|
+
const interfaces = os.networkInterfaces();
|
|
38
35
|
logger(interfaces);
|
|
39
36
|
const all = Object.keys(interfaces)
|
|
40
37
|
.map((nic) => {
|
|
@@ -47,7 +44,7 @@ function nodeIpAddress(family, { useLinkLocalAddress, } = {}) {
|
|
|
47
44
|
}
|
|
48
45
|
}
|
|
49
46
|
const addresses = interfaces[nic].filter((details) => (0, common_1.normalizeFamilyNodeV18)(details.family) === family &&
|
|
50
|
-
!
|
|
47
|
+
!nodeIp.isLoopback(details.address) &&
|
|
51
48
|
(useLinkLocalAddress ? true : !isLinkLocalAddress(details)));
|
|
52
49
|
return {
|
|
53
50
|
nic,
|
package/lib/ice/src/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../ice/src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../ice/src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as os from \"node:os\";\nimport * as nodeIp from \"ip\";\nimport {\n type Address,\n type InterfaceAddresses,\n debug,\n normalizeFamilyNodeV18,\n} from \"./imports/common\";\nimport { classes, methods } from \"./stun/const\";\nimport { Message } from \"./stun/message\";\nimport { StunProtocol } from \"./stun/protocol\";\n\nconst logger = debug(\"werift-ice : packages/ice/src/utils.ts\");\n\nexport async function getGlobalIp(\n stunServer?: Address,\n interfaceAddresses?: InterfaceAddresses,\n) {\n const protocol = new StunProtocol();\n await protocol.connectionMade(true, undefined, interfaceAddresses);\n const request = new Message(methods.BINDING, classes.REQUEST);\n const [response] = await protocol.request(\n request,\n stunServer ?? [\"stun.l.google.com\", 19302],\n );\n await protocol.close();\n\n const address = response.getAttributeValue(\"XOR-MAPPED-ADDRESS\");\n return address[0] as string;\n}\n\nexport function isLinkLocalAddress(info: os.NetworkInterfaceInfo) {\n return (\n (normalizeFamilyNodeV18(info.family) === 4 &&\n info.address?.startsWith(\"169.254.\")) ||\n (normalizeFamilyNodeV18(info.family) === 6 &&\n info.address?.startsWith(\"fe80::\"))\n );\n}\n\nexport function nodeIpAddress(\n family: number,\n {\n useLinkLocalAddress,\n }: {\n /** such as google cloud run */\n useLinkLocalAddress?: boolean;\n } = {},\n): string[] {\n // https://chromium.googlesource.com/external/webrtc/+/master/rtc_base/network.cc#236\n const costlyNetworks = [\"ipsec\", \"tun\", \"utun\", \"tap\"];\n const banNetworks = [\"vmnet\", \"veth\"];\n\n const interfaces = os.networkInterfaces();\n\n logger(interfaces);\n\n const all = Object.keys(interfaces)\n .map((nic) => {\n for (const word of [...costlyNetworks, ...banNetworks]) {\n if (nic.startsWith(word)) {\n return {\n nic,\n addresses: [],\n };\n }\n }\n const addresses = interfaces[nic]!.filter(\n (details) =>\n normalizeFamilyNodeV18(details.family) === family &&\n !nodeIp.isLoopback(details.address) &&\n (useLinkLocalAddress ? true : !isLinkLocalAddress(details)),\n );\n return {\n nic,\n addresses: addresses.map((address) => address.address),\n };\n })\n .filter((address) => !!address);\n\n // os.networkInterfaces doesn't actually return addresses in a good order.\n // have seen instances where en0 (ethernet) is after en1 (wlan), etc.\n // eth0 > eth1\n all.sort((a, b) => a.nic.localeCompare(b.nic));\n return Object.values(all).flatMap((entry) => entry.addresses);\n}\n\nexport function getHostAddresses(\n useIpv4: boolean,\n useIpv6: boolean,\n options: {\n /** such as google cloud run */\n useLinkLocalAddress?: boolean;\n } = {},\n) {\n const address: string[] = [];\n if (useIpv4) {\n address.push(...nodeIpAddress(4, options));\n }\n if (useIpv6) {\n address.push(...nodeIpAddress(6, options));\n }\n return address;\n}\n\nexport const url2Address = (url?: string) => {\n if (!url) return;\n const [address, port] = url.split(\":\");\n return [address, Number.parseInt(port)] as Address;\n};\n"]}
|
package/lib/index.mjs
CHANGED
|
@@ -530,8 +530,8 @@ var EventDisposer = class {
|
|
|
530
530
|
import {
|
|
531
531
|
createSocket as createSocket2
|
|
532
532
|
} from "dgram";
|
|
533
|
-
import net from "net";
|
|
534
|
-
import { connect } from "net";
|
|
533
|
+
import * as net from "node:net";
|
|
534
|
+
import { connect } from "node:net";
|
|
535
535
|
var log = debug("werift-ice:packages/ice/src/transport.ts");
|
|
536
536
|
var UdpTransport = class _UdpTransport {
|
|
537
537
|
constructor(socketType, options = {}) {
|
|
@@ -726,7 +726,7 @@ var signatures = [
|
|
|
726
726
|
// ../dtls/src/cipher/prf.ts
|
|
727
727
|
import { createHash, createHmac } from "crypto";
|
|
728
728
|
import { createDecode } from "@shinyoshiaki/binary-data";
|
|
729
|
-
import nacl from "tweetnacl";
|
|
729
|
+
import * as nacl from "tweetnacl";
|
|
730
730
|
|
|
731
731
|
// ../dtls/src/cipher/ec.ts
|
|
732
732
|
import { p256 } from "@noble/curves/p256";
|
|
@@ -1893,7 +1893,7 @@ function createAEADCipher(id, name, block, kx, constants, hash2 = "sha256") {
|
|
|
1893
1893
|
}
|
|
1894
1894
|
|
|
1895
1895
|
// ../dtls/src/cipher/namedCurve.ts
|
|
1896
|
-
import nacl2 from "tweetnacl";
|
|
1896
|
+
import * as nacl2 from "tweetnacl";
|
|
1897
1897
|
function generateKeyPair(namedCurve) {
|
|
1898
1898
|
switch (namedCurve) {
|
|
1899
1899
|
case NamedCurveAlgorithm.secp256r1_23: {
|
|
@@ -4544,7 +4544,7 @@ function wrapRtx(packet, payloadType, sequenceNumber, ssrc) {
|
|
|
4544
4544
|
|
|
4545
4545
|
// ../rtp/src/srtp/context/context.ts
|
|
4546
4546
|
import { createHmac as createHmac3 } from "crypto";
|
|
4547
|
-
import AES from "aes-js";
|
|
4547
|
+
import * as AES from "aes-js";
|
|
4548
4548
|
|
|
4549
4549
|
// ../rtp/src/srtp/cipher/ctr.ts
|
|
4550
4550
|
import { createCipheriv as createCipheriv2, createDecipheriv as createDecipheriv2, createHmac as createHmac2 } from "crypto";
|
|
@@ -6387,7 +6387,7 @@ var cancelable = (ex) => {
|
|
|
6387
6387
|
|
|
6388
6388
|
// ../ice/src/stun/attributes.ts
|
|
6389
6389
|
import * as Int64 from "int64-buffer";
|
|
6390
|
-
import nodeIp from "ip";
|
|
6390
|
+
import * as nodeIp from "ip";
|
|
6391
6391
|
function packAddress(value) {
|
|
6392
6392
|
const [address] = value;
|
|
6393
6393
|
const protocol = nodeIp.isV4Format(address) ? IPV4_PROTOCOL : IPV6_PROTOCOL;
|
|
@@ -7385,11 +7385,11 @@ function candidatePriority(candidateType, localPref = 65535) {
|
|
|
7385
7385
|
import { randomBytes as randomBytes6 } from "crypto";
|
|
7386
7386
|
import { isIPv4 as isIPv42 } from "net";
|
|
7387
7387
|
import * as Int642 from "int64-buffer";
|
|
7388
|
-
import isEqual from "fast-deep-equal";
|
|
7389
|
-
import timers from "timers/promises";
|
|
7388
|
+
import * as isEqual from "fast-deep-equal";
|
|
7389
|
+
import * as timers from "node:timers/promises";
|
|
7390
7390
|
|
|
7391
7391
|
// ../ice/src/dns/lookup.ts
|
|
7392
|
-
import mdns from "multicast-dns";
|
|
7392
|
+
import * as mdns from "multicast-dns";
|
|
7393
7393
|
var MdnsLookup = class {
|
|
7394
7394
|
cache = /* @__PURE__ */ new Map();
|
|
7395
7395
|
mdnsInstance = mdns();
|
|
@@ -7559,8 +7559,8 @@ function validateAddress(addr) {
|
|
|
7559
7559
|
}
|
|
7560
7560
|
|
|
7561
7561
|
// ../ice/src/utils.ts
|
|
7562
|
-
import os from "os";
|
|
7563
|
-
import nodeIp2 from "ip";
|
|
7562
|
+
import * as os from "node:os";
|
|
7563
|
+
import * as nodeIp2 from "ip";
|
|
7564
7564
|
var logger = debug("werift-ice : packages/ice/src/utils.ts");
|
|
7565
7565
|
async function getGlobalIp(stunServer, interfaceAddresses) {
|
|
7566
7566
|
const protocol = new StunProtocol();
|
|
@@ -8500,7 +8500,7 @@ var decodeTxUsername = (txUsername) => {
|
|
|
8500
8500
|
};
|
|
8501
8501
|
|
|
8502
8502
|
// src/helper.ts
|
|
8503
|
-
import EventEmitter from "events";
|
|
8503
|
+
import { EventEmitter } from "node:events";
|
|
8504
8504
|
function enumerate2(arr) {
|
|
8505
8505
|
return arr.map((v, i) => [i, v]);
|
|
8506
8506
|
}
|
|
@@ -8824,7 +8824,7 @@ function useVideoOrientation() {
|
|
|
8824
8824
|
|
|
8825
8825
|
// src/media/rtpReceiver.ts
|
|
8826
8826
|
import { randomUUID as randomUUID7 } from "crypto";
|
|
8827
|
-
import { setTimeout as
|
|
8827
|
+
import { setTimeout as setTimeout8 } from "timers/promises";
|
|
8828
8828
|
|
|
8829
8829
|
// src/utils.ts
|
|
8830
8830
|
import { createHash as createHash4 } from "crypto";
|
|
@@ -9293,7 +9293,7 @@ var NackHandler = class {
|
|
|
9293
9293
|
};
|
|
9294
9294
|
|
|
9295
9295
|
// src/media/receiver/receiverTwcc.ts
|
|
9296
|
-
import { setTimeout as
|
|
9296
|
+
import { setTimeout as setTimeout6 } from "timers/promises";
|
|
9297
9297
|
var log26 = debug("werift:packages/webrtc/media/receiver/receiverTwcc");
|
|
9298
9298
|
var ReceiverTWCC = class {
|
|
9299
9299
|
constructor(dtlsTransport, rtcpSsrc, mediaSourceSsrc) {
|
|
@@ -9319,7 +9319,7 @@ var ReceiverTWCC = class {
|
|
|
9319
9319
|
async runTWCC() {
|
|
9320
9320
|
while (this.twccRunning) {
|
|
9321
9321
|
this.sendTWCC();
|
|
9322
|
-
await
|
|
9322
|
+
await setTimeout6(100);
|
|
9323
9323
|
}
|
|
9324
9324
|
}
|
|
9325
9325
|
sendTWCC() {
|
|
@@ -9476,7 +9476,7 @@ import * as Int643 from "int64-buffer";
|
|
|
9476
9476
|
// src/transport/dtls.ts
|
|
9477
9477
|
import { Certificate as Certificate3, PrivateKey as PrivateKey2 } from "@fidm/x509";
|
|
9478
9478
|
import { randomUUID as randomUUID4 } from "crypto";
|
|
9479
|
-
import { setTimeout as
|
|
9479
|
+
import { setTimeout as setTimeout7 } from "timers/promises";
|
|
9480
9480
|
var log27 = debug("werift:packages/webrtc/src/transport/dtls.ts");
|
|
9481
9481
|
var RTCDtlsTransport = class _RTCDtlsTransport {
|
|
9482
9482
|
constructor(config, iceTransport, localCertificate, srtpProfiles2 = []) {
|
|
@@ -9592,7 +9592,7 @@ var RTCDtlsTransport = class _RTCDtlsTransport {
|
|
|
9592
9592
|
f(error);
|
|
9593
9593
|
});
|
|
9594
9594
|
if (this.dtls instanceof DtlsClient) {
|
|
9595
|
-
await
|
|
9595
|
+
await setTimeout7(100);
|
|
9596
9596
|
this.dtls.connect().catch((error) => {
|
|
9597
9597
|
this.setState("failed");
|
|
9598
9598
|
log27("dtls connect failed", error);
|
|
@@ -12856,7 +12856,7 @@ var RTCRtpReceiver = class {
|
|
|
12856
12856
|
this.rtcpRunning = true;
|
|
12857
12857
|
try {
|
|
12858
12858
|
while (this.rtcpRunning) {
|
|
12859
|
-
await
|
|
12859
|
+
await setTimeout8(500 + Math.random() * 1e3, void 0, {
|
|
12860
12860
|
signal: this.rtcpCancel.signal
|
|
12861
12861
|
});
|
|
12862
12862
|
const reports = Object.entries(this.remoteStreams).map(
|
|
@@ -12883,12 +12883,12 @@ var RTCRtpReceiver = class {
|
|
|
12883
12883
|
const packet = new RtcpRrPacket({ ssrc: this.rtcpSsrc, reports });
|
|
12884
12884
|
try {
|
|
12885
12885
|
if (this.config.debug.receiverReportDelay) {
|
|
12886
|
-
await
|
|
12886
|
+
await setTimeout8(this.config.debug.receiverReportDelay);
|
|
12887
12887
|
}
|
|
12888
12888
|
await this.dtlsTransport.sendRtcp([packet]);
|
|
12889
12889
|
} catch (error) {
|
|
12890
12890
|
log31("sendRtcp failed", error);
|
|
12891
|
-
await
|
|
12891
|
+
await setTimeout8(500 + Math.random() * 1e3);
|
|
12892
12892
|
}
|
|
12893
12893
|
}
|
|
12894
12894
|
} catch (error) {
|
|
@@ -13185,7 +13185,7 @@ var RtpRouter = class {
|
|
|
13185
13185
|
import { randomBytes as randomBytes9 } from "crypto";
|
|
13186
13186
|
import { jspack as jspack7 } from "@shinyoshiaki/jspack";
|
|
13187
13187
|
import { randomUUID as randomUUID8 } from "crypto";
|
|
13188
|
-
import { setTimeout as
|
|
13188
|
+
import { setTimeout as setTimeout9 } from "timers/promises";
|
|
13189
13189
|
|
|
13190
13190
|
// src/media/sender/cumulativeResult.ts
|
|
13191
13191
|
var CumulativeResult = class {
|
|
@@ -13477,7 +13477,7 @@ var RTCRtpSender = class {
|
|
|
13477
13477
|
this.rtcpRunning = true;
|
|
13478
13478
|
try {
|
|
13479
13479
|
while (this.rtcpRunning) {
|
|
13480
|
-
await
|
|
13480
|
+
await setTimeout9(500 + Math.random() * 1e3, void 0, {
|
|
13481
13481
|
signal: this.rtcpCancel.signal
|
|
13482
13482
|
});
|
|
13483
13483
|
const packets = [
|
|
@@ -13511,7 +13511,7 @@ var RTCRtpSender = class {
|
|
|
13511
13511
|
await this.dtlsTransport.sendRtcp(packets);
|
|
13512
13512
|
} catch (error) {
|
|
13513
13513
|
log33("sendRtcp failed", error);
|
|
13514
|
-
await
|
|
13514
|
+
await setTimeout9(500 + Math.random() * 1e3);
|
|
13515
13515
|
}
|
|
13516
13516
|
}
|
|
13517
13517
|
} catch (error) {
|
|
@@ -14233,8 +14233,17 @@ var SDPManager = class {
|
|
|
14233
14233
|
* ローカルセッション記述を設定し、トランスポート情報を追加する
|
|
14234
14234
|
*/
|
|
14235
14235
|
setLocal(description, transceivers, sctpTransport) {
|
|
14236
|
+
const transceiverByMLineIndex = new Map(
|
|
14237
|
+
transceivers.map((transceiver) => [transceiver?.mLineIndex, transceiver])
|
|
14238
|
+
);
|
|
14239
|
+
const fallbackDtlsTransport = transceivers.find((transceiver) => transceiver?.dtlsTransport)?.dtlsTransport ?? sctpTransport?.dtlsTransport;
|
|
14236
14240
|
description.media.filter((m) => ["audio", "video"].includes(m.kind)).forEach((m, i) => {
|
|
14237
|
-
|
|
14241
|
+
const transceiver = transceiverByMLineIndex.get(i) ?? transceivers[i];
|
|
14242
|
+
const dtlsTransport = transceiver?.dtlsTransport ?? fallbackDtlsTransport;
|
|
14243
|
+
if (!dtlsTransport) {
|
|
14244
|
+
throw new Error(`dtls transport not found for media index ${i}`);
|
|
14245
|
+
}
|
|
14246
|
+
this.addTransportDescription(m, dtlsTransport);
|
|
14238
14247
|
});
|
|
14239
14248
|
const sctpMedia = description.media.find((m) => m.kind === "application");
|
|
14240
14249
|
if (sctpTransport && sctpMedia) {
|
|
@@ -14277,7 +14286,7 @@ var SecureTransportManager = class {
|
|
|
14277
14286
|
}
|
|
14278
14287
|
get dtlsTransports() {
|
|
14279
14288
|
const transports = [
|
|
14280
|
-
...this.transceiverManager.getTransceivers().map((t) => t
|
|
14289
|
+
...this.transceiverManager.getTransceivers().map((t) => t?.dtlsTransport),
|
|
14281
14290
|
this.sctpManager.sctpTransport?.dtlsTransport
|
|
14282
14291
|
].filter((t) => t != void 0);
|
|
14283
14292
|
return transports.reduce((acc, cur) => {
|
|
@@ -14839,7 +14848,7 @@ var RTCPeerConnection = class extends EventTarget {
|
|
|
14839
14848
|
bundlePolicy: this.sdpManager.bundlePolicy,
|
|
14840
14849
|
remoteIsBundled: !!this.sdpManager.remoteIsBundled,
|
|
14841
14850
|
media: this._localDescription.media[0],
|
|
14842
|
-
transceiver: this.transceiverManager.getTransceivers().find((t) => t
|
|
14851
|
+
transceiver: this.transceiverManager.getTransceivers().find((t) => t?.dtlsTransport?.iceTransport.id === iceTransport.id),
|
|
14843
14852
|
sctpTransport: this.sctpTransport?.dtlsTransport.iceTransport.id === iceTransport.id ? this.sctpTransport : void 0
|
|
14844
14853
|
});
|
|
14845
14854
|
});
|
|
@@ -530,8 +530,8 @@ var EventDisposer = class {
|
|
|
530
530
|
import {
|
|
531
531
|
createSocket as createSocket2
|
|
532
532
|
} from "dgram";
|
|
533
|
-
import net from "net";
|
|
534
|
-
import { connect } from "net";
|
|
533
|
+
import * as net from "node:net";
|
|
534
|
+
import { connect } from "node:net";
|
|
535
535
|
var log = debug("werift-ice:packages/ice/src/transport.ts");
|
|
536
536
|
var UdpTransport = class _UdpTransport {
|
|
537
537
|
constructor(socketType, options = {}) {
|
|
@@ -4375,7 +4375,7 @@ function wrapRtx(packet, payloadType, sequenceNumber, ssrc) {
|
|
|
4375
4375
|
|
|
4376
4376
|
// ../rtp/src/srtp/context/context.ts
|
|
4377
4377
|
import { createHmac as createHmac2 } from "crypto";
|
|
4378
|
-
import AES from "aes-js";
|
|
4378
|
+
import * as AES from "aes-js";
|
|
4379
4379
|
|
|
4380
4380
|
// ../rtp/src/srtp/cipher/ctr.ts
|
|
4381
4381
|
import { createCipheriv as createCipheriv2, createDecipheriv, createHmac } from "crypto";
|
|
@@ -6771,7 +6771,7 @@ var signatures = [
|
|
|
6771
6771
|
// ../dtls/src/cipher/prf.ts
|
|
6772
6772
|
import { createHash, createHmac as createHmac3 } from "crypto";
|
|
6773
6773
|
import { createDecode } from "@shinyoshiaki/binary-data";
|
|
6774
|
-
import nacl from "tweetnacl";
|
|
6774
|
+
import * as nacl from "tweetnacl";
|
|
6775
6775
|
|
|
6776
6776
|
// ../dtls/src/cipher/ec.ts
|
|
6777
6777
|
import { p256 } from "@noble/curves/p256";
|
|
@@ -7706,7 +7706,7 @@ function createAEADCipher(id, name, block, kx, constants, hash2 = "sha256") {
|
|
|
7706
7706
|
}
|
|
7707
7707
|
|
|
7708
7708
|
// ../dtls/src/cipher/namedCurve.ts
|
|
7709
|
-
import nacl2 from "tweetnacl";
|
|
7709
|
+
import * as nacl2 from "tweetnacl";
|
|
7710
7710
|
function generateKeyPair(namedCurve) {
|
|
7711
7711
|
switch (namedCurve) {
|
|
7712
7712
|
case NamedCurveAlgorithm.secp256r1_23: {
|
|
@@ -8426,7 +8426,7 @@ import crc32 from "buffer-crc32";
|
|
|
8426
8426
|
|
|
8427
8427
|
// ../ice/src/stun/attributes.ts
|
|
8428
8428
|
import * as Int64 from "int64-buffer";
|
|
8429
|
-
import nodeIp from "ip";
|
|
8429
|
+
import * as nodeIp from "ip";
|
|
8430
8430
|
function packAddress(value) {
|
|
8431
8431
|
const [address] = value;
|
|
8432
8432
|
const protocol = nodeIp.isV4Format(address) ? IPV4_PROTOCOL : IPV6_PROTOCOL;
|
|
@@ -8568,23 +8568,23 @@ var log22 = debug("werift-ice:packages/ice/src/turn/protocol.ts");
|
|
|
8568
8568
|
|
|
8569
8569
|
// ../ice/src/ice.ts
|
|
8570
8570
|
import * as Int642 from "int64-buffer";
|
|
8571
|
-
import isEqual from "fast-deep-equal";
|
|
8571
|
+
import * as isEqual from "fast-deep-equal";
|
|
8572
8572
|
|
|
8573
8573
|
// ../ice/src/dns/lookup.ts
|
|
8574
|
-
import mdns from "multicast-dns";
|
|
8574
|
+
import * as mdns from "multicast-dns";
|
|
8575
8575
|
|
|
8576
8576
|
// ../ice/src/iceBase.ts
|
|
8577
8577
|
var log23 = debug("werift-ice : packages/ice/src/ice.ts : log");
|
|
8578
8578
|
|
|
8579
8579
|
// ../ice/src/utils.ts
|
|
8580
|
-
import nodeIp2 from "ip";
|
|
8580
|
+
import * as nodeIp2 from "ip";
|
|
8581
8581
|
var logger = debug("werift-ice : packages/ice/src/utils.ts");
|
|
8582
8582
|
|
|
8583
8583
|
// ../ice/src/ice.ts
|
|
8584
8584
|
var log24 = debug("werift-ice : packages/ice/src/ice.ts : log");
|
|
8585
8585
|
|
|
8586
8586
|
// src/helper.ts
|
|
8587
|
-
import EventEmitter from "events";
|
|
8587
|
+
import { EventEmitter } from "node:events";
|
|
8588
8588
|
var EventTarget2 = class extends EventEmitter {
|
|
8589
8589
|
addEventListener = (type, listener) => {
|
|
8590
8590
|
this.addListener(type, listener);
|
|
@@ -9449,6 +9449,9 @@ var WebmFactory = class extends MediaWriter {
|
|
|
9449
9449
|
if (this.props.path) {
|
|
9450
9450
|
webm.pipe(async (o) => {
|
|
9451
9451
|
const eol = await saveToFileSystem(this.props.path)(o);
|
|
9452
|
+
if (this.props.stream) {
|
|
9453
|
+
this.props.stream.execute(o);
|
|
9454
|
+
}
|
|
9452
9455
|
if (eol) {
|
|
9453
9456
|
this.onEol.execute();
|
|
9454
9457
|
this.ended = true;
|
|
@@ -1,37 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
2
|
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
36
3
|
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
37
4
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
@@ -47,7 +14,7 @@ var _Mp4Container_instances, _Mp4Container_mp4, _Mp4Container_audioFrame, _Mp4Co
|
|
|
47
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
15
|
exports.mp4SupportedCodecs = exports.Mp4Container = void 0;
|
|
49
16
|
const common_1 = require("../../../imports/common");
|
|
50
|
-
const MP4 =
|
|
17
|
+
const MP4 = require("./mp4box");
|
|
51
18
|
class Mp4Container {
|
|
52
19
|
constructor(props) {
|
|
53
20
|
_Mp4Container_instances.add(this);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/container.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event } from \"../../../imports/common\";\n\nimport * as MP4 from \"./mp4box\";\n\ntype DecoderConfig = AudioDecoderConfig | VideoDecoderConfig;\ntype EncodedChunk = EncodedAudioChunk | EncodedVideoChunk;\n\nexport type DataType = \"init\" | \"delta\" | \"key\";\n\nexport interface Mp4Data {\n type: DataType;\n timestamp: number;\n duration: number;\n data: Uint8Array;\n kind: \"audio\" | \"video\";\n}\n\nexport class Mp4Container {\n #mp4: MP4.ISOFile;\n #audioFrame?: EncodedAudioChunk | EncodedVideoChunk;\n #videoFrame?: EncodedAudioChunk | EncodedVideoChunk; // 1 frame buffer\n audioTrack?: number;\n videoTrack?: number;\n #audioSegment = 0;\n #videoSegment = 0;\n onData = new Event<[Mp4Data]>();\n\n constructor(\n private props: {\n track: { audio: boolean; video: boolean };\n },\n ) {\n this.#mp4 = new MP4.ISOFile();\n this.#mp4.init();\n }\n\n get tracksReady() {\n let ready = true;\n if (this.props.track.audio && !this.audioTrack) {\n ready = false;\n }\n if (this.props.track.video && !this.videoTrack) {\n ready = false;\n }\n return ready;\n }\n\n write(\n frame: (DecoderConfig | EncodedChunk) & {\n track: \"video\" | \"audio\";\n },\n ) {\n if (isDecoderConfig(frame)) {\n return this.#init(frame);\n } else {\n return this.#enqueue(frame);\n }\n }\n\n #init(\n frame: DecoderConfig & {\n track: \"video\" | \"audio\";\n },\n ) {\n let codec = frame.codec.substring(0, 4);\n if (codec == \"opus\") {\n codec = \"Opus\";\n }\n\n const options: MP4.TrackOptions = {\n type: codec,\n timescale: 1_000_000,\n };\n\n if (isVideoConfig(frame)) {\n options.width = frame.codedWidth;\n options.height = frame.codedHeight;\n } else {\n options.channel_count = frame.numberOfChannels;\n options.samplerate = frame.sampleRate;\n options.hdlr = \"soun\";\n }\n\n if (!frame.description) throw new Error(\"missing frame description\");\n const desc = frame.description as ArrayBufferLike;\n\n if (codec === \"avc1\") {\n options.avcDecoderConfigRecord = desc;\n } else if (codec === \"hev1\") {\n options.hevcDecoderConfigRecord = desc;\n } else if (codec === \"Opus\") {\n // description is an identification header: https://datatracker.ietf.org/doc/html/rfc7845#section-5.1\n // The first 8 bytes are the magic string \"OpusHead\", followed by what we actually want.\n const dops = new MP4.BoxParser.dOpsBox();\n\n // Annoyingly, the header is little endian while MP4 is big endian, so we have to parse.\n dops.parse(new MP4.Stream(desc, 8, MP4.Stream.LITTLE_ENDIAN));\n\n options.description = dops;\n } else {\n throw new Error(`unsupported codec: ${codec}`);\n }\n\n const track = this.#mp4.addTrack(options);\n if (track == undefined) {\n throw new Error(\"failed to initialize MP4 track\");\n }\n if (frame.track === \"audio\") {\n this.audioTrack = track;\n } else {\n this.videoTrack = track;\n }\n\n if (!this.tracksReady) {\n return;\n }\n\n const buffer = MP4.ISOFile.writeInitializationSegment(\n this.#mp4.ftyp!,\n this.#mp4.moov!,\n 0,\n 0,\n );\n const data = new Uint8Array(buffer);\n const res = {\n type: \"init\",\n timestamp: 0,\n duration: 0,\n data,\n kind: frame.track,\n } as const;\n this.onData.execute(res);\n }\n\n frameBuffer: (EncodedChunk & {\n track: \"video\" | \"audio\";\n })[] = [];\n\n #enqueue(\n frame: EncodedChunk & {\n track: \"video\" | \"audio\";\n },\n ) {\n this.frameBuffer.push(frame);\n if (!this.tracksReady) {\n return;\n }\n for (const frame of this.frameBuffer) {\n this._enqueue(frame);\n }\n this.frameBuffer = [];\n }\n\n private _enqueue(\n frame: EncodedChunk & {\n track: \"video\" | \"audio\";\n },\n ) {\n const track = frame.track === \"audio\" ? this.audioTrack : this.videoTrack;\n if (!track) {\n throw new Error(\"track missing\");\n }\n\n // Check if we should create a new segment\n if (frame.track === \"video\") {\n if (frame.type == \"key\") {\n this.#videoSegment += 1;\n } else if (this.#videoSegment == 0) {\n throw new Error(\"must start with keyframe\");\n }\n } else {\n this.#audioSegment += 1;\n }\n\n // We need a one frame buffer to compute the duration\n if (frame.track === \"video\") {\n if (!this.#videoFrame) {\n this.#videoFrame = frame;\n return;\n }\n } else {\n if (!this.#audioFrame) {\n this.#audioFrame = frame;\n return;\n }\n }\n\n const bufferFrame =\n frame.track === \"video\" ? this.#videoFrame : this.#audioFrame;\n\n if (!bufferFrame) {\n throw new Error(\"bufferFrame missing\");\n }\n\n const duration = frame.timestamp - bufferFrame.timestamp;\n\n // TODO avoid this extra copy by writing to the mdat directly\n // ...which means changing mp4box.js to take an offset instead of ArrayBuffer\n\n const buffer = new ArrayBuffer(bufferFrame.byteLength);\n bufferFrame.copyTo(buffer);\n\n // Add the sample to the container\n this.#mp4.addSample(track, buffer, {\n duration,\n dts: bufferFrame.timestamp,\n cts: bufferFrame.timestamp,\n is_sync: bufferFrame.type == \"key\",\n });\n\n const stream = new MP4.Stream(undefined, 0, MP4.Stream.BIG_ENDIAN);\n\n // Moof and mdat atoms are written in pairs.\n // TODO remove the moof/mdat from the Box to reclaim memory once everything works\n for (;;) {\n const moof = this.#mp4.moofs.shift();\n const mdat = this.#mp4.mdats.shift();\n\n if (!moof && !mdat) break;\n if (!moof) throw new Error(\"moof missing\");\n if (!mdat) throw new Error(\"mdat missing\");\n\n moof.write(stream);\n mdat.write(stream);\n }\n\n // TODO avoid this extra copy by writing to the buffer provided in copyTo\n const data = new Uint8Array(stream.buffer);\n\n if (frame.track === \"video\") {\n this.#videoFrame = frame;\n } else {\n this.#audioFrame = frame;\n }\n\n const res = {\n type: bufferFrame.type,\n timestamp: bufferFrame.timestamp,\n kind: frame.track,\n duration,\n data,\n };\n this.onData.execute(res);\n }\n\n /* TODO flush the last frame\n\t#flush(controller: TransformStreamDefaultController<Chunk>) {\n\t\tif (this.#frame) {\n\t\t\t// TODO guess the duration\n\t\t\tthis.#enqueue(this.#frame, 0, controller)\n\t\t}\n\t}\n\t*/\n}\n\nfunction isDecoderConfig(\n frame: DecoderConfig | EncodedChunk,\n): frame is DecoderConfig {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (frame as DecoderConfig).codec !== undefined;\n}\n\nfunction isVideoConfig(frame: DecoderConfig): frame is VideoDecoderConfig {\n return (frame as VideoDecoderConfig).codedWidth !== undefined;\n}\n\nexport interface AudioDecoderConfig {\n codec: string;\n description?: ArrayBuffer | undefined;\n numberOfChannels: number;\n sampleRate: number;\n}\n\nexport interface VideoDecoderConfig {\n codec: string;\n codedHeight?: number | undefined;\n codedWidth?: number | undefined;\n description?: ArrayBuffer | undefined;\n displayAspectHeight?: number | undefined;\n displayAspectWidth?: number | undefined;\n optimizeForLatency?: boolean | undefined;\n}\n\ninterface EncodedAudioChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedAudioChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedAudioChunkType = \"delta\" | \"key\";\n\ninterface EncodedVideoChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedVideoChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedVideoChunkType = \"delta\" | \"key\";\n\nexport const mp4SupportedCodecs = [\"avc1\", \"opus\"] as const;\nexport type Mp4SupportedCodec = (typeof mp4SupportedCodecs)[number];\n"]}
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/container.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event } from \"../../../imports/common\";\n\nimport * as MP4 from \"./mp4box\";\n\ntype DecoderConfig = AudioDecoderConfig | VideoDecoderConfig;\ntype EncodedChunk = EncodedAudioChunk | EncodedVideoChunk;\n\nexport type DataType = \"init\" | \"delta\" | \"key\";\n\nexport interface Mp4Data {\n type: DataType;\n timestamp: number;\n duration: number;\n data: Uint8Array;\n kind: \"audio\" | \"video\";\n}\n\nexport class Mp4Container {\n #mp4: MP4.ISOFile;\n #audioFrame?: EncodedAudioChunk | EncodedVideoChunk;\n #videoFrame?: EncodedAudioChunk | EncodedVideoChunk; // 1 frame buffer\n audioTrack?: number;\n videoTrack?: number;\n #audioSegment = 0;\n #videoSegment = 0;\n onData = new Event<[Mp4Data]>();\n\n constructor(\n private props: {\n track: { audio: boolean; video: boolean };\n },\n ) {\n this.#mp4 = new MP4.ISOFile();\n this.#mp4.init();\n }\n\n get tracksReady() {\n let ready = true;\n if (this.props.track.audio && !this.audioTrack) {\n ready = false;\n }\n if (this.props.track.video && !this.videoTrack) {\n ready = false;\n }\n return ready;\n }\n\n write(\n frame: (DecoderConfig | EncodedChunk) & {\n track: \"video\" | \"audio\";\n },\n ) {\n if (isDecoderConfig(frame)) {\n return this.#init(frame);\n } else {\n return this.#enqueue(frame);\n }\n }\n\n #init(\n frame: DecoderConfig & {\n track: \"video\" | \"audio\";\n },\n ) {\n let codec = frame.codec.substring(0, 4);\n if (codec == \"opus\") {\n codec = \"Opus\";\n }\n\n const options: MP4.TrackOptions = {\n type: codec,\n timescale: 1_000_000,\n };\n\n if (isVideoConfig(frame)) {\n options.width = frame.codedWidth;\n options.height = frame.codedHeight;\n } else {\n options.channel_count = frame.numberOfChannels;\n options.samplerate = frame.sampleRate;\n options.hdlr = \"soun\";\n }\n\n if (!frame.description) throw new Error(\"missing frame description\");\n const desc = frame.description as ArrayBufferLike;\n\n if (codec === \"avc1\") {\n options.avcDecoderConfigRecord = desc;\n } else if (codec === \"hev1\") {\n options.hevcDecoderConfigRecord = desc;\n } else if (codec === \"Opus\") {\n // description is an identification header: https://datatracker.ietf.org/doc/html/rfc7845#section-5.1\n // The first 8 bytes are the magic string \"OpusHead\", followed by what we actually want.\n const dops = new MP4.BoxParser.dOpsBox();\n\n // Annoyingly, the header is little endian while MP4 is big endian, so we have to parse.\n dops.parse(new MP4.Stream(desc, 8, MP4.Stream.LITTLE_ENDIAN));\n\n options.description = dops;\n } else {\n throw new Error(`unsupported codec: ${codec}`);\n }\n\n const track = this.#mp4.addTrack(options);\n if (track == undefined) {\n throw new Error(\"failed to initialize MP4 track\");\n }\n if (frame.track === \"audio\") {\n this.audioTrack = track;\n } else {\n this.videoTrack = track;\n }\n\n if (!this.tracksReady) {\n return;\n }\n\n const buffer = MP4.ISOFile.writeInitializationSegment(\n this.#mp4.ftyp!,\n this.#mp4.moov!,\n 0,\n 0,\n );\n const data = new Uint8Array(buffer);\n const res = {\n type: \"init\",\n timestamp: 0,\n duration: 0,\n data,\n kind: frame.track,\n } as const;\n this.onData.execute(res);\n }\n\n frameBuffer: (EncodedChunk & {\n track: \"video\" | \"audio\";\n })[] = [];\n\n #enqueue(\n frame: EncodedChunk & {\n track: \"video\" | \"audio\";\n },\n ) {\n this.frameBuffer.push(frame);\n if (!this.tracksReady) {\n return;\n }\n for (const frame of this.frameBuffer) {\n this._enqueue(frame);\n }\n this.frameBuffer = [];\n }\n\n private _enqueue(\n frame: EncodedChunk & {\n track: \"video\" | \"audio\";\n },\n ) {\n const track = frame.track === \"audio\" ? this.audioTrack : this.videoTrack;\n if (!track) {\n throw new Error(\"track missing\");\n }\n\n // Check if we should create a new segment\n if (frame.track === \"video\") {\n if (frame.type == \"key\") {\n this.#videoSegment += 1;\n } else if (this.#videoSegment == 0) {\n throw new Error(\"must start with keyframe\");\n }\n } else {\n this.#audioSegment += 1;\n }\n\n // We need a one frame buffer to compute the duration\n if (frame.track === \"video\") {\n if (!this.#videoFrame) {\n this.#videoFrame = frame;\n return;\n }\n } else {\n if (!this.#audioFrame) {\n this.#audioFrame = frame;\n return;\n }\n }\n\n const bufferFrame =\n frame.track === \"video\" ? this.#videoFrame : this.#audioFrame;\n\n if (!bufferFrame) {\n throw new Error(\"bufferFrame missing\");\n }\n\n const duration = frame.timestamp - bufferFrame.timestamp;\n\n // TODO avoid this extra copy by writing to the mdat directly\n // ...which means changing mp4box.js to take an offset instead of ArrayBuffer\n\n const buffer = new ArrayBuffer(bufferFrame.byteLength);\n bufferFrame.copyTo(buffer);\n\n // Add the sample to the container\n this.#mp4.addSample(track, buffer, {\n duration,\n dts: bufferFrame.timestamp,\n cts: bufferFrame.timestamp,\n is_sync: bufferFrame.type == \"key\",\n });\n\n const stream = new MP4.Stream(undefined, 0, MP4.Stream.BIG_ENDIAN);\n\n // Moof and mdat atoms are written in pairs.\n // TODO remove the moof/mdat from the Box to reclaim memory once everything works\n for (;;) {\n const moof = this.#mp4.moofs.shift();\n const mdat = this.#mp4.mdats.shift();\n\n if (!moof && !mdat) break;\n if (!moof) throw new Error(\"moof missing\");\n if (!mdat) throw new Error(\"mdat missing\");\n\n moof.write(stream);\n mdat.write(stream);\n }\n\n // TODO avoid this extra copy by writing to the buffer provided in copyTo\n const data = new Uint8Array(stream.buffer);\n\n if (frame.track === \"video\") {\n this.#videoFrame = frame;\n } else {\n this.#audioFrame = frame;\n }\n\n const res = {\n type: bufferFrame.type,\n timestamp: bufferFrame.timestamp,\n kind: frame.track,\n duration,\n data,\n };\n this.onData.execute(res);\n }\n\n /* TODO flush the last frame\n\t#flush(controller: TransformStreamDefaultController<Chunk>) {\n\t\tif (this.#frame) {\n\t\t\t// TODO guess the duration\n\t\t\tthis.#enqueue(this.#frame, 0, controller)\n\t\t}\n\t}\n\t*/\n}\n\nfunction isDecoderConfig(\n frame: DecoderConfig | EncodedChunk,\n): frame is DecoderConfig {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return (frame as DecoderConfig).codec !== undefined;\n}\n\nfunction isVideoConfig(frame: DecoderConfig): frame is VideoDecoderConfig {\n return (frame as VideoDecoderConfig).codedWidth !== undefined;\n}\n\nexport interface AudioDecoderConfig {\n codec: string;\n description?: ArrayBuffer | undefined;\n numberOfChannels: number;\n sampleRate: number;\n}\n\nexport interface VideoDecoderConfig {\n codec: string;\n codedHeight?: number | undefined;\n codedWidth?: number | undefined;\n description?: ArrayBuffer | undefined;\n displayAspectHeight?: number | undefined;\n displayAspectWidth?: number | undefined;\n optimizeForLatency?: boolean | undefined;\n}\n\ninterface EncodedAudioChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedAudioChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedAudioChunkType = \"delta\" | \"key\";\n\ninterface EncodedVideoChunk {\n readonly byteLength: number;\n readonly duration: number | null;\n readonly timestamp: number;\n readonly type: EncodedVideoChunkType;\n copyTo(destination: ArrayBuffer): void;\n}\n\ntype EncodedVideoChunkType = \"delta\" | \"key\";\n\nexport const mp4SupportedCodecs = [\"avc1\", \"opus\"] as const;\nexport type Mp4SupportedCodec = (typeof mp4SupportedCodecs)[number];\n"]}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.AVCDecoderConfigurationRecord = exports.H264AnnexBParser = exports.H264NaluAVC1 = exports.H264NaluPayload = exports.H264NaluType = void 0;
|
|
7
4
|
exports.annexb2avcc = annexb2avcc;
|
|
8
|
-
const sps_parser_1 =
|
|
5
|
+
const sps_parser_1 = require("./sps-parser");
|
|
9
6
|
var H264NaluType;
|
|
10
7
|
(function (H264NaluType) {
|
|
11
8
|
H264NaluType[H264NaluType["kUnspecified"] = 0] = "kUnspecified";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/h264.ts"],"names":[],"mappings":";;;;;;AAuLA,kCA0CC;AAjOD,8DAAqC;AAErC,IAAY,YAgBX;AAhBD,WAAY,YAAY;IACtB,+DAAgB,CAAA;IAChB,+DAAgB,CAAA;IAChB,yDAAa,CAAA;IACb,yDAAa,CAAA;IACb,yDAAa,CAAA;IACb,yDAAa,CAAA;IACb,yDAAa,CAAA;IACb,yDAAa,CAAA;IACb,yDAAa,CAAA;IACb,yDAAa,CAAA;IACb,oEAAmB,CAAA;IACnB,gEAAiB,CAAA;IACjB,sDAAY,CAAA;IACZ,sDAAY,CAAA;IACZ,4DAAe,CAAA;AACjB,CAAC,EAhBW,YAAY,4BAAZ,YAAY,QAgBvB;AAED,MAAa,eAAe;IAA5B;QACE;;;;;WAAoB;QACpB;;;;;WAAkB;IACpB,CAAC;CAAA;AAHD,0CAGC;AAED,MAAa,YAAY;IAIvB,YAAY,IAAqB;QAHjC;;;;;WAAmB;QACnB;;;;;WAAiB;QAGf,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;QAEvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,sCAAsC;QAEjF,MAAM,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,4BAA4B;QAC5B,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC1B,eAAe;QACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;CACF;AAhBD,oCAgBC;AAED,MAAa,gBAAgB;IAO3B,YAAmB,IAAgB;QANlB;;;;mBAAc,kBAAkB;WAAC;QAE1C;;;;;WAAkB;QAClB;;;;mBAAoC,CAAC;WAAC;QACtC;;;;mBAAqB,KAAK;WAAC;QAGjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAEO,uBAAuB,CAAC,YAAoB;QAClD,IAAI,CAAC,GAAG,YAAY,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QAExB,SAAS,CAAC;YACR,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC;YACzB,CAAC;YAED,iCAAiC;YACjC,MAAM,MAAM,GACV,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACnB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACnB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBAClB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtE,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACjD,OAAO,CAAC,CAAC;YACX,CAAC;iBAAM,CAAC;gBACN,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IAEM,mBAAmB;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,YAAY,GAA2B,IAAI,CAAC;QAEhD,OAAO,YAAY,IAAI,IAAI,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM;YACR,CAAC;YACD,+BAA+B;YAC/B,MAAM,gBAAgB,GAAG,IAAI,CAAC,yBAAyB,CAAC;YAExD,4BAA4B;YAC5B,IAAI,MAAM,GAAG,gBAAgB,CAAC;YAC9B,MAAM,GAAG,GACP,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBACvB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnB,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,CAAC;YACd,CAAC;YAED,MAAM,SAAS,GAAiB,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YACpD,MAAM,aAAa,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAElD,MAAM,qBAAqB,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;YACnE,IAAI,CAAC,yBAAyB,GAAG,qBAAqB,CAAC;YAEvD,IAAI,SAAS,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;gBACzC,SAAS;YACX,CAAC;YACD,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;gBACxB,qGAAqG;gBACrG,SAAS;YACX,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;YAElE,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,YAAY,CAAC,IAAI,GAAG,SAAS,CAAC;YAC9B,YAAY,CAAC,IAAI,GAAG,YAAY,CAAC;QACnC,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AApFD,4CAoFC;AAED,MAAa,6BAA6B;IAGxC,sDAAsD;IACtD,YAAmB,GAAe,EAAE,GAAe,EAAE,WAAgB;QAH7D;;;;;WAAiB;QAIvB,IAAI,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,UAAU,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC;QAC7D,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAE9B,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YACpD,iBAAiB,GAAG,IAAI,CAAC;YACzB,MAAM,IAAI,CAAC,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAElD,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,uBAAuB;QACvC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;QACzC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB;QAC1C,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB;QACvC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,iCAAiC;QAEjD,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,mCAAmC;QAE1D,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,6BAA6B;QACzD,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC;QAE5B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACjB,MAAM,IAAI,UAAU,CAAC;QAErB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,4BAA4B;QAE9C,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,4BAA4B;QACjE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC;QAErC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,CAAC,GAAG,UAAU,CAAC;QAEzB,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC,iBAAiB,CAAC;YACpD,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,oBAAoB;YAC7C,MAAM,IAAI,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;AApDD,sEAoDC;AAED,SAAgB,WAAW,CAAC,IAAY;IACtC,MAAM,aAAa,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,YAAY,GAA2B,IAAI,CAAC;IAChD,MAAM,8BAA8B,GAAG,KAAK,CAAC;IAC7C,MAAM,uBAAuB,GAAG,KAAK,CAAC;IAEtC,MAAM,eAAe,GAIjB;QACF,GAAG,EAAE,SAAS;QACd,GAAG,EAAE,SAAS;QACd,OAAO,EAAE,SAAS;KACnB,CAAC;IAEF,OAAO,CAAC,YAAY,GAAG,aAAa,CAAC,mBAAmB,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,YAAY,CAAC,CAAC;QAEjD,IAAI,SAAS,CAAC,IAAI,KAAK,YAAY,CAAC,SAAS,EAAE,CAAC;YAC9C,oEAAoE;YACpE,MAAM,OAAO,GAAG,oBAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,8BAA8B,EAAE,CAAC;gBACpC,eAAe,CAAC,GAAG,GAAG,SAAS,CAAC;gBAChC,eAAe,CAAC,OAAO,GAAG,OAAO,CAAC;YACpC,CAAC;QACH,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,KAAK,YAAY,CAAC,SAAS,EAAE,CAAC;YACrD,IAAI,CAAC,8BAA8B,IAAI,uBAAuB,EAAE,CAAC;gBAC/D,eAAe,CAAC,GAAG,GAAG,SAAS,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,eAAe,CAAC,GAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,kBAAkB,GAAG,eAAe,CAAC,GAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,6BAA6B,CAC5C,kBAAkB,EAClB,kBAAkB,EAClB,OAAO,CACR,CAAC;IACF,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;AACxB,CAAC","sourcesContent":["import SPSParser from \"./sps-parser\";\n\nexport enum H264NaluType {\n kUnspecified = 0,\n kSliceNonIDR = 1,\n kSliceDPA = 2,\n kSliceDPB = 3,\n kSliceDPC = 4,\n kSliceIDR = 5,\n kSliceSEI = 6,\n kSliceSPS = 7,\n kSlicePPS = 8,\n kSliceAUD = 9,\n kEndOfSequence = 10,\n kEndOfStream = 11,\n kFiller = 12,\n kSPSExt = 13,\n kReserved0 = 14,\n}\n\nexport class H264NaluPayload {\n type!: H264NaluType;\n data!: Uint8Array;\n}\n\nexport class H264NaluAVC1 {\n type: H264NaluType;\n data: Uint8Array;\n\n constructor(nalu: H264NaluPayload) {\n const nalu_size = nalu.data.byteLength;\n\n this.type = nalu.type;\n this.data = new Uint8Array(4 + nalu_size); // 4 byte length-header + nalu payload\n\n const v = new DataView(this.data.buffer);\n // Fill 4 byte length-header\n v.setUint32(0, nalu_size);\n // Copy payload\n this.data.set(nalu.data, 4);\n }\n}\n\nexport class H264AnnexBParser {\n private readonly TAG: string = \"H264AnnexBParser\";\n\n private data_: Uint8Array;\n private current_startcode_offset_: number = 0;\n private eof_flag_: boolean = false;\n\n public constructor(data: Uint8Array) {\n this.data_ = data;\n this.current_startcode_offset_ = this.findNextStartCodeOffset(0);\n }\n\n private findNextStartCodeOffset(start_offset: number) {\n let i = start_offset;\n const data = this.data_;\n\n for (;;) {\n if (i + 3 >= data.byteLength) {\n this.eof_flag_ = true;\n return data.byteLength;\n }\n\n // search 00 00 00 01 or 00 00 01\n const uint32 =\n (data[i + 0] << 24) |\n (data[i + 1] << 16) |\n (data[i + 2] << 8) |\n data[i + 3];\n const uint24 = (data[i + 0] << 16) | (data[i + 1] << 8) | data[i + 2];\n if (uint32 === 0x00000001 || uint24 === 0x000001) {\n return i;\n } else {\n i++;\n }\n }\n }\n\n public readNextNaluPayload(): H264NaluPayload | null {\n const data = this.data_;\n let nalu_payload: H264NaluPayload | null = null;\n\n while (nalu_payload == null) {\n if (this.eof_flag_) {\n break;\n }\n // offset pointed to start code\n const startcode_offset = this.current_startcode_offset_;\n\n // nalu payload start offset\n let offset = startcode_offset;\n const u32 =\n (data[offset] << 24) |\n (data[offset + 1] << 16) |\n (data[offset + 2] << 8) |\n data[offset + 3];\n if (u32 === 0x00000001) {\n offset += 4;\n } else {\n offset += 3;\n }\n\n const nalu_type: H264NaluType = data[offset] & 0x1f;\n const forbidden_bit = (data[offset] & 0x80) >>> 7;\n\n const next_startcode_offset = this.findNextStartCodeOffset(offset);\n this.current_startcode_offset_ = next_startcode_offset;\n\n if (nalu_type >= H264NaluType.kReserved0) {\n continue;\n }\n if (forbidden_bit !== 0) {\n // Log.e(this.TAG, `forbidden_bit near offset ${offset} should be 0 but has value ${forbidden_bit}`);\n continue;\n }\n\n const payload_data = data.subarray(offset, next_startcode_offset);\n\n nalu_payload = new H264NaluPayload();\n nalu_payload.type = nalu_type;\n nalu_payload.data = payload_data;\n }\n\n return nalu_payload;\n }\n}\n\nexport class AVCDecoderConfigurationRecord {\n private data: Uint8Array;\n\n // sps, pps: require Nalu without 4 byte length-header\n public constructor(sps: Uint8Array, pps: Uint8Array, sps_details: any) {\n let length = 6 + 2 + sps.byteLength + 1 + 2 + pps.byteLength;\n let need_extra_fields = false;\n\n if (sps[3] !== 66 && sps[3] !== 77 && sps[3] !== 88) {\n need_extra_fields = true;\n length += 4;\n }\n\n const data = (this.data = new Uint8Array(length));\n\n data[0] = 0x01; // configurationVersion\n data[1] = sps[1]; // AVCProfileIndication\n data[2] = sps[2]; // profile_compatibility\n data[3] = sps[3]; // AVCLevelIndication\n data[4] = 0xff; // 111111 + lengthSizeMinusOne(3)\n\n data[5] = 0xe0 | 0x01; // 111 + numOfSequenceParameterSets\n\n const sps_length = sps.byteLength;\n data[6] = sps_length >>> 8; // sequenceParameterSetLength\n data[7] = sps_length & 0xff;\n\n let offset = 8;\n data.set(sps, 8);\n offset += sps_length;\n\n data[offset] = 1; // numOfPictureParameterSets\n\n const pps_length = pps.byteLength;\n data[offset + 1] = pps_length >>> 8; // pictureParameterSetLength\n data[offset + 2] = pps_length & 0xff;\n\n data.set(pps, offset + 3);\n offset += 3 + pps_length;\n\n if (need_extra_fields) {\n data[offset] = 0xfc | sps_details.chroma_format_idc;\n data[offset + 1] = 0xf8 | (sps_details.bit_depth_luma - 8);\n data[offset + 2] = 0xf8 | (sps_details.bit_depth_chroma - 8);\n data[offset + 3] = 0x00; // number of sps ext\n offset += 4;\n }\n }\n\n public getData() {\n return this.data;\n }\n}\n\nexport function annexb2avcc(data: Buffer) {\n const annexb_parser = new H264AnnexBParser(data);\n let nalu_payload: H264NaluPayload | null = null;\n const video_init_segment_dispatched_ = false;\n const video_metadata_changed_ = false;\n\n const video_metadata_: {\n sps: H264NaluAVC1 | undefined;\n pps: H264NaluAVC1 | undefined;\n details: any;\n } = {\n sps: undefined,\n pps: undefined,\n details: undefined,\n };\n\n while ((nalu_payload = annexb_parser.readNextNaluPayload()) != null) {\n const nalu_avc1 = new H264NaluAVC1(nalu_payload);\n\n if (nalu_avc1.type === H264NaluType.kSliceSPS) {\n // Notice: parseSPS requires Nalu without startcode or length-header\n const details = SPSParser.parseSPS(nalu_payload.data);\n if (!video_init_segment_dispatched_) {\n video_metadata_.sps = nalu_avc1;\n video_metadata_.details = details;\n }\n } else if (nalu_avc1.type === H264NaluType.kSlicePPS) {\n if (!video_init_segment_dispatched_ || video_metadata_changed_) {\n video_metadata_.pps = nalu_avc1;\n }\n }\n }\n\n const sps_without_header = video_metadata_.sps!.data.subarray(4);\n const pps_without_header = video_metadata_.pps!.data.subarray(4);\n const details = video_metadata_.details;\n const avcc = new AVCDecoderConfigurationRecord(\n sps_without_header,\n pps_without_header,\n details,\n );\n return avcc.getData();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"h264.js","sourceRoot":"","sources":["../../../../../../../rtp/src/extra/container/mp4/h264.ts"],"names":[],"mappings":"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","sourcesContent":["import SPSParser from \"./sps-parser\";\n\nexport enum H264NaluType {\n kUnspecified = 0,\n kSliceNonIDR = 1,\n kSliceDPA = 2,\n kSliceDPB = 3,\n kSliceDPC = 4,\n kSliceIDR = 5,\n kSliceSEI = 6,\n kSliceSPS = 7,\n kSlicePPS = 8,\n kSliceAUD = 9,\n kEndOfSequence = 10,\n kEndOfStream = 11,\n kFiller = 12,\n kSPSExt = 13,\n kReserved0 = 14,\n}\n\nexport class H264NaluPayload {\n type!: H264NaluType;\n data!: Uint8Array;\n}\n\nexport class H264NaluAVC1 {\n type: H264NaluType;\n data: Uint8Array;\n\n constructor(nalu: H264NaluPayload) {\n const nalu_size = nalu.data.byteLength;\n\n this.type = nalu.type;\n this.data = new Uint8Array(4 + nalu_size); // 4 byte length-header + nalu payload\n\n const v = new DataView(this.data.buffer);\n // Fill 4 byte length-header\n v.setUint32(0, nalu_size);\n // Copy payload\n this.data.set(nalu.data, 4);\n }\n}\n\nexport class H264AnnexBParser {\n private readonly TAG: string = \"H264AnnexBParser\";\n\n private data_: Uint8Array;\n private current_startcode_offset_: number = 0;\n private eof_flag_: boolean = false;\n\n public constructor(data: Uint8Array) {\n this.data_ = data;\n this.current_startcode_offset_ = this.findNextStartCodeOffset(0);\n }\n\n private findNextStartCodeOffset(start_offset: number) {\n let i = start_offset;\n const data = this.data_;\n\n for (;;) {\n if (i + 3 >= data.byteLength) {\n this.eof_flag_ = true;\n return data.byteLength;\n }\n\n // search 00 00 00 01 or 00 00 01\n const uint32 =\n (data[i + 0] << 24) |\n (data[i + 1] << 16) |\n (data[i + 2] << 8) |\n data[i + 3];\n const uint24 = (data[i + 0] << 16) | (data[i + 1] << 8) | data[i + 2];\n if (uint32 === 0x00000001 || uint24 === 0x000001) {\n return i;\n } else {\n i++;\n }\n }\n }\n\n public readNextNaluPayload(): H264NaluPayload | null {\n const data = this.data_;\n let nalu_payload: H264NaluPayload | null = null;\n\n while (nalu_payload == null) {\n if (this.eof_flag_) {\n break;\n }\n // offset pointed to start code\n const startcode_offset = this.current_startcode_offset_;\n\n // nalu payload start offset\n let offset = startcode_offset;\n const u32 =\n (data[offset] << 24) |\n (data[offset + 1] << 16) |\n (data[offset + 2] << 8) |\n data[offset + 3];\n if (u32 === 0x00000001) {\n offset += 4;\n } else {\n offset += 3;\n }\n\n const nalu_type: H264NaluType = data[offset] & 0x1f;\n const forbidden_bit = (data[offset] & 0x80) >>> 7;\n\n const next_startcode_offset = this.findNextStartCodeOffset(offset);\n this.current_startcode_offset_ = next_startcode_offset;\n\n if (nalu_type >= H264NaluType.kReserved0) {\n continue;\n }\n if (forbidden_bit !== 0) {\n // Log.e(this.TAG, `forbidden_bit near offset ${offset} should be 0 but has value ${forbidden_bit}`);\n continue;\n }\n\n const payload_data = data.subarray(offset, next_startcode_offset);\n\n nalu_payload = new H264NaluPayload();\n nalu_payload.type = nalu_type;\n nalu_payload.data = payload_data;\n }\n\n return nalu_payload;\n }\n}\n\nexport class AVCDecoderConfigurationRecord {\n private data: Uint8Array;\n\n // sps, pps: require Nalu without 4 byte length-header\n public constructor(sps: Uint8Array, pps: Uint8Array, sps_details: any) {\n let length = 6 + 2 + sps.byteLength + 1 + 2 + pps.byteLength;\n let need_extra_fields = false;\n\n if (sps[3] !== 66 && sps[3] !== 77 && sps[3] !== 88) {\n need_extra_fields = true;\n length += 4;\n }\n\n const data = (this.data = new Uint8Array(length));\n\n data[0] = 0x01; // configurationVersion\n data[1] = sps[1]; // AVCProfileIndication\n data[2] = sps[2]; // profile_compatibility\n data[3] = sps[3]; // AVCLevelIndication\n data[4] = 0xff; // 111111 + lengthSizeMinusOne(3)\n\n data[5] = 0xe0 | 0x01; // 111 + numOfSequenceParameterSets\n\n const sps_length = sps.byteLength;\n data[6] = sps_length >>> 8; // sequenceParameterSetLength\n data[7] = sps_length & 0xff;\n\n let offset = 8;\n data.set(sps, 8);\n offset += sps_length;\n\n data[offset] = 1; // numOfPictureParameterSets\n\n const pps_length = pps.byteLength;\n data[offset + 1] = pps_length >>> 8; // pictureParameterSetLength\n data[offset + 2] = pps_length & 0xff;\n\n data.set(pps, offset + 3);\n offset += 3 + pps_length;\n\n if (need_extra_fields) {\n data[offset] = 0xfc | sps_details.chroma_format_idc;\n data[offset + 1] = 0xf8 | (sps_details.bit_depth_luma - 8);\n data[offset + 2] = 0xf8 | (sps_details.bit_depth_chroma - 8);\n data[offset + 3] = 0x00; // number of sps ext\n offset += 4;\n }\n }\n\n public getData() {\n return this.data;\n }\n}\n\nexport function annexb2avcc(data: Buffer) {\n const annexb_parser = new H264AnnexBParser(data);\n let nalu_payload: H264NaluPayload | null = null;\n const video_init_segment_dispatched_ = false;\n const video_metadata_changed_ = false;\n\n const video_metadata_: {\n sps: H264NaluAVC1 | undefined;\n pps: H264NaluAVC1 | undefined;\n details: any;\n } = {\n sps: undefined,\n pps: undefined,\n details: undefined,\n };\n\n while ((nalu_payload = annexb_parser.readNextNaluPayload()) != null) {\n const nalu_avc1 = new H264NaluAVC1(nalu_payload);\n\n if (nalu_avc1.type === H264NaluType.kSliceSPS) {\n // Notice: parseSPS requires Nalu without startcode or length-header\n const details = SPSParser.parseSPS(nalu_payload.data);\n if (!video_init_segment_dispatched_) {\n video_metadata_.sps = nalu_avc1;\n video_metadata_.details = details;\n }\n } else if (nalu_avc1.type === H264NaluType.kSlicePPS) {\n if (!video_init_segment_dispatched_ || video_metadata_changed_) {\n video_metadata_.pps = nalu_avc1;\n }\n }\n }\n\n const sps_without_header = video_metadata_.sps!.data.subarray(4);\n const pps_without_header = video_metadata_.pps!.data.subarray(4);\n const details = video_metadata_.details;\n const avcc = new AVCDecoderConfigurationRecord(\n sps_without_header,\n pps_without_header,\n details,\n );\n return avcc.getData();\n}\n"]}
|