/
sr.ts
77 lines (67 loc) · 1.9 KB
/
sr.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import { range } from "lodash";
import { bufferReader, bufferWriter } from "../helper";
import { RtcpReceiverInfo } from "./rr";
import { RtcpPacketConverter } from "./rtcp";
export class RtcpSrPacket {
ssrc: number = 0;
senderInfo!: RtcpSenderInfo;
reports: RtcpReceiverInfo[] = [];
static type = 200;
type = RtcpSrPacket.type;
constructor(props: Partial<RtcpSrPacket> = {}) {
Object.assign(this, props);
}
serialize() {
let payload = Buffer.alloc(4);
payload.writeUInt32BE(this.ssrc);
payload = Buffer.concat([payload, this.senderInfo.serialize()]);
payload = Buffer.concat([
payload,
...this.reports.map((report) => report.serialize()),
]);
return RtcpPacketConverter.serialize(
RtcpSrPacket.type,
this.reports.length,
payload,
Math.floor(payload.length / 4)
);
}
static deSerialize(payload: Buffer, count: number) {
const ssrc = payload.readUInt32BE();
const senderInfo = RtcpSenderInfo.deSerialize(payload.slice(4, 24));
let pos = 24;
const reports: RtcpReceiverInfo[] = [];
for (const _ of range(count)) {
reports.push(RtcpReceiverInfo.deSerialize(payload.slice(pos, pos + 24)));
pos += 24;
}
return new RtcpSrPacket({ ssrc, senderInfo, reports });
}
}
export class RtcpSenderInfo {
ntpTimestamp!: bigint;
rtpTimestamp!: number;
packetCount!: number;
octetCount!: number;
constructor(props: Partial<RtcpSenderInfo> = {}) {
Object.assign(this, props);
}
serialize() {
return bufferWriter(
[8, 4, 4, 4],
[this.ntpTimestamp, this.rtpTimestamp, this.packetCount, this.octetCount]
);
}
static deSerialize(data: Buffer) {
const [ntpTimestamp, rtpTimestamp, packetCount, octetCount] = bufferReader(
data,
[8, 4, 4, 4]
);
return new RtcpSenderInfo({
ntpTimestamp,
rtpTimestamp,
packetCount,
octetCount,
});
}
}