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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rtp.js","sourceRoot":"","sources":["../../../../../../rtp/src/processor_v2/source/rtp.ts"],"names":[],"mappings":";;;AAAA,qCAA+C;AAG/C,iCAAsC;AAOtC,MAAa,eAAgB,SAAQ,mBAAuB;IAG1D,YAAY,EAAsB,EAAE,UAAoC,EAAE;QACxE,KAAK,EAAE,CAAC;QAHO,aAAQ,GAAG,IAAI,uBAAa,EAAE,CAAC;QAK9C,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;YACnB,IACE,OAAO,CAAC,WAAW,IAAI,SAAS;gBAChC,OAAO,CAAC,WAAW,KAAK,GAAG,CAAC,MAAM,CAAC,WAAW,EAC9C;gBACA,OAAO;aACR;YAED,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;CACF;AAtBD,0CAsBC","sourcesContent":["import Event, { EventDisposer } from \"rx.mini\";\n\nimport { RtpPacket } from \"../../rtp/rtp\";\nimport { SourceStream } from \"./base\";\n\nexport interface RtpOutput {\n rtp?: RtpPacket;\n eol?: boolean;\n}\n\nexport class RtpSourceStream extends SourceStream<RtpOutput> {\n private readonly disposer = new EventDisposer();\n\n constructor(ev: Event<[RtpPacket]>, options: { payloadType?: number } = {}) {\n super();\n\n ev.subscribe((rtp) => {\n if (\n options.payloadType != undefined &&\n options.payloadType !== rtp.header.payloadType\n ) {\n return;\n }\n\n this.write({ rtp });\n }).disposer(this.disposer);\n }\n\n async stop() {\n this.controller.enqueue({ eol: true });\n this.disposer.dispose();\n }\n}\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { ReadableStream, WritableStream } from "stream/web";
|
|
4
|
+
import { SupportedCodec } from "../container/webm";
|
|
5
|
+
import { DepacketizerOutput } from "./depacketizer";
|
|
6
|
+
export declare type WebmLiveInput = DepacketizerOutput;
|
|
7
|
+
export declare type WebmLiveOutput = {
|
|
8
|
+
packet?: Buffer;
|
|
9
|
+
eol?: {
|
|
10
|
+
/**ms */
|
|
11
|
+
duration: number;
|
|
12
|
+
durationElement: Uint8Array;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export interface WebmLiveOption {
|
|
16
|
+
/**ms */
|
|
17
|
+
duration?: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class WebmLiveSink {
|
|
20
|
+
tracks: {
|
|
21
|
+
width?: number;
|
|
22
|
+
height?: number;
|
|
23
|
+
kind: "audio" | "video";
|
|
24
|
+
codec: SupportedCodec;
|
|
25
|
+
clockRate: number;
|
|
26
|
+
trackNumber: number;
|
|
27
|
+
}[];
|
|
28
|
+
private options;
|
|
29
|
+
private builder;
|
|
30
|
+
private queue;
|
|
31
|
+
private relativeTimestamp;
|
|
32
|
+
private timestamps;
|
|
33
|
+
private cuePoints;
|
|
34
|
+
private position;
|
|
35
|
+
stopped: boolean;
|
|
36
|
+
audioStream: WritableStream<WebmLiveInput>;
|
|
37
|
+
videoStream: WritableStream<WebmLiveInput>;
|
|
38
|
+
webmStream: ReadableStream<WebmLiveOutput>;
|
|
39
|
+
private controller;
|
|
40
|
+
constructor(tracks: {
|
|
41
|
+
width?: number;
|
|
42
|
+
height?: number;
|
|
43
|
+
kind: "audio" | "video";
|
|
44
|
+
codec: SupportedCodec;
|
|
45
|
+
clockRate: number;
|
|
46
|
+
trackNumber: number;
|
|
47
|
+
}[], options?: WebmLiveOption);
|
|
48
|
+
private init;
|
|
49
|
+
private onFrameReceived;
|
|
50
|
+
private stop;
|
|
51
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WebmLiveSink = void 0;
|
|
7
|
+
const debug_1 = __importDefault(require("debug"));
|
|
8
|
+
const web_1 = require("stream/web");
|
|
9
|
+
const __1 = require("..");
|
|
10
|
+
const webm_1 = require("../container/webm");
|
|
11
|
+
const sourcePath = `werift-rtp : packages/rtp/src/processor_v2/webmLive.ts`;
|
|
12
|
+
const log = (0, debug_1.default)(sourcePath);
|
|
13
|
+
class WebmLiveSink {
|
|
14
|
+
constructor(tracks, options = {}) {
|
|
15
|
+
this.tracks = tracks;
|
|
16
|
+
this.options = options;
|
|
17
|
+
this.queue = new __1.PromiseQueue();
|
|
18
|
+
this.relativeTimestamp = 0;
|
|
19
|
+
this.timestamps = {};
|
|
20
|
+
this.cuePoints = [];
|
|
21
|
+
this.position = 0;
|
|
22
|
+
this.stopped = false;
|
|
23
|
+
this.builder = new webm_1.WEBMBuilder(tracks);
|
|
24
|
+
tracks.forEach((t) => {
|
|
25
|
+
this.timestamps[t.trackNumber] = new ClusterTimestamp(t.clockRate);
|
|
26
|
+
});
|
|
27
|
+
const createStream = (trackNumber) => new web_1.WritableStream({
|
|
28
|
+
write: ({ frame, eol }) => {
|
|
29
|
+
if (this.stopped)
|
|
30
|
+
return;
|
|
31
|
+
if (!frame) {
|
|
32
|
+
if (eol) {
|
|
33
|
+
this.stop();
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
this.queue.push(() => this.onFrameReceived({ ...frame, trackNumber }));
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
const audioTrack = tracks.find((t) => t.kind === "audio");
|
|
41
|
+
if (audioTrack) {
|
|
42
|
+
this.audioStream = createStream(audioTrack.trackNumber);
|
|
43
|
+
}
|
|
44
|
+
const videoTrack = tracks.find((t) => t.kind === "video");
|
|
45
|
+
if (videoTrack) {
|
|
46
|
+
this.videoStream = createStream(videoTrack.trackNumber);
|
|
47
|
+
}
|
|
48
|
+
this.webmStream = new web_1.ReadableStream({
|
|
49
|
+
start: (controller) => {
|
|
50
|
+
this.controller = controller;
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
this.queue.push(() => this.init());
|
|
54
|
+
}
|
|
55
|
+
async init() {
|
|
56
|
+
const staticPart = Buffer.concat([
|
|
57
|
+
this.builder.ebmlHeader,
|
|
58
|
+
this.builder.createSegment(this.options.duration),
|
|
59
|
+
]);
|
|
60
|
+
this.controller.enqueue({ packet: staticPart });
|
|
61
|
+
this.position += staticPart.length;
|
|
62
|
+
const video = this.tracks.find((t) => t.kind === "video");
|
|
63
|
+
if (video) {
|
|
64
|
+
this.cuePoints.push(new CuePoint(this.builder, video.trackNumber, 0.0, this.position));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async onFrameReceived(frame) {
|
|
68
|
+
const track = this.tracks.find((t) => t.trackNumber === frame.trackNumber);
|
|
69
|
+
if (!track) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const timestampManager = this.timestamps[track.trackNumber];
|
|
73
|
+
let elapsed = timestampManager.update(frame.timestamp);
|
|
74
|
+
if ((track.kind === "video" && frame.isKeyframe) ||
|
|
75
|
+
elapsed > MaxSinged16Int) {
|
|
76
|
+
this.relativeTimestamp += elapsed;
|
|
77
|
+
const cluster = this.builder.createCluster(this.relativeTimestamp);
|
|
78
|
+
this.controller.enqueue({ packet: Buffer.from(cluster) });
|
|
79
|
+
if (elapsed !== 0) {
|
|
80
|
+
this.cuePoints.push(new CuePoint(this.builder, track.trackNumber, this.relativeTimestamp, this.position));
|
|
81
|
+
}
|
|
82
|
+
this.position += cluster.length;
|
|
83
|
+
Object.values(this.timestamps).forEach((t) => t.reset());
|
|
84
|
+
elapsed = timestampManager.update(frame.timestamp);
|
|
85
|
+
}
|
|
86
|
+
const block = this.builder.createSimpleBlock(frame.data, frame.isKeyframe, track.trackNumber, elapsed);
|
|
87
|
+
this.controller.enqueue({ packet: block });
|
|
88
|
+
this.position += block.length;
|
|
89
|
+
const [cuePoint] = this.cuePoints.slice(-1);
|
|
90
|
+
if (cuePoint) {
|
|
91
|
+
cuePoint.blockNumber++;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async stop() {
|
|
95
|
+
if (this.stopped) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.stopped = true;
|
|
99
|
+
log("stop");
|
|
100
|
+
const cues = this.builder.createCues(this.cuePoints.map((c) => c.build()));
|
|
101
|
+
this.controller.enqueue({ packet: Buffer.from(cues) });
|
|
102
|
+
const latestTimestamp = Object.values(this.timestamps).sort((a, b) => a.elapsed - b.elapsed)[0].elapsed;
|
|
103
|
+
const duration = this.relativeTimestamp + latestTimestamp;
|
|
104
|
+
const durationElement = this.builder.createDuration(duration);
|
|
105
|
+
this.controller.enqueue({ eol: { duration, durationElement } });
|
|
106
|
+
this.controller.close();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.WebmLiveSink = WebmLiveSink;
|
|
110
|
+
class ClusterTimestamp {
|
|
111
|
+
constructor(clockRate) {
|
|
112
|
+
this.clockRate = clockRate;
|
|
113
|
+
this.elapsed = 0;
|
|
114
|
+
}
|
|
115
|
+
reset() {
|
|
116
|
+
this.baseTimestamp = undefined;
|
|
117
|
+
}
|
|
118
|
+
update(timestamp) {
|
|
119
|
+
if (this.baseTimestamp == undefined) {
|
|
120
|
+
this.baseTimestamp = timestamp;
|
|
121
|
+
}
|
|
122
|
+
const rotate = Math.abs(timestamp - this.baseTimestamp) > (Max32Uint / 4) * 3;
|
|
123
|
+
if (rotate) {
|
|
124
|
+
log("rotate", { baseTimestamp: this.baseTimestamp, timestamp });
|
|
125
|
+
}
|
|
126
|
+
const elapsed = rotate
|
|
127
|
+
? timestamp + Max32Uint - this.baseTimestamp
|
|
128
|
+
: timestamp - this.baseTimestamp;
|
|
129
|
+
this.elapsed = (0, __1.int)((elapsed / this.clockRate) * 1000);
|
|
130
|
+
return this.elapsed;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
class CuePoint {
|
|
134
|
+
constructor(builder, trackNumber, relativeTimestamp, position) {
|
|
135
|
+
this.builder = builder;
|
|
136
|
+
this.trackNumber = trackNumber;
|
|
137
|
+
this.relativeTimestamp = relativeTimestamp;
|
|
138
|
+
this.position = position;
|
|
139
|
+
/**
|
|
140
|
+
* cuesの後のclusterのあるべき位置
|
|
141
|
+
* cuesはclusterの前に挿入される
|
|
142
|
+
*/
|
|
143
|
+
this.cuesLength = 0;
|
|
144
|
+
this.blockNumber = 0;
|
|
145
|
+
}
|
|
146
|
+
build() {
|
|
147
|
+
return this.builder.createCuePoint(this.relativeTimestamp, this.trackNumber, this.position - 48 + this.cuesLength, this.blockNumber);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**4294967295 */
|
|
151
|
+
const Max32Uint = Number(0x01n << 32n) - 1;
|
|
152
|
+
/**32767 */
|
|
153
|
+
const MaxSinged16Int = (0x01 << 16) / 2 - 1;
|
|
154
|
+
//# sourceMappingURL=webmLive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webmLive.js","sourceRoot":"","sources":["../../../../../rtp/src/processor_v2/webmLive.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport {\n ReadableStream,\n ReadableStreamController,\n WritableStream,\n} from \"stream/web\";\n\nimport { int, PromiseQueue } from \"..\";\nimport { SupportedCodec, WEBMBuilder } from \"../container/webm\";\nimport { DepacketizerOutput } from \"./depacketizer\";\n\nconst sourcePath = `werift-rtp : packages/rtp/src/processor_v2/webmLive.ts`;\nconst log = debug(sourcePath);\n\nexport type WebmLiveInput = DepacketizerOutput;\n\nexport type WebmLiveOutput = {\n packet?: Buffer;\n eol?: {\n /**ms */\n duration: number;\n durationElement: Uint8Array;\n };\n};\n\nexport interface WebmLiveOption {\n /**ms */\n duration?: number;\n}\n\nexport class WebmLiveSink {\n private builder: WEBMBuilder;\n private queue = new PromiseQueue();\n private relativeTimestamp = 0;\n private timestamps: { [pt: number]: ClusterTimestamp } = {};\n private cuePoints: CuePoint[] = [];\n private position = 0;\n stopped = false;\n audioStream!: WritableStream<WebmLiveInput>;\n videoStream!: WritableStream<WebmLiveInput>;\n webmStream: ReadableStream<WebmLiveOutput>;\n private controller!: ReadableStreamController<WebmLiveOutput>;\n\n constructor(\n public tracks: {\n width?: number;\n height?: number;\n kind: \"audio\" | \"video\";\n codec: SupportedCodec;\n clockRate: number;\n trackNumber: number;\n }[],\n private options: WebmLiveOption = {}\n ) {\n this.builder = new WEBMBuilder(tracks);\n\n tracks.forEach((t) => {\n this.timestamps[t.trackNumber] = new ClusterTimestamp(t.clockRate);\n });\n\n const createStream = (trackNumber: number) =>\n new WritableStream({\n write: ({ frame, eol }: WebmLiveInput) => {\n if (this.stopped) return;\n if (!frame) {\n if (eol) {\n this.stop();\n }\n return;\n }\n\n this.queue.push(() =>\n this.onFrameReceived({ ...frame, trackNumber })\n );\n },\n });\n\n const audioTrack = tracks.find((t) => t.kind === \"audio\");\n if (audioTrack) {\n this.audioStream = createStream(audioTrack.trackNumber);\n }\n\n const videoTrack = tracks.find((t) => t.kind === \"video\");\n if (videoTrack) {\n this.videoStream = createStream(videoTrack.trackNumber);\n }\n\n this.webmStream = new ReadableStream<WebmLiveOutput>({\n start: (controller) => {\n this.controller = controller;\n },\n });\n\n this.queue.push(() => this.init());\n }\n\n private async init() {\n const staticPart = Buffer.concat([\n this.builder.ebmlHeader,\n this.builder.createSegment(this.options.duration),\n ]);\n this.controller.enqueue({ packet: staticPart });\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 async onFrameReceived(\n frame: WebmLiveInput[\"frame\"] & { trackNumber: number }\n ) {\n const track = this.tracks.find((t) => t.trackNumber === frame.trackNumber);\n if (!track) {\n return;\n }\n\n const timestampManager = this.timestamps[track.trackNumber];\n let elapsed = timestampManager.update(frame.timestamp);\n\n if (\n (track.kind === \"video\" && frame.isKeyframe) ||\n elapsed > MaxSinged16Int\n ) {\n this.relativeTimestamp += elapsed;\n\n const cluster = this.builder.createCluster(this.relativeTimestamp);\n this.controller.enqueue({ packet: Buffer.from(cluster) });\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.position += cluster.length;\n Object.values(this.timestamps).forEach((t) => t.reset());\n elapsed = timestampManager.update(frame.timestamp);\n }\n\n const block = this.builder.createSimpleBlock(\n frame.data,\n frame.isKeyframe,\n track.trackNumber,\n elapsed\n );\n this.controller.enqueue({ packet: block });\n this.position += block.length;\n const [cuePoint] = this.cuePoints.slice(-1);\n if (cuePoint) {\n cuePoint.blockNumber++;\n }\n }\n\n private async stop() {\n if (this.stopped) {\n return;\n }\n this.stopped = true;\n\n log(\"stop\");\n\n const cues = this.builder.createCues(this.cuePoints.map((c) => c.build()));\n this.controller.enqueue({ packet: Buffer.from(cues) });\n\n const latestTimestamp = Object.values(this.timestamps).sort(\n (a, b) => a.elapsed - b.elapsed\n )[0].elapsed;\n const duration = this.relativeTimestamp + latestTimestamp;\n const durationElement = this.builder.createDuration(duration);\n this.controller.enqueue({ eol: { duration, durationElement } });\n\n this.controller.close();\n }\n}\n\nclass ClusterTimestamp {\n baseTimestamp?: number;\n elapsed = 0;\n\n constructor(public clockRate: number) {}\n\n reset() {\n this.baseTimestamp = undefined;\n }\n\n update(timestamp: number) {\n if (this.baseTimestamp == undefined) {\n this.baseTimestamp = timestamp;\n }\n const rotate =\n Math.abs(timestamp - this.baseTimestamp) > (Max32Uint / 4) * 3;\n\n if (rotate) {\n log(\"rotate\", { baseTimestamp: this.baseTimestamp, timestamp });\n }\n\n const elapsed = rotate\n ? timestamp + Max32Uint - this.baseTimestamp\n : timestamp - this.baseTimestamp;\n\n this.elapsed = int((elapsed / this.clockRate) * 1000);\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: WEBMBuilder,\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 */\nconst Max32Uint = Number(0x01n << 32n) - 1;\n/**32767 */\nconst MaxSinged16Int = (0x01 << 16) / 2 - 1;\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const RTCP_HEADER_SIZE = 4;
|
|
3
3
|
export declare class RtcpHeader {
|
|
4
4
|
version: number;
|
|
5
5
|
padding: boolean;
|
|
6
6
|
count: number;
|
|
7
7
|
type: number;
|
|
8
|
+
/**このパケットの長さは、ヘッダーと任意のパディングを含む32ビットワードから 1を引いたものである */
|
|
8
9
|
length: number;
|
|
9
10
|
constructor(props?: Partial<RtcpHeader>);
|
|
10
11
|
serialize(): Buffer;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RtcpHeader = exports.
|
|
3
|
+
exports.RtcpHeader = exports.RTCP_HEADER_SIZE = void 0;
|
|
4
4
|
const src_1 = require("../../../common/src");
|
|
5
|
-
exports.
|
|
5
|
+
exports.RTCP_HEADER_SIZE = 4;
|
|
6
6
|
/*
|
|
7
7
|
* 0 1 2 3
|
|
8
8
|
* 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
|
|
@@ -16,6 +16,7 @@ class RtcpHeader {
|
|
|
16
16
|
this.padding = false;
|
|
17
17
|
this.count = 0;
|
|
18
18
|
this.type = 0;
|
|
19
|
+
/**このパケットの長さは、ヘッダーと任意のパディングを含む32ビットワードから 1を引いたものである */
|
|
19
20
|
this.length = 0;
|
|
20
21
|
Object.assign(this, props);
|
|
21
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/header.ts"],"names":[],"mappings":";;;AAAA,6CAK6B;AAEhB,QAAA,
|
|
1
|
+
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/header.ts"],"names":[],"mappings":";;;AAAA,6CAK6B;AAEhB,QAAA,gBAAgB,GAAG,CAAC,CAAC;AAElC;;;;;;GAMG;AAEH,MAAa,UAAU;IAQrB,YAAY,QAA6B,EAAE;QAP3C,YAAO,GAAW,CAAC,CAAC;QACpB,YAAO,GAAY,KAAK,CAAC;QACzB,UAAK,GAAW,CAAC,CAAC;QAClB,SAAI,GAAW,CAAC,CAAC;QACjB,sDAAsD;QACtD,WAAM,GAAW,CAAC,CAAC;QAGjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,MAAM,MAAM,GAAG,IAAI,eAAS,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5E,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,GAAW;QAC5B,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAA,kBAAY,EAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAA,YAAM,EAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,IAAA,YAAM,EAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAA,YAAM,EAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,OAAO,IAAI,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;CACF;AA5BD,gCA4BC","sourcesContent":["import {\n BitWriter,\n bufferReader,\n bufferWriter,\n getBit,\n} from \"../../../common/src\";\n\nexport const RTCP_HEADER_SIZE = 4;\n\n/*\n * 0 1 2 3\n * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * |V=2|P| RC | PT | length |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class RtcpHeader {\n version: number = 2;\n padding: boolean = false;\n count: number = 0;\n type: number = 0;\n /**このパケットの長さは、ヘッダーと任意のパディングを含む32ビットワードから 1を引いたものである */\n length: number = 0;\n\n constructor(props: Partial<RtcpHeader> = {}) {\n Object.assign(this, props);\n }\n\n serialize() {\n const v_p_rc = new BitWriter(8);\n v_p_rc.set(2, 0, this.version);\n if (this.padding) v_p_rc.set(1, 2, 1);\n v_p_rc.set(5, 3, this.count);\n const buf = bufferWriter([1, 1, 2], [v_p_rc.value, this.type, this.length]);\n return buf;\n }\n\n static deSerialize(buf: Buffer) {\n const [v_p_rc, type, length] = bufferReader(buf, [1, 1, 2]);\n const version = getBit(v_p_rc, 0, 2);\n const padding = getBit(v_p_rc, 2, 1) > 0;\n const count = getBit(v_p_rc, 3, 5);\n return new RtcpHeader({ version, padding, count, type, length });\n }\n}\n"]}
|
package/lib/rtp/src/rtcp/rr.d.ts
CHANGED
|
@@ -14,7 +14,9 @@ export declare class RtcpReceiverInfo {
|
|
|
14
14
|
packetsLost: number;
|
|
15
15
|
highestSequence: number;
|
|
16
16
|
jitter: number;
|
|
17
|
+
/**last SR */
|
|
17
18
|
lsr: number;
|
|
19
|
+
/**delay since last SR */
|
|
18
20
|
dlsr: number;
|
|
19
21
|
constructor(props?: Partial<RtcpReceiverInfo>);
|
|
20
22
|
serialize(): Buffer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rr.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/rr.ts"],"names":[],"mappings":";;;;;;AAAA,yDAAiC;AAEjC,6CAAiE;AACjE,iCAA6C;AAE7C,MAAa,YAAY;IAMvB,YAAY,QAA+B,EAAE;QAL7C,SAAI,GAAW,CAAC,CAAC;QACjB,YAAO,GAAuB,EAAE,CAAC;QAExB,SAAI,GAAG,YAAY,CAAC,IAAI,CAAC;QAGhC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,IAAI,OAAO,GAAG,IAAA,kBAAY,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YACtB,OAAO;YACP,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;SACpD,CAAC,CAAC;QACH,OAAO,0BAAmB,CAAC,SAAS,CAClC,YAAY,CAAC,IAAI,EACjB,IAAI,CAAC,OAAO,CAAC,MAAM,EACnB,OAAO,EACP,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAC/B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY,EAAE,KAAa;QAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,IAAA,kBAAY,EAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACxB,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACtE,GAAG,IAAI,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;;AAjCH,oCAkCC;AA/BiB,iBAAI,GAAG,GAAG,CAAC;AAiC7B,MAAa,gBAAgB;
|
|
1
|
+
{"version":3,"file":"rr.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/rr.ts"],"names":[],"mappings":";;;;;;AAAA,yDAAiC;AAEjC,6CAAiE;AACjE,iCAA6C;AAE7C,MAAa,YAAY;IAMvB,YAAY,QAA+B,EAAE;QAL7C,SAAI,GAAW,CAAC,CAAC;QACjB,YAAO,GAAuB,EAAE,CAAC;QAExB,SAAI,GAAG,YAAY,CAAC,IAAI,CAAC;QAGhC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,IAAI,OAAO,GAAG,IAAA,kBAAY,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YACtB,OAAO;YACP,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;SACpD,CAAC,CAAC;QACH,OAAO,0BAAmB,CAAC,SAAS,CAClC,YAAY,CAAC,IAAI,EACjB,IAAI,CAAC,OAAO,CAAC,MAAM,EACnB,OAAO,EACP,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAC/B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY,EAAE,KAAa;QAC5C,MAAM,CAAC,IAAI,CAAC,GAAG,IAAA,kBAAY,EAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACxB,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACtE,GAAG,IAAI,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;;AAjCH,oCAkCC;AA/BiB,iBAAI,GAAG,GAAG,CAAC;AAiC7B,MAAa,gBAAgB;IAW3B,YAAY,QAAmC,EAAE;QAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,OAAO,IAAA,kBAAY,EACjB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACrB;YACE,IAAI,CAAC,IAAI;YACT,IAAI,CAAC,YAAY;YACjB,IAAI,CAAC,WAAW;YAChB,IAAI,CAAC,eAAe;YACpB,IAAI,CAAC,MAAM;YACX,IAAI,CAAC,GAAG;YACR,IAAI,CAAC,IAAI;SACV,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,MAAM,CACJ,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,MAAM,EACN,GAAG,EACH,IAAI,EACL,GAAG,IAAA,kBAAY,EAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE9C,OAAO,IAAI,gBAAgB,CAAC;YAC1B,IAAI;YACJ,YAAY;YACZ,WAAW;YACX,eAAe;YACf,MAAM;YACN,GAAG;YACH,IAAI;SACL,CAAC,CAAC;IACL,CAAC;CACF;AAnDD,4CAmDC","sourcesContent":["import range from \"lodash/range\";\n\nimport { bufferReader, bufferWriter } from \"../../../common/src\";\nimport { RtcpPacketConverter } from \"./rtcp\";\n\nexport class RtcpRrPacket {\n ssrc: number = 0;\n reports: RtcpReceiverInfo[] = [];\n static readonly type = 201;\n readonly type = RtcpRrPacket.type;\n\n constructor(props: Partial<RtcpRrPacket> = {}) {\n Object.assign(this, props);\n }\n\n serialize() {\n let payload = bufferWriter([4], [this.ssrc]);\n payload = Buffer.concat([\n payload,\n ...this.reports.map((report) => report.serialize()),\n ]);\n return RtcpPacketConverter.serialize(\n RtcpRrPacket.type,\n this.reports.length,\n payload,\n Math.floor(payload.length / 4)\n );\n }\n\n static deSerialize(data: Buffer, count: number) {\n const [ssrc] = bufferReader(data, [4]);\n let pos = 4;\n const reports: RtcpReceiverInfo[] = [];\n range(count).forEach(() => {\n reports.push(RtcpReceiverInfo.deSerialize(data.slice(pos, pos + 24)));\n pos += 24;\n });\n return new RtcpRrPacket({ ssrc, reports });\n }\n}\n\nexport class RtcpReceiverInfo {\n ssrc!: number;\n fractionLost!: number;\n packetsLost!: number;\n highestSequence!: number;\n jitter!: number;\n /**last SR */\n lsr!: number;\n /**delay since last SR */\n dlsr!: number;\n\n constructor(props: Partial<RtcpReceiverInfo> = {}) {\n Object.assign(this, props);\n }\n\n serialize() {\n return bufferWriter(\n [4, 1, 3, 4, 4, 4, 4],\n [\n this.ssrc,\n this.fractionLost,\n this.packetsLost,\n this.highestSequence,\n this.jitter,\n this.lsr,\n this.dlsr,\n ]\n );\n }\n\n static deSerialize(data: Buffer) {\n const [\n ssrc,\n fractionLost,\n packetsLost,\n highestSequence,\n jitter,\n lsr,\n dlsr,\n ] = bufferReader(data, [4, 1, 3, 4, 4, 4, 4]);\n\n return new RtcpReceiverInfo({\n ssrc,\n fractionLost,\n packetsLost,\n highestSequence,\n jitter,\n lsr,\n dlsr,\n });\n }\n}\n"]}
|
package/lib/rtp/src/rtcp/rtcp.js
CHANGED
|
@@ -27,12 +27,12 @@ class RtcpPacketConverter {
|
|
|
27
27
|
let pos = 0;
|
|
28
28
|
const packets = [];
|
|
29
29
|
while (pos < data.length) {
|
|
30
|
-
const header = header_1.RtcpHeader.deSerialize(data.
|
|
31
|
-
pos += header_1.
|
|
32
|
-
let payload = data.
|
|
30
|
+
const header = header_1.RtcpHeader.deSerialize(data.subarray(pos, pos + header_1.RTCP_HEADER_SIZE));
|
|
31
|
+
pos += header_1.RTCP_HEADER_SIZE;
|
|
32
|
+
let payload = data.subarray(pos);
|
|
33
33
|
pos += header.length * 4;
|
|
34
34
|
if (header.padding) {
|
|
35
|
-
payload = payload.
|
|
35
|
+
payload = payload.subarray(0, payload.length - payload.subarray(-1)[0]);
|
|
36
36
|
}
|
|
37
37
|
try {
|
|
38
38
|
switch (header.type) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtcp.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/rtcp.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,
|
|
1
|
+
{"version":3,"file":"rtcp.js","sourceRoot":"","sources":["../../../../../rtp/src/rtcp/rtcp.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,qCAAwD;AACxD,iCAAqD;AACrD,6BAAoC;AACpC,mCAAqD;AACrD,iCAAqD;AACrD,6BAAoC;AAEpC,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,0CAA0C,CAAC,CAAC;AAS9D,MAAa,mBAAmB;IAC9B,MAAM,CAAC,SAAS,CACd,IAAY,EACZ,KAAa,EACb,OAAe,EACf,MAAc;QAEd,MAAM,MAAM,GAAG,IAAI,mBAAU,CAAC;YAC5B,IAAI;YACJ,KAAK;YACL,OAAO,EAAE,CAAC;YACV,MAAM;SACP,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;YACxB,MAAM,MAAM,GAAG,mBAAU,CAAC,WAAW,CACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,yBAAgB,CAAC,CAC3C,CAAC;YACF,GAAG,IAAI,yBAAgB,CAAC;YAExB,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACjC,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAEzB,IAAI,MAAM,CAAC,OAAO,EAAE;gBAClB,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACzE;YAED,IAAI;gBACF,QAAQ,MAAM,CAAC,IAAI,EAAE;oBACnB,KAAK,iBAAY,CAAC,IAAI;wBACpB,OAAO,CAAC,IAAI,CAAC,iBAAY,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;wBAC9D,MAAM;oBACR,KAAK,iBAAY,CAAC,IAAI;wBACpB,OAAO,CAAC,IAAI,CAAC,iBAAY,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;wBAC9D,MAAM;oBACR,KAAK,kCAA2B,CAAC,IAAI;wBACnC,OAAO,CAAC,IAAI,CACV,kCAA2B,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CACzD,CAAC;wBACF,MAAM;oBACR,KAAK,kCAA0B,CAAC,IAAI;wBAClC,OAAO,CAAC,IAAI,CACV,kCAA0B,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CACxD,CAAC;wBACF,MAAM;oBACR,KAAK,kCAA2B,CAAC,IAAI;wBACnC,OAAO,CAAC,IAAI,CACV,kCAA2B,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CACzD,CAAC;wBACF,MAAM;oBACR;wBACE,2CAA2C;wBAC3C,MAAM;iBACT;aACF;YAAC,OAAO,KAAK,EAAE;gBACd,GAAG,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;aAChC;SACF;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AApED,kDAoEC","sourcesContent":["import debug from \"debug\";\n\nimport { RTCP_HEADER_SIZE, RtcpHeader } from \"./header\";\nimport { RtcpPayloadSpecificFeedback } from \"./psfb\";\nimport { RtcpRrPacket } from \"./rr\";\nimport { RtcpTransportLayerFeedback } from \"./rtpfb\";\nimport { RtcpSourceDescriptionPacket } from \"./sdes\";\nimport { RtcpSrPacket } from \"./sr\";\n\nconst log = debug(\"werift-rtp:packages/rtp/src/rtcp/rtcp.ts\");\n\nexport type RtcpPacket =\n | RtcpRrPacket\n | RtcpSrPacket\n | RtcpPayloadSpecificFeedback\n | RtcpSourceDescriptionPacket\n | RtcpTransportLayerFeedback;\n\nexport class RtcpPacketConverter {\n static serialize(\n type: number,\n count: number,\n payload: Buffer,\n length: number\n ) {\n const header = new RtcpHeader({\n type,\n count,\n version: 2,\n length,\n });\n const buf = header.serialize();\n return Buffer.concat([buf, payload]);\n }\n\n static deSerialize(data: Buffer) {\n let pos = 0;\n const packets: RtcpPacket[] = [];\n\n while (pos < data.length) {\n const header = RtcpHeader.deSerialize(\n data.subarray(pos, pos + RTCP_HEADER_SIZE)\n );\n pos += RTCP_HEADER_SIZE;\n\n let payload = data.subarray(pos);\n pos += header.length * 4;\n\n if (header.padding) {\n payload = payload.subarray(0, payload.length - payload.subarray(-1)[0]);\n }\n\n try {\n switch (header.type) {\n case RtcpSrPacket.type:\n packets.push(RtcpSrPacket.deSerialize(payload, header.count));\n break;\n case RtcpRrPacket.type:\n packets.push(RtcpRrPacket.deSerialize(payload, header.count));\n break;\n case RtcpSourceDescriptionPacket.type:\n packets.push(\n RtcpSourceDescriptionPacket.deSerialize(payload, header)\n );\n break;\n case RtcpTransportLayerFeedback.type:\n packets.push(\n RtcpTransportLayerFeedback.deSerialize(payload, header)\n );\n break;\n case RtcpPayloadSpecificFeedback.type:\n packets.push(\n RtcpPayloadSpecificFeedback.deSerialize(payload, header)\n );\n break;\n default:\n // log(\"unknown rtcp packet\", header.type);\n break;\n }\n } catch (error) {\n log(\"deSerialize RTCP\", error);\n }\n }\n\n return packets;\n }\n}\n"]}
|
|
@@ -7,7 +7,7 @@ exports.RtcpTransportLayerFeedback = void 0;
|
|
|
7
7
|
const debug_1 = __importDefault(require("debug"));
|
|
8
8
|
const nack_1 = require("./nack");
|
|
9
9
|
const twcc_1 = require("./twcc");
|
|
10
|
-
const log = (0, debug_1.default)("werift/rtp/rtcp/rtpfb/index");
|
|
10
|
+
const log = (0, debug_1.default)("werift-rtp:packages/rtp/rtcp/rtpfb/index");
|
|
11
11
|
class RtcpTransportLayerFeedback {
|
|
12
12
|
constructor(props = {}) {
|
|
13
13
|
this.type = RtcpTransportLayerFeedback.type;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/rtpfb/index.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,iCAAqC;AACrC,iCAAyC;AAEzC,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/rtpfb/index.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAG1B,iCAAqC;AACrC,iCAAyC;AAEzC,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,0CAA0C,CAAC,CAAC;AAgB9D,MAAa,0BAA0B;IAMrC,YAAY,QAA6C,EAAE;QAJlD,SAAI,GAAG,0BAA0B,CAAC,IAAI,CAAC;QAK9C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC1C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAY,EAAE,MAAkB;QACjD,IAAI,QAA8B,CAAC;QAEnC,QAAQ,MAAM,CAAC,KAAK,EAAE;YACpB,KAAK,kBAAW,CAAC,KAAK;gBACpB,QAAQ,GAAG,kBAAW,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACjD,MAAM;YACR,KAAK,sBAAe,CAAC,KAAK;gBACxB,QAAQ,GAAG,sBAAe,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACrD,MAAM;YACR;gBACE,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1C,MAAM;SACT;QAED,OAAO,IAAI,0BAA0B,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;;AA/BH,gEAgCC;AA/BiB,+BAAI,GAAG,GAAG,CAAC","sourcesContent":["import debug from \"debug\";\n\nimport { RtcpHeader } from \"../header\";\nimport { GenericNack } from \"./nack\";\nimport { TransportWideCC } from \"./twcc\";\n\nconst log = debug(\"werift-rtp:packages/rtp/rtcp/rtpfb/index\");\n\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |V=2|P| FMT | PT | length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | SSRC of packet sender |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | SSRC of media source |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// : Feedback Control Information (FCI) :\n// : :\n\ntype Feedback = GenericNack | TransportWideCC;\n\nexport class RtcpTransportLayerFeedback {\n static readonly type = 205;\n readonly type = RtcpTransportLayerFeedback.type;\n feedback!: Feedback;\n header!: RtcpHeader;\n\n constructor(props: Partial<RtcpTransportLayerFeedback> = {}) {\n Object.assign(this, props);\n }\n\n serialize() {\n const payload = this.feedback.serialize();\n return payload;\n }\n\n static deSerialize(data: Buffer, header: RtcpHeader) {\n let feedback: Feedback | undefined;\n\n switch (header.count) {\n case GenericNack.count:\n feedback = GenericNack.deSerialize(data, header);\n break;\n case TransportWideCC.count:\n feedback = TransportWideCC.deSerialize(data, header);\n break;\n default:\n log(\"unknown rtpfb packet\", header.count);\n break;\n }\n\n return new RtcpTransportLayerFeedback({ feedback, header });\n }\n}\n"]}
|
|
@@ -7,6 +7,14 @@ exports.GenericNack = void 0;
|
|
|
7
7
|
const range_1 = __importDefault(require("lodash/range"));
|
|
8
8
|
const src_1 = require("../../../../common/src");
|
|
9
9
|
const header_1 = require("../header");
|
|
10
|
+
const _1 = require(".");
|
|
11
|
+
// 0 1 2 3
|
|
12
|
+
// 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
|
|
13
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
14
|
+
// | PID | BLP |
|
|
15
|
+
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
16
|
+
// Packet ID (PID)
|
|
17
|
+
// bitmask of following lost packets (BLP):
|
|
10
18
|
class GenericNack {
|
|
11
19
|
constructor(props = {}) {
|
|
12
20
|
this.count = GenericNack.count;
|
|
@@ -14,7 +22,7 @@ class GenericNack {
|
|
|
14
22
|
Object.assign(this, props);
|
|
15
23
|
if (!this.header) {
|
|
16
24
|
this.header = new header_1.RtcpHeader({
|
|
17
|
-
type:
|
|
25
|
+
type: _1.RtcpTransportLayerFeedback.type,
|
|
18
26
|
count: this.count,
|
|
19
27
|
version: 2,
|
|
20
28
|
});
|
|
@@ -25,7 +33,7 @@ class GenericNack {
|
|
|
25
33
|
const lost = (0, range_1.default)(8, data.length, 4)
|
|
26
34
|
.map((pos) => {
|
|
27
35
|
const lost = [];
|
|
28
|
-
const [pid, blp] = (0, src_1.bufferReader)(data.
|
|
36
|
+
const [pid, blp] = (0, src_1.bufferReader)(data.subarray(pos), [2, 2]);
|
|
29
37
|
lost.push(pid);
|
|
30
38
|
(0, range_1.default)(0, 16).forEach((d) => {
|
|
31
39
|
if ((blp >> d) & 1) {
|
|
@@ -43,8 +51,8 @@ class GenericNack {
|
|
|
43
51
|
});
|
|
44
52
|
}
|
|
45
53
|
serialize() {
|
|
46
|
-
const
|
|
47
|
-
const
|
|
54
|
+
const ssrcPair = (0, src_1.bufferWriter)([4, 4], [this.senderSsrc, this.mediaSourceSsrc]);
|
|
55
|
+
const fci = [];
|
|
48
56
|
if (this.lost.length > 0) {
|
|
49
57
|
let pid = this.lost[0], blp = 0;
|
|
50
58
|
this.lost.slice(1).forEach((p) => {
|
|
@@ -53,14 +61,14 @@ class GenericNack {
|
|
|
53
61
|
blp |= 1 << d;
|
|
54
62
|
}
|
|
55
63
|
else {
|
|
56
|
-
|
|
64
|
+
fci.push((0, src_1.bufferWriter)([2, 2], [pid, blp]));
|
|
57
65
|
pid = p;
|
|
58
66
|
blp = 0;
|
|
59
67
|
}
|
|
60
68
|
});
|
|
61
|
-
|
|
69
|
+
fci.push((0, src_1.bufferWriter)([2, 2], [pid, blp]));
|
|
62
70
|
}
|
|
63
|
-
const buf = Buffer.concat([
|
|
71
|
+
const buf = Buffer.concat([ssrcPair, Buffer.concat(fci)]);
|
|
64
72
|
this.header.length = buf.length / 4;
|
|
65
73
|
return Buffer.concat([this.header.serialize(), buf]);
|
|
66
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/rtpfb/nack.ts"],"names":[],"mappings":";;;;;;AAAA,yDAAiC;AAEjC,gDAAoE;AACpE,sCAAuC;
|
|
1
|
+
{"version":3,"file":"nack.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtcp/rtpfb/nack.ts"],"names":[],"mappings":"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","sourcesContent":["import range from \"lodash/range\";\n\nimport { bufferReader, bufferWriter } from \"../../../../common/src\";\nimport { RtcpHeader } from \"../header\";\nimport { RtcpTransportLayerFeedback } from \".\";\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// | PID | BLP |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n// Packet ID (PID)\n// bitmask of following lost packets (BLP):\n\nexport class GenericNack {\n static count = 1;\n readonly count = GenericNack.count;\n header!: RtcpHeader;\n senderSsrc!: number;\n mediaSourceSsrc!: number;\n lost: number[] = [];\n\n constructor(props: Partial<GenericNack> = {}) {\n Object.assign(this, props);\n if (!this.header) {\n this.header = new RtcpHeader({\n type: RtcpTransportLayerFeedback.type,\n count: this.count,\n version: 2,\n });\n }\n }\n\n static deSerialize(data: Buffer, header: RtcpHeader) {\n const [senderSsrc, mediaSourceSsrc] = bufferReader(data, [4, 4]);\n const lost = range(8, data.length, 4)\n .map((pos) => {\n const lost: number[] = [];\n const [pid, blp] = bufferReader(data.subarray(pos), [2, 2]);\n lost.push(pid);\n range(0, 16).forEach((d) => {\n if ((blp >> d) & 1) {\n lost.push(pid + d + 1);\n }\n });\n return lost;\n })\n .flatMap((v) => v);\n\n return new GenericNack({\n header,\n senderSsrc,\n mediaSourceSsrc,\n lost,\n });\n }\n\n serialize() {\n const ssrcPair = bufferWriter(\n [4, 4],\n [this.senderSsrc, this.mediaSourceSsrc]\n );\n\n const fci: Buffer[] = [];\n if (this.lost.length > 0) {\n let pid = this.lost[0],\n blp = 0;\n this.lost.slice(1).forEach((p) => {\n const d = p - pid - 1;\n if (d < 16) {\n blp |= 1 << d;\n } else {\n fci.push(bufferWriter([2, 2], [pid, blp]));\n pid = p;\n blp = 0;\n }\n });\n fci.push(bufferWriter([2, 2], [pid, blp]));\n }\n const buf = Buffer.concat([ssrcPair, Buffer.concat(fci)]);\n this.header.length = buf.length / 4;\n return Buffer.concat([this.header.serialize(), buf]);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packet.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtp/red/packet.ts"],"names":[],"mappings":"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","sourcesContent":["// rfc2198\n\nimport { debug } from \"debug\";\n\nimport { BitStream } from \"../../../../common/src\";\n\nconst log = debug(\"packages/rtp/src/rtp/red/packet.ts\");\n\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |F| block PT | timestamp offset | block length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |0| Block PT |\n// +-+-+-+-+-+-+-+-+\n\nexport class Red {\n header!: RedHeader;\n blocks: {\n block: Buffer;\n blockPT: number;\n /**14bit */\n timestampOffset?: number;\n }[] = [];\n\n static deSerialize(bufferOrArrayBuffer: Buffer | ArrayBuffer) {\n const buf =\n bufferOrArrayBuffer instanceof ArrayBuffer\n ? Buffer.from(bufferOrArrayBuffer)\n : bufferOrArrayBuffer;\n\n const red = new Red();\n let offset = 0;\n [red.header, offset] = RedHeader.deSerialize(buf);\n\n red.header.fields.forEach(({ blockLength, timestampOffset, blockPT }) => {\n if (blockLength && timestampOffset) {\n const block = buf.slice(offset, offset + blockLength);\n red.blocks.push({ block, blockPT, timestampOffset });\n offset += blockLength;\n } else {\n const block = buf.slice(offset);\n red.blocks.push({ block, blockPT });\n }\n });\n\n return red;\n }\n\n serialize() {\n this.header = new RedHeader();\n\n for (const { timestampOffset, blockPT, block } of this.blocks) {\n if (timestampOffset) {\n this.header.fields.push({\n fBit: 1,\n blockPT,\n blockLength: block.length,\n timestampOffset,\n });\n } else {\n this.header.fields.push({ fBit: 0, blockPT });\n }\n }\n\n let buf = this.header.serialize();\n for (const { block } of this.blocks) {\n buf = Buffer.concat([buf, block]);\n }\n\n return buf;\n }\n}\n\nexport class RedHeader {\n fields: RedHeaderField[] = [];\n\n static deSerialize(buf: Buffer) {\n let offset = 0;\n const header = new RedHeader();\n\n for (;;) {\n const field: RedHeaderField = {} as any;\n header.fields.push(field);\n\n const bitStream = new BitStream(buf.slice(offset));\n field.fBit = bitStream.readBits(1);\n field.blockPT = bitStream.readBits(7);\n\n offset++;\n\n if (field.fBit === 0) {\n break;\n }\n\n field.timestampOffset = bitStream.readBits(14);\n field.blockLength = bitStream.readBits(10);\n\n offset += 3;\n }\n\n return [header, offset] as const;\n }\n\n serialize() {\n let buf = Buffer.alloc(0);\n for (const field of this.fields) {\n try {\n if (field.timestampOffset && field.blockLength) {\n const bitStream = new BitStream(Buffer.alloc(4))\n .writeBits(1, field.fBit)\n .writeBits(7, field.blockPT)\n .writeBits(14, field.timestampOffset)\n .writeBits(10, field.blockLength);\n buf = Buffer.concat([buf, bitStream.uint8Array]);\n } else {\n const bitStream = new BitStream(Buffer.alloc(1))\n .writeBits(1, 0)\n .writeBits(7, field.blockPT);\n buf = Buffer.concat([buf, bitStream.uint8Array]);\n }\n } catch (error: any) {\n log(error?.message);\n continue;\n }\n }\n return buf;\n }\n}\n\ninterface RedHeaderField {\n fBit: number;\n blockPT: number;\n /**14bit */\n timestampOffset?: number;\n /**10bit */\n blockLength?: number;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"packet.js","sourceRoot":"","sources":["../../../../../../rtp/src/rtp/red/packet.ts"],"names":[],"mappings":"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","sourcesContent":["// rfc2198\n\nimport { debug } from \"debug\";\n\nimport { BitStream } from \"../../../../common/src\";\n\nconst log = debug(\"packages/rtp/src/rtp/red/packet.ts\");\n\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// |F| block PT | timestamp offset | block length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n\n// 0 1 2 3 4 5 6 7\n// +-+-+-+-+-+-+-+-+\n// |0| Block PT |\n// +-+-+-+-+-+-+-+-+\n\nexport class Red {\n header!: RedHeader;\n blocks: {\n block: Buffer;\n blockPT: number;\n /**14bit */\n timestampOffset?: number;\n }[] = [];\n\n static deSerialize(bufferOrArrayBuffer: Buffer | ArrayBuffer) {\n const buf =\n bufferOrArrayBuffer instanceof ArrayBuffer\n ? Buffer.from(bufferOrArrayBuffer)\n : bufferOrArrayBuffer;\n\n const red = new Red();\n let offset = 0;\n [red.header, offset] = RedHeader.deSerialize(buf);\n\n red.header.fields.forEach(({ blockLength, timestampOffset, blockPT }) => {\n if (blockLength && timestampOffset) {\n const block = buf.slice(offset, offset + blockLength);\n red.blocks.push({ block, blockPT, timestampOffset });\n offset += blockLength;\n } else {\n const block = buf.slice(offset);\n red.blocks.push({ block, blockPT });\n }\n });\n\n return red;\n }\n\n serialize() {\n this.header = new RedHeader();\n\n for (const { timestampOffset, blockPT, block } of this.blocks) {\n if (timestampOffset) {\n this.header.fields.push({\n fBit: 1,\n blockPT,\n blockLength: block.length,\n timestampOffset,\n });\n } else {\n this.header.fields.push({ fBit: 0, blockPT });\n }\n }\n\n let buf = this.header.serialize();\n for (const { block } of this.blocks) {\n buf = Buffer.concat([buf, block]);\n }\n\n return buf;\n }\n}\n\nexport class RedHeader {\n fields: RedHeaderField[] = [];\n\n static deSerialize(buf: Buffer) {\n let offset = 0;\n const header = new RedHeader();\n\n for (;;) {\n const field: RedHeaderField = {} as any;\n header.fields.push(field);\n\n const bitStream = new BitStream(buf.slice(offset));\n field.fBit = bitStream.readBits(1);\n field.blockPT = bitStream.readBits(7);\n\n offset++;\n\n if (field.fBit === 0) {\n break;\n }\n\n field.timestampOffset = bitStream.readBits(14);\n field.blockLength = bitStream.readBits(10);\n\n offset += 3;\n }\n\n return [header, offset] as const;\n }\n\n serialize() {\n let buf = Buffer.alloc(0);\n for (const field of this.fields) {\n try {\n if (field.timestampOffset && field.blockLength) {\n const bitStream = new BitStream(Buffer.alloc(4))\n .writeBits(1, field.fBit)\n .writeBits(7, field.blockPT)\n .writeBits(14, field.timestampOffset)\n .writeBits(10, field.blockLength);\n buf = Buffer.concat([buf, bitStream.uint8Array]);\n } else {\n const bitStream = new BitStream(Buffer.alloc(1))\n .writeBits(1, 0)\n .writeBits(7, field.blockPT);\n buf = Buffer.concat([buf, bitStream.uint8Array]);\n }\n } catch (error: any) {\n log(error?.message);\n continue;\n }\n }\n return buf;\n }\n}\n\ninterface RedHeaderField {\n /**ヘッダーの最初のビットは、別のヘッダーブロックが続くかどうかを示す。 1の場合は、さらにヘッダーブロックが続き、0の場合は、これが最後のヘッダーブロックとなります。 */\n fBit: number;\n blockPT: number;\n /**14bit */\n timestampOffset?: number;\n /**10bit */\n blockLength?: number;\n}\n"]}
|