@agentdance/node-webrtc-rtp 1.0.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/dist/extension.d.ts +32 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +133 -0
- package/dist/extension.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/rtcp/bye.d.ts +7 -0
- package/dist/rtcp/bye.d.ts.map +1 -0
- package/dist/rtcp/bye.js +59 -0
- package/dist/rtcp/bye.js.map +1 -0
- package/dist/rtcp/fb.d.ts +22 -0
- package/dist/rtcp/fb.d.ts.map +1 -0
- package/dist/rtcp/fb.js +171 -0
- package/dist/rtcp/fb.js.map +1 -0
- package/dist/rtcp/index.d.ts +23 -0
- package/dist/rtcp/index.d.ts.map +1 -0
- package/dist/rtcp/index.js +145 -0
- package/dist/rtcp/index.js.map +1 -0
- package/dist/rtcp/rr.d.ts +12 -0
- package/dist/rtcp/rr.d.ts.map +1 -0
- package/dist/rtcp/rr.js +65 -0
- package/dist/rtcp/rr.js.map +1 -0
- package/dist/rtcp/sdes.d.ts +7 -0
- package/dist/rtcp/sdes.d.ts.map +1 -0
- package/dist/rtcp/sdes.js +76 -0
- package/dist/rtcp/sdes.js.map +1 -0
- package/dist/rtcp/sr.d.ts +9 -0
- package/dist/rtcp/sr.d.ts.map +1 -0
- package/dist/rtcp/sr.js +59 -0
- package/dist/rtcp/sr.js.map +1 -0
- package/dist/rtp.d.ts +21 -0
- package/dist/rtp.d.ts.map +1 -0
- package/dist/rtp.js +149 -0
- package/dist/rtp.js.map +1 -0
- package/dist/sequence.d.ts +26 -0
- package/dist/sequence.d.ts.map +1 -0
- package/dist/sequence.js +53 -0
- package/dist/sequence.js.map +1 -0
- package/dist/types.d.ts +127 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
- package/src/extension.ts +153 -0
- package/src/index.ts +68 -0
- package/src/rtcp/bye.ts +73 -0
- package/src/rtcp/fb.ts +206 -0
- package/src/rtcp/index.ts +150 -0
- package/src/rtcp/rr.ts +82 -0
- package/src/rtcp/sdes.ts +94 -0
- package/src/rtcp/sr.ts +75 -0
- package/src/rtp.ts +176 -0
- package/src/sequence.ts +59 -0
- package/src/types.ts +129 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RTP header extension parsing and serialization.
|
|
3
|
+
* Supports one-byte header (RFC 5285, profile 0xBEDE) and
|
|
4
|
+
* two-byte header (RFC 5285, profile 0x1000).
|
|
5
|
+
*/
|
|
6
|
+
import type { RtpExtensionValue, RtpHeaderExtension } from './types.js';
|
|
7
|
+
export declare const ONE_BYTE_PROFILE = 48862;
|
|
8
|
+
export declare const TWO_BYTE_PROFILE = 4096;
|
|
9
|
+
/**
|
|
10
|
+
* Parse the extension payload (after the 4-byte profile+length header).
|
|
11
|
+
* @param profile - The extension profile value (0xBEDE or 0x1000)
|
|
12
|
+
* @param data - Raw bytes of the extension body (without the 4-byte profile/length header)
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseExtensionValues(profile: number, data: Buffer): RtpExtensionValue[];
|
|
15
|
+
/**
|
|
16
|
+
* Serialize extension values into a Buffer (without the 4-byte profile/length header).
|
|
17
|
+
* The result is padded to a 4-byte boundary.
|
|
18
|
+
*/
|
|
19
|
+
export declare function serializeExtensionValues(profile: number, values: RtpExtensionValue[]): Buffer;
|
|
20
|
+
/**
|
|
21
|
+
* Serialize a complete RtpHeaderExtension (profile/length word + body).
|
|
22
|
+
*/
|
|
23
|
+
export declare function serializeExtension(ext: RtpHeaderExtension): Buffer;
|
|
24
|
+
/**
|
|
25
|
+
* Get the first extension value matching a given id, or undefined.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getExtensionValue(ext: RtpHeaderExtension, id: number): RtpExtensionValue | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Return a new RtpHeaderExtension with the given id set (inserted or replaced).
|
|
30
|
+
*/
|
|
31
|
+
export declare function setExtensionValue(ext: RtpHeaderExtension, value: RtpExtensionValue): RtpHeaderExtension;
|
|
32
|
+
//# sourceMappingURL=extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExE,eAAO,MAAM,gBAAgB,QAAS,CAAC;AACvC,eAAO,MAAM,gBAAgB,OAAS,CAAC;AAEvC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,iBAAiB,EAAE,CAoDrB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,iBAAiB,EAAE,GAC1B,MAAM,CAsCR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAQlE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,kBAAkB,EACvB,EAAE,EAAE,MAAM,GACT,iBAAiB,GAAG,SAAS,CAE/B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,kBAAkB,EACvB,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CAGpB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RTP header extension parsing and serialization.
|
|
3
|
+
* Supports one-byte header (RFC 5285, profile 0xBEDE) and
|
|
4
|
+
* two-byte header (RFC 5285, profile 0x1000).
|
|
5
|
+
*/
|
|
6
|
+
export const ONE_BYTE_PROFILE = 0xbede;
|
|
7
|
+
export const TWO_BYTE_PROFILE = 0x1000;
|
|
8
|
+
/**
|
|
9
|
+
* Parse the extension payload (after the 4-byte profile+length header).
|
|
10
|
+
* @param profile - The extension profile value (0xBEDE or 0x1000)
|
|
11
|
+
* @param data - Raw bytes of the extension body (without the 4-byte profile/length header)
|
|
12
|
+
*/
|
|
13
|
+
export function parseExtensionValues(profile, data) {
|
|
14
|
+
const values = [];
|
|
15
|
+
if (profile === ONE_BYTE_PROFILE) {
|
|
16
|
+
// One-byte header: | 0001 | id(4) | len-1(4) | data ... |
|
|
17
|
+
let i = 0;
|
|
18
|
+
while (i < data.length) {
|
|
19
|
+
const byte = data[i];
|
|
20
|
+
if (byte === undefined)
|
|
21
|
+
break;
|
|
22
|
+
if (byte === 0x00) {
|
|
23
|
+
// Padding
|
|
24
|
+
i++;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (byte === 0xff) {
|
|
28
|
+
// End marker
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
const id = (byte >> 4) & 0x0f;
|
|
32
|
+
const len = (byte & 0x0f) + 1;
|
|
33
|
+
i++;
|
|
34
|
+
if (i + len > data.length)
|
|
35
|
+
break;
|
|
36
|
+
values.push({ id, data: Buffer.from(data.subarray(i, i + len)) });
|
|
37
|
+
i += len;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else if ((profile & 0xfff0) === TWO_BYTE_PROFILE) {
|
|
41
|
+
// Two-byte header: | id(8) | len(8) | data ... |
|
|
42
|
+
let i = 0;
|
|
43
|
+
while (i < data.length) {
|
|
44
|
+
const id = data[i];
|
|
45
|
+
if (id === undefined)
|
|
46
|
+
break;
|
|
47
|
+
if (id === 0x00) {
|
|
48
|
+
// Padding
|
|
49
|
+
i++;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
i++;
|
|
53
|
+
if (i >= data.length)
|
|
54
|
+
break;
|
|
55
|
+
const len = data[i];
|
|
56
|
+
if (len === undefined)
|
|
57
|
+
break;
|
|
58
|
+
i++;
|
|
59
|
+
if (len === 0) {
|
|
60
|
+
values.push({ id, data: Buffer.alloc(0) });
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (i + len > data.length)
|
|
64
|
+
break;
|
|
65
|
+
values.push({ id, data: Buffer.from(data.subarray(i, i + len)) });
|
|
66
|
+
i += len;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return values;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Serialize extension values into a Buffer (without the 4-byte profile/length header).
|
|
73
|
+
* The result is padded to a 4-byte boundary.
|
|
74
|
+
*/
|
|
75
|
+
export function serializeExtensionValues(profile, values) {
|
|
76
|
+
const parts = [];
|
|
77
|
+
if (profile === ONE_BYTE_PROFILE) {
|
|
78
|
+
for (const ext of values) {
|
|
79
|
+
const len = ext.data.length;
|
|
80
|
+
if (len < 1 || len > 16) {
|
|
81
|
+
throw new RangeError(`One-byte extension id=${ext.id}: data length must be 1-16 bytes, got ${len}`);
|
|
82
|
+
}
|
|
83
|
+
if (ext.id < 1 || ext.id > 14) {
|
|
84
|
+
throw new RangeError(`One-byte extension id must be 1-14, got ${ext.id}`);
|
|
85
|
+
}
|
|
86
|
+
const header = ((ext.id & 0x0f) << 4) | ((len - 1) & 0x0f);
|
|
87
|
+
parts.push(Buffer.from([header]));
|
|
88
|
+
parts.push(Buffer.from(ext.data));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if ((profile & 0xfff0) === TWO_BYTE_PROFILE) {
|
|
92
|
+
for (const ext of values) {
|
|
93
|
+
const len = ext.data.length;
|
|
94
|
+
if (ext.id < 1 || ext.id > 255) {
|
|
95
|
+
throw new RangeError(`Two-byte extension id must be 1-255, got ${ext.id}`);
|
|
96
|
+
}
|
|
97
|
+
parts.push(Buffer.from([ext.id, len]));
|
|
98
|
+
if (len > 0)
|
|
99
|
+
parts.push(Buffer.from(ext.data));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const body = Buffer.concat(parts);
|
|
103
|
+
// Pad to 4-byte boundary
|
|
104
|
+
const padLen = (4 - (body.length % 4)) % 4;
|
|
105
|
+
const padding = Buffer.alloc(padLen, 0x00);
|
|
106
|
+
return Buffer.concat([body, padding]);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Serialize a complete RtpHeaderExtension (profile/length word + body).
|
|
110
|
+
*/
|
|
111
|
+
export function serializeExtension(ext) {
|
|
112
|
+
const body = serializeExtensionValues(ext.id, ext.values);
|
|
113
|
+
// Length field = number of 32-bit words in the body
|
|
114
|
+
const lengthWords = body.length / 4;
|
|
115
|
+
const header = Buffer.allocUnsafe(4);
|
|
116
|
+
header.writeUInt16BE(ext.id, 0);
|
|
117
|
+
header.writeUInt16BE(lengthWords, 2);
|
|
118
|
+
return Buffer.concat([header, body]);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get the first extension value matching a given id, or undefined.
|
|
122
|
+
*/
|
|
123
|
+
export function getExtensionValue(ext, id) {
|
|
124
|
+
return ext.values.find((v) => v.id === id);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Return a new RtpHeaderExtension with the given id set (inserted or replaced).
|
|
128
|
+
*/
|
|
129
|
+
export function setExtensionValue(ext, value) {
|
|
130
|
+
const filtered = ext.values.filter((v) => v.id !== value.id);
|
|
131
|
+
return { id: ext.id, values: [...filtered, value] };
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @agentdance/node-webrtc-rtp — RFC 3550 RTP/RTCP implementation
|
|
3
|
+
*/
|
|
4
|
+
export type { RtpPacket, RtpHeaderExtension, RtpExtensionValue, RtcpHeader, RtcpSenderReport, RtcpReceiverReport, ReportBlock, RtcpSdes, SdesChunk, SdesItem, RtcpBye, RtcpNack, RtcpPli, RtcpFir, FirEntry, RtcpRemb, RtcpPacket, } from './types.js';
|
|
5
|
+
export { RtcpPacketType } from './types.js';
|
|
6
|
+
export { encodeRtp, decodeRtp, isRtpPacket } from './rtp.js';
|
|
7
|
+
export { encodeRtcp, decodeRtcp, isRtcpPacket } from './rtcp/index.js';
|
|
8
|
+
export { encodeSr, decodeSr } from './rtcp/sr.js';
|
|
9
|
+
export { encodeRr, decodeRr, encodeReportBlock, decodeReportBlock } from './rtcp/rr.js';
|
|
10
|
+
export { encodeSdes, decodeSdes } from './rtcp/sdes.js';
|
|
11
|
+
export { encodeBye, decodeBye } from './rtcp/bye.js';
|
|
12
|
+
export { encodeNack, decodeNack, encodePli, decodePli, encodeFir, decodeFir, encodeRemb, decodeRemb, } from './rtcp/fb.js';
|
|
13
|
+
export { ONE_BYTE_PROFILE, TWO_BYTE_PROFILE, parseExtensionValues, serializeExtensionValues, serializeExtension, getExtensionValue, setExtensionValue, } from './extension.js';
|
|
14
|
+
export { seqDiff, seqLt, seqLte, seqGt, ntpToUnix, unixToNtp, } from './sequence.js';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,OAAO,EACP,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGvE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,UAAU,GACX,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,OAAO,EACP,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,EACT,SAAS,GACV,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @agentdance/node-webrtc-rtp — RFC 3550 RTP/RTCP implementation
|
|
3
|
+
*/
|
|
4
|
+
export { RtcpPacketType } from './types.js';
|
|
5
|
+
// RTP
|
|
6
|
+
export { encodeRtp, decodeRtp, isRtpPacket } from './rtp.js';
|
|
7
|
+
// RTCP compound
|
|
8
|
+
export { encodeRtcp, decodeRtcp, isRtcpPacket } from './rtcp/index.js';
|
|
9
|
+
// RTCP individual encoders/decoders
|
|
10
|
+
export { encodeSr, decodeSr } from './rtcp/sr.js';
|
|
11
|
+
export { encodeRr, decodeRr, encodeReportBlock, decodeReportBlock } from './rtcp/rr.js';
|
|
12
|
+
export { encodeSdes, decodeSdes } from './rtcp/sdes.js';
|
|
13
|
+
export { encodeBye, decodeBye } from './rtcp/bye.js';
|
|
14
|
+
export { encodeNack, decodeNack, encodePli, decodePli, encodeFir, decodeFir, encodeRemb, decodeRemb, } from './rtcp/fb.js';
|
|
15
|
+
// Header extensions
|
|
16
|
+
export { ONE_BYTE_PROFILE, TWO_BYTE_PROFILE, parseExtensionValues, serializeExtensionValues, serializeExtension, getExtensionValue, setExtensionValue, } from './extension.js';
|
|
17
|
+
// Sequence utilities
|
|
18
|
+
export { seqDiff, seqLt, seqLte, seqGt, ntpToUnix, unixToNtp, } from './sequence.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM;AACN,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE7D,gBAAgB;AAChB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEvE,oCAAoC;AACpC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,qBAAqB;AACrB,OAAO,EACL,OAAO,EACP,KAAK,EACL,MAAM,EACN,KAAK,EACL,SAAS,EACT,SAAS,GACV,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bye.d.ts","sourceRoot":"","sources":["../../src/rtcp/bye.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAmC9C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA2B9C"}
|
package/dist/rtcp/bye.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RTCP BYE — RFC 3550 Section 6.6
|
|
3
|
+
*/
|
|
4
|
+
const BYE_HEADER_SIZE = 4;
|
|
5
|
+
export function encodeBye(bye) {
|
|
6
|
+
const sc = bye.ssrcs.length;
|
|
7
|
+
// Reason string (optional)
|
|
8
|
+
let reasonBuf = Buffer.alloc(0);
|
|
9
|
+
if (bye.reason !== undefined) {
|
|
10
|
+
const text = Buffer.from(bye.reason, 'utf8');
|
|
11
|
+
const reasonLen = Math.min(text.length, 255);
|
|
12
|
+
// 1 byte length prefix + text + padding to 4-byte boundary
|
|
13
|
+
const raw = Buffer.allocUnsafe(1 + reasonLen);
|
|
14
|
+
raw[0] = reasonLen;
|
|
15
|
+
text.copy(raw, 1, 0, reasonLen);
|
|
16
|
+
const padded = reasonLen + 1;
|
|
17
|
+
const padLen = (4 - (padded % 4)) % 4;
|
|
18
|
+
reasonBuf = Buffer.concat([raw, Buffer.alloc(padLen, 0x00)]);
|
|
19
|
+
}
|
|
20
|
+
const totalBytes = BYE_HEADER_SIZE + sc * 4 + reasonBuf.length;
|
|
21
|
+
const buf = Buffer.allocUnsafe(totalBytes);
|
|
22
|
+
buf[0] = (2 << 6) | (sc & 0x1f);
|
|
23
|
+
buf[1] = 203;
|
|
24
|
+
buf.writeUInt16BE(totalBytes / 4 - 1, 2);
|
|
25
|
+
let offset = BYE_HEADER_SIZE;
|
|
26
|
+
for (const ssrc of bye.ssrcs) {
|
|
27
|
+
buf.writeUInt32BE(ssrc >>> 0, offset);
|
|
28
|
+
offset += 4;
|
|
29
|
+
}
|
|
30
|
+
if (reasonBuf.length > 0) {
|
|
31
|
+
reasonBuf.copy(buf, offset);
|
|
32
|
+
}
|
|
33
|
+
return buf;
|
|
34
|
+
}
|
|
35
|
+
export function decodeBye(buf) {
|
|
36
|
+
if (buf.length < BYE_HEADER_SIZE) {
|
|
37
|
+
throw new RangeError(`BYE packet too short: ${buf.length}`);
|
|
38
|
+
}
|
|
39
|
+
const sc = buf[0] & 0x1f;
|
|
40
|
+
const totalBytes = (buf.readUInt16BE(2) + 1) * 4;
|
|
41
|
+
const ssrcs = [];
|
|
42
|
+
let offset = BYE_HEADER_SIZE;
|
|
43
|
+
for (let i = 0; i < sc; i++) {
|
|
44
|
+
if (offset + 4 > buf.length)
|
|
45
|
+
break;
|
|
46
|
+
ssrcs.push(buf.readUInt32BE(offset));
|
|
47
|
+
offset += 4;
|
|
48
|
+
}
|
|
49
|
+
let reason;
|
|
50
|
+
if (offset < totalBytes && offset < buf.length) {
|
|
51
|
+
const reasonLen = buf[offset];
|
|
52
|
+
if (reasonLen !== undefined && reasonLen > 0) {
|
|
53
|
+
offset++;
|
|
54
|
+
reason = buf.subarray(offset, offset + reasonLen).toString('utf8');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { ssrcs, ...(reason !== undefined ? { reason } : {}) };
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=bye.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bye.js","sourceRoot":"","sources":["../../src/rtcp/bye.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RTCP Feedback messages — RFC 4585
|
|
3
|
+
*
|
|
4
|
+
* Transport Layer Feedback (PT=205):
|
|
5
|
+
* FMT=1 NACK (Generic NACK)
|
|
6
|
+
* FMT=15 TWCC (Transport-wide CC) — not fully implemented here
|
|
7
|
+
*
|
|
8
|
+
* Payload-Specific Feedback (PT=206):
|
|
9
|
+
* FMT=1 PLI (Picture Loss Indication)
|
|
10
|
+
* FMT=4 FIR (Full Intra Request)
|
|
11
|
+
* FMT=15 REMB (Receiver Estimated Max Bitrate, draft-alvestrand-rmcat-remb)
|
|
12
|
+
*/
|
|
13
|
+
import type { RtcpNack, RtcpPli, RtcpFir, RtcpRemb } from '../types.js';
|
|
14
|
+
export declare function encodeNack(nack: RtcpNack): Buffer;
|
|
15
|
+
export declare function decodeNack(buf: Buffer): RtcpNack;
|
|
16
|
+
export declare function encodePli(pli: RtcpPli): Buffer;
|
|
17
|
+
export declare function decodePli(buf: Buffer): RtcpPli;
|
|
18
|
+
export declare function encodeFir(fir: RtcpFir): Buffer;
|
|
19
|
+
export declare function decodeFir(buf: Buffer): RtcpFir;
|
|
20
|
+
export declare function encodeRemb(remb: RtcpRemb): Buffer;
|
|
21
|
+
export declare function decodeRemb(buf: Buffer): RtcpRemb;
|
|
22
|
+
//# sourceMappingURL=fb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fb.d.ts","sourceRoot":"","sources":["../../src/rtcp/fb.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAY,QAAQ,EAAE,MAAM,aAAa,CAAC;AASlF,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAcjD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAShD;AAMD,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAY9C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO9C;AASD,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAkB9C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgB9C;AASD,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAiCjD;AAaD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CA+BhD"}
|
package/dist/rtcp/fb.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RTCP Feedback messages — RFC 4585
|
|
3
|
+
*
|
|
4
|
+
* Transport Layer Feedback (PT=205):
|
|
5
|
+
* FMT=1 NACK (Generic NACK)
|
|
6
|
+
* FMT=15 TWCC (Transport-wide CC) — not fully implemented here
|
|
7
|
+
*
|
|
8
|
+
* Payload-Specific Feedback (PT=206):
|
|
9
|
+
* FMT=1 PLI (Picture Loss Indication)
|
|
10
|
+
* FMT=4 FIR (Full Intra Request)
|
|
11
|
+
* FMT=15 REMB (Receiver Estimated Max Bitrate, draft-alvestrand-rmcat-remb)
|
|
12
|
+
*/
|
|
13
|
+
/** Common feedback header size: 4 (common) + 4 (senderSSRC) + 4 (mediaSSRC) = 12 bytes */
|
|
14
|
+
const FB_HEADER_SIZE = 12;
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// NACK — RFC 4585 Section 6.2.1, PT=205, FMT=1
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export function encodeNack(nack) {
|
|
19
|
+
// FCI = PID (16 bits) + BLP (16 bits) = 4 bytes
|
|
20
|
+
const totalBytes = FB_HEADER_SIZE + 4;
|
|
21
|
+
const buf = Buffer.allocUnsafe(totalBytes);
|
|
22
|
+
buf[0] = (2 << 6) | 1; // V=2, P=0, FMT=1
|
|
23
|
+
buf[1] = 205;
|
|
24
|
+
buf.writeUInt16BE(totalBytes / 4 - 1, 2);
|
|
25
|
+
buf.writeUInt32BE(nack.senderSsrc >>> 0, 4);
|
|
26
|
+
buf.writeUInt32BE(nack.mediaSsrc >>> 0, 8);
|
|
27
|
+
buf.writeUInt16BE(nack.pid & 0xffff, 12);
|
|
28
|
+
buf.writeUInt16BE(nack.blp & 0xffff, 14);
|
|
29
|
+
return buf;
|
|
30
|
+
}
|
|
31
|
+
export function decodeNack(buf) {
|
|
32
|
+
if (buf.length < FB_HEADER_SIZE + 4) {
|
|
33
|
+
throw new RangeError(`NACK packet too short: ${buf.length}`);
|
|
34
|
+
}
|
|
35
|
+
const senderSsrc = buf.readUInt32BE(4);
|
|
36
|
+
const mediaSsrc = buf.readUInt32BE(8);
|
|
37
|
+
const pid = buf.readUInt16BE(12);
|
|
38
|
+
const blp = buf.readUInt16BE(14);
|
|
39
|
+
return { senderSsrc, mediaSsrc, pid, blp };
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// PLI — RFC 4585 Section 6.3.1, PT=206, FMT=1
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
export function encodePli(pli) {
|
|
45
|
+
// No FCI
|
|
46
|
+
const totalBytes = FB_HEADER_SIZE;
|
|
47
|
+
const buf = Buffer.allocUnsafe(totalBytes);
|
|
48
|
+
buf[0] = (2 << 6) | 1; // V=2, P=0, FMT=1
|
|
49
|
+
buf[1] = 206;
|
|
50
|
+
buf.writeUInt16BE(totalBytes / 4 - 1, 2);
|
|
51
|
+
buf.writeUInt32BE(pli.senderSsrc >>> 0, 4);
|
|
52
|
+
buf.writeUInt32BE(pli.mediaSsrc >>> 0, 8);
|
|
53
|
+
return buf;
|
|
54
|
+
}
|
|
55
|
+
export function decodePli(buf) {
|
|
56
|
+
if (buf.length < FB_HEADER_SIZE) {
|
|
57
|
+
throw new RangeError(`PLI packet too short: ${buf.length}`);
|
|
58
|
+
}
|
|
59
|
+
const senderSsrc = buf.readUInt32BE(4);
|
|
60
|
+
const mediaSsrc = buf.readUInt32BE(8);
|
|
61
|
+
return { senderSsrc, mediaSsrc };
|
|
62
|
+
}
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// FIR — RFC 5104 Section 4.3.1, PT=206, FMT=4
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
/** Each FIR entry: 4 bytes SSRC + 4 bytes (seqNumber | reserved) */
|
|
67
|
+
const FIR_ENTRY_SIZE = 8;
|
|
68
|
+
export function encodeFir(fir) {
|
|
69
|
+
const totalBytes = FB_HEADER_SIZE + fir.entries.length * FIR_ENTRY_SIZE;
|
|
70
|
+
const buf = Buffer.allocUnsafe(totalBytes);
|
|
71
|
+
buf[0] = (2 << 6) | 4; // V=2, P=0, FMT=4
|
|
72
|
+
buf[1] = 206;
|
|
73
|
+
buf.writeUInt16BE(totalBytes / 4 - 1, 2);
|
|
74
|
+
buf.writeUInt32BE(fir.senderSsrc >>> 0, 4);
|
|
75
|
+
buf.writeUInt32BE(0, 8); // media SSRC = 0 for FIR
|
|
76
|
+
let offset = FB_HEADER_SIZE;
|
|
77
|
+
for (const entry of fir.entries) {
|
|
78
|
+
buf.writeUInt32BE(entry.ssrc >>> 0, offset);
|
|
79
|
+
buf.writeUInt32BE((entry.seqNumber & 0xff) << 24, offset + 4);
|
|
80
|
+
offset += FIR_ENTRY_SIZE;
|
|
81
|
+
}
|
|
82
|
+
return buf;
|
|
83
|
+
}
|
|
84
|
+
export function decodeFir(buf) {
|
|
85
|
+
if (buf.length < FB_HEADER_SIZE) {
|
|
86
|
+
throw new RangeError(`FIR packet too short: ${buf.length}`);
|
|
87
|
+
}
|
|
88
|
+
const senderSsrc = buf.readUInt32BE(4);
|
|
89
|
+
const entries = [];
|
|
90
|
+
let offset = FB_HEADER_SIZE;
|
|
91
|
+
while (offset + FIR_ENTRY_SIZE <= buf.length) {
|
|
92
|
+
const ssrc = buf.readUInt32BE(offset);
|
|
93
|
+
const seqNumber = (buf.readUInt32BE(offset + 4) >>> 24) & 0xff;
|
|
94
|
+
entries.push({ ssrc, seqNumber });
|
|
95
|
+
offset += FIR_ENTRY_SIZE;
|
|
96
|
+
}
|
|
97
|
+
return { senderSsrc, entries };
|
|
98
|
+
}
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
// REMB — draft-alvestrand-rmcat-remb, PT=206, FMT=15
|
|
101
|
+
// Unique ID: "REMB" in ASCII at FCI[0..3]
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
const REMB_UNIQUE_ID = Buffer.from('REMB', 'ascii');
|
|
104
|
+
export function encodeRemb(remb) {
|
|
105
|
+
const ssrcCount = remb.ssrcs.length;
|
|
106
|
+
// FCI: 4 (REMB) + 1 (numSSRC) + 3 (BR exp+mantissa) + ssrcCount*4
|
|
107
|
+
const fciSize = 8 + ssrcCount * 4;
|
|
108
|
+
const totalBytes = FB_HEADER_SIZE + fciSize;
|
|
109
|
+
const buf = Buffer.allocUnsafe(totalBytes);
|
|
110
|
+
buf[0] = (2 << 6) | 15; // V=2, P=0, FMT=15
|
|
111
|
+
buf[1] = 206;
|
|
112
|
+
buf.writeUInt16BE(totalBytes / 4 - 1, 2);
|
|
113
|
+
buf.writeUInt32BE(remb.senderSsrc >>> 0, 4);
|
|
114
|
+
buf.writeUInt32BE(remb.mediaSsrc >>> 0, 8);
|
|
115
|
+
// "REMB" unique identifier
|
|
116
|
+
REMB_UNIQUE_ID.copy(buf, 12);
|
|
117
|
+
// Num SSRC (1 byte)
|
|
118
|
+
buf[16] = ssrcCount & 0xff;
|
|
119
|
+
// BR Exp (6 bits) + BR Mantissa (18 bits) = 24 bits
|
|
120
|
+
// bitrate = mantissa * 2^exp
|
|
121
|
+
const { exp, mantissa } = encodeBitrate(remb.bitrate);
|
|
122
|
+
buf[17] = ((exp & 0x3f) << 2) | ((mantissa >> 16) & 0x03);
|
|
123
|
+
buf[18] = (mantissa >> 8) & 0xff;
|
|
124
|
+
buf[19] = mantissa & 0xff;
|
|
125
|
+
let offset = 20;
|
|
126
|
+
for (const ssrc of remb.ssrcs) {
|
|
127
|
+
buf.writeUInt32BE(ssrc >>> 0, offset);
|
|
128
|
+
offset += 4;
|
|
129
|
+
}
|
|
130
|
+
return buf;
|
|
131
|
+
}
|
|
132
|
+
function encodeBitrate(bitrate) {
|
|
133
|
+
if (bitrate === 0)
|
|
134
|
+
return { exp: 0, mantissa: 0 };
|
|
135
|
+
let exp = 0;
|
|
136
|
+
let m = bitrate;
|
|
137
|
+
while (m >= (1 << 18)) {
|
|
138
|
+
m >>= 1;
|
|
139
|
+
exp++;
|
|
140
|
+
}
|
|
141
|
+
return { exp, mantissa: m & 0x3ffff };
|
|
142
|
+
}
|
|
143
|
+
export function decodeRemb(buf) {
|
|
144
|
+
if (buf.length < FB_HEADER_SIZE + 8) {
|
|
145
|
+
throw new RangeError(`REMB packet too short: ${buf.length}`);
|
|
146
|
+
}
|
|
147
|
+
const senderSsrc = buf.readUInt32BE(4);
|
|
148
|
+
const mediaSsrc = buf.readUInt32BE(8);
|
|
149
|
+
// Verify "REMB" unique ID
|
|
150
|
+
const uid = buf.subarray(12, 16).toString('ascii');
|
|
151
|
+
if (uid !== 'REMB') {
|
|
152
|
+
throw new Error(`Not a REMB packet, got unique ID: ${uid}`);
|
|
153
|
+
}
|
|
154
|
+
const numSsrc = buf[16];
|
|
155
|
+
const byte17 = buf[17];
|
|
156
|
+
const byte18 = buf[18];
|
|
157
|
+
const byte19 = buf[19];
|
|
158
|
+
const exp = (byte17 >> 2) & 0x3f;
|
|
159
|
+
const mantissa = ((byte17 & 0x03) << 16) | (byte18 << 8) | byte19;
|
|
160
|
+
const bitrate = mantissa * Math.pow(2, exp);
|
|
161
|
+
const ssrcs = [];
|
|
162
|
+
let offset = 20;
|
|
163
|
+
for (let i = 0; i < numSsrc; i++) {
|
|
164
|
+
if (offset + 4 > buf.length)
|
|
165
|
+
break;
|
|
166
|
+
ssrcs.push(buf.readUInt32BE(offset));
|
|
167
|
+
offset += 4;
|
|
168
|
+
}
|
|
169
|
+
return { senderSsrc, mediaSsrc, bitrate, ssrcs };
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=fb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fb.js","sourceRoot":"","sources":["../../src/rtcp/fb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RTCP compound packet dispatch — RFC 3550 Section 6.1
|
|
3
|
+
*
|
|
4
|
+
* Compound RTCP packets are multiple RTCP packets concatenated together
|
|
5
|
+
* in a single UDP datagram.
|
|
6
|
+
*/
|
|
7
|
+
import type { RtcpPacket } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Returns true if the buffer looks like an RTCP packet:
|
|
10
|
+
* - version == 2
|
|
11
|
+
* - payload type in 200–207
|
|
12
|
+
* - at least 4 bytes
|
|
13
|
+
*/
|
|
14
|
+
export declare function isRtcpPacket(buf: Buffer): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Decode a (possibly compound) RTCP buffer into an array of RtcpPacket objects.
|
|
17
|
+
*/
|
|
18
|
+
export declare function decodeRtcp(buf: Buffer): RtcpPacket[];
|
|
19
|
+
/**
|
|
20
|
+
* Encode an array of RtcpPacket objects into a compound RTCP buffer.
|
|
21
|
+
*/
|
|
22
|
+
export declare function encodeRtcp(packets: RtcpPacket[]): Buffer;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rtcp/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAA4B,MAAM,aAAa,CAAC;AAiBxE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUjD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,CA+DpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAoCxD"}
|