werift 0.15.10 → 0.16.0
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/index.d.ts +2 -0
- package/lib/common/src/index.js +2 -0
- package/lib/common/src/index.js.map +1 -1
- package/lib/common/src/log.d.ts +11 -0
- package/lib/common/src/log.js +17 -0
- package/lib/common/src/log.js.map +1 -0
- package/lib/common/src/network.d.ts +7 -3
- package/lib/common/src/network.js +15 -7
- package/lib/common/src/network.js.map +1 -1
- package/lib/common/src/type.d.ts +3 -0
- package/lib/common/src/type.js +3 -0
- package/lib/common/src/type.js.map +1 -0
- package/lib/dtls/src/context/cipher.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js +10 -0
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/ice/src/ice.d.ts +3 -0
- package/lib/ice/src/ice.js +9 -2
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +2 -1
- package/lib/ice/src/stun/protocol.js +3 -3
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/transport.d.ts +4 -2
- package/lib/ice/src/transport.js +8 -6
- package/lib/ice/src/transport.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +3 -1
- package/lib/ice/src/turn/protocol.js +2 -2
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/utils.d.ts +2 -1
- package/lib/ice/src/utils.js +2 -2
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/rtp/src/codec/index.d.ts +18 -0
- package/lib/rtp/src/codec/index.js +81 -0
- package/lib/rtp/src/codec/index.js.map +1 -0
- package/lib/rtp/src/codec/vp8.d.ts +5 -3
- package/lib/rtp/src/codec/vp8.js +19 -5
- package/lib/rtp/src/codec/vp8.js.map +1 -1
- package/lib/rtp/src/container/webm.d.ts +6 -1
- package/lib/rtp/src/container/webm.js +9 -2
- package/lib/rtp/src/container/webm.js.map +1 -1
- package/lib/rtp/src/index.d.ts +2 -6
- package/lib/rtp/src/index.js +2 -6
- package/lib/rtp/src/index.js.map +1 -1
- package/lib/rtp/src/processor/base.d.ts +3 -1
- package/lib/rtp/src/processor/base.js +19 -6
- package/lib/rtp/src/processor/base.js.map +1 -1
- package/lib/rtp/src/processor/jitterBuffer.js +1 -2
- package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
- package/lib/rtp/src/processor/lipsync.js +22 -2
- package/lib/rtp/src/processor/lipsync.js.map +1 -1
- package/lib/rtp/src/processor/webm.d.ts +11 -7
- package/lib/rtp/src/processor/webm.js +16 -41
- package/lib/rtp/src/processor/webm.js.map +1 -1
- package/lib/rtp/src/processor_v2/depacketizer.d.ts +17 -0
- package/lib/rtp/src/processor_v2/depacketizer.js +84 -0
- package/lib/rtp/src/processor_v2/depacketizer.js.map +1 -0
- package/lib/rtp/src/processor_v2/index.d.ts +4 -0
- package/lib/rtp/src/processor_v2/index.js +21 -0
- package/lib/rtp/src/processor_v2/index.js.map +1 -0
- package/lib/rtp/src/processor_v2/jitterBuffer.d.ts +33 -0
- package/lib/rtp/src/processor_v2/jitterBuffer.js +154 -0
- package/lib/rtp/src/processor_v2/jitterBuffer.js.map +1 -0
- package/lib/rtp/src/processor_v2/source/base.d.ts +8 -0
- package/lib/rtp/src/processor_v2/source/base.js +16 -0
- package/lib/rtp/src/processor_v2/source/base.js.map +1 -0
- package/lib/rtp/src/processor_v2/source/index.d.ts +2 -0
- package/lib/rtp/src/processor_v2/source/index.js +6 -0
- package/lib/rtp/src/processor_v2/source/index.js.map +1 -0
- package/lib/rtp/src/processor_v2/source/rtp.d.ts +14 -0
- package/lib/rtp/src/processor_v2/source/rtp.js +24 -0
- package/lib/rtp/src/processor_v2/source/rtp.js.map +1 -0
- package/lib/rtp/src/processor_v2/webmLive.d.ts +51 -0
- package/lib/rtp/src/processor_v2/webmLive.js +154 -0
- package/lib/rtp/src/processor_v2/webmLive.js.map +1 -0
- package/lib/rtp/src/rtcp/header.d.ts +2 -1
- package/lib/rtp/src/rtcp/header.js +3 -2
- package/lib/rtp/src/rtcp/header.js.map +1 -1
- package/lib/rtp/src/rtcp/rr.d.ts +2 -0
- package/lib/rtp/src/rtcp/rr.js.map +1 -1
- package/lib/rtp/src/rtcp/rtcp.js +4 -4
- package/lib/rtp/src/rtcp/rtcp.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.js +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/nack.js +15 -7
- package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
- package/lib/rtp/src/rtp/red/packet.d.ts +1 -0
- package/lib/rtp/src/rtp/red/packet.js.map +1 -1
- package/lib/rtp/src/rtp/rtp.d.ts +1 -0
- package/lib/rtp/src/rtp/rtp.js +27 -26
- package/lib/rtp/src/rtp/rtp.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.js +14 -20
- package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
- package/lib/webrtc/src/dataChannel.js +1 -1
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/media/extension/rtpExtension.d.ts +2 -0
- package/lib/webrtc/src/media/extension/rtpExtension.js +8 -1
- package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -1
- package/lib/webrtc/src/media/parameters.d.ts +2 -0
- package/lib/webrtc/src/media/parameters.js +1 -0
- package/lib/webrtc/src/media/parameters.js.map +1 -1
- package/lib/webrtc/src/media/receiver/nack.d.ts +10 -5
- package/lib/webrtc/src/media/receiver/nack.js +44 -27
- package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
- package/lib/webrtc/src/media/receiver/receiverTwcc.js +1 -1
- package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
- package/lib/webrtc/src/media/receiver/red.d.ts +1 -1
- package/lib/webrtc/src/media/receiver/red.js +14 -3
- package/lib/webrtc/src/media/receiver/red.js.map +1 -1
- package/lib/webrtc/src/media/router.d.ts +10 -3
- package/lib/webrtc/src/media/router.js +2 -0
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +11 -3
- package/lib/webrtc/src/media/rtpReceiver.js +42 -23
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +23 -2
- package/lib/webrtc/src/media/rtpSender.js +34 -10
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +5 -1
- package/lib/webrtc/src/media/rtpTransceiver.js +9 -9
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/track.js +4 -2
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/index.d.ts +5 -1
- package/lib/webrtc/src/nonstandard/recorder/index.js +2 -2
- package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.d.ts +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.js +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +3 -3
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +61 -41
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +13 -0
- package/lib/webrtc/src/peerConnection.js +40 -3
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +1 -0
- package/lib/webrtc/src/sdp.js +4 -0
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.js +6 -1
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.js +1 -1
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +7 -2
- package/lib/webrtc/src/utils.js +9 -3
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/dataChannel.ts +1 -1
- package/src/media/extension/rtpExtension.ts +8 -0
- package/src/media/parameters.ts +3 -0
- package/src/media/receiver/nack.ts +45 -26
- package/src/media/receiver/receiverTwcc.ts +1 -1
- package/src/media/receiver/red.ts +14 -1
- package/src/media/router.ts +5 -3
- package/src/media/rtpReceiver.ts +59 -28
- package/src/media/rtpSender.ts +38 -12
- package/src/media/rtpTransceiver.ts +10 -8
- package/src/media/track.ts +6 -2
- package/src/nonstandard/recorder/index.ts +6 -2
- package/src/nonstandard/recorder/writer/index.ts +1 -1
- package/src/nonstandard/recorder/writer/webm.ts +105 -57
- package/src/peerConnection.ts +61 -7
- package/src/sdp.ts +3 -0
- package/src/transport/dtls.ts +5 -1
- package/src/transport/sctp.ts +1 -1
- package/src/utils.ts +8 -2
package/lib/ice/src/utils.js
CHANGED
|
@@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.normalizeFamilyNodeV18 = exports.getGlobalIp = void 0;
|
|
4
4
|
const ice_1 = require("./ice");
|
|
5
5
|
const protocol_1 = require("./stun/protocol");
|
|
6
|
-
async function getGlobalIp(stunServer) {
|
|
6
|
+
async function getGlobalIp(stunServer, interfaceAddresses) {
|
|
7
7
|
const connection = new ice_1.Connection(true, {
|
|
8
8
|
stunServer: stunServer ?? ["stun.l.google.com", 19302],
|
|
9
9
|
});
|
|
10
10
|
await connection.gatherCandidates();
|
|
11
11
|
const protocol = new protocol_1.StunProtocol(connection);
|
|
12
12
|
protocol.localCandidate = connection.localCandidates[0];
|
|
13
|
-
await protocol.connectionMade(true);
|
|
13
|
+
await protocol.connectionMade(true, undefined, interfaceAddresses);
|
|
14
14
|
const candidate = await (0, ice_1.serverReflexiveCandidate)(protocol, [
|
|
15
15
|
"stun.l.google.com",
|
|
16
16
|
19302,
|
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":";;;AACA,+BAA6D;AAC7D,8CAA+C;AAGxC,KAAK,UAAU,WAAW,CAC/B,UAAoB,EACpB,kBAAuC;IAEvC,MAAM,UAAU,GAAG,IAAI,gBAAU,CAAC,IAAI,EAAE;QACtC,UAAU,EAAE,UAAU,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC;KACvD,CAAC,CAAC;IACH,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAC;IAEpC,MAAM,QAAQ,GAAG,IAAI,uBAAY,CAAC,UAAU,CAAC,CAAC;IAC9C,QAAQ,CAAC,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACnE,MAAM,SAAS,GAAG,MAAM,IAAA,8BAAwB,EAAC,QAAQ,EAAE;QACzD,mBAAmB;QACnB,KAAK;KACN,CAAC,CAAC;IAEH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;IACzB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEvB,OAAO,SAAS,EAAE,IAAI,CAAC;AACzB,CAAC;AArBD,kCAqBC;AAED,SAAgB,sBAAsB,CAAC,MAAuB;IAC5D,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAEhC,OAAO,MAAe,CAAC;AACzB,CAAC;AALD,wDAKC","sourcesContent":["import { InterfaceAddresses } from \"../../common/src/network\";\nimport { Connection, serverReflexiveCandidate } from \"./ice\";\nimport { StunProtocol } from \"./stun/protocol\";\nimport { Address } from \"./types/model\";\n\nexport async function getGlobalIp(\n stunServer?: Address,\n interfaceAddresses?: InterfaceAddresses\n) {\n const connection = new Connection(true, {\n stunServer: stunServer ?? [\"stun.l.google.com\", 19302],\n });\n await connection.gatherCandidates();\n\n const protocol = new StunProtocol(connection);\n protocol.localCandidate = connection.localCandidates[0];\n await protocol.connectionMade(true, undefined, interfaceAddresses);\n const candidate = await serverReflexiveCandidate(protocol, [\n \"stun.l.google.com\",\n 19302,\n ]);\n\n await connection.close();\n await protocol.close();\n\n return candidate?.host;\n}\n\nexport function normalizeFamilyNodeV18(family: string | number): 4 | 6 {\n if (family === \"IPv4\") return 4;\n if (family === \"IPv6\") return 6;\n\n return family as 4 | 6;\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { RtpPacket } from "../rtp/rtp";
|
|
3
|
+
import { DePacketizerBase } from "./base";
|
|
4
|
+
export * from "./av1";
|
|
5
|
+
export * from "./base";
|
|
6
|
+
export * from "./h264";
|
|
7
|
+
export * from "./opus";
|
|
8
|
+
export * from "./vp8";
|
|
9
|
+
export * from "./vp9";
|
|
10
|
+
export declare function dePacketizeRtpPackets(codec: string, packets: RtpPacket[]): {
|
|
11
|
+
isKeyframe: boolean;
|
|
12
|
+
data: Buffer;
|
|
13
|
+
partitions: DePacketizerBase[];
|
|
14
|
+
} | {
|
|
15
|
+
isKeyframe: boolean;
|
|
16
|
+
data: Buffer;
|
|
17
|
+
};
|
|
18
|
+
export declare function dePacketizeRtpPacket(codec: string, packet: RtpPacket): DePacketizerBase;
|
|
@@ -0,0 +1,81 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.dePacketizeRtpPacket = exports.dePacketizeRtpPackets = void 0;
|
|
18
|
+
const av1_1 = require("./av1");
|
|
19
|
+
const h264_1 = require("./h264");
|
|
20
|
+
const opus_1 = require("./opus");
|
|
21
|
+
const vp8_1 = require("./vp8");
|
|
22
|
+
const vp9_1 = require("./vp9");
|
|
23
|
+
__exportStar(require("./av1"), exports);
|
|
24
|
+
__exportStar(require("./base"), exports);
|
|
25
|
+
__exportStar(require("./h264"), exports);
|
|
26
|
+
__exportStar(require("./opus"), exports);
|
|
27
|
+
__exportStar(require("./vp8"), exports);
|
|
28
|
+
__exportStar(require("./vp9"), exports);
|
|
29
|
+
function dePacketizeRtpPackets(codec, packets) {
|
|
30
|
+
const basicCodecParser = (DePacketizer) => {
|
|
31
|
+
const partitions = packets.map((p) => DePacketizer.deSerialize(p.payload));
|
|
32
|
+
const isKeyframe = !!partitions.find((f) => f.isKeyframe);
|
|
33
|
+
const data = Buffer.concat(partitions.map((f) => f.payload));
|
|
34
|
+
return { isKeyframe, data, partitions };
|
|
35
|
+
};
|
|
36
|
+
switch (codec.toUpperCase()) {
|
|
37
|
+
case "AV1": {
|
|
38
|
+
const chunks = packets.map((p) => av1_1.AV1RtpPayload.deSerialize(p.payload));
|
|
39
|
+
const isKeyframe = !!chunks.find((f) => f.isKeyframe);
|
|
40
|
+
const data = av1_1.AV1RtpPayload.getFrame(chunks);
|
|
41
|
+
return { isKeyframe, data };
|
|
42
|
+
}
|
|
43
|
+
case "MPEG4/ISO/AVC":
|
|
44
|
+
return basicCodecParser(h264_1.H264RtpPayload);
|
|
45
|
+
case "VP8": {
|
|
46
|
+
const { partitions, data, isKeyframe } = basicCodecParser(vp8_1.Vp8RtpPayload);
|
|
47
|
+
if (!partitions[0].payloadHeaderExist) {
|
|
48
|
+
throw new Error();
|
|
49
|
+
}
|
|
50
|
+
return { data, isKeyframe };
|
|
51
|
+
}
|
|
52
|
+
case "VP9":
|
|
53
|
+
return basicCodecParser(vp9_1.Vp9RtpPayload);
|
|
54
|
+
case "OPUS":
|
|
55
|
+
return basicCodecParser(opus_1.OpusRtpPayload);
|
|
56
|
+
default:
|
|
57
|
+
throw new Error();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.dePacketizeRtpPackets = dePacketizeRtpPackets;
|
|
61
|
+
function dePacketizeRtpPacket(codec, packet) {
|
|
62
|
+
const depacketizer = (DePacketizer) => {
|
|
63
|
+
return DePacketizer.deSerialize(packet.payload);
|
|
64
|
+
};
|
|
65
|
+
switch (codec.toUpperCase()) {
|
|
66
|
+
case "AV1":
|
|
67
|
+
return depacketizer(av1_1.AV1RtpPayload);
|
|
68
|
+
case "MPEG4/ISO/AVC":
|
|
69
|
+
return depacketizer(h264_1.H264RtpPayload);
|
|
70
|
+
case "VP8":
|
|
71
|
+
return depacketizer(vp8_1.Vp8RtpPayload);
|
|
72
|
+
case "VP9":
|
|
73
|
+
return depacketizer(vp9_1.Vp9RtpPayload);
|
|
74
|
+
case "OPUS":
|
|
75
|
+
return depacketizer(opus_1.OpusRtpPayload);
|
|
76
|
+
default:
|
|
77
|
+
throw new Error();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.dePacketizeRtpPacket = dePacketizeRtpPacket;
|
|
81
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { RtpPacket } from \"../rtp/rtp\";\nimport { AV1RtpPayload } from \"./av1\";\nimport { DePacketizerBase } from \"./base\";\nimport { H264RtpPayload } from \"./h264\";\nimport { OpusRtpPayload } from \"./opus\";\nimport { Vp8RtpPayload } from \"./vp8\";\nimport { Vp9RtpPayload } from \"./vp9\";\n\nexport * from \"./av1\";\nexport * from \"./base\";\nexport * from \"./h264\";\nexport * from \"./opus\";\nexport * from \"./vp8\";\nexport * from \"./vp9\";\n\nexport function dePacketizeRtpPackets(codec: string, packets: RtpPacket[]) {\n const basicCodecParser = (DePacketizer: typeof DePacketizerBase) => {\n const partitions = packets.map((p) => DePacketizer.deSerialize(p.payload));\n const isKeyframe = !!partitions.find((f) => f.isKeyframe);\n const data = Buffer.concat(partitions.map((f) => f.payload));\n return { isKeyframe, data, partitions };\n };\n\n switch (codec.toUpperCase()) {\n case \"AV1\": {\n const chunks = packets.map((p) => AV1RtpPayload.deSerialize(p.payload));\n const isKeyframe = !!chunks.find((f) => f.isKeyframe);\n const data = AV1RtpPayload.getFrame(chunks);\n return { isKeyframe, data };\n }\n case \"MPEG4/ISO/AVC\":\n return basicCodecParser(H264RtpPayload);\n case \"VP8\": {\n const { partitions, data, isKeyframe } = basicCodecParser(Vp8RtpPayload);\n if (!(partitions[0] as Vp8RtpPayload).payloadHeaderExist) {\n throw new Error();\n }\n\n return { data, isKeyframe };\n }\n case \"VP9\":\n return basicCodecParser(Vp9RtpPayload);\n case \"OPUS\":\n return basicCodecParser(OpusRtpPayload);\n default:\n throw new Error();\n }\n}\n\nexport function dePacketizeRtpPacket(codec: string, packet: RtpPacket) {\n const depacketizer = (DePacketizer: typeof DePacketizerBase) => {\n return DePacketizer.deSerialize(packet.payload);\n };\n\n switch (codec.toUpperCase()) {\n case \"AV1\":\n return depacketizer(AV1RtpPayload as any);\n case \"MPEG4/ISO/AVC\":\n return depacketizer(H264RtpPayload);\n case \"VP8\":\n return depacketizer(Vp8RtpPayload);\n case \"VP9\":\n return depacketizer(Vp9RtpPayload);\n case \"OPUS\":\n return depacketizer(OpusRtpPayload);\n default:\n throw new Error();\n }\n}\n"]}
|
|
@@ -13,14 +13,16 @@ export declare class Vp8RtpPayload implements DePacketizerBase {
|
|
|
13
13
|
mBit?: number;
|
|
14
14
|
pictureId?: number;
|
|
15
15
|
payload: Buffer;
|
|
16
|
-
size0
|
|
16
|
+
size0: number;
|
|
17
17
|
hBit?: number;
|
|
18
18
|
ver?: number;
|
|
19
19
|
pBit?: number;
|
|
20
|
-
size1
|
|
21
|
-
size2
|
|
20
|
+
size1: number;
|
|
21
|
+
size2: number;
|
|
22
22
|
static deSerialize(buf: Buffer): Vp8RtpPayload;
|
|
23
23
|
static isDetectedFinalPacketInSequence(header: RtpHeader): boolean;
|
|
24
24
|
get isKeyframe(): boolean;
|
|
25
25
|
get isPartitionHead(): boolean;
|
|
26
|
+
get payloadHeaderExist(): boolean;
|
|
27
|
+
get size(): number;
|
|
26
28
|
}
|
package/lib/rtp/src/codec/vp8.js
CHANGED
|
@@ -34,6 +34,11 @@ const src_1 = require("../../../common/src");
|
|
|
34
34
|
// : :
|
|
35
35
|
// +-+-+-+-+-+-+-+-+
|
|
36
36
|
class Vp8RtpPayload {
|
|
37
|
+
constructor() {
|
|
38
|
+
this.size0 = 0;
|
|
39
|
+
this.size1 = 0;
|
|
40
|
+
this.size2 = 0;
|
|
41
|
+
}
|
|
37
42
|
static deSerialize(buf) {
|
|
38
43
|
const p = new Vp8RtpPayload();
|
|
39
44
|
let offset = 0;
|
|
@@ -73,17 +78,16 @@ class Vp8RtpPayload {
|
|
|
73
78
|
offset++;
|
|
74
79
|
}
|
|
75
80
|
p.payload = buf.slice(offset);
|
|
76
|
-
if (p.
|
|
81
|
+
if (p.payloadHeaderExist) {
|
|
77
82
|
p.size0 = (0, src_1.getBit)(buf[offset], 0, 3);
|
|
78
83
|
p.hBit = (0, src_1.getBit)(buf[offset], 3);
|
|
79
84
|
p.ver = (0, src_1.getBit)(buf[offset], 4, 3);
|
|
80
85
|
p.pBit = (0, src_1.getBit)(buf[offset], 7);
|
|
81
86
|
offset++;
|
|
87
|
+
p.size1 = buf[offset];
|
|
88
|
+
offset++;
|
|
89
|
+
p.size2 = buf[offset];
|
|
82
90
|
}
|
|
83
|
-
p.size1 = buf[offset];
|
|
84
|
-
offset++;
|
|
85
|
-
p.size2 = buf[offset];
|
|
86
|
-
offset++;
|
|
87
91
|
return p;
|
|
88
92
|
}
|
|
89
93
|
static isDetectedFinalPacketInSequence(header) {
|
|
@@ -95,6 +99,16 @@ class Vp8RtpPayload {
|
|
|
95
99
|
get isPartitionHead() {
|
|
96
100
|
return this.sBit === 1;
|
|
97
101
|
}
|
|
102
|
+
get payloadHeaderExist() {
|
|
103
|
+
return this.sBit === 1 && this.pid === 0;
|
|
104
|
+
}
|
|
105
|
+
get size() {
|
|
106
|
+
if (this.payloadHeaderExist) {
|
|
107
|
+
const size = this.size0 + 8 * this.size1 + 2048 * this.size2;
|
|
108
|
+
return size;
|
|
109
|
+
}
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
98
112
|
}
|
|
99
113
|
exports.Vp8RtpPayload = Vp8RtpPayload;
|
|
100
114
|
//# sourceMappingURL=vp8.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vp8.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/vp8.ts"],"names":[],"mappings":";;;AAAA,6CAA0D;AAI1D,8CAA8C;AAE9C,8DAA8D;AAC9D,8DAA8D;AAC9D,yEAAyE;AACzE,8DAA8D;AAC9D,yEAAyE;AACzE,8DAA8D;AAC9D,yEAAyE;AACzE,8DAA8D;AAC9D,8DAA8D;AAC9D,8DAA8D;AAC9D,yEAAyE;AACzE,8DAA8D;AAC9D,yEAAyE;AACzE,8DAA8D;AAE9D,kBAAkB;AAClB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AACpB,oBAAoB;AAEpB,MAAa,aAAa;
|
|
1
|
+
{"version":3,"file":"vp8.js","sourceRoot":"","sources":["../../../../../rtp/src/codec/vp8.ts"],"names":[],"mappings":"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","sourcesContent":["import { getBit, paddingByte } from \"../../../common/src\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { DePacketizerBase } from \"./base\";\n\n// RFC 7741 - RTP Payload Format for VP8 Video\n\n// 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// |X|R|N|S|R| PID | (REQUIRED) |X|R|N|S|R| PID | (REQUIRED)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// X: |I|L|T|K| RSV | (OPTIONAL) X: |I|L|T|K| RSV | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// I: |M| PictureID | (OPTIONAL) I: |M| PictureID | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// L: | TL0PICIDX | (OPTIONAL) | PictureID |\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// T/K: |TID|Y| KEYIDX | (OPTIONAL) L: | TL0PICIDX | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+\n// T/K: |TID|Y| KEYIDX | (OPTIONAL)\n// +-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |Size0|H| VER |P|\n// +-+-+-+-+-+-+-+-+\n// | Size1 |\n// +-+-+-+-+-+-+-+-+\n// | Size2 |\n// +-+-+-+-+-+-+-+-+\n// | Octets 4..N of|\n// | VP8 payload |\n// : :\n// +-+-+-+-+-+-+-+-+\n// | OPTIONAL RTP |\n// | padding |\n// : :\n// +-+-+-+-+-+-+-+-+\n\nexport class Vp8RtpPayload implements DePacketizerBase {\n xBit!: number;\n nBit!: number;\n sBit!: number;\n pid!: number;\n iBit?: number;\n lBit?: number;\n tBit?: number;\n kBit?: number;\n mBit?: number;\n pictureId?: number;\n payload!: Buffer;\n size0: number = 0;\n hBit?: number;\n ver?: number;\n pBit?: number;\n size1: number = 0;\n size2: number = 0;\n\n static deSerialize(buf: Buffer) {\n const p = new Vp8RtpPayload();\n\n let offset = 0;\n\n p.xBit = getBit(buf[offset], 0);\n p.nBit = getBit(buf[offset], 2);\n p.sBit = getBit(buf[offset], 3);\n p.pid = getBit(buf[offset], 5, 3);\n offset++;\n\n if (p.xBit) {\n p.iBit = getBit(buf[offset], 0);\n p.lBit = getBit(buf[offset], 1);\n p.tBit = getBit(buf[offset], 2);\n p.kBit = getBit(buf[offset], 3);\n offset++;\n }\n\n if (p.iBit) {\n p.mBit = getBit(buf[offset], 0);\n if (p.mBit) {\n const _7 = paddingByte(getBit(buf[offset], 1, 7));\n const _8 = paddingByte(buf[offset + 1]);\n p.pictureId = parseInt(_7 + _8, 2);\n offset += 2;\n } else {\n p.pictureId = getBit(buf[offset], 1, 7);\n offset++;\n }\n }\n\n if (p.lBit) {\n offset++;\n }\n\n if (p.lBit || p.kBit) {\n if (p.tBit) {\n }\n if (p.kBit) {\n }\n offset++;\n }\n\n p.payload = buf.slice(offset);\n\n if (p.payloadHeaderExist) {\n p.size0 = getBit(buf[offset], 0, 3);\n p.hBit = getBit(buf[offset], 3);\n p.ver = getBit(buf[offset], 4, 3);\n p.pBit = getBit(buf[offset], 7);\n offset++;\n p.size1 = buf[offset];\n offset++;\n p.size2 = buf[offset];\n }\n\n return p;\n }\n\n static isDetectedFinalPacketInSequence(header: RtpHeader) {\n return header.marker;\n }\n\n get isKeyframe() {\n return this.pBit === 0;\n }\n\n get isPartitionHead() {\n return this.sBit === 1;\n }\n\n get payloadHeaderExist() {\n return this.sBit === 1 && this.pid === 0;\n }\n\n get size() {\n if (this.payloadHeaderExist) {\n const size = this.size0 + 8 * this.size1 + 2048 * this.size2;\n return size;\n }\n return 0;\n }\n}\n"]}
|
|
@@ -15,7 +15,12 @@ export declare class WEBMBuilder {
|
|
|
15
15
|
width: number;
|
|
16
16
|
height: number;
|
|
17
17
|
}>): EBML.EBMLData;
|
|
18
|
-
createSegment(
|
|
18
|
+
createSegment(
|
|
19
|
+
/**ms */
|
|
20
|
+
duration?: number): Uint8Array;
|
|
21
|
+
createDuration(
|
|
22
|
+
/**ms */
|
|
23
|
+
duration: number): Uint8Array;
|
|
19
24
|
createCuePoint(relativeTimestamp: number, trackNumber: number, clusterPosition: number, blockNumber: number): EBML.EBMLData;
|
|
20
25
|
createCues(cuePoints: EBML.EBMLData[]): Uint8Array;
|
|
21
26
|
createCluster(timecode: number): Uint8Array;
|
|
@@ -72,13 +72,15 @@ class WEBMBuilder {
|
|
|
72
72
|
]);
|
|
73
73
|
return trackEntry;
|
|
74
74
|
}
|
|
75
|
-
createSegment(
|
|
75
|
+
createSegment(
|
|
76
|
+
/**ms */
|
|
77
|
+
duration) {
|
|
76
78
|
const elements = [
|
|
77
79
|
EBML.element(EBML.ID.TimecodeScale, EBML.number(millisecond)),
|
|
78
80
|
EBML.element(EBML.ID.MuxingApp, EBML.string("webrtc")),
|
|
79
81
|
EBML.element(EBML.ID.WritingApp, EBML.string("webrtc")),
|
|
80
82
|
];
|
|
81
|
-
if (duration) {
|
|
83
|
+
if (duration != undefined) {
|
|
82
84
|
elements.push(EBML.element(EBML.ID.Duration, EBML.float(duration)));
|
|
83
85
|
}
|
|
84
86
|
return EBML.build(EBML.unknownSizeElement(EBML.ID.Segment, [
|
|
@@ -87,6 +89,11 @@ class WEBMBuilder {
|
|
|
87
89
|
EBML.element(EBML.ID.Tracks, this.trackEntries),
|
|
88
90
|
]));
|
|
89
91
|
}
|
|
92
|
+
createDuration(
|
|
93
|
+
/**ms */
|
|
94
|
+
duration) {
|
|
95
|
+
return EBML.build(EBML.element(EBML.ID.Duration, EBML.float(duration)));
|
|
96
|
+
}
|
|
90
97
|
createCuePoint(relativeTimestamp, trackNumber, clusterPosition, blockNumber) {
|
|
91
98
|
return EBML.element(EBML.ID.CuePoint, [
|
|
92
99
|
EBML.element(EBML.ID.CueTime, EBML.number(relativeTimestamp)),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../rtp/src/container/webm.ts"],"names":[],"mappings":"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","sourcesContent":["import * as EBML from \"@shinyoshiaki/ebml-builder\";\n\nimport { BitWriter2, BufferChain } from \"../../../common/src\";\nimport { OpusRtpPayload } from \"..\";\n\nexport class WEBMBuilder {\n readonly ebmlHeader = EBML.build(\n EBML.element(EBML.ID.EBML, [\n EBML.element(EBML.ID.EBMLVersion, EBML.number(1)),\n EBML.element(EBML.ID.EBMLReadVersion, EBML.number(1)),\n EBML.element(EBML.ID.EBMLMaxIDLength, EBML.number(4)),\n EBML.element(EBML.ID.EBMLMaxSizeLength, EBML.number(8)),\n EBML.element(EBML.ID.DocType, EBML.string(\"webm\")),\n EBML.element(EBML.ID.DocTypeVersion, EBML.number(2)),\n EBML.element(EBML.ID.DocTypeReadVersion, EBML.number(2)),\n ])\n );\n trackEntries: EBML.EBMLData[] = [];\n\n constructor(\n tracks: {\n width?: number;\n height?: number;\n kind: \"audio\" | \"video\";\n codec: SupportedCodec;\n trackNumber: number;\n }[]\n ) {\n this.trackEntries = tracks.map(\n ({ width, height, kind, codec, trackNumber }) => {\n return this.createTrackEntry(kind, trackNumber, codec, {\n width,\n height,\n });\n }\n );\n }\n\n createTrackEntry(\n kind: string,\n trackNumber: number,\n codec: string,\n { width, height }: Partial<{ kind: string; width: number; height: number }>\n ) {\n const trackElements: EBML.EBMLData[] = [];\n if (kind === \"video\") {\n trackElements.push(\n EBML.element(EBML.ID.Video, [\n EBML.element(EBML.ID.PixelWidth, EBML.number(width)),\n EBML.element(EBML.ID.PixelHeight, EBML.number(height)),\n ])\n );\n } else {\n trackElements.push(\n EBML.element(EBML.ID.Audio, [\n EBML.element(EBML.ID.SamplingFrequency, EBML.float(48000.0)),\n EBML.element(EBML.ID.Channels, EBML.number(2)),\n ])\n );\n // only support OPUS\n trackElements.push(\n EBML.element(\n EBML.ID.CodecPrivate,\n EBML.bytes(OpusRtpPayload.createCodecPrivate())\n )\n );\n }\n\n const trackEntry = EBML.element(EBML.ID.TrackEntry, [\n EBML.element(EBML.ID.TrackNumber, EBML.number(trackNumber)),\n EBML.element(EBML.ID.TrackUID, EBML.number(trackNumber)),\n EBML.element(EBML.ID.CodecName, EBML.string(codec)),\n EBML.element(EBML.ID.TrackType, EBML.number(kind === \"video\" ? 1 : 2)),\n EBML.element(\n EBML.ID.CodecID,\n EBML.string(`${kind === \"video\" ? \"V\" : \"A\"}_${codec}`)\n ),\n ...trackElements,\n ]);\n return trackEntry;\n }\n\n createSegment(duration?: number) {\n const elements = [\n EBML.element(EBML.ID.TimecodeScale, EBML.number(millisecond)),\n EBML.element(EBML.ID.MuxingApp, EBML.string(\"webrtc\")),\n EBML.element(EBML.ID.WritingApp, EBML.string(\"webrtc\")),\n ];\n if (duration) {\n elements.push(EBML.element(EBML.ID.Duration, EBML.float(duration)));\n }\n return EBML.build(\n EBML.unknownSizeElement(EBML.ID.Segment, [\n EBML.element(EBML.ID.SeekHead, []),\n EBML.element(EBML.ID.Info, elements),\n EBML.element(EBML.ID.Tracks, this.trackEntries),\n ])\n );\n }\n\n createCuePoint(\n relativeTimestamp: number,\n trackNumber: number,\n clusterPosition: number,\n blockNumber: number\n ) {\n return EBML.element(EBML.ID.CuePoint, [\n EBML.element(EBML.ID.CueTime, EBML.number(relativeTimestamp)),\n EBML.element(EBML.ID.CueTrackPositions, [\n EBML.element(EBML.ID.CueTrack, EBML.number(trackNumber)),\n EBML.element(EBML.ID.CueClusterPosition, EBML.number(clusterPosition)),\n EBML.element(EBML.ID.CueBlockNumber, EBML.number(blockNumber)),\n ]),\n ]);\n }\n\n createCues(cuePoints: EBML.EBMLData[]) {\n return EBML.build(EBML.element(EBML.ID.Cues, cuePoints));\n }\n\n createCluster(timecode: number) {\n return EBML.build(\n EBML.unknownSizeElement(EBML.ID.Cluster, [\n EBML.element(EBML.ID.Timecode, EBML.number(timecode)),\n ])\n );\n }\n\n createSimpleBlock(\n data: Buffer,\n isKeyframe: boolean,\n trackNumber: number,\n relativeTimestamp: number\n ) {\n const elementId = Buffer.from([0xa3]);\n const contentSize: Uint8Array = EBML.vintEncodedNumber(\n 1 + 2 + 1 + data.length\n ).bytes;\n\n const keyframe = isKeyframe ? 1 : 0;\n const flags = new BitWriter2(8)\n .set(keyframe)\n .set(0, 3)\n .set(0)\n .set(0, 2)\n .set(0);\n\n const simpleBlock = Buffer.concat([\n elementId,\n contentSize,\n EBML.vintEncodedNumber(trackNumber).bytes,\n new BufferChain(2).writeInt16BE(relativeTimestamp).buffer,\n new BufferChain(1).writeUInt8(flags.value).buffer,\n data,\n ]);\n return simpleBlock;\n }\n}\n\nconst supportedCodecs = [\"MPEG4/ISO/AVC\", \"VP8\", \"VP9\", \"AV1\", \"OPUS\"] as const;\nexport type SupportedCodec = typeof supportedCodecs[number];\nconst millisecond = 1000000;\n"]}
|
|
1
|
+
{"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../rtp/src/container/webm.ts"],"names":[],"mappings":"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","sourcesContent":["import * as EBML from \"@shinyoshiaki/ebml-builder\";\n\nimport { BitWriter2, BufferChain } from \"../../../common/src\";\nimport { OpusRtpPayload } from \"..\";\n\nexport class WEBMBuilder {\n readonly ebmlHeader = EBML.build(\n EBML.element(EBML.ID.EBML, [\n EBML.element(EBML.ID.EBMLVersion, EBML.number(1)),\n EBML.element(EBML.ID.EBMLReadVersion, EBML.number(1)),\n EBML.element(EBML.ID.EBMLMaxIDLength, EBML.number(4)),\n EBML.element(EBML.ID.EBMLMaxSizeLength, EBML.number(8)),\n EBML.element(EBML.ID.DocType, EBML.string(\"webm\")),\n EBML.element(EBML.ID.DocTypeVersion, EBML.number(2)),\n EBML.element(EBML.ID.DocTypeReadVersion, EBML.number(2)),\n ])\n );\n trackEntries: EBML.EBMLData[] = [];\n\n constructor(\n tracks: {\n width?: number;\n height?: number;\n kind: \"audio\" | \"video\";\n codec: SupportedCodec;\n trackNumber: number;\n }[]\n ) {\n this.trackEntries = tracks.map(\n ({ width, height, kind, codec, trackNumber }) => {\n return this.createTrackEntry(kind, trackNumber, codec, {\n width,\n height,\n });\n }\n );\n }\n\n createTrackEntry(\n kind: string,\n trackNumber: number,\n codec: string,\n { width, height }: Partial<{ kind: string; width: number; height: number }>\n ) {\n const trackElements: EBML.EBMLData[] = [];\n if (kind === \"video\") {\n trackElements.push(\n EBML.element(EBML.ID.Video, [\n EBML.element(EBML.ID.PixelWidth, EBML.number(width)),\n EBML.element(EBML.ID.PixelHeight, EBML.number(height)),\n ])\n );\n } else {\n trackElements.push(\n EBML.element(EBML.ID.Audio, [\n EBML.element(EBML.ID.SamplingFrequency, EBML.float(48000.0)),\n EBML.element(EBML.ID.Channels, EBML.number(2)),\n ])\n );\n // only support OPUS\n trackElements.push(\n EBML.element(\n EBML.ID.CodecPrivate,\n EBML.bytes(OpusRtpPayload.createCodecPrivate())\n )\n );\n }\n\n const trackEntry = EBML.element(EBML.ID.TrackEntry, [\n EBML.element(EBML.ID.TrackNumber, EBML.number(trackNumber)),\n EBML.element(EBML.ID.TrackUID, EBML.number(trackNumber)),\n EBML.element(EBML.ID.CodecName, EBML.string(codec)),\n EBML.element(EBML.ID.TrackType, EBML.number(kind === \"video\" ? 1 : 2)),\n EBML.element(\n EBML.ID.CodecID,\n EBML.string(`${kind === \"video\" ? \"V\" : \"A\"}_${codec}`)\n ),\n ...trackElements,\n ]);\n return trackEntry;\n }\n\n createSegment(\n /**ms */\n duration?: number\n ) {\n const elements = [\n EBML.element(EBML.ID.TimecodeScale, EBML.number(millisecond)),\n EBML.element(EBML.ID.MuxingApp, EBML.string(\"webrtc\")),\n EBML.element(EBML.ID.WritingApp, EBML.string(\"webrtc\")),\n ];\n if (duration != undefined) {\n elements.push(EBML.element(EBML.ID.Duration, EBML.float(duration)));\n }\n return EBML.build(\n EBML.unknownSizeElement(EBML.ID.Segment, [\n EBML.element(EBML.ID.SeekHead, []),\n EBML.element(EBML.ID.Info, elements),\n EBML.element(EBML.ID.Tracks, this.trackEntries),\n ])\n );\n }\n\n createDuration(\n /**ms */\n duration: number\n ) {\n return EBML.build(EBML.element(EBML.ID.Duration, EBML.float(duration)));\n }\n\n createCuePoint(\n relativeTimestamp: number,\n trackNumber: number,\n clusterPosition: number,\n blockNumber: number\n ) {\n return EBML.element(EBML.ID.CuePoint, [\n EBML.element(EBML.ID.CueTime, EBML.number(relativeTimestamp)),\n EBML.element(EBML.ID.CueTrackPositions, [\n EBML.element(EBML.ID.CueTrack, EBML.number(trackNumber)),\n EBML.element(EBML.ID.CueClusterPosition, EBML.number(clusterPosition)),\n EBML.element(EBML.ID.CueBlockNumber, EBML.number(blockNumber)),\n ]),\n ]);\n }\n\n createCues(cuePoints: EBML.EBMLData[]) {\n return EBML.build(EBML.element(EBML.ID.Cues, cuePoints));\n }\n\n createCluster(timecode: number) {\n return EBML.build(\n EBML.unknownSizeElement(EBML.ID.Cluster, [\n EBML.element(EBML.ID.Timecode, EBML.number(timecode)),\n ])\n );\n }\n\n createSimpleBlock(\n data: Buffer,\n isKeyframe: boolean,\n trackNumber: number,\n relativeTimestamp: number\n ) {\n const elementId = Buffer.from([0xa3]);\n const contentSize: Uint8Array = EBML.vintEncodedNumber(\n 1 + 2 + 1 + data.length\n ).bytes;\n\n const keyframe = isKeyframe ? 1 : 0;\n const flags = new BitWriter2(8)\n .set(keyframe)\n .set(0, 3)\n .set(0)\n .set(0, 2)\n .set(0);\n\n const simpleBlock = Buffer.concat([\n elementId,\n contentSize,\n EBML.vintEncodedNumber(trackNumber).bytes,\n new BufferChain(2).writeInt16BE(relativeTimestamp).buffer,\n new BufferChain(1).writeUInt8(flags.value).buffer,\n data,\n ]);\n return simpleBlock;\n }\n}\n\nconst supportedCodecs = [\"MPEG4/ISO/AVC\", \"VP8\", \"VP9\", \"AV1\", \"OPUS\"] as const;\nexport type SupportedCodec = typeof supportedCodecs[number];\nconst millisecond = 1000000;\n"]}
|
package/lib/rtp/src/index.d.ts
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
import "buffer";
|
|
2
2
|
export * from "../../common/src";
|
|
3
|
-
export * from "./codec
|
|
4
|
-
export * from "./codec/base";
|
|
5
|
-
export * from "./codec/h264";
|
|
6
|
-
export * from "./codec/opus";
|
|
7
|
-
export * from "./codec/vp8";
|
|
8
|
-
export * from "./codec/vp9";
|
|
3
|
+
export * from "./codec";
|
|
9
4
|
export * from "./processor/base";
|
|
10
5
|
export * from "./processor/jitterBuffer";
|
|
11
6
|
export * from "./processor/lipsync";
|
|
12
7
|
export * from "./processor/sampleBuilder";
|
|
13
8
|
export * from "./processor/webm";
|
|
9
|
+
export * from "./processor_v2";
|
|
14
10
|
export * from "./rtcp/header";
|
|
15
11
|
export * from "./rtcp/psfb";
|
|
16
12
|
export * from "./rtcp/psfb/pictureLossIndication";
|
package/lib/rtp/src/index.js
CHANGED
|
@@ -16,17 +16,13 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
require("buffer");
|
|
18
18
|
__exportStar(require("../../common/src"), exports);
|
|
19
|
-
__exportStar(require("./codec
|
|
20
|
-
__exportStar(require("./codec/base"), exports);
|
|
21
|
-
__exportStar(require("./codec/h264"), exports);
|
|
22
|
-
__exportStar(require("./codec/opus"), exports);
|
|
23
|
-
__exportStar(require("./codec/vp8"), exports);
|
|
24
|
-
__exportStar(require("./codec/vp9"), exports);
|
|
19
|
+
__exportStar(require("./codec"), exports);
|
|
25
20
|
__exportStar(require("./processor/base"), exports);
|
|
26
21
|
__exportStar(require("./processor/jitterBuffer"), exports);
|
|
27
22
|
__exportStar(require("./processor/lipsync"), exports);
|
|
28
23
|
__exportStar(require("./processor/sampleBuilder"), exports);
|
|
29
24
|
__exportStar(require("./processor/webm"), exports);
|
|
25
|
+
__exportStar(require("./processor_v2"), exports);
|
|
30
26
|
__exportStar(require("./rtcp/header"), exports);
|
|
31
27
|
__exportStar(require("./rtcp/psfb"), exports);
|
|
32
28
|
__exportStar(require("./rtcp/psfb/pictureLossIndication"), exports);
|
package/lib/rtp/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../rtp/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kBAAgB;AAChB,mDAAiC;AACjC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../rtp/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kBAAgB;AAChB,mDAAiC;AACjC,0CAAwB;AACxB,mDAAiC;AACjC,2DAAyC;AACzC,sDAAoC;AACpC,4DAA0C;AAC1C,mDAAiC;AACjC,iDAA+B;AAC/B,gDAA8B;AAC9B,8CAA4B;AAC5B,oEAAkD;AAClD,mDAAiC;AACjC,4CAA0B;AAC1B,8CAA4B;AAC5B,+CAA6B;AAC7B,oDAAkC;AAClC,oDAAkC;AAClC,8CAA4B;AAC5B,4CAA0B;AAC1B,oDAAkC;AAClC,mDAAiC;AACjC,4CAA0B;AAC1B,+CAA6B;AAC7B,8CAA4B","sourcesContent":["import \"buffer\";\nexport * from \"../../common/src\";\nexport * from \"./codec\";\nexport * from \"./processor/base\";\nexport * from \"./processor/jitterBuffer\";\nexport * from \"./processor/lipsync\";\nexport * from \"./processor/sampleBuilder\";\nexport * from \"./processor/webm\";\nexport * from \"./processor_v2\";\nexport * from \"./rtcp/header\";\nexport * from \"./rtcp/psfb\";\nexport * from \"./rtcp/psfb/pictureLossIndication\";\nexport * from \"./rtcp/psfb/remb\";\nexport * from \"./rtcp/rr\";\nexport * from \"./rtcp/rtcp\";\nexport * from \"./rtcp/rtpfb\";\nexport * from \"./rtcp/rtpfb/nack\";\nexport * from \"./rtcp/rtpfb/twcc\";\nexport * from \"./rtcp/sdes\";\nexport * from \"./rtcp/sr\";\nexport * from \"./rtp/red/encoder\";\nexport * from \"./rtp/red/packet\";\nexport * from \"./rtp/rtp\";\nexport * from \"./srtp/srtcp\";\nexport * from \"./srtp/srtp\";\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import Event from "rx.mini";
|
|
2
2
|
import { RtcpPacket, RtpPacket } from "..";
|
|
3
3
|
export declare abstract class Pipeline {
|
|
4
4
|
protected children?: Pipeline | Output;
|
|
5
|
+
private disposer?;
|
|
5
6
|
constructor(streams?: {
|
|
6
7
|
rtpStream?: Event<[RtpPacket]>;
|
|
7
8
|
rtcpStream?: Event<[RtcpPacket]>;
|
|
@@ -9,6 +10,7 @@ export declare abstract class Pipeline {
|
|
|
9
10
|
pipe(children: Pipeline | Output): Pipeline | Output;
|
|
10
11
|
pushRtpPackets(packets: RtpPacket[]): void;
|
|
11
12
|
pushRtcpPackets(packets: RtcpPacket[]): void;
|
|
13
|
+
stop(): void;
|
|
12
14
|
}
|
|
13
15
|
export declare abstract class Output {
|
|
14
16
|
pushRtpPackets?(packets: RtpPacket[]): void;
|
|
@@ -3,12 +3,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Output = exports.Pipeline = void 0;
|
|
4
4
|
class Pipeline {
|
|
5
5
|
constructor(streams) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
const disposers = [];
|
|
7
|
+
{
|
|
8
|
+
const { unSubscribe } = streams?.rtpStream?.subscribe?.((packet) => {
|
|
9
|
+
this.pushRtpPackets([packet]);
|
|
10
|
+
}) ?? {};
|
|
11
|
+
disposers.push(unSubscribe);
|
|
12
|
+
}
|
|
13
|
+
{
|
|
14
|
+
const { unSubscribe } = streams?.rtcpStream?.subscribe?.((packet) => {
|
|
15
|
+
this.pushRtcpPackets([packet]);
|
|
16
|
+
}) ?? {};
|
|
17
|
+
disposers.push(unSubscribe);
|
|
18
|
+
}
|
|
19
|
+
this.disposer = () => {
|
|
20
|
+
disposers.forEach((d) => d?.());
|
|
21
|
+
};
|
|
12
22
|
}
|
|
13
23
|
pipe(children) {
|
|
14
24
|
this.children = children;
|
|
@@ -16,6 +26,9 @@ class Pipeline {
|
|
|
16
26
|
}
|
|
17
27
|
pushRtpPackets(packets) { }
|
|
18
28
|
pushRtcpPackets(packets) { }
|
|
29
|
+
stop() {
|
|
30
|
+
this.disposer?.();
|
|
31
|
+
}
|
|
19
32
|
}
|
|
20
33
|
exports.Pipeline = Pipeline;
|
|
21
34
|
class Output {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/base.ts"],"names":[],"mappings":";;;AAIA,MAAsB,QAAQ;
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/base.ts"],"names":[],"mappings":";;;AAIA,MAAsB,QAAQ;IAI5B,YAAY,OAGX;QACC,MAAM,SAAS,GAAiC,EAAE,CAAC;QACnD;YACE,MAAM,EAAE,WAAW,EAAE,GACnB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;gBACzC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC7B;QACD;YACE,MAAM,EAAE,WAAW,EAAE,GACnB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1C,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACjC,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SAC7B;QACD,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE;YACnB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,QAA2B;QAC9B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,cAAc,CAAC,OAAoB,IAAG,CAAC;IACvC,eAAe,CAAC,OAAqB,IAAG,CAAC;IACzC,IAAI;QACF,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;IACpB,CAAC;CACF;AApCD,4BAoCC;AAED,MAAsB,MAAM;IAC1B,cAAc,CAAE,OAAoB,IAAG,CAAC;IACxC,eAAe,CAAE,OAAqB,IAAG,CAAC;CAC3C;AAHD,wBAGC","sourcesContent":["import Event from \"rx.mini\";\n\nimport { RtcpPacket, RtpPacket } from \"..\";\n\nexport abstract class Pipeline {\n protected children?: Pipeline | Output;\n private disposer?: () => void;\n\n constructor(streams?: {\n rtpStream?: Event<[RtpPacket]>;\n rtcpStream?: Event<[RtcpPacket]>;\n }) {\n const disposers: ((() => void) | undefined)[] = [];\n {\n const { unSubscribe } =\n streams?.rtpStream?.subscribe?.((packet) => {\n this.pushRtpPackets([packet]);\n }) ?? {};\n disposers.push(unSubscribe);\n }\n {\n const { unSubscribe } =\n streams?.rtcpStream?.subscribe?.((packet) => {\n this.pushRtcpPackets([packet]);\n }) ?? {};\n disposers.push(unSubscribe);\n }\n this.disposer = () => {\n disposers.forEach((d) => d?.());\n };\n }\n pipe(children: Pipeline | Output): Pipeline | Output {\n this.children = children;\n return this;\n }\n pushRtpPackets(packets: RtpPacket[]) {}\n pushRtcpPackets(packets: RtcpPacket[]) {}\n stop() {\n this.disposer?.();\n }\n}\n\nexport abstract class Output {\n pushRtpPackets?(packets: RtpPacket[]) {}\n pushRtcpPackets?(packets: RtcpPacket[]) {}\n}\n"]}
|
|
@@ -4,7 +4,7 @@ exports.JitterBuffer = void 0;
|
|
|
4
4
|
const debug_1 = require("debug");
|
|
5
5
|
const src_1 = require("../../../common/src");
|
|
6
6
|
const base_1 = require("./base");
|
|
7
|
-
const log = (0, debug_1.debug)("werift:packages/
|
|
7
|
+
const log = (0, debug_1.debug)("werift : packages/rtp/src/processor/jitterBuffer.ts");
|
|
8
8
|
class JitterBuffer extends base_1.Pipeline {
|
|
9
9
|
constructor() {
|
|
10
10
|
super(...arguments);
|
|
@@ -18,7 +18,6 @@ class JitterBuffer extends base_1.Pipeline {
|
|
|
18
18
|
}
|
|
19
19
|
else if (p.header.sequenceNumber != (0, src_1.uint16Add)(this.head, 1)) {
|
|
20
20
|
if (this.retry++ >= this.maxRetry) {
|
|
21
|
-
log("give up packet lost");
|
|
22
21
|
this.head = (0, src_1.uint16Add)(this.head, 2);
|
|
23
22
|
}
|
|
24
23
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jitterBuffer.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/jitterBuffer.ts"],"names":[],"mappings":";;;AAAA,iCAA8B;AAE9B,6CAAgD;AAGhD,iCAAkC;AAElC,MAAM,GAAG,GAAG,IAAA,aAAK,EAAC,
|
|
1
|
+
{"version":3,"file":"jitterBuffer.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/jitterBuffer.ts"],"names":[],"mappings":";;;AAAA,iCAA8B;AAE9B,6CAAgD;AAGhD,iCAAkC;AAElC,MAAM,GAAG,GAAG,IAAA,aAAK,EAAC,qDAAqD,CAAC,CAAC;AAEzE,MAAa,YAAa,SAAQ,eAAQ;IAA1C;;QACU,UAAK,GAAG,CAAC,CAAC;QAEV,WAAM,GAA4C,EAAE,CAAC;QAE7D,aAAQ,GAAG,GAAG,CAAC;QAUP,UAAK,GAAG,CAAC,CAAY,EAAE,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAEzC,IAAI,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE;gBAC1B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;aACrC;iBAAM,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,IAAA,eAAS,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE;gBAC7D,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;oBACjC,IAAI,CAAC,IAAI,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;iBACrC;qBAAM;oBACL,OAAO;iBACR;aACF;iBAAM;gBACL,IAAI,CAAC,IAAI,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aACrC;YAED,MAAM,OAAO,GAAgB,EAAE,CAAC;YAChC,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACrB,QAAS,IAAI,GAAG,IAAA,eAAS,EAAC,IAAI,EAAE,CAAC,CAAC,EAAE;gBAClC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,CAAC,EAAE;oBACL,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAChB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;iBAC1B;qBAAM;oBACL,MAAM;iBACP;aACF;YACD,IAAI,CAAC,IAAI,GAAG,IAAA,eAAS,EAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAEhC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC;IAtCC,cAAc,CAAC,OAAoB;QACjC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,eAAe,CAAC,OAAqB;QACnC,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;CAgCF;AA7CD,oCA6CC","sourcesContent":["import { debug } from \"debug\";\n\nimport { uint16Add } from \"../../../common/src\";\nimport { RtpPacket } from \"..\";\nimport { RtcpPacket } from \"../rtcp/rtcp\";\nimport { Pipeline } from \"./base\";\n\nconst log = debug(\"werift : packages/rtp/src/processor/jitterBuffer.ts\");\n\nexport class JitterBuffer extends Pipeline {\n private retry = 0;\n private head?: number;\n private buffer: { [sequenceNumber: number]: RtpPacket } = {};\n\n maxRetry = 100;\n\n pushRtpPackets(packets: RtpPacket[]) {\n packets.forEach(this.onRtp);\n }\n\n pushRtcpPackets(packets: RtcpPacket[]) {\n this.children?.pushRtcpPackets?.(packets);\n }\n\n private onRtp = (p: RtpPacket) => {\n this.buffer[p.header.sequenceNumber] = p;\n\n if (this.head == undefined) {\n this.head = p.header.sequenceNumber;\n } else if (p.header.sequenceNumber != uint16Add(this.head, 1)) {\n if (this.retry++ >= this.maxRetry) {\n this.head = uint16Add(this.head, 2);\n } else {\n return;\n }\n } else {\n this.head = uint16Add(this.head, 1);\n }\n\n const packets: RtpPacket[] = [];\n let tail = this.head;\n for (; ; tail = uint16Add(tail, 1)) {\n const p = this.buffer[tail];\n if (p) {\n packets.push(p);\n delete this.buffer[tail];\n } else {\n break;\n }\n }\n this.head = uint16Add(tail, -1);\n\n this.children?.pushRtpPackets?.(packets);\n };\n}\n"]}
|
|
@@ -4,6 +4,26 @@ exports.Max32bit = exports.ntpTime2Time = exports.LipSync = void 0;
|
|
|
4
4
|
const src_1 = require("../../../common/src");
|
|
5
5
|
const __1 = require("..");
|
|
6
6
|
const base_1 = require("./base");
|
|
7
|
+
// #### リップシンク
|
|
8
|
+
// ```
|
|
9
|
+
// 0 1 2 3
|
|
10
|
+
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
11
|
+
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
|
12
|
+
// sender | NTP timestamp, most significant word |
|
|
13
|
+
// info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
14
|
+
// | NTP timestamp, least significant word |
|
|
15
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
16
|
+
// | RTP timestamp |
|
|
17
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
18
|
+
// | sender's packet count |
|
|
19
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
20
|
+
// | sender's octet count |
|
|
21
|
+
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|
|
22
|
+
// ```
|
|
23
|
+
// - RTCP-SRにはNTP timestampとRTCP-SRを送った時点で最後に送ったRTPパケットのtimestampが載っている
|
|
24
|
+
// - RTP timestampは開始時点の値がランダムなので、Audio,VideoのRTPパケットの同期にはそのままでは使えない
|
|
25
|
+
// - ある時点のRTP timestampのNTP timestampがRTCP-SRでわかるので、任意のRTP timestampに対応するNTP timestampを計算できる
|
|
26
|
+
// - Audio,VideoのRTPパケットの同期にはRTP timestampをNTP timestampに変換して行えば良い
|
|
7
27
|
// WIP
|
|
8
28
|
// todo impl
|
|
9
29
|
class LipSync extends base_1.Pipeline {
|
|
@@ -34,8 +54,8 @@ class LipSync extends base_1.Pipeline {
|
|
|
34
54
|
});
|
|
35
55
|
if (Object.keys(this.rtpPackets).length === 2) {
|
|
36
56
|
const [a, b] = Object.values(this.rtpPackets);
|
|
37
|
-
const lastA = this.calcNtpTime(a.
|
|
38
|
-
const lastB = this.calcNtpTime(b.
|
|
57
|
+
const lastA = this.calcNtpTime(a.at(-1).header.timestamp);
|
|
58
|
+
const lastB = this.calcNtpTime(b.at(-1).header.timestamp);
|
|
39
59
|
if (lastA == undefined || lastB == undefined) {
|
|
40
60
|
this.children?.pushRtpPackets?.(packets);
|
|
41
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lipsync.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/lipsync.ts"],"names":[],"mappings":";;;AAEA,6CAAiE;AACjE,0BAA6C;AAE7C,iCAAkC;AAElC,MAAM;AACN,YAAY;AACZ,MAAa,OAAQ,SAAQ,eAAQ;IAKnC,YACS,SAAiB,EACjB,QAAgB,EACvB,OAGC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QAPR,cAAS,GAAT,SAAS,CAAQ;QACjB,aAAQ,GAAR,QAAQ,CAAQ;QAJjB,eAAU,GAAkC,EAAE,CAAC;IAWvD,CAAC;IAED,eAAe,CAAC,OAAqB;QACnC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACrB,IAAI,EAAE,YAAY,gBAAY,EAAE;gBAC9B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;aACrB;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAEO,UAAU,CAAC,EAAgB;QACjC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC;QACrD,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;QACrC,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAAC;IACvC,CAAC;IAED,cAAc,CAAC,OAAoB;QACjC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;gBACnC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7C,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"lipsync.js","sourceRoot":"","sources":["../../../../../rtp/src/processor/lipsync.ts"],"names":[],"mappings":"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","sourcesContent":["import Event from \"rx.mini\";\n\nimport { bufferReader, bufferWriter } from \"../../../common/src\";\nimport { RtcpSrPacket, RtpPacket } from \"..\";\nimport { RtcpPacket } from \"../rtcp/rtcp\";\nimport { Pipeline } from \"./base\";\n\n// #### リップシンク\n// ```\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// sender | NTP timestamp, most significant word |\n// info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | NTP timestamp, least significant word |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | RTP timestamp |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | sender's packet count |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | sender's octet count |\n// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n// ```\n\n// - RTCP-SRにはNTP timestampとRTCP-SRを送った時点で最後に送ったRTPパケットのtimestampが載っている\n// - RTP timestampは開始時点の値がランダムなので、Audio,VideoのRTPパケットの同期にはそのままでは使えない\n// - ある時点のRTP timestampのNTP timestampがRTCP-SRでわかるので、任意のRTP timestampに対応するNTP timestampを計算できる\n// - Audio,VideoのRTPパケットの同期にはRTP timestampをNTP timestampに変換して行えば良い\n\n// WIP\n// todo impl\nexport class LipSync extends Pipeline {\n baseNtpTimestamp?: bigint;\n baseRtpTimestamp?: number;\n private rtpPackets: { [pt: number]: RtpPacket[] } = {};\n\n constructor(\n public clockRate: number,\n public mismatch: number,\n streams?: {\n rtpStream?: Event<[RtpPacket]>;\n rtcpStream?: Event<[RtcpPacket]>;\n }\n ) {\n super(streams);\n }\n\n pushRtcpPackets(packets: RtcpPacket[]) {\n packets.forEach((sr) => {\n if (sr instanceof RtcpSrPacket) {\n this.srReceived(sr);\n }\n });\n this.children?.pushRtcpPackets?.(packets);\n }\n\n private srReceived(sr: RtcpSrPacket) {\n const { ntpTimestamp, rtpTimestamp } = sr.senderInfo;\n this.baseNtpTimestamp = ntpTimestamp;\n this.baseRtpTimestamp = rtpTimestamp;\n }\n\n pushRtpPackets(packets: RtpPacket[]) {\n packets.forEach((p) => {\n this.rtpPackets[p.header.payloadType] =\n this.rtpPackets[p.header.payloadType] ?? [];\n this.rtpPackets[p.header.payloadType].push(p);\n });\n if (Object.keys(this.rtpPackets).length === 2) {\n const [a, b] = Object.values(this.rtpPackets);\n const lastA = this.calcNtpTime(a.at(-1)!.header.timestamp);\n const lastB = this.calcNtpTime(b.at(-1)!.header.timestamp);\n\n if (lastA == undefined || lastB == undefined) {\n this.children?.pushRtpPackets?.(packets);\n } else {\n //\n }\n }\n }\n\n private calcNtpTime(rtpTimestamp: number) {\n if (!this.baseRtpTimestamp || !this.baseNtpTimestamp) {\n return;\n }\n\n // base rtpTimestamp is rollover\n if (rtpTimestamp - this.baseRtpTimestamp > Max32bit - this.clockRate * 60) {\n this.baseRtpTimestamp += Max32bit;\n }\n // target rtpTimestamp is rollover\n else if (\n rtpTimestamp + (Max32bit - this.clockRate * 60) - this.baseRtpTimestamp <\n 0\n ) {\n rtpTimestamp += Max32bit;\n }\n\n const elapsed = (rtpTimestamp - this.baseRtpTimestamp) / this.clockRate;\n\n return ntpTime2Time(this.baseNtpTimestamp) + elapsed;\n }\n}\n\nexport const ntpTime2Time = (ntp: bigint) => {\n const [ntpSec, ntpMsec] = bufferReader(bufferWriter([8], [ntp]), [4, 4]);\n\n return Number(`${ntpSec}.${ntpMsec}`);\n};\n\n/**4294967295 */\nexport const Max32bit = Number((0x01n << 32n) - 1n);\n\nexport interface BufferResolve {\n packets: {\n packet: RtpPacket;\n offset: number;\n }[];\n /**NTP seconds */\n startAtNtpTime: number;\n}\n"]}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { BinaryLike } from "crypto";
|
|
1
4
|
import Event from "rx.mini";
|
|
2
5
|
import { RtpPacket } from "..";
|
|
3
6
|
import { SupportedCodec } from "../container/webm";
|
|
4
7
|
import { Output } from "./base";
|
|
8
|
+
export interface FileIO {
|
|
9
|
+
writeFile: (path: string, bin: BinaryLike) => Promise<void>;
|
|
10
|
+
appendFile: (path: string, bin: BinaryLike) => Promise<void>;
|
|
11
|
+
readFile: (path: string) => Promise<Buffer>;
|
|
12
|
+
}
|
|
5
13
|
export declare class WebmOutput implements Output {
|
|
6
|
-
|
|
7
|
-
private fs;
|
|
14
|
+
private writer;
|
|
8
15
|
path: string;
|
|
9
16
|
tracks: {
|
|
10
17
|
width?: number;
|
|
@@ -23,9 +30,7 @@ export declare class WebmOutput implements Output {
|
|
|
23
30
|
private cuePoints;
|
|
24
31
|
private position;
|
|
25
32
|
stopped: boolean;
|
|
26
|
-
constructor(
|
|
27
|
-
/**fs/promises */
|
|
28
|
-
fs: any, path: string, tracks: {
|
|
33
|
+
constructor(writer: FileIO, path: string, tracks: {
|
|
29
34
|
width?: number;
|
|
30
35
|
height?: number;
|
|
31
36
|
kind: "audio" | "video";
|
|
@@ -37,8 +42,7 @@ export declare class WebmOutput implements Output {
|
|
|
37
42
|
rtpStream?: Event<[RtpPacket]>;
|
|
38
43
|
});
|
|
39
44
|
private init;
|
|
40
|
-
stop(): Promise<void>;
|
|
45
|
+
stop(insertDuration?: boolean): Promise<void>;
|
|
41
46
|
pushRtpPackets(packets: RtpPacket[]): void;
|
|
42
47
|
private onRtpPackets;
|
|
43
|
-
private dePacketizeRtpPackets;
|
|
44
48
|
}
|