werift 0.23.0 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -0
- package/lib/common/src/binary.js +2 -3
- package/lib/common/src/binary.js.map +1 -1
- package/lib/common/src/transport.d.ts +22 -9
- package/lib/common/src/transport.js +152 -25
- package/lib/common/src/transport.js.map +1 -1
- package/lib/ice/src/candidate.d.ts +16 -1
- package/lib/ice/src/candidate.js +99 -15
- package/lib/ice/src/candidate.js.map +1 -1
- package/lib/ice/src/ice.d.ts +2 -0
- package/lib/ice/src/ice.js +175 -50
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +23 -2
- package/lib/ice/src/iceBase.js +63 -1
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/index.d.ts +2 -0
- package/lib/ice/src/index.js +2 -0
- package/lib/ice/src/index.js.map +1 -1
- package/lib/ice/src/internal/selectAddresses.d.ts +9 -0
- package/lib/ice/src/internal/selectAddresses.js +40 -0
- package/lib/ice/src/internal/selectAddresses.js.map +1 -0
- package/lib/ice/src/stun/const.d.ts +1 -26
- package/lib/ice/src/stun/const.js +15 -54
- package/lib/ice/src/stun/const.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +1 -25
- package/lib/ice/src/stun/message.js +15 -149
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +1 -1
- package/lib/ice/src/stun/protocol.js +2 -2
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/tcpFrame.d.ts +5 -0
- package/lib/ice/src/stun/tcpFrame.js +26 -0
- package/lib/ice/src/stun/tcpFrame.js.map +1 -0
- package/lib/ice/src/stun/tcpProtocol.d.ts +51 -0
- package/lib/ice/src/stun/tcpProtocol.js +326 -0
- package/lib/ice/src/stun/tcpProtocol.js.map +1 -0
- package/lib/ice/src/stun/transaction.d.ts +2 -1
- package/lib/ice/src/stun/transaction.js +9 -3
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/frame.d.ts +1 -0
- package/lib/ice/src/turn/frame.js +18 -0
- package/lib/ice/src/turn/frame.js.map +1 -0
- package/lib/ice/src/turn/protocol.d.ts +9 -7
- package/lib/ice/src/turn/protocol.js +32 -44
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +1 -1
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/ice/src/utils.js +2 -31
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/{ice → ice-server}/src/stun/attributes.d.ts +12 -5
- package/lib/{ice → ice-server}/src/stun/attributes.js +69 -66
- package/lib/ice-server/src/stun/attributes.js.map +1 -0
- package/lib/ice-server/src/stun/const.d.ts +28 -0
- package/lib/ice-server/src/stun/const.js +88 -0
- package/lib/ice-server/src/stun/const.js.map +1 -0
- package/lib/ice-server/src/stun/ip.d.ts +12 -0
- package/lib/ice-server/src/stun/ip.js +88 -0
- package/lib/ice-server/src/stun/ip.js.map +1 -0
- package/lib/ice-server/src/stun/message.d.ts +37 -0
- package/lib/ice-server/src/stun/message.js +190 -0
- package/lib/ice-server/src/stun/message.js.map +1 -0
- package/lib/ice-server/src/turn/auth.d.ts +1 -0
- package/lib/ice-server/src/turn/auth.js +10 -0
- package/lib/ice-server/src/turn/auth.js.map +1 -0
- package/lib/ice-server/src/turn/frame.d.ts +13 -0
- package/lib/ice-server/src/turn/frame.js +69 -0
- package/lib/ice-server/src/turn/frame.js.map +1 -0
- package/lib/index.mjs +2866 -946
- package/lib/nonstandard/index.mjs +1872 -455
- package/lib/rtp/src/codec/av1.js +11 -5
- package/lib/rtp/src/codec/av1.js.map +1 -1
- package/lib/rtp/src/codec/leb128.d.ts +5 -0
- package/lib/rtp/src/codec/leb128.js +24 -0
- package/lib/rtp/src/codec/leb128.js.map +1 -0
- package/lib/rtp/src/extra/container/mp4/container.d.ts +9 -6
- package/lib/rtp/src/extra/container/mp4/container.js +258 -173
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.d.ts +1 -0
- package/lib/rtp/src/extra/container/mp4/h264.js +13 -0
- package/lib/rtp/src/extra/container/mp4/h264.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.d.ts +11 -7
- package/lib/rtp/src/extra/processor/mp4.js +115 -60
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.d.ts +2 -3
- package/lib/rtp/src/extra/processor/mp4Callback.js +5 -3
- package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
- package/lib/rtp/src/rtp/rtx.js +4 -6
- package/lib/rtp/src/rtp/rtx.js.map +1 -1
- package/lib/rtp/src/srtp/context/context.d.ts +2 -0
- package/lib/rtp/src/srtp/context/context.js +12 -12
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/sctp/src/param.js +31 -15
- package/lib/sctp/src/param.js.map +1 -1
- package/lib/sctp/src/sctp.js +10 -9
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/dataChannel.d.ts +3 -2
- package/lib/webrtc/src/dataChannel.js +9 -2
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/errors.d.ts +3 -0
- package/lib/webrtc/src/errors.js +11 -0
- package/lib/webrtc/src/errors.js.map +1 -0
- package/lib/webrtc/src/helper.d.ts +5 -1
- package/lib/webrtc/src/helper.js +33 -1
- package/lib/webrtc/src/helper.js.map +1 -1
- package/lib/webrtc/src/media/receiver/statistics.d.ts +4 -1
- package/lib/webrtc/src/media/receiver/statistics.js +22 -0
- package/lib/webrtc/src/media/receiver/statistics.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +15 -2
- package/lib/webrtc/src/media/rtpReceiver.js +135 -20
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +32 -7
- package/lib/webrtc/src/media/rtpSender.js +179 -31
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +13 -4
- package/lib/webrtc/src/media/rtpTransceiver.js +26 -5
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/stats.d.ts +15 -1
- package/lib/webrtc/src/media/stats.js +55 -1
- package/lib/webrtc/src/media/stats.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +2 -1
- package/lib/webrtc/src/media/track.js +7 -1
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/dummyMedia.d.ts +19 -0
- package/lib/webrtc/src/nonstandard/dummyMedia.js +157 -0
- package/lib/webrtc/src/nonstandard/dummyMedia.js.map +1 -0
- package/lib/webrtc/src/nonstandard/navigator.d.ts +18 -8
- package/lib/webrtc/src/nonstandard/navigator.js +96 -32
- package/lib/webrtc/src/nonstandard/navigator.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.d.ts +16 -0
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.js +360 -0
- package/lib/webrtc/src/nonstandard/userMedia/packetizer.js.map +1 -0
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +71 -31
- package/lib/webrtc/src/nonstandard/userMedia.js +454 -108
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +183 -50
- package/lib/webrtc/src/peerConnection.js +458 -109
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sctpManager.d.ts +1 -1
- package/lib/webrtc/src/sctpManager.js +27 -7
- package/lib/webrtc/src/sctpManager.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +10 -7
- package/lib/webrtc/src/sdp.js +40 -44
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +4 -3
- package/lib/webrtc/src/sdpManager.js +50 -27
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.d.ts +13 -4
- package/lib/webrtc/src/secureTransportManager.js +100 -22
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/lib/webrtc/src/transceiverManager.d.ts +5 -4
- package/lib/webrtc/src/transceiverManager.js +61 -62
- package/lib/webrtc/src/transceiverManager.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.d.ts +15 -4
- package/lib/webrtc/src/transport/dtls.js +91 -23
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +21 -3
- package/lib/webrtc/src/transport/ice.js +159 -30
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +1 -0
- package/lib/webrtc/src/transport/sctp.js +26 -22
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +12 -4
- package/lib/webrtc/src/utils.js +118 -16
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +7 -10
- package/lib/ice/src/stun/attributes.js.map +0 -1
- package/lib/rtp/src/extra/container/mp4/mp4box.d.ts +0 -5
- package/lib/rtp/src/extra/container/mp4/mp4box.js +0 -32
- package/lib/rtp/src/extra/container/mp4/mp4box.js.map +0 -1
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.AVCDecoderConfigurationRecord = exports.H264AnnexBParser = exports.H264NaluAVC1 = exports.H264NaluPayload = exports.H264NaluType = void 0;
|
|
7
7
|
exports.annexb2avcc = annexb2avcc;
|
|
8
|
+
exports.annexb2avcSample = annexb2avcSample;
|
|
8
9
|
const sps_parser_1 = __importDefault(require("./sps-parser"));
|
|
9
10
|
var H264NaluType;
|
|
10
11
|
(function (H264NaluType) {
|
|
@@ -237,4 +238,16 @@ function annexb2avcc(data) {
|
|
|
237
238
|
const avcc = new AVCDecoderConfigurationRecord(sps_without_header, pps_without_header, details);
|
|
238
239
|
return avcc.getData();
|
|
239
240
|
}
|
|
241
|
+
function annexb2avcSample(data) {
|
|
242
|
+
const annexbParser = new H264AnnexBParser(data);
|
|
243
|
+
const nalUnits = [];
|
|
244
|
+
let naluPayload = null;
|
|
245
|
+
while ((naluPayload = annexbParser.readNextNaluPayload()) != null) {
|
|
246
|
+
nalUnits.push(Buffer.from(new H264NaluAVC1(naluPayload).data));
|
|
247
|
+
}
|
|
248
|
+
if (nalUnits.length === 0) {
|
|
249
|
+
throw new Error("annexb sample does not contain nal units");
|
|
250
|
+
}
|
|
251
|
+
return Buffer.concat(nalUnits);
|
|
252
|
+
}
|
|
240
253
|
//# sourceMappingURL=h264.js.map
|
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
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\nexport function annexb2avcSample(data: Buffer) {\n const annexbParser = new H264AnnexBParser(data);\n const nalUnits: Buffer[] = [];\n let naluPayload: H264NaluPayload | null = null;\n\n while ((naluPayload = annexbParser.readNextNaluPayload()) != null) {\n nalUnits.push(Buffer.from(new H264NaluAVC1(naluPayload).data));\n }\n\n if (nalUnits.length === 0) {\n throw new Error(\"annexb sample does not contain nal units\");\n }\n\n return Buffer.concat(nalUnits);\n}\n"]}
|
|
@@ -10,14 +10,16 @@ export type Mp4Input = {
|
|
|
10
10
|
};
|
|
11
11
|
eol?: boolean;
|
|
12
12
|
};
|
|
13
|
-
export
|
|
13
|
+
export type Mp4Output = {
|
|
14
14
|
type: DataType;
|
|
15
15
|
timestamp: number;
|
|
16
16
|
duration: number;
|
|
17
17
|
data: Uint8Array;
|
|
18
|
-
eol?:
|
|
18
|
+
eol?: false | undefined;
|
|
19
19
|
kind: "audio" | "video";
|
|
20
|
-
}
|
|
20
|
+
} | {
|
|
21
|
+
eol: true;
|
|
22
|
+
};
|
|
21
23
|
export interface MP4Option {
|
|
22
24
|
/**ms */
|
|
23
25
|
duration?: number;
|
|
@@ -28,16 +30,18 @@ export declare class MP4Base implements AVProcessor<Mp4Input> {
|
|
|
28
30
|
tracks: Track[];
|
|
29
31
|
private output;
|
|
30
32
|
private options;
|
|
33
|
+
audioStopped: boolean;
|
|
31
34
|
private internalStats;
|
|
32
35
|
private container;
|
|
33
36
|
stopped: boolean;
|
|
34
37
|
onStopped: Event<any[]>;
|
|
35
|
-
|
|
38
|
+
videoStopped: boolean;
|
|
39
|
+
constructor(tracks: Track[], output: (output: Mp4Output) => void | Promise<void>, options?: MP4Option);
|
|
36
40
|
toJSON(): Record<string, any>;
|
|
37
|
-
|
|
38
|
-
|
|
41
|
+
processVideoInput: ({ eol, frame }: Mp4Input) => void;
|
|
42
|
+
processAudioInput: ({ eol, frame }: Mp4Input) => void;
|
|
39
43
|
protected start(): void;
|
|
40
|
-
stop(): void
|
|
44
|
+
stop(): Promise<void>;
|
|
41
45
|
}
|
|
42
46
|
export interface Track {
|
|
43
47
|
width?: number;
|
|
@@ -24,6 +24,12 @@ class MP4Base {
|
|
|
24
24
|
writable: true,
|
|
25
25
|
value: options
|
|
26
26
|
});
|
|
27
|
+
Object.defineProperty(this, "audioStopped", {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
configurable: true,
|
|
30
|
+
writable: true,
|
|
31
|
+
value: false
|
|
32
|
+
});
|
|
27
33
|
Object.defineProperty(this, "internalStats", {
|
|
28
34
|
enumerable: true,
|
|
29
35
|
configurable: true,
|
|
@@ -48,84 +54,113 @@ class MP4Base {
|
|
|
48
54
|
writable: true,
|
|
49
55
|
value: new common_1.Event()
|
|
50
56
|
});
|
|
51
|
-
Object.defineProperty(this, "
|
|
57
|
+
Object.defineProperty(this, "videoStopped", {
|
|
52
58
|
enumerable: true,
|
|
53
59
|
configurable: true,
|
|
54
60
|
writable: true,
|
|
55
|
-
value:
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
61
|
+
value: false
|
|
62
|
+
});
|
|
63
|
+
Object.defineProperty(this, "processVideoInput", {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
configurable: true,
|
|
66
|
+
writable: true,
|
|
67
|
+
value: ({ eol, frame }) => {
|
|
68
|
+
if (this.stopped) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (!frame) {
|
|
72
|
+
if (eol) {
|
|
73
|
+
this.videoStopped = true;
|
|
74
|
+
if (!this.tracks.some((track) => track.kind === "audio") ||
|
|
75
|
+
this.audioStopped) {
|
|
76
|
+
void this.stop();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const track = this.tracks.find((t) => t.kind === "video");
|
|
82
|
+
this.videoStopped = false;
|
|
83
|
+
if (!this.container.videoTrack) {
|
|
84
|
+
if (frame.isKeyframe) {
|
|
85
|
+
const avcc = (0, mp4_1.annexb2avcc)(frame.data);
|
|
86
|
+
const sample = (0, mp4_1.annexb2avcSample)(frame.data);
|
|
87
|
+
const [displayAspectWidth, displayAspectHeight] = computeRatio(track.width, track.height);
|
|
59
88
|
this.container.write({
|
|
60
|
-
codec:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
89
|
+
codec: avccToCodecString(avcc),
|
|
90
|
+
codedWidth: track.width,
|
|
91
|
+
codedHeight: track.height,
|
|
92
|
+
description: toArrayBuffer(Buffer.from(avcc)),
|
|
93
|
+
displayAspectWidth,
|
|
94
|
+
displayAspectHeight,
|
|
95
|
+
track: "video",
|
|
65
96
|
});
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
97
|
this.container.write({
|
|
69
|
-
byteLength:
|
|
98
|
+
byteLength: sample.length,
|
|
70
99
|
duration: null,
|
|
71
100
|
timestamp: frame.time * 1000,
|
|
72
101
|
type: "key",
|
|
73
102
|
copyTo: (destination) => {
|
|
74
|
-
|
|
75
|
-
frame.data.copy(destination);
|
|
103
|
+
new Uint8Array(destination).set(sample);
|
|
76
104
|
},
|
|
77
|
-
track: "
|
|
105
|
+
track: "video",
|
|
78
106
|
});
|
|
79
107
|
}
|
|
80
108
|
}
|
|
109
|
+
else {
|
|
110
|
+
const sample = (0, mp4_1.annexb2avcSample)(frame.data);
|
|
111
|
+
this.container.write({
|
|
112
|
+
byteLength: sample.length,
|
|
113
|
+
duration: null,
|
|
114
|
+
timestamp: frame.time * 1000,
|
|
115
|
+
type: frame.isKeyframe ? "key" : "delta",
|
|
116
|
+
copyTo: (destination) => {
|
|
117
|
+
new Uint8Array(destination).set(sample);
|
|
118
|
+
},
|
|
119
|
+
track: "video",
|
|
120
|
+
});
|
|
121
|
+
}
|
|
81
122
|
}
|
|
82
123
|
});
|
|
83
|
-
Object.defineProperty(this, "
|
|
124
|
+
Object.defineProperty(this, "processAudioInput", {
|
|
84
125
|
enumerable: true,
|
|
85
126
|
configurable: true,
|
|
86
127
|
writable: true,
|
|
87
|
-
value: ({ frame }) => {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
codedHeight: track.height,
|
|
98
|
-
description: avcc.buffer,
|
|
99
|
-
displayAspectWidth,
|
|
100
|
-
displayAspectHeight,
|
|
101
|
-
track: "video",
|
|
102
|
-
});
|
|
103
|
-
this.container.write({
|
|
104
|
-
byteLength: frame.data.length,
|
|
105
|
-
duration: null,
|
|
106
|
-
timestamp: frame.time * 1000,
|
|
107
|
-
type: "key",
|
|
108
|
-
copyTo: (destination) => {
|
|
109
|
-
//@ts-expect-error
|
|
110
|
-
frame.data.copy(destination);
|
|
111
|
-
},
|
|
112
|
-
track: "video",
|
|
113
|
-
});
|
|
128
|
+
value: ({ eol, frame }) => {
|
|
129
|
+
if (this.stopped) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (!frame) {
|
|
133
|
+
if (eol) {
|
|
134
|
+
this.audioStopped = true;
|
|
135
|
+
if (!this.tracks.some((track) => track.kind === "video") ||
|
|
136
|
+
this.videoStopped) {
|
|
137
|
+
void this.stop();
|
|
114
138
|
}
|
|
115
139
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const track = this.tracks.find((t) => t.kind === "audio");
|
|
143
|
+
this.audioStopped = false;
|
|
144
|
+
if (!this.container.audioTrack) {
|
|
145
|
+
this.container.write({
|
|
146
|
+
codec: track.codec,
|
|
147
|
+
description: toArrayBuffer(__1.OpusRtpPayload.createCodecPrivate()),
|
|
148
|
+
numberOfChannels: 2,
|
|
149
|
+
sampleRate: track.clockRate,
|
|
150
|
+
track: "audio",
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
this.container.write({
|
|
155
|
+
byteLength: frame.data.length,
|
|
156
|
+
duration: null,
|
|
157
|
+
timestamp: frame.time * 1000,
|
|
158
|
+
type: "key",
|
|
159
|
+
copyTo: (destination) => {
|
|
160
|
+
new Uint8Array(destination).set(frame.data);
|
|
161
|
+
},
|
|
162
|
+
track: "audio",
|
|
163
|
+
});
|
|
129
164
|
}
|
|
130
165
|
}
|
|
131
166
|
});
|
|
@@ -135,8 +170,8 @@ class MP4Base {
|
|
|
135
170
|
video: !!this.tracks.find((t) => t.kind === "video"),
|
|
136
171
|
},
|
|
137
172
|
});
|
|
138
|
-
this.container.onData.subscribe((data) => {
|
|
139
|
-
this.output(data);
|
|
173
|
+
this.container.onData.subscribe(async (data) => {
|
|
174
|
+
await this.output(data);
|
|
140
175
|
});
|
|
141
176
|
}
|
|
142
177
|
toJSON() {
|
|
@@ -145,7 +180,15 @@ class MP4Base {
|
|
|
145
180
|
};
|
|
146
181
|
}
|
|
147
182
|
start() { }
|
|
148
|
-
stop() {
|
|
183
|
+
async stop() {
|
|
184
|
+
if (this.stopped) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
this.stopped = true;
|
|
188
|
+
await this.container.stop();
|
|
189
|
+
await this.output({ eol: true });
|
|
190
|
+
await this.onStopped.execute();
|
|
191
|
+
}
|
|
149
192
|
}
|
|
150
193
|
exports.MP4Base = MP4Base;
|
|
151
194
|
function computeRatio(a, b) {
|
|
@@ -160,4 +203,16 @@ function computeRatio(a, b) {
|
|
|
160
203
|
const divisor = gcd(a, b);
|
|
161
204
|
return [a / divisor, b / divisor];
|
|
162
205
|
}
|
|
206
|
+
function avccToCodecString(avcc) {
|
|
207
|
+
if (avcc.byteLength < 4) {
|
|
208
|
+
throw new Error("invalid avcc decoder configuration record");
|
|
209
|
+
}
|
|
210
|
+
return `avc1.${toHex(avcc[1])}${toHex(avcc[2])}${toHex(avcc[3])}`;
|
|
211
|
+
}
|
|
212
|
+
function toHex(value) {
|
|
213
|
+
return value.toString(16).padStart(2, "0");
|
|
214
|
+
}
|
|
215
|
+
function toArrayBuffer(buffer) {
|
|
216
|
+
return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
|
|
217
|
+
}
|
|
163
218
|
//# sourceMappingURL=mp4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mp4.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/mp4.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event } from \"../../imports/common\";\n\nimport { OpusRtpPayload, buffer2ArrayBuffer } from \"../..\";\nimport {\n type DataType,\n Mp4Container,\n type Mp4SupportedCodec,\n annexb2avcc,\n} from \"../container/mp4\";\nimport type { AVProcessor } from \"./interface\";\n\nexport type Mp4Input = {\n frame?: {\n data: Buffer;\n isKeyframe: boolean;\n /**ms */\n time: number;\n };\n eol?: boolean;\n};\n\nexport interface Mp4Output {\n type: DataType;\n timestamp: number;\n duration: number;\n data: Uint8Array;\n eol?: boolean;\n kind: \"audio\" | \"video\";\n}\n\nexport interface MP4Option {\n /**ms */\n duration?: number;\n encryptionKey?: Buffer;\n strictTimestamp?: boolean;\n}\n\nexport class MP4Base implements AVProcessor<Mp4Input> {\n private internalStats = {};\n private container: Mp4Container;\n stopped = false;\n onStopped = new Event();\n\n constructor(\n public tracks: Track[],\n private output: (output: Mp4Output) => void,\n private options: MP4Option = {},\n ) {\n this.container = new Mp4Container({\n track: {\n audio: !!this.tracks.find((t) => t.kind === \"audio\"),\n video: !!this.tracks.find((t) => t.kind === \"video\"),\n },\n });\n this.container.onData.subscribe((data) => {\n this.output(data);\n });\n }\n\n toJSON(): Record<string, any> {\n return {\n ...this.internalStats,\n };\n }\n\n processAudioInput = ({ frame }: Mp4Input) => {\n const track = this.tracks.find((t) => t.kind === \"audio\")!;\n\n if (frame) {\n if (!this.container.audioTrack) {\n this.container.write({\n codec: track.codec,\n description: buffer2ArrayBuffer(\n OpusRtpPayload.createCodecPrivate(),\n ) as ArrayBuffer,\n numberOfChannels: 2,\n sampleRate: track.clockRate,\n track: \"audio\",\n });\n } else {\n this.container.write({\n byteLength: frame.data.length,\n duration: null,\n timestamp: frame.time * 1000,\n type: \"key\",\n copyTo: (destination) => {\n //@ts-expect-error\n frame.data.copy(destination);\n },\n track: \"audio\",\n });\n }\n }\n };\n\n processVideoInput = ({ frame }: Mp4Input) => {\n const track = this.tracks.find((t) => t.kind === \"video\")!;\n\n if (frame) {\n if (!this.container.videoTrack) {\n if (frame.isKeyframe) {\n const avcc = annexb2avcc(frame.data);\n\n const [displayAspectWidth, displayAspectHeight] = computeRatio(\n track.width!,\n track.height!,\n );\n\n this.container.write({\n codec: track.codec,\n codedWidth: track.width,\n codedHeight: track.height,\n description: avcc.buffer as ArrayBuffer,\n displayAspectWidth,\n displayAspectHeight,\n track: \"video\",\n });\n this.container.write({\n byteLength: frame.data.length,\n duration: null,\n timestamp: frame.time * 1000,\n type: \"key\",\n copyTo: (destination) => {\n //@ts-expect-error\n frame.data.copy(destination);\n },\n track: \"video\",\n });\n }\n } else {\n this.container.write({\n byteLength: frame.data.length,\n duration: null,\n timestamp: frame.time * 1000,\n type: frame.isKeyframe ? \"key\" : \"delta\",\n copyTo: (destination) => {\n //@ts-expect-error\n frame.data.copy(destination);\n },\n track: \"video\",\n });\n }\n }\n };\n\n protected start() {}\n\n stop() {}\n}\n\nfunction computeRatio(a: number, b: number) {\n function gcd(x: number, y: number) {\n while (y !== 0) {\n const temp = y;\n y = x % y;\n x = temp;\n }\n return x;\n }\n\n const divisor = gcd(a, b);\n return [a / divisor, b / divisor];\n}\n\nexport interface Track {\n width?: number;\n height?: number;\n kind: \"audio\" | \"video\";\n codec: Mp4SupportedCodec;\n clockRate: number;\n trackNumber: number;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mp4.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/mp4.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event } from \"../../imports/common\";\n\nimport { OpusRtpPayload } from \"../..\";\nimport {\n type DataType,\n Mp4Container,\n type Mp4SupportedCodec,\n annexb2avcSample,\n annexb2avcc,\n} from \"../container/mp4\";\nimport type { AVProcessor } from \"./interface\";\n\nexport type Mp4Input = {\n frame?: {\n data: Buffer;\n isKeyframe: boolean;\n /**ms */\n time: number;\n };\n eol?: boolean;\n};\n\nexport type Mp4Output =\n | {\n type: DataType;\n timestamp: number;\n duration: number;\n data: Uint8Array;\n eol?: false | undefined;\n kind: \"audio\" | \"video\";\n }\n | {\n eol: true;\n };\n\nexport interface MP4Option {\n /**ms */\n duration?: number;\n encryptionKey?: Buffer;\n strictTimestamp?: boolean;\n}\n\nexport class MP4Base implements AVProcessor<Mp4Input> {\n audioStopped = false;\n private internalStats = {};\n private container: Mp4Container;\n stopped = false;\n onStopped = new Event();\n videoStopped = false;\n\n constructor(\n public tracks: Track[],\n private output: (output: Mp4Output) => void | Promise<void>,\n private options: MP4Option = {},\n ) {\n this.container = new Mp4Container({\n track: {\n audio: !!this.tracks.find((t) => t.kind === \"audio\"),\n video: !!this.tracks.find((t) => t.kind === \"video\"),\n },\n });\n this.container.onData.subscribe(async (data) => {\n await this.output(data);\n });\n }\n\n toJSON(): Record<string, any> {\n return {\n ...this.internalStats,\n };\n }\n\n processVideoInput = ({ eol, frame }: Mp4Input) => {\n if (this.stopped) {\n return;\n }\n\n if (!frame) {\n if (eol) {\n this.videoStopped = true;\n if (\n !this.tracks.some((track) => track.kind === \"audio\") ||\n this.audioStopped\n ) {\n void this.stop();\n }\n }\n return;\n }\n\n const track = this.tracks.find((t) => t.kind === \"video\")!;\n\n this.videoStopped = false;\n if (!this.container.videoTrack) {\n if (frame.isKeyframe) {\n const avcc = annexb2avcc(frame.data);\n const sample = annexb2avcSample(frame.data);\n\n const [displayAspectWidth, displayAspectHeight] = computeRatio(\n track.width!,\n track.height!,\n );\n\n this.container.write({\n codec: avccToCodecString(avcc),\n codedWidth: track.width,\n codedHeight: track.height,\n description: toArrayBuffer(Buffer.from(avcc)),\n displayAspectWidth,\n displayAspectHeight,\n track: \"video\",\n });\n this.container.write({\n byteLength: sample.length,\n duration: null,\n timestamp: frame.time * 1000,\n type: \"key\",\n copyTo: (destination) => {\n new Uint8Array(destination).set(sample);\n },\n track: \"video\",\n });\n }\n } else {\n const sample = annexb2avcSample(frame.data);\n this.container.write({\n byteLength: sample.length,\n duration: null,\n timestamp: frame.time * 1000,\n type: frame.isKeyframe ? \"key\" : \"delta\",\n copyTo: (destination) => {\n new Uint8Array(destination).set(sample);\n },\n track: \"video\",\n });\n }\n };\n\n processAudioInput = ({ eol, frame }: Mp4Input) => {\n if (this.stopped) {\n return;\n }\n\n if (!frame) {\n if (eol) {\n this.audioStopped = true;\n if (\n !this.tracks.some((track) => track.kind === \"video\") ||\n this.videoStopped\n ) {\n void this.stop();\n }\n }\n return;\n }\n\n const track = this.tracks.find((t) => t.kind === \"audio\")!;\n\n this.audioStopped = false;\n if (!this.container.audioTrack) {\n this.container.write({\n codec: track.codec,\n description: toArrayBuffer(OpusRtpPayload.createCodecPrivate()),\n numberOfChannels: 2,\n sampleRate: track.clockRate,\n track: \"audio\",\n });\n } else {\n this.container.write({\n byteLength: frame.data.length,\n duration: null,\n timestamp: frame.time * 1000,\n type: \"key\",\n copyTo: (destination) => {\n new Uint8Array(destination).set(frame.data);\n },\n track: \"audio\",\n });\n }\n };\n\n protected start() {}\n\n async stop() {\n if (this.stopped) {\n return;\n }\n\n this.stopped = true;\n await this.container.stop();\n await this.output({ eol: true });\n await this.onStopped.execute();\n }\n}\n\nfunction computeRatio(a: number, b: number) {\n function gcd(x: number, y: number) {\n while (y !== 0) {\n const temp = y;\n y = x % y;\n x = temp;\n }\n return x;\n }\n\n const divisor = gcd(a, b);\n return [a / divisor, b / divisor];\n}\n\nexport interface Track {\n width?: number;\n height?: number;\n kind: \"audio\" | \"video\";\n codec: Mp4SupportedCodec;\n clockRate: number;\n trackNumber: number;\n}\n\nfunction avccToCodecString(avcc: Uint8Array) {\n if (avcc.byteLength < 4) {\n throw new Error(\"invalid avcc decoder configuration record\");\n }\n\n return `avc1.${toHex(avcc[1])}${toHex(avcc[2])}${toHex(avcc[3])}`;\n}\n\nfunction toHex(value: number) {\n return value.toString(16).padStart(2, \"0\");\n}\n\nfunction toArrayBuffer(buffer: Buffer) {\n return buffer.buffer.slice(\n buffer.byteOffset,\n buffer.byteOffset + buffer.byteLength,\n ) as ArrayBuffer;\n}\n"]}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { MP4Base, type Mp4Input, type Mp4Output, type Track } from "./mp4";
|
|
2
|
-
import type { WebmOption } from "./webm";
|
|
1
|
+
import { MP4Base, type MP4Option, type Mp4Input, type Mp4Output, type Track } from "./mp4";
|
|
3
2
|
export declare class MP4Callback extends MP4Base {
|
|
4
3
|
private cb?;
|
|
5
4
|
private queue;
|
|
6
|
-
constructor(tracks: Track[], options?:
|
|
5
|
+
constructor(tracks: Track[], options?: MP4Option);
|
|
7
6
|
pipe: (cb: (input: Mp4Output) => Promise<void>) => void;
|
|
8
7
|
inputAudio: (input: Mp4Input) => void;
|
|
9
8
|
inputVideo: (input: Mp4Input) => void;
|
|
@@ -55,8 +55,10 @@ class MP4Callback extends mp4_1.MP4Base {
|
|
|
55
55
|
configurable: true,
|
|
56
56
|
writable: true,
|
|
57
57
|
value: () => {
|
|
58
|
-
this.
|
|
59
|
-
|
|
58
|
+
void this.stop().finally(() => {
|
|
59
|
+
this.cb = undefined;
|
|
60
|
+
this.queue.cancel();
|
|
61
|
+
});
|
|
60
62
|
}
|
|
61
63
|
});
|
|
62
64
|
}
|
|
@@ -71,7 +73,7 @@ Object.defineProperty(MP4Callback, "saveToFileSystem", {
|
|
|
71
73
|
const queue = new __1.PromiseQueue();
|
|
72
74
|
return async (value) => {
|
|
73
75
|
await queue.push(async () => {
|
|
74
|
-
if (value
|
|
76
|
+
if ("data" in value) {
|
|
75
77
|
await (0, promises_1.appendFile)(path, value.data);
|
|
76
78
|
}
|
|
77
79
|
else if (value.eol) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mp4Callback.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/mp4Callback.ts"],"names":[],"mappings":";;;;AAAA,0CAAyC;AAEzC,6BAAqC;AACrC,+
|
|
1
|
+
{"version":3,"file":"mp4Callback.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/mp4Callback.ts"],"names":[],"mappings":";;;;AAAA,0CAAyC;AAEzC,6BAAqC;AACrC,+BAMe;AAEf,MAAa,WAAY,SAAQ,aAAO;IAGtC,YAAY,MAAe,EAAE,UAAqB,EAAE;QAClD,KAAK,CACH,MAAM,EACN,KAAK,EAAE,MAAM,EAAE,EAAE;YACf,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,EACD,OAAO,CACR,CAAC;QAZI;;;;;WAAyC;QACzC;;;;mBAAQ,IAAI,gBAAY,EAAE;WAAC;QAcnC;;;;mBAAO,CAAC,EAAuC,EAAE,EAAE;gBACjD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;WAAC;QAEF;;;;mBAAa,CAAC,KAAe,EAAE,EAAE;gBAC/B,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;WAAC;QACF;;;;mBAAa,CAAC,KAAe,EAAE,EAAE;gBAC/B,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;WAAC;QAEF;;;;mBAAU,GAAG,EAAE;gBACb,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;oBAC5B,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;oBACpB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACtB,CAAC,CAAC,CAAC;YACL,CAAC;WAAC;IAnBF,CAAC;;AAdH,kCA8CC;;AAXQ;;;;WAAmB,CAAC,IAAY,EAAE,EAAE;QACzC,MAAM,KAAK,GAAG,IAAI,gBAAY,EAAE,CAAC;QACjC,OAAO,KAAK,EAAE,KAAgB,EAAE,EAAE;YAChC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBAC1B,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;oBACpB,MAAM,IAAA,qBAAU,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrC,CAAC;qBAAM,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBACvB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;IACJ,CAAC;EAVsB,CAUrB","sourcesContent":["import { appendFile } from \"fs/promises\";\n\nimport { PromiseQueue } from \"../..\";\nimport {\n MP4Base,\n type MP4Option,\n type Mp4Input,\n type Mp4Output,\n type Track,\n} from \"./mp4\";\n\nexport class MP4Callback extends MP4Base {\n private cb?: (input: Mp4Output) => Promise<void>;\n private queue = new PromiseQueue();\n constructor(tracks: Track[], options: MP4Option = {}) {\n super(\n tracks,\n async (output) => {\n const cb = this.cb;\n if (cb) {\n await this.queue.push(() => cb(output));\n }\n },\n options,\n );\n }\n\n pipe = (cb: (input: Mp4Output) => Promise<void>) => {\n this.cb = cb;\n this.start();\n };\n\n inputAudio = (input: Mp4Input) => {\n this.processAudioInput(input);\n };\n inputVideo = (input: Mp4Input) => {\n this.processVideoInput(input);\n };\n\n destroy = () => {\n void this.stop().finally(() => {\n this.cb = undefined;\n this.queue.cancel();\n });\n };\n\n static saveToFileSystem = (path: string) => {\n const queue = new PromiseQueue();\n return async (value: Mp4Output) => {\n await queue.push(async () => {\n if (\"data\" in value) {\n await appendFile(path, value.data);\n } else if (value.eol) {\n }\n });\n };\n };\n}\n"]}
|
package/lib/rtp/src/rtp/rtx.js
CHANGED
|
@@ -2,19 +2,20 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.unwrapRtx = unwrapRtx;
|
|
4
4
|
exports.wrapRtx = wrapRtx;
|
|
5
|
-
const jspack_1 = require("@shinyoshiaki/jspack");
|
|
6
5
|
const rtp_1 = require("./rtp");
|
|
7
6
|
function unwrapRtx(rtx, payloadType, ssrc) {
|
|
8
7
|
const packet = new rtp_1.RtpPacket(new rtp_1.RtpHeader({
|
|
9
8
|
payloadType,
|
|
10
9
|
marker: rtx.header.marker,
|
|
11
|
-
sequenceNumber:
|
|
10
|
+
sequenceNumber: rtx.payload.readUInt16BE(0),
|
|
12
11
|
timestamp: rtx.header.timestamp,
|
|
13
12
|
ssrc,
|
|
14
13
|
}), rtx.payload.subarray(2));
|
|
15
14
|
return packet;
|
|
16
15
|
}
|
|
17
16
|
function wrapRtx(packet, payloadType, sequenceNumber, ssrc) {
|
|
17
|
+
const originalSequence = Buffer.allocUnsafe(2);
|
|
18
|
+
originalSequence.writeUInt16BE(packet.header.sequenceNumber, 0);
|
|
18
19
|
const rtx = new rtp_1.RtpPacket(new rtp_1.RtpHeader({
|
|
19
20
|
payloadType,
|
|
20
21
|
marker: packet.header.marker,
|
|
@@ -23,10 +24,7 @@ function wrapRtx(packet, payloadType, sequenceNumber, ssrc) {
|
|
|
23
24
|
ssrc,
|
|
24
25
|
csrc: packet.header.csrc,
|
|
25
26
|
extensions: packet.header.extensions,
|
|
26
|
-
}), Buffer.concat([
|
|
27
|
-
Buffer.from(jspack_1.jspack.Pack("!H", [packet.header.sequenceNumber])),
|
|
28
|
-
packet.payload,
|
|
29
|
-
]));
|
|
27
|
+
}), Buffer.concat([originalSequence, packet.payload]));
|
|
30
28
|
return rtx;
|
|
31
29
|
}
|
|
32
30
|
//# sourceMappingURL=rtx.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtx.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/rtx.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"rtx.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/rtx.ts"],"names":[],"mappings":";;AAEA,8BAYC;AAED,0BAqBC;AArCD,+BAA6C;AAE7C,SAAgB,SAAS,CAAC,GAAc,EAAE,WAAmB,EAAE,IAAY;IACzE,MAAM,MAAM,GAAG,IAAI,eAAS,CAC1B,IAAI,eAAS,CAAC;QACZ,WAAW;QACX,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM;QACzB,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QAC3C,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;QAC/B,IAAI;KACL,CAAC,EACF,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CACxB,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,OAAO,CACrB,MAAiB,EACjB,WAAmB,EACnB,cAAsB,EACtB,IAAY;IAEZ,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC/C,gBAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAChE,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,CAAC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAClD,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import { RtpHeader, RtpPacket } from \"./rtp\";\n\nexport function unwrapRtx(rtx: RtpPacket, payloadType: number, ssrc: number) {\n const packet = new RtpPacket(\n new RtpHeader({\n payloadType,\n marker: rtx.header.marker,\n sequenceNumber: rtx.payload.readUInt16BE(0),\n timestamp: rtx.header.timestamp,\n ssrc,\n }),\n rtx.payload.subarray(2),\n );\n return packet;\n}\n\nexport function wrapRtx(\n packet: RtpPacket,\n payloadType: number,\n sequenceNumber: number,\n ssrc: number,\n) {\n const originalSequence = Buffer.allocUnsafe(2);\n originalSequence.writeUInt16BE(packet.header.sequenceNumber, 0);\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([originalSequence, packet.payload]),\n );\n return rtx;\n}\n"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { createHmac } from "crypto";
|
|
2
2
|
import type { CipherAesBase } from "../cipher";
|
|
3
3
|
import { type SrtpProfile } from "../const";
|
|
4
|
+
/** AES-128-ECB single-block encrypt for SRTP KDF (no padding). */
|
|
5
|
+
export declare function aes128EcbEncrypt(key: Buffer, plaintext: Buffer): Buffer;
|
|
4
6
|
export declare class Context {
|
|
5
7
|
masterKey: Buffer;
|
|
6
8
|
masterSalt: Buffer;
|
|
@@ -1,14 +1,17 @@
|
|
|
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.Context = void 0;
|
|
4
|
+
exports.aes128EcbEncrypt = aes128EcbEncrypt;
|
|
7
5
|
const crypto_1 = require("crypto");
|
|
8
|
-
const aes_js_1 = __importDefault(require("aes-js"));
|
|
9
6
|
const ctr_1 = require("../cipher/ctr");
|
|
10
7
|
const gcm_1 = require("../cipher/gcm");
|
|
11
8
|
const const_1 = require("../const");
|
|
9
|
+
/** AES-128-ECB single-block encrypt for SRTP KDF (no padding). */
|
|
10
|
+
function aes128EcbEncrypt(key, plaintext) {
|
|
11
|
+
const cipher = (0, crypto_1.createCipheriv)("aes-128-ecb", key, null);
|
|
12
|
+
cipher.setAutoPadding(false);
|
|
13
|
+
return Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
14
|
+
}
|
|
12
15
|
class Context {
|
|
13
16
|
constructor(masterKey, masterSalt, profile) {
|
|
14
17
|
Object.defineProperty(this, "masterKey", {
|
|
@@ -96,7 +99,7 @@ class Context {
|
|
|
96
99
|
value: void 0
|
|
97
100
|
});
|
|
98
101
|
{
|
|
99
|
-
//
|
|
102
|
+
// AES-ECB plaintext require 16byte
|
|
100
103
|
// so need to padding to 14 byte
|
|
101
104
|
const diff = 14 - masterSalt.length;
|
|
102
105
|
if (diff > 0) {
|
|
@@ -135,8 +138,7 @@ class Context {
|
|
|
135
138
|
sessionKey[j] = sessionKey[j] ^ labelAndIndexOverKdr[i];
|
|
136
139
|
}
|
|
137
140
|
sessionKey = Buffer.concat([sessionKey, Buffer.from([0x00, 0x00])]);
|
|
138
|
-
|
|
139
|
-
return Buffer.from(block.encrypt(sessionKey));
|
|
141
|
+
return aes128EcbEncrypt(this.masterKey, sessionKey);
|
|
140
142
|
}
|
|
141
143
|
generateSessionSalt(label) {
|
|
142
144
|
let sessionSalt = Buffer.from(this.masterSalt);
|
|
@@ -153,8 +155,7 @@ class Context {
|
|
|
153
155
|
sessionSalt[j] = sessionSalt[j] ^ labelAndIndexOverKdr[i];
|
|
154
156
|
}
|
|
155
157
|
sessionSalt = Buffer.concat([sessionSalt, Buffer.from([0x00, 0x00])]);
|
|
156
|
-
|
|
157
|
-
sessionSalt = Buffer.from(block.encrypt(sessionSalt));
|
|
158
|
+
sessionSalt = aes128EcbEncrypt(this.masterKey, sessionSalt);
|
|
158
159
|
return sessionSalt.subarray(0, 14);
|
|
159
160
|
}
|
|
160
161
|
generateSessionAuthTag(label) {
|
|
@@ -179,9 +180,8 @@ class Context {
|
|
|
179
180
|
sessionAuthTag,
|
|
180
181
|
Buffer.from([0x00, 0x01]),
|
|
181
182
|
]);
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
secondRun = Buffer.from(block.encrypt(secondRun));
|
|
183
|
+
firstRun = aes128EcbEncrypt(this.masterKey, firstRun);
|
|
184
|
+
secondRun = aes128EcbEncrypt(this.masterKey, secondRun);
|
|
185
185
|
return Buffer.concat([firstRun, secondRun.subarray(0, 4)]);
|
|
186
186
|
}
|
|
187
187
|
getSrtpSsrcState(ssrc) {
|