werift 0.20.0 → 0.21.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/event.d.ts +45 -0
- package/lib/common/src/event.js +229 -0
- package/lib/common/src/event.js.map +1 -0
- package/lib/common/src/index.d.ts +1 -0
- package/lib/common/src/index.js +1 -0
- package/lib/common/src/index.js.map +1 -1
- package/lib/dtls/src/flight/client/flight5.js +6 -1
- package/lib/dtls/src/flight/client/flight5.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js +5 -3
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/dtls/src/imports/common.d.ts +1 -0
- package/lib/dtls/src/imports/common.js +18 -0
- package/lib/dtls/src/imports/common.js.map +1 -0
- package/lib/dtls/src/index.d.ts +1 -1
- package/lib/dtls/src/index.js.map +1 -1
- package/lib/dtls/src/record/receive.js +1 -1
- package/lib/dtls/src/record/receive.js.map +1 -1
- package/lib/dtls/src/socket.d.ts +1 -1
- package/lib/dtls/src/socket.js +5 -5
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/ice/src/candidate.d.ts +3 -2
- package/lib/ice/src/candidate.js +19 -5
- package/lib/ice/src/candidate.js.map +1 -1
- package/lib/ice/src/helper.d.ts +6 -6
- package/lib/ice/src/helper.js +20 -17
- package/lib/ice/src/helper.js.map +1 -1
- package/lib/ice/src/ice.d.ts +29 -71
- package/lib/ice/src/ice.js +417 -417
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +109 -0
- package/lib/ice/src/iceBase.js +166 -0
- package/lib/ice/src/iceBase.js.map +1 -0
- package/lib/ice/src/imports/common.d.ts +1 -0
- package/lib/ice/src/imports/common.js +18 -0
- package/lib/ice/src/imports/common.js.map +1 -0
- package/lib/ice/src/index.d.ts +5 -0
- package/lib/ice/src/index.js +5 -0
- package/lib/ice/src/index.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +7 -0
- package/lib/ice/src/stun/message.js +20 -6
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +6 -6
- package/lib/ice/src/stun/protocol.js +29 -23
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/transaction.js +10 -4
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/transport.d.ts +21 -4
- package/lib/ice/src/transport.js +115 -7
- package/lib/ice/src/transport.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +54 -37
- package/lib/ice/src/turn/protocol.js +219 -94
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +9 -5
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/ice/src/utils.d.ts +1 -0
- package/lib/ice/src/utils.js +15 -16
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/container.d.ts +1 -1
- package/lib/rtp/src/extra/container/mp4/container.js +2 -5
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/container.d.ts +3 -1
- package/lib/rtp/src/extra/container/webm/container.js +8 -2
- package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/id.d.ts +6 -0
- package/lib/rtp/src/extra/container/webm/ebml/id.js +6 -0
- package/lib/rtp/src/extra/container/webm/ebml/id.js.map +1 -1
- package/lib/rtp/src/extra/processor/depacketizer.d.ts +1 -1
- package/lib/rtp/src/extra/processor/depacketizer.js +2 -2
- package/lib/rtp/src/extra/processor/depacketizer.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.d.ts +1 -1
- package/lib/rtp/src/extra/processor/mp4.js +2 -5
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/nack.d.ts +1 -1
- package/lib/rtp/src/extra/processor/nack.js +3 -3
- package/lib/rtp/src/extra/processor/nack.js.map +1 -1
- package/lib/rtp/src/extra/processor/rtcpCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/rtcpCallback.js +2 -5
- package/lib/rtp/src/extra/processor/rtcpCallback.js.map +1 -1
- package/lib/rtp/src/extra/processor/rtpCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/rtpCallback.js +2 -5
- package/lib/rtp/src/extra/processor/rtpCallback.js.map +1 -1
- package/lib/rtp/src/extra/processor/webm.d.ts +12 -17
- package/lib/rtp/src/extra/processor/webm.js +2 -5
- package/lib/rtp/src/extra/processor/webm.js.map +1 -1
- package/lib/rtp/src/extra/processor/webmCallback.d.ts +1 -10
- package/lib/rtp/src/extra/processor/webmCallback.js.map +1 -1
- package/lib/rtp/src/imports/common.d.ts +1 -0
- package/lib/rtp/src/imports/common.js +18 -0
- package/lib/rtp/src/imports/common.js.map +1 -0
- package/lib/rtp/src/rtp/headerExtension.d.ts +45 -3
- package/lib/rtp/src/rtp/headerExtension.js +15 -0
- package/lib/rtp/src/rtp/headerExtension.js.map +1 -1
- package/lib/sctp/src/helper.js +2 -5
- package/lib/sctp/src/helper.js.map +1 -1
- package/lib/sctp/src/imports/common.d.ts +1 -0
- package/lib/sctp/src/imports/common.js +18 -0
- package/lib/sctp/src/imports/common.js.map +1 -0
- package/lib/sctp/src/index.d.ts +1 -1
- package/lib/sctp/src/index.js.map +1 -1
- package/lib/sctp/src/sctp.d.ts +1 -1
- package/lib/sctp/src/sctp.js +3 -3
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/const.d.ts +2 -2
- package/lib/webrtc/src/const.js.map +1 -1
- package/lib/webrtc/src/dataChannel.d.ts +1 -1
- package/lib/webrtc/src/dataChannel.js +5 -5
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/imports/common.d.ts +1 -0
- package/lib/webrtc/src/imports/common.js +18 -0
- package/lib/webrtc/src/imports/common.js.map +1 -0
- package/lib/webrtc/src/media/extension/rtpExtension.d.ts +1 -0
- package/lib/webrtc/src/media/extension/rtpExtension.js +6 -0
- package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -1
- package/lib/webrtc/src/media/receiver/nack.d.ts +1 -1
- package/lib/webrtc/src/media/receiver/nack.js +2 -2
- package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
- package/lib/webrtc/src/media/router.d.ts +0 -3
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +3 -4
- package/lib/webrtc/src/media/rtpReceiver.js +4 -7
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +1 -1
- package/lib/webrtc/src/media/rtpSender.js +5 -5
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.js +2 -5
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/sender/senderBWE.d.ts +1 -1
- package/lib/webrtc/src/media/sender/senderBWE.js +4 -7
- package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +3 -3
- package/lib/webrtc/src/media/track.js +4 -7
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/index.d.ts +3 -1
- package/lib/webrtc/src/nonstandard/recorder/index.js +2 -5
- 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.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +3 -2
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +15 -8
- package/lib/webrtc/src/peerConnection.js +107 -93
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sdp.js +15 -3
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.d.ts +6 -6
- package/lib/webrtc/src/transport/dtls.js +19 -26
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +22 -11
- package/lib/webrtc/src/transport/ice.js +106 -38
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +1 -1
- package/lib/webrtc/src/transport/sctp.js +2 -2
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/package.json +1 -1
- package/src/const.ts +2 -2
- package/src/dataChannel.ts +1 -1
- package/src/imports/common.ts +1 -0
- package/src/media/extension/rtpExtension.ts +6 -0
- package/src/media/receiver/nack.ts +1 -1
- package/src/media/router.ts +2 -3
- package/src/media/rtpReceiver.ts +5 -4
- package/src/media/rtpSender.ts +1 -1
- package/src/media/rtpTransceiver.ts +1 -1
- package/src/media/sender/senderBWE.ts +1 -1
- package/src/media/track.ts +9 -4
- package/src/nonstandard/recorder/index.ts +4 -1
- package/src/nonstandard/recorder/writer/index.ts +1 -1
- package/src/nonstandard/recorder/writer/webm.ts +48 -44
- package/src/peerConnection.ts +122 -89
- package/src/sdp.ts +16 -3
- package/src/transport/dtls.ts +22 -14
- package/src/transport/ice.ts +83 -31
- package/src/transport/sctp.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mp4.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/mp4.ts"],"names":[],"mappings":"
|
|
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(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: Uint8Array) => {\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,\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: Uint8Array) => {\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: Uint8Array) => {\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"]}
|
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.NackHandlerBase = void 0;
|
|
7
7
|
const debug_1 = __importDefault(require("debug"));
|
|
8
|
-
const
|
|
8
|
+
const common_1 = require("../../imports/common");
|
|
9
9
|
const __1 = require("../..");
|
|
10
10
|
const log = (0, debug_1.default)("werift-rtp : packages/rtp/src/processor/nack.ts");
|
|
11
11
|
const LOST_SIZE = 30 * 5;
|
|
@@ -51,13 +51,13 @@ class NackHandlerBase {
|
|
|
51
51
|
enumerable: true,
|
|
52
52
|
configurable: true,
|
|
53
53
|
writable: true,
|
|
54
|
-
value: new
|
|
54
|
+
value: new common_1.Event()
|
|
55
55
|
});
|
|
56
56
|
Object.defineProperty(this, "onPacketLost", {
|
|
57
57
|
enumerable: true,
|
|
58
58
|
configurable: true,
|
|
59
59
|
writable: true,
|
|
60
|
-
value: new
|
|
60
|
+
value: new common_1.Event()
|
|
61
61
|
});
|
|
62
62
|
Object.defineProperty(this, "mediaSourceSsrc", {
|
|
63
63
|
enumerable: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/nack.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,
|
|
1
|
+
{"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/nack.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"../../imports/common\";\n\nimport {\n GenericNack,\n RtcpTransportLayerFeedback,\n type RtpPacket,\n timer,\n uint16Add,\n} from \"../..\";\nimport type { Processor } from \"./interface\";\nimport type { RtpOutput } from \"./rtpCallback\";\n\nconst log = debug(\"werift-rtp : packages/rtp/src/processor/nack.ts\");\n\nconst LOST_SIZE = 30 * 5;\n\nexport type NackHandlerInput = RtpOutput;\n\nexport type NackHandlerOutput = RtpOutput;\n\nexport class NackHandlerBase\n implements Processor<NackHandlerInput, NackHandlerOutput>\n{\n private newEstSeqNum = 0;\n private _lost: { [seqNum: number]: number } = {};\n private clearNackInterval?: () => void;\n private internalStats = {};\n\n readonly onNackSent = new Event<[GenericNack]>();\n readonly onPacketLost = new Event<[number]>();\n mediaSourceSsrc?: number;\n readonly retryCount = 10;\n stopped = false;\n\n constructor(\n private senderSsrc: number,\n private onNack: (rtcp: RtcpTransportLayerFeedback) => Promise<void>,\n ) {}\n\n toJSON(): Record<string, any> {\n return {\n ...this.internalStats,\n newEstSeqNum: this.newEstSeqNum,\n lostLength: Object.values(this._lost).length,\n senderSsrc: this.senderSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n };\n }\n\n private get lostSeqNumbers() {\n return Object.keys(this._lost).map(Number).sort();\n }\n\n private getLost(seq: number) {\n return this._lost[seq];\n }\n\n private setLost(seq: number, count: number) {\n this._lost[seq] = count;\n\n if (this.clearNackInterval || this.stopped) {\n return;\n }\n this.clearNackInterval = timer.setInterval(async () => {\n try {\n await this.sendNack();\n if (!Object.keys(this._lost).length) {\n this.clearNackInterval?.();\n this.clearNackInterval = undefined;\n }\n } catch (error) {\n log(\"failed to send nack\", error);\n }\n }, 5);\n }\n\n private removeLost(sequenceNumber: number) {\n delete this._lost[sequenceNumber];\n }\n\n processInput = (input: RtpOutput) => {\n if (input.rtp) {\n this.addPacket(input.rtp);\n this.internalStats[\"nackHandler\"] = new Date().toISOString();\n return [input];\n }\n\n this.stop();\n return [input];\n };\n\n private addPacket(packet: RtpPacket) {\n const { sequenceNumber, ssrc } = packet.header;\n this.mediaSourceSsrc = ssrc;\n\n if (this.newEstSeqNum === 0) {\n this.newEstSeqNum = sequenceNumber;\n return;\n }\n\n if (this.getLost(sequenceNumber)) {\n // log(\"packetLoss resolved\", { sequenceNumber });\n this.removeLost(sequenceNumber);\n return;\n }\n\n if (sequenceNumber === uint16Add(this.newEstSeqNum, 1)) {\n this.newEstSeqNum = sequenceNumber;\n } else if (sequenceNumber > uint16Add(this.newEstSeqNum, 1)) {\n // packet lost detected\n for (\n let seq = uint16Add(this.newEstSeqNum, 1);\n seq < sequenceNumber;\n seq++\n ) {\n this.setLost(seq, 1);\n }\n // this.receiver.sendRtcpPLI(this.mediaSourceSsrc);\n\n this.newEstSeqNum = sequenceNumber;\n this.pruneLost();\n }\n }\n\n private pruneLost() {\n if (this.lostSeqNumbers.length > LOST_SIZE) {\n this._lost = Object.entries(this._lost)\n .slice(-LOST_SIZE)\n .reduce(\n (acc, [key, v]) => {\n acc[key] = v;\n return acc;\n },\n {} as { [seqNum: number]: number },\n );\n }\n }\n\n private stop() {\n this.stopped = true;\n this._lost = {};\n this.clearNackInterval?.();\n this.onNackSent.allUnsubscribe();\n this.onPacketLost.allUnsubscribe();\n this.onNack = undefined as any;\n }\n\n private updateRetryCount() {\n this.lostSeqNumbers.forEach((seq) => {\n const count = this._lost[seq]++;\n if (count > this.retryCount) {\n this.removeLost(seq);\n this.onPacketLost.execute(seq);\n }\n });\n }\n\n private sendNack = () =>\n new Promise((r, f) => {\n if (this.lostSeqNumbers.length > 0 && this.mediaSourceSsrc) {\n this.internalStats[\"count\"] = (this.internalStats[\"count\"] ?? 0) + 1;\n\n const nack = new GenericNack({\n senderSsrc: this.senderSsrc,\n mediaSourceSsrc: this.mediaSourceSsrc,\n lost: this.lostSeqNumbers,\n });\n\n const rtcp = new RtcpTransportLayerFeedback({\n feedback: nack,\n });\n this.onNack(rtcp).then(r).catch(f);\n\n this.updateRetryCount();\n this.onNackSent.execute(nack);\n }\n });\n}\n"]}
|
|
@@ -1,10 +1,7 @@
|
|
|
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.RtcpSourceCallback = void 0;
|
|
7
|
-
const
|
|
4
|
+
const common_1 = require("../../imports/common");
|
|
8
5
|
class RtcpSourceCallback {
|
|
9
6
|
constructor() {
|
|
10
7
|
Object.defineProperty(this, "cb", {
|
|
@@ -23,7 +20,7 @@ class RtcpSourceCallback {
|
|
|
23
20
|
enumerable: true,
|
|
24
21
|
configurable: true,
|
|
25
22
|
writable: true,
|
|
26
|
-
value: new
|
|
23
|
+
value: new common_1.Event()
|
|
27
24
|
});
|
|
28
25
|
Object.defineProperty(this, "input", {
|
|
29
26
|
enumerable: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtcpCallback.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/rtcpCallback.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rtcpCallback.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/rtcpCallback.ts"],"names":[],"mappings":";;;AAAA,iDAA6C;AAY7C,MAAa,kBAAkB;IAA/B;QAGU;;;;;WAAiC;QACjC;;;;;WAAwB;QAChC;;;;mBAAY,IAAI,cAAK,EAAE;WAAC;QAYxB;;;;mBAAQ,CAAC,IAAe,EAAE,EAAE;gBAC1B,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;oBACZ,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;WAAC;QASF;;;;mBAAU,GAAG,EAAE;gBACb,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,IAAI,CAAC,UAAU,EAAE,CAAC;oBAClB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC9B,CAAC;gBACD,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;gBACpB,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;YAClC,CAAC;WAAC;IACJ,CAAC;IA/BC,MAAM;QACJ,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,EAA+B,EAAE,UAAuB;QAC3D,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAQD,IAAI;QACF,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CAUF;AAtCD,gDAsCC","sourcesContent":["import { Event } from \"../../imports/common\";\n\nimport type { RtcpPacket } from \"../..\";\nimport type { SimpleProcessorCallback } from \"./interface\";\n\nexport type RtcpInput = RtcpPacket;\n\nexport interface RtcpOutput {\n rtcp?: RtcpPacket;\n eol?: boolean;\n}\n\nexport class RtcpSourceCallback\n implements SimpleProcessorCallback<RtcpInput, RtcpOutput>\n{\n private cb?: (chunk: RtcpOutput) => void;\n private destructor?: () => void;\n onStopped = new Event();\n\n toJSON() {\n return {};\n }\n\n pipe(cb: (chunk: RtcpOutput) => void, destructor?: () => void) {\n this.cb = cb;\n this.destructor = destructor;\n return this;\n }\n\n input = (rtcp: RtcpInput) => {\n if (this.cb) {\n this.cb({ rtcp });\n }\n };\n\n stop() {\n if (this.cb) {\n this.cb({ eol: true });\n }\n this.onStopped.execute();\n }\n\n destroy = () => {\n if (this.destructor) {\n this.destructor();\n this.destructor = undefined;\n }\n this.cb = undefined;\n this.onStopped.allUnsubscribe();\n };\n}\n"]}
|
|
@@ -1,10 +1,7 @@
|
|
|
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.RtpSourceCallback = void 0;
|
|
7
|
-
const
|
|
4
|
+
const common_1 = require("../../imports/common");
|
|
8
5
|
const __1 = require("../..");
|
|
9
6
|
class RtpSourceCallback {
|
|
10
7
|
constructor(options = {}) {
|
|
@@ -30,7 +27,7 @@ class RtpSourceCallback {
|
|
|
30
27
|
enumerable: true,
|
|
31
28
|
configurable: true,
|
|
32
29
|
writable: true,
|
|
33
|
-
value: new
|
|
30
|
+
value: new common_1.Event()
|
|
34
31
|
});
|
|
35
32
|
Object.defineProperty(this, "stats", {
|
|
36
33
|
enumerable: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtpCallback.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/rtpCallback.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rtpCallback.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/rtpCallback.ts"],"names":[],"mappings":";;;AAAA,iDAA6C;AAE7C,6BAAkC;AAUlC,MAAa,iBAAiB;IAU5B,YACU,UAIJ,EAAE;QAJN;;;;mBAAQ,OAAO;WAIT;QAZA;;;;;WAAgC;QAChC;;;;;WAAwB;QAChC;;;;mBAAY,IAAI,cAAK,EAAE;WAAC;QACxB;;;;mBAAQ,EAAE;WAAC;QACX;;;;mBAAsB,EAAE;WAAC;QACzB;;;;mBAAkB,KAAK;WAAC;QAsBxB;;;;mBAAQ,CAAC,MAA0B,EAAE,EAAE;gBACrC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACjC,CAAC,CAAC,aAAS,CAAC,WAAW,CAAC,MAAM,CAAC;oBAC/B,CAAC,CAAC,MAAM,CAAC;gBAEX,IACE,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,SAAS;oBACrC,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,GAAG,CAAC,MAAM,CAAC,WAAW,EACnD,CAAC;oBACD,IAAI,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;wBACtC,GAAG,CAAC,KAAK,EAAE,CAAC;oBACd,CAAC;oBACD,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;oBACrB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACxB,aAAa;wBACb,GAAG,EAAE,MAAM,CAAC,SAAS;wBACrB,OAAO;wBACP,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC;gBAE7B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAI,EAAE,EAAE,CAAC;oBACP,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;wBACrC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;4BACzB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;4BACZ,OAAO;wBACT,CAAC;wBACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBACtB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;4BAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gCAC1B,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;4BACd,CAAC,CAAC,CAAC;4BACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;4BACjB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;wBAC9B,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;WAAC;QASF;;;;mBAAU,GAAG,EAAE;gBACb,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,IAAI,CAAC,UAAU,EAAE,CAAC;oBAClB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC9B,CAAC;gBACD,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;gBACpB,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;YAClC,CAAC;WAAC;QAtEA,OAAO,CAAC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,IAAI,IAAI,CAAC;IACtE,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,EAA8B,EAAE,UAAuB;QAC1D,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IA6CD,IAAI;QACF,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CAUF;AAxFD,8CAwFC","sourcesContent":["import { Event } from \"../../imports/common\";\n\nimport { RtpPacket } from \"../..\";\nimport type { SimpleProcessorCallback } from \"./interface\";\n\nexport type RtpInput = Buffer | RtpPacket;\n\nexport interface RtpOutput {\n rtp?: RtpPacket;\n eol?: boolean;\n}\n\nexport class RtpSourceCallback\n implements SimpleProcessorCallback<RtpInput, RtpOutput>\n{\n private cb?: (chunk: RtpOutput) => void;\n private destructor?: () => void;\n onStopped = new Event();\n stats = {};\n buffer: RtpPacket[] = [];\n bufferFulfilled = false;\n\n constructor(\n private options: {\n payloadType?: number;\n clearInvalidPTPacket?: boolean;\n initialBufferLength?: number;\n } = {},\n ) {\n options.clearInvalidPTPacket = options.clearInvalidPTPacket ?? true;\n }\n\n toJSON() {\n return { ...this.stats };\n }\n\n pipe(cb: (chunk: RtpOutput) => void, destructor?: () => void) {\n this.cb = cb;\n this.destructor = destructor;\n return this;\n }\n\n input = (packet: Buffer | RtpPacket) => {\n const rtp = Buffer.isBuffer(packet)\n ? RtpPacket.deSerialize(packet)\n : packet;\n\n if (\n this.options.payloadType != undefined &&\n this.options.payloadType !== rtp.header.payloadType\n ) {\n if (this.options.clearInvalidPTPacket) {\n rtp.clear();\n }\n return;\n }\n\n this.stats[\"rtpSource\"] =\n new Date().toISOString() +\n \" timestamp:\" +\n rtp?.header.timestamp +\n \" seq:\" +\n rtp?.header.sequenceNumber;\n\n const cb = this.cb;\n if (cb) {\n if (this.options.initialBufferLength) {\n if (this.bufferFulfilled) {\n cb({ rtp });\n return;\n }\n this.buffer.push(rtp);\n if (this.buffer.length > this.options.initialBufferLength) {\n this.buffer.forEach((rtp) => {\n cb({ rtp });\n });\n this.buffer = [];\n this.bufferFulfilled = true;\n }\n } else {\n cb({ rtp });\n }\n }\n };\n\n stop() {\n if (this.cb) {\n this.cb({ eol: true });\n }\n this.onStopped.execute();\n }\n\n destroy = () => {\n if (this.destructor) {\n this.destructor();\n this.destructor = undefined;\n }\n this.cb = undefined;\n this.onStopped.allUnsubscribe();\n };\n}\n"]}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
|
-
import Event from "
|
|
1
|
+
import { Event } from "../../imports/common";
|
|
2
2
|
import type { SupportedCodec } from "../container/webm";
|
|
3
3
|
import type { AVProcessor } from "./interface";
|
|
4
|
+
export interface WebmTrack {
|
|
5
|
+
width?: number;
|
|
6
|
+
height?: number;
|
|
7
|
+
roll?: number;
|
|
8
|
+
kind: MediaKind;
|
|
9
|
+
codec: SupportedCodec;
|
|
10
|
+
clockRate: number;
|
|
11
|
+
trackNumber: number;
|
|
12
|
+
}
|
|
4
13
|
export type WebmInput = {
|
|
5
14
|
frame?: {
|
|
6
15
|
data: Buffer;
|
|
@@ -29,14 +38,7 @@ export interface WebmOption {
|
|
|
29
38
|
strictTimestamp?: boolean;
|
|
30
39
|
}
|
|
31
40
|
export declare class WebmBase implements AVProcessor<WebmInput> {
|
|
32
|
-
tracks:
|
|
33
|
-
width?: number;
|
|
34
|
-
height?: number;
|
|
35
|
-
kind: MediaKind;
|
|
36
|
-
codec: SupportedCodec;
|
|
37
|
-
clockRate: number;
|
|
38
|
-
trackNumber: number;
|
|
39
|
-
}[];
|
|
41
|
+
tracks: WebmTrack[];
|
|
40
42
|
private output;
|
|
41
43
|
private options;
|
|
42
44
|
private builder;
|
|
@@ -53,14 +55,7 @@ export declare class WebmBase implements AVProcessor<WebmInput> {
|
|
|
53
55
|
videoKeyframeReceived: boolean;
|
|
54
56
|
internalStats: {};
|
|
55
57
|
onStopped: Event<any[]>;
|
|
56
|
-
constructor(tracks:
|
|
57
|
-
width?: number;
|
|
58
|
-
height?: number;
|
|
59
|
-
kind: MediaKind;
|
|
60
|
-
codec: SupportedCodec;
|
|
61
|
-
clockRate: number;
|
|
62
|
-
trackNumber: number;
|
|
63
|
-
}[], output: (output: WebmOutput) => void, options?: WebmOption);
|
|
58
|
+
constructor(tracks: WebmTrack[], output: (output: WebmOutput) => void, options?: WebmOption);
|
|
64
59
|
toJSON(): Record<string, any>;
|
|
65
60
|
private processInput;
|
|
66
61
|
processAudioInput: (input: WebmInput) => void;
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.SegmentSizePosition = exports.DurationPosition = exports.MaxSinged16Int = exports.Max32Uint = exports.WebmBase = void 0;
|
|
7
4
|
exports.replaceSegmentSize = replaceSegmentSize;
|
|
8
|
-
const
|
|
5
|
+
const common_1 = require("../../imports/common");
|
|
9
6
|
const container_1 = require("../container");
|
|
10
7
|
class WebmBase {
|
|
11
8
|
constructor(tracks, output, options = {}) {
|
|
@@ -104,7 +101,7 @@ class WebmBase {
|
|
|
104
101
|
enumerable: true,
|
|
105
102
|
configurable: true,
|
|
106
103
|
writable: true,
|
|
107
|
-
value: new
|
|
104
|
+
value: new common_1.Event()
|
|
108
105
|
});
|
|
109
106
|
Object.defineProperty(this, "processAudioInput", {
|
|
110
107
|
enumerable: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/webm.ts"],"names":[],"mappings":"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","sourcesContent":["import Event from \"rx.mini\";\n\nimport {\n WEBMContainer,\n getEBMLByteLength,\n numberToByteArray,\n vintEncode,\n} from \"../container\";\nimport type { SupportedCodec } from \"../container/webm\";\nimport type { AVProcessor } from \"./interface\";\n\nexport type WebmInput = {\n frame?: {\n data: Buffer;\n isKeyframe: boolean;\n /**ms */\n time: number;\n };\n eol?: boolean;\n};\n\nexport interface WebmOutput {\n saveToFile?: Buffer;\n kind?: \"initial\" | \"cluster\" | \"block\" | \"cuePoints\";\n /**ms */\n previousDuration?: number;\n eol?: {\n /**ms */\n duration: number;\n durationElement: Uint8Array;\n header: Buffer;\n };\n}\n\nexport interface WebmOption {\n /**ms */\n duration?: number;\n encryptionKey?: Buffer;\n strictTimestamp?: boolean;\n}\n\nexport class WebmBase implements AVProcessor<WebmInput> {\n private builder: WEBMContainer;\n private relativeTimestamp = 0;\n private timestamps: { [pt: number]: ClusterTimestamp } = {};\n private cuePoints: CuePoint[] = [];\n private position = 0;\n private clusterCounts = 0;\n /**ms */\n elapsed?: number;\n audioStopped = false;\n videoStopped = false;\n stopped = false;\n videoKeyframeReceived = false;\n internalStats = {};\n onStopped = new Event();\n\n constructor(\n public tracks: {\n width?: number;\n height?: number;\n kind: MediaKind;\n codec: SupportedCodec;\n clockRate: number;\n trackNumber: number;\n }[],\n private output: (output: WebmOutput) => void,\n private options: WebmOption = {},\n ) {\n this.builder = new WEBMContainer(tracks, options.encryptionKey);\n\n tracks.forEach((t) => {\n this.timestamps[t.trackNumber] = new ClusterTimestamp();\n });\n }\n\n toJSON(): Record<string, any> {\n return {\n ...this.internalStats,\n videoKeyframeReceived: this.videoKeyframeReceived,\n videoStopped: this.videoStopped,\n audioStopped: this.audioStopped,\n stopped: this.stopped,\n };\n }\n\n private processInput(input: WebmInput, trackNumber: number) {\n if (this.stopped) {\n return;\n }\n\n const track = this.tracks.find((t) => t.trackNumber === trackNumber);\n if (!track) {\n throw new Error(\"track not found\");\n }\n\n if (!input.frame) {\n if (this.tracks.length === 2) {\n if (track.kind === \"audio\") {\n this.audioStopped = true;\n this.internalStats[\"audioStopped\"] = new Date().toISOString();\n if (this.videoStopped) {\n this.stop();\n }\n } else {\n this.videoStopped = true;\n this.internalStats[\"videoStopped\"] = new Date().toISOString();\n if (this.audioStopped) {\n this.stop();\n }\n }\n } else if (input.eol) {\n this.stop();\n }\n\n return;\n }\n\n if (track.kind === \"audio\") {\n this.audioStopped = false;\n } else {\n this.videoStopped = false;\n }\n\n this.onFrameReceived({ ...input.frame, trackNumber });\n }\n\n processAudioInput = (input: WebmInput) => {\n const track = this.tracks.find((t) => t.kind === \"audio\");\n if (track) {\n this.internalStats[\"processAudioInput\"] = new Date().toISOString();\n this.processInput(input, track.trackNumber);\n }\n };\n\n processVideoInput = (input: WebmInput) => {\n if (input.frame?.isKeyframe) {\n this.videoKeyframeReceived = true;\n }\n if (!this.videoKeyframeReceived && input?.frame?.isKeyframe !== true) {\n return;\n }\n\n const track = this.tracks.find((t) => t.kind === \"video\");\n if (track) {\n this.internalStats[\"processVideoInput\"] = new Date().toISOString();\n this.processInput(input, track.trackNumber);\n }\n };\n\n protected start() {\n const staticPart = Buffer.concat([\n this.builder.ebmlHeader,\n this.builder.createSegment(this.options.duration),\n ]);\n this.output({ saveToFile: staticPart, kind: \"initial\" });\n this.position += staticPart.length;\n\n const video = this.tracks.find((t) => t.kind === \"video\");\n if (video) {\n this.cuePoints.push(\n new CuePoint(this.builder, video.trackNumber, 0.0, this.position),\n );\n }\n }\n\n private onFrameReceived(frame: WebmInput[\"frame\"] & { trackNumber: number }) {\n const track = this.tracks.find((t) => t.trackNumber === frame.trackNumber);\n if (!track) {\n return;\n }\n\n this.internalStats[\"onFrameReceived_trackNumber\" + frame.trackNumber] =\n new Date().toISOString();\n this.internalStats[\"onFrameReceived_count\"] =\n (this.internalStats[\"onFrameReceived_count\"] ?? 0) + 1;\n\n const timestampManager = this.timestamps[track.trackNumber];\n if (timestampManager.baseTime == undefined) {\n for (const t of Object.values(this.timestamps)) {\n t.baseTime = frame.time;\n }\n }\n\n // clusterの経過時間 ms\n let elapsed = timestampManager.update(frame.time);\n\n if (this.clusterCounts === 0) {\n this.createCluster(0.0, 0);\n } else if (\n (track.kind === \"video\" && frame.isKeyframe) ||\n // simpleBlockのタイムスタンプはsigned 16bitだから\n elapsed > MaxSinged16Int\n ) {\n this.relativeTimestamp += elapsed;\n\n if (elapsed !== 0) {\n this.cuePoints.push(\n new CuePoint(\n this.builder,\n track.trackNumber,\n this.relativeTimestamp,\n this.position,\n ),\n );\n\n this.createCluster(this.relativeTimestamp, elapsed);\n Object.values(this.timestamps).forEach((t) => t.shift(elapsed));\n elapsed = timestampManager.update(frame.time);\n }\n }\n\n if (elapsed >= 0) {\n this.createSimpleBlock({\n frame,\n trackNumber: track.trackNumber,\n elapsed,\n });\n } else {\n this.internalStats[\"delayed_frame\"] = {\n elapsed,\n trackNumber: track.trackNumber,\n timestamp: new Date().toISOString(),\n count: (this.internalStats[\"delayed_frame\"]?.count ?? 0) + 1,\n };\n }\n }\n\n private createCluster(\n timestamp: number,\n /**ms */\n duration: number,\n ) {\n const cluster = this.builder.createCluster(timestamp);\n this.clusterCounts++;\n this.output({\n saveToFile: Buffer.from(cluster),\n kind: \"cluster\",\n previousDuration: duration,\n });\n this.position += cluster.length;\n this.elapsed = undefined;\n }\n\n private createSimpleBlock({\n frame,\n trackNumber,\n elapsed,\n }: {\n frame: NonNullable<WebmInput[\"frame\"]>;\n trackNumber: number;\n elapsed: number;\n }) {\n if (this.elapsed == undefined) {\n this.elapsed = elapsed;\n }\n if (elapsed < this.elapsed && this.options.strictTimestamp) {\n this.internalStats[\"previous_timestamp\"] = {\n elapsed,\n present: this.elapsed,\n trackNumber,\n timestamp: new Date().toISOString(),\n count: (this.internalStats[\"previous_timestamp\"]?.count ?? 0) + 1,\n };\n return;\n }\n if (elapsed > this.elapsed + 1000) {\n const key = \"maybe_packetLost-\" + trackNumber;\n this.internalStats[key] = {\n elapsed,\n present: this.elapsed,\n trackNumber,\n timestamp: new Date().toISOString(),\n count: (this.internalStats[key]?.count ?? 0) + 1,\n };\n }\n this.elapsed = elapsed;\n\n const block = this.builder.createSimpleBlock(\n frame.data,\n frame.isKeyframe,\n trackNumber,\n elapsed,\n );\n\n this.internalStats[\"createSimpleBlock_trackNumber\" + trackNumber] =\n new Date().toISOString();\n\n this.output({ saveToFile: block, kind: \"block\" });\n this.position += block.length;\n const [cuePoint] = this.cuePoints.slice(-1);\n if (cuePoint) {\n cuePoint.blockNumber++;\n }\n }\n\n stop() {\n if (this.stopped) {\n return;\n }\n this.videoStopped = true;\n this.audioStopped = true;\n this.stopped = true;\n this.internalStats[\"stopped\"] = new Date().toISOString();\n\n const latestTimestamp = Object.values(this.timestamps)\n .sort((a, b) => a.elapsed - b.elapsed)\n .reverse()[0].elapsed;\n const duration = this.relativeTimestamp + latestTimestamp;\n\n const cues = this.builder.createCues(this.cuePoints.map((c) => c.build()));\n this.output({\n saveToFile: Buffer.from(cues),\n kind: \"cuePoints\",\n previousDuration: duration,\n });\n\n const durationElement = this.builder.createDuration(duration);\n const header = Buffer.concat([\n this.builder.ebmlHeader,\n this.builder.createSegment(duration),\n ]);\n\n this.output({ eol: { duration, durationElement, header } });\n\n this.timestamps = {};\n this.cuePoints = [];\n this.internalStats = {};\n this.output = undefined as any;\n\n this.onStopped.execute();\n }\n}\n\nclass ClusterTimestamp {\n /**ms */\n baseTime?: number;\n /**ms */\n elapsed = 0;\n private offset = 0;\n\n shift(\n /**ms */\n elapsed: number,\n ) {\n this.offset += elapsed;\n }\n\n update(\n /**ms */\n time: number,\n ) {\n if (this.baseTime == undefined) {\n throw new Error(\"baseTime not exist\");\n }\n\n this.elapsed = time - this.baseTime - this.offset;\n\n return this.elapsed;\n }\n}\n\nclass CuePoint {\n /**\n * cuesの後のclusterのあるべき位置\n * cuesはclusterの前に挿入される\n */\n cuesLength = 0;\n blockNumber = 0;\n\n constructor(\n private readonly builder: WEBMContainer,\n private readonly trackNumber: number,\n private readonly relativeTimestamp: number,\n public position: number,\n ) {}\n\n build() {\n return this.builder.createCuePoint(\n this.relativeTimestamp,\n this.trackNumber,\n this.position - 48 + this.cuesLength,\n this.blockNumber,\n );\n }\n}\n\n/**4294967295 */\nexport const Max32Uint = Number(0x01n << 32n) - 1;\n/**32767 */\nexport const MaxSinged16Int = (0x01 << 16) / 2 - 1;\n\nexport const DurationPosition = 83;\n\nexport const SegmentSizePosition = 40;\n\nexport function replaceSegmentSize(totalFileSize: number) {\n const bodySize = totalFileSize - SegmentSizePosition;\n const resize = [\n ...vintEncode(numberToByteArray(bodySize, getEBMLByteLength(bodySize))),\n ];\n const todoFill = 8 - resize.length - 2;\n if (todoFill > 0) {\n resize.push(0xec);\n if (todoFill > 1) {\n const voidSize = vintEncode(\n numberToByteArray(todoFill, getEBMLByteLength(todoFill)),\n );\n [...voidSize].forEach((i) => resize.push(i));\n }\n }\n return Buffer.from(resize);\n}\n\nexport type MediaKind = \"video\" | \"audio\";\n"]}
|
|
1
|
+
{"version":3,"file":"webm.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/webm.ts"],"names":[],"mappings":"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","sourcesContent":["import { Event } from \"../../imports/common\";\n\nimport {\n WEBMContainer,\n getEBMLByteLength,\n numberToByteArray,\n vintEncode,\n} from \"../container\";\nimport type { SupportedCodec } from \"../container/webm\";\nimport type { AVProcessor } from \"./interface\";\n\nexport interface WebmTrack {\n width?: number;\n height?: number;\n roll?: number;\n kind: MediaKind;\n codec: SupportedCodec;\n clockRate: number;\n trackNumber: number;\n}\n\nexport type WebmInput = {\n frame?: {\n data: Buffer;\n isKeyframe: boolean;\n /**ms */\n time: number;\n };\n eol?: boolean;\n};\n\nexport interface WebmOutput {\n saveToFile?: Buffer;\n kind?: \"initial\" | \"cluster\" | \"block\" | \"cuePoints\";\n /**ms */\n previousDuration?: number;\n eol?: {\n /**ms */\n duration: number;\n durationElement: Uint8Array;\n header: Buffer;\n };\n}\n\nexport interface WebmOption {\n /**ms */\n duration?: number;\n encryptionKey?: Buffer;\n strictTimestamp?: boolean;\n}\n\nexport class WebmBase implements AVProcessor<WebmInput> {\n private builder: WEBMContainer;\n private relativeTimestamp = 0;\n private timestamps: { [pt: number]: ClusterTimestamp } = {};\n private cuePoints: CuePoint[] = [];\n private position = 0;\n private clusterCounts = 0;\n /**ms */\n elapsed?: number;\n audioStopped = false;\n videoStopped = false;\n stopped = false;\n videoKeyframeReceived = false;\n internalStats = {};\n onStopped = new Event();\n\n constructor(\n public tracks: WebmTrack[],\n private output: (output: WebmOutput) => void,\n private options: WebmOption = {},\n ) {\n this.builder = new WEBMContainer(tracks, options.encryptionKey);\n\n tracks.forEach((t) => {\n this.timestamps[t.trackNumber] = new ClusterTimestamp();\n });\n }\n\n toJSON(): Record<string, any> {\n return {\n ...this.internalStats,\n videoKeyframeReceived: this.videoKeyframeReceived,\n videoStopped: this.videoStopped,\n audioStopped: this.audioStopped,\n stopped: this.stopped,\n };\n }\n\n private processInput(input: WebmInput, trackNumber: number) {\n if (this.stopped) {\n return;\n }\n\n const track = this.tracks.find((t) => t.trackNumber === trackNumber);\n if (!track) {\n throw new Error(\"track not found\");\n }\n\n if (!input.frame) {\n if (this.tracks.length === 2) {\n if (track.kind === \"audio\") {\n this.audioStopped = true;\n this.internalStats[\"audioStopped\"] = new Date().toISOString();\n if (this.videoStopped) {\n this.stop();\n }\n } else {\n this.videoStopped = true;\n this.internalStats[\"videoStopped\"] = new Date().toISOString();\n if (this.audioStopped) {\n this.stop();\n }\n }\n } else if (input.eol) {\n this.stop();\n }\n\n return;\n }\n\n if (track.kind === \"audio\") {\n this.audioStopped = false;\n } else {\n this.videoStopped = false;\n }\n\n this.onFrameReceived({ ...input.frame, trackNumber });\n }\n\n processAudioInput = (input: WebmInput) => {\n const track = this.tracks.find((t) => t.kind === \"audio\");\n if (track) {\n this.internalStats[\"processAudioInput\"] = new Date().toISOString();\n this.processInput(input, track.trackNumber);\n }\n };\n\n processVideoInput = (input: WebmInput) => {\n if (input.frame?.isKeyframe) {\n this.videoKeyframeReceived = true;\n }\n if (!this.videoKeyframeReceived && input?.frame?.isKeyframe !== true) {\n return;\n }\n\n const track = this.tracks.find((t) => t.kind === \"video\");\n if (track) {\n this.internalStats[\"processVideoInput\"] = new Date().toISOString();\n this.processInput(input, track.trackNumber);\n }\n };\n\n protected start() {\n const staticPart = Buffer.concat([\n this.builder.ebmlHeader,\n this.builder.createSegment(this.options.duration),\n ]);\n this.output({ saveToFile: staticPart, kind: \"initial\" });\n this.position += staticPart.length;\n\n const video = this.tracks.find((t) => t.kind === \"video\");\n if (video) {\n this.cuePoints.push(\n new CuePoint(this.builder, video.trackNumber, 0.0, this.position),\n );\n }\n }\n\n private onFrameReceived(frame: WebmInput[\"frame\"] & { trackNumber: number }) {\n const track = this.tracks.find((t) => t.trackNumber === frame.trackNumber);\n if (!track) {\n return;\n }\n\n this.internalStats[\"onFrameReceived_trackNumber\" + frame.trackNumber] =\n new Date().toISOString();\n this.internalStats[\"onFrameReceived_count\"] =\n (this.internalStats[\"onFrameReceived_count\"] ?? 0) + 1;\n\n const timestampManager = this.timestamps[track.trackNumber];\n if (timestampManager.baseTime == undefined) {\n for (const t of Object.values(this.timestamps)) {\n t.baseTime = frame.time;\n }\n }\n\n // clusterの経過時間 ms\n let elapsed = timestampManager.update(frame.time);\n\n if (this.clusterCounts === 0) {\n this.createCluster(0.0, 0);\n } else if (\n (track.kind === \"video\" && frame.isKeyframe) ||\n // simpleBlockのタイムスタンプはsigned 16bitだから\n elapsed > MaxSinged16Int\n ) {\n this.relativeTimestamp += elapsed;\n\n if (elapsed !== 0) {\n this.cuePoints.push(\n new CuePoint(\n this.builder,\n track.trackNumber,\n this.relativeTimestamp,\n this.position,\n ),\n );\n\n this.createCluster(this.relativeTimestamp, elapsed);\n Object.values(this.timestamps).forEach((t) => t.shift(elapsed));\n elapsed = timestampManager.update(frame.time);\n }\n }\n\n if (elapsed >= 0) {\n this.createSimpleBlock({\n frame,\n trackNumber: track.trackNumber,\n elapsed,\n });\n } else {\n this.internalStats[\"delayed_frame\"] = {\n elapsed,\n trackNumber: track.trackNumber,\n timestamp: new Date().toISOString(),\n count: (this.internalStats[\"delayed_frame\"]?.count ?? 0) + 1,\n };\n }\n }\n\n private createCluster(\n timestamp: number,\n /**ms */\n duration: number,\n ) {\n const cluster = this.builder.createCluster(timestamp);\n this.clusterCounts++;\n this.output({\n saveToFile: Buffer.from(cluster),\n kind: \"cluster\",\n previousDuration: duration,\n });\n this.position += cluster.length;\n this.elapsed = undefined;\n }\n\n private createSimpleBlock({\n frame,\n trackNumber,\n elapsed,\n }: {\n frame: NonNullable<WebmInput[\"frame\"]>;\n trackNumber: number;\n elapsed: number;\n }) {\n if (this.elapsed == undefined) {\n this.elapsed = elapsed;\n }\n if (elapsed < this.elapsed && this.options.strictTimestamp) {\n this.internalStats[\"previous_timestamp\"] = {\n elapsed,\n present: this.elapsed,\n trackNumber,\n timestamp: new Date().toISOString(),\n count: (this.internalStats[\"previous_timestamp\"]?.count ?? 0) + 1,\n };\n return;\n }\n if (elapsed > this.elapsed + 1000) {\n const key = \"maybe_packetLost-\" + trackNumber;\n this.internalStats[key] = {\n elapsed,\n present: this.elapsed,\n trackNumber,\n timestamp: new Date().toISOString(),\n count: (this.internalStats[key]?.count ?? 0) + 1,\n };\n }\n this.elapsed = elapsed;\n\n const block = this.builder.createSimpleBlock(\n frame.data,\n frame.isKeyframe,\n trackNumber,\n elapsed,\n );\n\n this.internalStats[\"createSimpleBlock_trackNumber\" + trackNumber] =\n new Date().toISOString();\n\n this.output({ saveToFile: block, kind: \"block\" });\n this.position += block.length;\n const [cuePoint] = this.cuePoints.slice(-1);\n if (cuePoint) {\n cuePoint.blockNumber++;\n }\n }\n\n stop() {\n if (this.stopped) {\n return;\n }\n this.videoStopped = true;\n this.audioStopped = true;\n this.stopped = true;\n this.internalStats[\"stopped\"] = new Date().toISOString();\n\n const latestTimestamp = Object.values(this.timestamps)\n .sort((a, b) => a.elapsed - b.elapsed)\n .reverse()[0].elapsed;\n const duration = this.relativeTimestamp + latestTimestamp;\n\n const cues = this.builder.createCues(this.cuePoints.map((c) => c.build()));\n this.output({\n saveToFile: Buffer.from(cues),\n kind: \"cuePoints\",\n previousDuration: duration,\n });\n\n const durationElement = this.builder.createDuration(duration);\n const header = Buffer.concat([\n this.builder.ebmlHeader,\n this.builder.createSegment(duration),\n ]);\n\n this.output({ eol: { duration, durationElement, header } });\n\n this.timestamps = {};\n this.cuePoints = [];\n this.internalStats = {};\n this.output = undefined as any;\n\n this.onStopped.execute();\n }\n}\n\nclass ClusterTimestamp {\n /**ms */\n baseTime?: number;\n /**ms */\n elapsed = 0;\n private offset = 0;\n\n shift(\n /**ms */\n elapsed: number,\n ) {\n this.offset += elapsed;\n }\n\n update(\n /**ms */\n time: number,\n ) {\n if (this.baseTime == undefined) {\n throw new Error(\"baseTime not exist\");\n }\n\n this.elapsed = time - this.baseTime - this.offset;\n\n return this.elapsed;\n }\n}\n\nclass CuePoint {\n /**\n * cuesの後のclusterのあるべき位置\n * cuesはclusterの前に挿入される\n */\n cuesLength = 0;\n blockNumber = 0;\n\n constructor(\n private readonly builder: WEBMContainer,\n private readonly trackNumber: number,\n private readonly relativeTimestamp: number,\n public position: number,\n ) {}\n\n build() {\n return this.builder.createCuePoint(\n this.relativeTimestamp,\n this.trackNumber,\n this.position - 48 + this.cuesLength,\n this.blockNumber,\n );\n }\n}\n\n/**4294967295 */\nexport const Max32Uint = Number(0x01n << 32n) - 1;\n/**32767 */\nexport const MaxSinged16Int = (0x01 << 16) / 2 - 1;\n\nexport const DurationPosition = 83;\n\nexport const SegmentSizePosition = 40;\n\nexport function replaceSegmentSize(totalFileSize: number) {\n const bodySize = totalFileSize - SegmentSizePosition;\n const resize = [\n ...vintEncode(numberToByteArray(bodySize, getEBMLByteLength(bodySize))),\n ];\n const todoFill = 8 - resize.length - 2;\n if (todoFill > 0) {\n resize.push(0xec);\n if (todoFill > 1) {\n const voidSize = vintEncode(\n numberToByteArray(todoFill, getEBMLByteLength(todoFill)),\n );\n [...voidSize].forEach((i) => resize.push(i));\n }\n }\n return Buffer.from(resize);\n}\n\nexport type MediaKind = \"video\" | \"audio\";\n"]}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { WebmBase, type WebmInput, type WebmOption, type WebmOutput } from "./webm";
|
|
3
|
-
export interface WebmTrack {
|
|
4
|
-
width?: number;
|
|
5
|
-
height?: number;
|
|
6
|
-
kind: "audio" | "video";
|
|
7
|
-
codec: SupportedCodec;
|
|
8
|
-
clockRate: number;
|
|
9
|
-
trackNumber: number;
|
|
10
|
-
}
|
|
1
|
+
import { WebmBase, type WebmInput, type WebmOption, type WebmOutput, type WebmTrack } from "./webm";
|
|
11
2
|
export declare class WebmCallback extends WebmBase {
|
|
12
3
|
private cb?;
|
|
13
4
|
private queue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webmCallback.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/webmCallback.ts"],"names":[],"mappings":";;;AAAA,0CAAqD;AAErD,6BAAqC;
|
|
1
|
+
{"version":3,"file":"webmCallback.js","sourceRoot":"","sources":["../../../../../../rtp/src/extra/processor/webmCallback.ts"],"names":[],"mappings":";;;AAAA,0CAAqD;AAErD,6BAAqC;AACrC,iCASgB;AAEhB,MAAa,YAAa,SAAQ,eAAQ;IAGxC,YAAY,MAAmB,EAAE,UAAsB,EAAE;QACvD,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;;;;;WAA0C;QAC1C;;;;mBAAQ,IAAI,gBAAY,EAAE;WAAC;QAcnC;;;;mBAAO,CAAC,EAAwC,EAAE,EAAE;gBAClD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;WAAC;QAEF;;;;mBAAa,CAAC,KAAgB,EAAE,EAAE;gBAChC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;WAAC;QACF;;;;mBAAa,CAAC,KAAgB,EAAE,EAAE;gBAChC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;WAAC;QAEF;;;;mBAAU,GAAG,EAAE;gBACb,IAAI,CAAC,EAAE,GAAG,SAAS,CAAC;gBACpB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,CAAC;WAAC;IAjBF,CAAC;CAkBF;AAhCD,oCAgCC;AAEM,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,EAAE,KAAiB,EAAE,EAAE;IAC5E,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,IAAA,qBAAU,EAAC,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;SAAM,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACrB,MAAM,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,IAAA,eAAI,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEvC,eAAe;QACf,MAAM,OAAO,CAAC,KAAK,CACjB,eAAe,EACf,CAAC,EACD,eAAe,CAAC,MAAM,EACtB,uBAAgB,CACjB,CAAC;QAEF,WAAW;QACX,MAAM,IAAI,GAAG,MAAM,IAAA,eAAI,EAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAA,yBAAkB,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,0BAAmB,CAAC,CAAC;QAEnE,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC,CAAC;AAtBW,QAAA,gBAAgB,oBAsB3B","sourcesContent":["import { appendFile, open, stat } from \"fs/promises\";\n\nimport { PromiseQueue } from \"../..\";\nimport {\n DurationPosition,\n SegmentSizePosition,\n WebmBase,\n type WebmInput,\n type WebmOption,\n type WebmOutput,\n type WebmTrack,\n replaceSegmentSize,\n} from \"./webm\";\n\nexport class WebmCallback extends WebmBase {\n private cb?: (input: WebmOutput) => Promise<void>;\n private queue = new PromiseQueue();\n constructor(tracks: WebmTrack[], options: WebmOption = {}) {\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: WebmOutput) => Promise<void>) => {\n this.cb = cb;\n this.start();\n };\n\n inputAudio = (input: WebmInput) => {\n this.processAudioInput(input);\n };\n inputVideo = (input: WebmInput) => {\n this.processVideoInput(input);\n };\n\n destroy = () => {\n this.cb = undefined;\n this.queue.cancel();\n };\n}\n\nexport const saveToFileSystem = (path: string) => async (value: WebmOutput) => {\n if (value.saveToFile) {\n await appendFile(path, value.saveToFile);\n } else if (value.eol) {\n const { durationElement } = value.eol;\n const handler = await open(path, \"r+\");\n\n // set duration\n await handler.write(\n durationElement,\n 0,\n durationElement.length,\n DurationPosition,\n );\n\n // set size\n const meta = await stat(path);\n const resize = replaceSegmentSize(meta.size);\n await handler.write(resize, 0, resize.length, SegmentSizePosition);\n\n await handler.close();\n }\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../../common/src";
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
__exportStar(require("../../../common/src"), exports);
|
|
18
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../../rtp/src/imports/common.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC","sourcesContent":["export * from \"../../../common/src\";\n"]}
|
|
@@ -7,17 +7,58 @@ export declare const RTP_EXTENSION_URI: {
|
|
|
7
7
|
readonly absSendTime: "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time";
|
|
8
8
|
readonly dependencyDescriptor: "https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension";
|
|
9
9
|
readonly audioLevelIndication: "urn:ietf:params:rtp-hdrext:ssrc-audio-level";
|
|
10
|
+
readonly videoOrientation: "urn:3gpp:video-orientation";
|
|
10
11
|
};
|
|
11
12
|
export type TransportWideCCPayload = number;
|
|
12
13
|
export type AudioLevelIndicationPayload = {
|
|
13
14
|
v: boolean;
|
|
14
15
|
level: number;
|
|
15
16
|
};
|
|
17
|
+
export interface videoOrientationPayload {
|
|
18
|
+
/**
|
|
19
|
+
Camera: indicates the direction of the camera used for this video stream. It can be used by the MTSI client in
|
|
20
|
+
receiver to e.g. display the received video differently depending on the source camera.
|
|
21
|
+
0: Front-facing camera, facing the user. If camera direction is unknown by the sending MTSI client in the terminal
|
|
22
|
+
then this is the default value used.
|
|
23
|
+
1: Back-facing camera, facing away from the user.
|
|
24
|
+
*/
|
|
25
|
+
c: number;
|
|
26
|
+
/**
|
|
27
|
+
F = Flip: indicates a horizontal (left-right flip) mirror operation on the video as sent on the link.
|
|
28
|
+
0: No flip operation. If the sending MTSI client in terminal does not know if a horizontal mirror operation is
|
|
29
|
+
necessary, then this is the default value used.
|
|
30
|
+
1: Horizontal flip operation
|
|
31
|
+
*/
|
|
32
|
+
f: number;
|
|
33
|
+
/**
|
|
34
|
+
R1, R0 = Rotation: indicates the rotation of the video as transmitted on the link. The receiver should rotate the video to
|
|
35
|
+
compensate that rotation. E.g. a 90° Counter Clockwise rotation should be compensated by the receiver with a 90°
|
|
36
|
+
Clockwise rotation prior to displaying.
|
|
37
|
+
|
|
38
|
+
+----+----+-----------------------------------------------+------------------------------+
|
|
39
|
+
| R1 | R0 | Rotation of the video as sent on the link | Rotation on the receiver |
|
|
40
|
+
| | | | before display |
|
|
41
|
+
+----+----+-----------------------------------------------+------------------------------+
|
|
42
|
+
| 0 | 0 | 0° rotation | None |
|
|
43
|
+
+----+----+-----------------------------------------------+------------------------------+
|
|
44
|
+
| 0 | 1 | 90° Counter Clockwise (CCW) rotation or 270° | 90° Clockwise (CW) rotation |
|
|
45
|
+
| | | Clockwise (CW) rotation | |
|
|
46
|
+
+----+----+-----------------------------------------------+------------------------------+
|
|
47
|
+
| 1 | 0 | 180° CCW rotation or 180° CW rotation | 180° CW rotation |
|
|
48
|
+
+----+----+-----------------------------------------------+------------------------------+
|
|
49
|
+
| 1 | 1 | 270° CCW rotation or 90° CW rotation | 90° CCW rotation |
|
|
50
|
+
+----+----+-----------------------------------------------+------------------------------+
|
|
51
|
+
|
|
52
|
+
*/
|
|
53
|
+
r1: number;
|
|
54
|
+
r0: number;
|
|
55
|
+
}
|
|
56
|
+
export interface Extensions {
|
|
57
|
+
[uri: string]: any;
|
|
58
|
+
}
|
|
16
59
|
export declare function rtpHeaderExtensionsParser(extensions: Extension[], extIdUriMap: {
|
|
17
60
|
[id: number]: string;
|
|
18
|
-
}):
|
|
19
|
-
[uri: string]: any;
|
|
20
|
-
};
|
|
61
|
+
}): Extensions;
|
|
21
62
|
export declare function serializeSdesMid(id: string): Buffer;
|
|
22
63
|
export declare function serializeSdesRTPStreamID(id: string): Buffer;
|
|
23
64
|
export declare function serializeRepairedRtpStreamId(id: string): Buffer;
|
|
@@ -28,3 +69,4 @@ export declare function deserializeString(buf: Buffer): string;
|
|
|
28
69
|
export declare function deserializeUint16BE(buf: Buffer): number;
|
|
29
70
|
export declare function deserializeAbsSendTime(buf: Buffer): any;
|
|
30
71
|
export declare function deserializeAudioLevelIndication(buf: Buffer): AudioLevelIndicationPayload;
|
|
72
|
+
export declare function deserializeVideoOrientation(payload: Buffer): videoOrientationPayload;
|
|
@@ -12,6 +12,7 @@ exports.deserializeString = deserializeString;
|
|
|
12
12
|
exports.deserializeUint16BE = deserializeUint16BE;
|
|
13
13
|
exports.deserializeAbsSendTime = deserializeAbsSendTime;
|
|
14
14
|
exports.deserializeAudioLevelIndication = deserializeAudioLevelIndication;
|
|
15
|
+
exports.deserializeVideoOrientation = deserializeVideoOrientation;
|
|
15
16
|
const src_1 = require("../../../common/src");
|
|
16
17
|
exports.RTP_EXTENSION_URI = {
|
|
17
18
|
sdesMid: "urn:ietf:params:rtp-hdrext:sdes:mid",
|
|
@@ -21,6 +22,7 @@ exports.RTP_EXTENSION_URI = {
|
|
|
21
22
|
absSendTime: "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",
|
|
22
23
|
dependencyDescriptor: "https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension",
|
|
23
24
|
audioLevelIndication: "urn:ietf:params:rtp-hdrext:ssrc-audio-level",
|
|
25
|
+
videoOrientation: "urn:3gpp:video-orientation",
|
|
24
26
|
};
|
|
25
27
|
function rtpHeaderExtensionsParser(extensions, extIdUriMap) {
|
|
26
28
|
return extensions
|
|
@@ -47,6 +49,8 @@ function rtpHeaderExtensionsParser(extensions, extIdUriMap) {
|
|
|
47
49
|
value: deserializeAudioLevelIndication(extension.payload),
|
|
48
50
|
};
|
|
49
51
|
}
|
|
52
|
+
case exports.RTP_EXTENSION_URI.videoOrientation:
|
|
53
|
+
return { uri, value: deserializeVideoOrientation(extension.payload) };
|
|
50
54
|
default:
|
|
51
55
|
return { uri, value: extension.payload };
|
|
52
56
|
}
|
|
@@ -98,4 +102,15 @@ function deserializeAudioLevelIndication(buf) {
|
|
|
98
102
|
};
|
|
99
103
|
return value;
|
|
100
104
|
}
|
|
105
|
+
function deserializeVideoOrientation(payload) {
|
|
106
|
+
const stream = new src_1.BitStream(payload);
|
|
107
|
+
stream.readBits(4);
|
|
108
|
+
const value = {
|
|
109
|
+
c: stream.readBits(1),
|
|
110
|
+
f: stream.readBits(1),
|
|
111
|
+
r1: stream.readBits(1),
|
|
112
|
+
r0: stream.readBits(1),
|
|
113
|
+
};
|
|
114
|
+
return value;
|
|
115
|
+
}
|
|
101
116
|
//# sourceMappingURL=headerExtension.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headerExtension.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/headerExtension.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"headerExtension.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/headerExtension.ts"],"names":[],"mappings":"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","sourcesContent":["import { BitStream, bufferReader, bufferWriter } from \"../../../common/src\";\nimport type { Extension } from \"./rtp\";\n\nexport const RTP_EXTENSION_URI = {\n sdesMid: \"urn:ietf:params:rtp-hdrext:sdes:mid\",\n sdesRTPStreamID: \"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\",\n repairedRtpStreamId: \"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\",\n transportWideCC:\n \"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\",\n absSendTime: \"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\",\n dependencyDescriptor:\n \"https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension\",\n audioLevelIndication: \"urn:ietf:params:rtp-hdrext:ssrc-audio-level\",\n videoOrientation: \"urn:3gpp:video-orientation\",\n} as const;\n\nexport type TransportWideCCPayload = number;\n\nexport type AudioLevelIndicationPayload = { v: boolean; level: number };\nexport interface videoOrientationPayload {\n /**\n Camera: indicates the direction of the camera used for this video stream. It can be used by the MTSI client in\n receiver to e.g. display the received video differently depending on the source camera.\n 0: Front-facing camera, facing the user. If camera direction is unknown by the sending MTSI client in the terminal\n then this is the default value used.\n 1: Back-facing camera, facing away from the user. \n */\n c: number;\n /**\n F = Flip: indicates a horizontal (left-right flip) mirror operation on the video as sent on the link.\n 0: No flip operation. If the sending MTSI client in terminal does not know if a horizontal mirror operation is\n necessary, then this is the default value used.\n 1: Horizontal flip operation \n */\n f: number;\n /**\n R1, R0 = Rotation: indicates the rotation of the video as transmitted on the link. The receiver should rotate the video to\n compensate that rotation. E.g. a 90° Counter Clockwise rotation should be compensated by the receiver with a 90°\n Clockwise rotation prior to displaying. \n\n +----+----+-----------------------------------------------+------------------------------+\n | R1 | R0 | Rotation of the video as sent on the link | Rotation on the receiver |\n | | | | before display |\n +----+----+-----------------------------------------------+------------------------------+\n | 0 | 0 | 0° rotation | None |\n +----+----+-----------------------------------------------+------------------------------+\n | 0 | 1 | 90° Counter Clockwise (CCW) rotation or 270° | 90° Clockwise (CW) rotation |\n | | | Clockwise (CW) rotation | |\n +----+----+-----------------------------------------------+------------------------------+\n | 1 | 0 | 180° CCW rotation or 180° CW rotation | 180° CW rotation |\n +----+----+-----------------------------------------------+------------------------------+\n | 1 | 1 | 270° CCW rotation or 90° CW rotation | 90° CCW rotation |\n +----+----+-----------------------------------------------+------------------------------+\n\n */\n r1: number;\n r0: number;\n}\n\nexport interface Extensions {\n [uri: string]: any;\n}\n\nexport function rtpHeaderExtensionsParser(\n extensions: Extension[],\n extIdUriMap: { [id: number]: string },\n): Extensions {\n return extensions\n .map((extension) => {\n const uri = extIdUriMap[extension.id];\n if (!uri) {\n return { uri: \"unknown\", value: extension.payload };\n }\n switch (uri) {\n case RTP_EXTENSION_URI.sdesMid:\n case RTP_EXTENSION_URI.sdesRTPStreamID:\n case RTP_EXTENSION_URI.repairedRtpStreamId:\n return { uri, value: deserializeString(extension.payload) };\n case RTP_EXTENSION_URI.transportWideCC:\n return { uri, value: deserializeUint16BE(extension.payload) };\n case RTP_EXTENSION_URI.absSendTime:\n return {\n uri,\n value: deserializeAbsSendTime(extension.payload),\n };\n case RTP_EXTENSION_URI.audioLevelIndication: {\n return {\n uri,\n value: deserializeAudioLevelIndication(extension.payload),\n };\n }\n case RTP_EXTENSION_URI.videoOrientation:\n return { uri, value: deserializeVideoOrientation(extension.payload) };\n default:\n return { uri, value: extension.payload };\n }\n })\n .reduce((acc: { [uri: string]: any }, cur) => {\n if (cur) acc[cur.uri] = cur.value;\n return acc;\n }, {});\n}\n\nexport function serializeSdesMid(id: string) {\n return Buffer.from(id);\n}\n\nexport function serializeSdesRTPStreamID(id: string) {\n return Buffer.from(id);\n}\n\nexport function serializeRepairedRtpStreamId(id: string) {\n return Buffer.from(id);\n}\n\nexport function serializeTransportWideCC(transportSequenceNumber: number) {\n return bufferWriter([2], [transportSequenceNumber]);\n}\n\nexport function serializeAbsSendTime(ntpTime: bigint) {\n const buf = Buffer.alloc(3);\n const time = (ntpTime >> 14n) & 0x00ffffffn;\n buf.writeUIntBE(Number(time), 0, 3);\n return buf;\n}\n\nexport function serializeAudioLevelIndication(level: number) {\n const stream = new BitStream(Buffer.alloc(1));\n stream.writeBits(1, 1);\n stream.writeBits(7, level);\n\n return stream.uint8Array;\n}\n\nexport function deserializeString(buf: Buffer) {\n return buf.toString();\n}\n\nexport function deserializeUint16BE(buf: Buffer) {\n return buf.readUInt16BE();\n}\n\nexport function deserializeAbsSendTime(buf: Buffer) {\n return bufferReader(buf, [3])[0];\n}\n\nexport function deserializeAudioLevelIndication(buf: Buffer) {\n const stream = new BitStream(buf);\n const value: AudioLevelIndicationPayload = {\n v: stream.readBits(1) === 1,\n level: stream.readBits(7),\n };\n return value;\n}\n\nexport function deserializeVideoOrientation(payload: Buffer) {\n const stream = new BitStream(payload);\n stream.readBits(4);\n const value: videoOrientationPayload = {\n c: stream.readBits(1),\n f: stream.readBits(1),\n r1: stream.readBits(1),\n r0: stream.readBits(1),\n };\n return value;\n}\n"]}
|