@spatialwalk/avatarkit-rtc 1.0.0-beta.8 → 1.0.0-beta.9
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/README.md +2 -571
- package/dist/assets/animation-worker-DOGeTjF0.js.map +1 -0
- package/dist/core/AvatarPlayer.d.ts +8 -3
- package/dist/core/AvatarPlayer.d.ts.map +1 -1
- package/dist/core/RTCProvider.d.ts +12 -5
- package/dist/core/RTCProvider.d.ts.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index10.js +86 -47
- package/dist/index10.js.map +1 -1
- package/dist/index11.js +14 -104
- package/dist/index11.js.map +1 -1
- package/dist/index12.js +390 -14
- package/dist/index12.js.map +1 -1
- package/dist/index13.js +137 -349
- package/dist/index13.js.map +1 -1
- package/dist/index14.js.map +1 -1
- package/dist/index15.js +1 -1
- package/dist/index2.js +38 -17
- package/dist/index2.js.map +1 -1
- package/dist/index3.js +141 -42
- package/dist/index3.js.map +1 -1
- package/dist/index4.js +101 -70
- package/dist/index4.js.map +1 -1
- package/dist/index5.js +6 -2
- package/dist/index5.js.map +1 -1
- package/dist/index6.js +73 -18
- package/dist/index6.js.map +1 -1
- package/dist/index8.js +5 -2
- package/dist/index8.js.map +1 -1
- package/dist/index9.js +65 -164
- package/dist/index9.js.map +1 -1
- package/dist/providers/agora/AgoraProvider.d.ts.map +1 -1
- package/dist/providers/agora/types.d.ts.map +1 -1
- package/dist/providers/base/BaseProvider.d.ts +9 -13
- package/dist/providers/base/BaseProvider.d.ts.map +1 -1
- package/dist/providers/livekit/LiveKitProvider.d.ts +4 -2
- package/dist/providers/livekit/LiveKitProvider.d.ts.map +1 -1
- package/dist/providers/livekit/animation-worker.d.ts.map +1 -1
- package/dist/types/index.d.ts +21 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +12 -3
- package/dist/assets/animation-worker-CdhDm7lL.js.map +0 -1
package/dist/index13.js
CHANGED
|
@@ -1,390 +1,178 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const DEFAULT_TRANSITION_END_FRAMES = 12;
|
|
23
|
-
class SEIExtractor {
|
|
24
|
-
constructor() {
|
|
25
|
-
/** @internal */
|
|
26
|
-
__publicField(this, "callbacks", null);
|
|
27
|
-
// Session state tracking
|
|
28
|
-
/** @internal */
|
|
29
|
-
__publicField(this, "lastWasIdle", true);
|
|
30
|
-
// Transition state tracking (to handle consecutive packets)
|
|
31
|
-
/** @internal */
|
|
32
|
-
__publicField(this, "isInStartTransition", false);
|
|
33
|
-
/** @internal */
|
|
34
|
-
__publicField(this, "isInEndTransition", false);
|
|
35
|
-
// Transition frame counts
|
|
36
|
-
/** @internal */
|
|
37
|
-
__publicField(this, "transitionStartFrameCount");
|
|
38
|
-
/** @internal */
|
|
39
|
-
__publicField(this, "transitionEndFrameCount");
|
|
40
|
-
// Statistics tracking
|
|
41
|
-
/** @internal */
|
|
42
|
-
__publicField(this, "totalFrameCount", 0);
|
|
43
|
-
/** @internal */
|
|
44
|
-
__publicField(this, "intervalFrameCount", 0);
|
|
45
|
-
/** @internal */
|
|
46
|
-
__publicField(this, "lastStatsTime", 0);
|
|
47
|
-
/** @internal */
|
|
48
|
-
__publicField(this, "statsInterval", null);
|
|
49
|
-
// Debug logging
|
|
50
|
-
/** @internal */
|
|
51
|
-
__publicField(this, "debugLogging", false);
|
|
52
|
-
this.transitionStartFrameCount = DEFAULT_TRANSITION_START_FRAMES;
|
|
53
|
-
this.transitionEndFrameCount = DEFAULT_TRANSITION_END_FRAMES;
|
|
1
|
+
import { varint64read, varint32read } from "./index16.js";
|
|
2
|
+
import { protoInt64 } from "./index17.js";
|
|
3
|
+
import { getTextEncoding } from "./index18.js";
|
|
4
|
+
var WireType;
|
|
5
|
+
(function(WireType2) {
|
|
6
|
+
WireType2[WireType2["Varint"] = 0] = "Varint";
|
|
7
|
+
WireType2[WireType2["Bit64"] = 1] = "Bit64";
|
|
8
|
+
WireType2[WireType2["LengthDelimited"] = 2] = "LengthDelimited";
|
|
9
|
+
WireType2[WireType2["StartGroup"] = 3] = "StartGroup";
|
|
10
|
+
WireType2[WireType2["EndGroup"] = 4] = "EndGroup";
|
|
11
|
+
WireType2[WireType2["Bit32"] = 5] = "Bit32";
|
|
12
|
+
})(WireType || (WireType = {}));
|
|
13
|
+
class BinaryReader {
|
|
14
|
+
constructor(buf, decodeUtf8 = getTextEncoding().decodeUtf8) {
|
|
15
|
+
this.decodeUtf8 = decodeUtf8;
|
|
16
|
+
this.varint64 = varint64read;
|
|
17
|
+
this.uint32 = varint32read;
|
|
18
|
+
this.buf = buf;
|
|
19
|
+
this.len = buf.length;
|
|
20
|
+
this.pos = 0;
|
|
21
|
+
this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
54
22
|
}
|
|
55
23
|
/**
|
|
56
|
-
*
|
|
57
|
-
* @param callbacks - Callbacks to receive extracted data
|
|
58
|
-
* @internal
|
|
24
|
+
* Reads a tag - field number and wire type.
|
|
59
25
|
*/
|
|
60
|
-
|
|
61
|
-
this.
|
|
62
|
-
|
|
26
|
+
tag() {
|
|
27
|
+
let tag = this.uint32(), fieldNo = tag >>> 3, wireType = tag & 7;
|
|
28
|
+
if (fieldNo <= 0 || wireType < 0 || wireType > 5)
|
|
29
|
+
throw new Error("illegal tag: field no " + fieldNo + " wire type " + wireType);
|
|
30
|
+
return [fieldNo, wireType];
|
|
63
31
|
}
|
|
64
32
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
33
|
+
* Skip one element and return the skipped data.
|
|
34
|
+
*
|
|
35
|
+
* When skipping StartGroup, provide the tags field number to check for
|
|
36
|
+
* matching field number in the EndGroup tag.
|
|
68
37
|
*/
|
|
69
|
-
|
|
70
|
-
|
|
38
|
+
skip(wireType, fieldNo) {
|
|
39
|
+
let start = this.pos;
|
|
40
|
+
switch (wireType) {
|
|
41
|
+
case WireType.Varint:
|
|
42
|
+
while (this.buf[this.pos++] & 128) {
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
// @ts-ignore TS7029: Fallthrough case in switch -- ignore instead of expect-error for compiler settings without noFallthroughCasesInSwitch: true
|
|
46
|
+
case WireType.Bit64:
|
|
47
|
+
this.pos += 4;
|
|
48
|
+
case WireType.Bit32:
|
|
49
|
+
this.pos += 4;
|
|
50
|
+
break;
|
|
51
|
+
case WireType.LengthDelimited:
|
|
52
|
+
let len = this.uint32();
|
|
53
|
+
this.pos += len;
|
|
54
|
+
break;
|
|
55
|
+
case WireType.StartGroup:
|
|
56
|
+
for (; ; ) {
|
|
57
|
+
const [fn, wt] = this.tag();
|
|
58
|
+
if (wt === WireType.EndGroup) {
|
|
59
|
+
if (fieldNo !== void 0 && fn !== fieldNo) {
|
|
60
|
+
throw new Error("invalid end group tag");
|
|
61
|
+
}
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
this.skip(wt, fn);
|
|
65
|
+
}
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
throw new Error("cant skip wire type " + wireType);
|
|
69
|
+
}
|
|
70
|
+
this.assertBounds();
|
|
71
|
+
return this.buf.subarray(start, this.pos);
|
|
71
72
|
}
|
|
72
73
|
/**
|
|
73
|
-
*
|
|
74
|
-
* Wraps async processing to not block the event handler.
|
|
75
|
-
* @param seiData - Raw SEI payload
|
|
76
|
-
* @internal
|
|
74
|
+
* Throws error if position in byte array is out of range.
|
|
77
75
|
*/
|
|
78
|
-
|
|
79
|
-
this.
|
|
80
|
-
|
|
81
|
-
this.logDebugInfo(seiData);
|
|
82
|
-
});
|
|
76
|
+
assertBounds() {
|
|
77
|
+
if (this.pos > this.len)
|
|
78
|
+
throw new RangeError("premature EOF");
|
|
83
79
|
}
|
|
84
80
|
/**
|
|
85
|
-
*
|
|
86
|
-
* This removes H.264 emulation prevention bytes (0x03) inserted after 00 00 sequences.
|
|
87
|
-
*
|
|
88
|
-
* H.264 spec: When encoding, 0x03 is inserted after 00 00 to prevent start code emulation:
|
|
89
|
-
* - 00 00 00 → 00 00 03 00
|
|
90
|
-
* - 00 00 01 → 00 00 03 01
|
|
91
|
-
* - 00 00 02 → 00 00 03 02
|
|
92
|
-
* - 00 00 03 → 00 00 03 03
|
|
93
|
-
*
|
|
94
|
-
* @param data - EBSP data
|
|
95
|
-
* @returns RBSP data
|
|
96
|
-
* @internal
|
|
81
|
+
* Read a `int32` field, a signed 32 bit varint.
|
|
97
82
|
*/
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
return data;
|
|
101
|
-
}
|
|
102
|
-
const result = [];
|
|
103
|
-
let zeroCount = 0;
|
|
104
|
-
for (let i = 0; i < data.length; i++) {
|
|
105
|
-
const byte = data[i];
|
|
106
|
-
if (zeroCount >= 2 && byte === 3) {
|
|
107
|
-
if (i + 1 < data.length) {
|
|
108
|
-
const nextByte = data[i + 1];
|
|
109
|
-
if (nextByte <= 3) {
|
|
110
|
-
zeroCount = 0;
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
if (byte === 0) {
|
|
116
|
-
zeroCount++;
|
|
117
|
-
} else {
|
|
118
|
-
zeroCount = 0;
|
|
119
|
-
}
|
|
120
|
-
result.push(byte);
|
|
121
|
-
}
|
|
122
|
-
return new Uint8Array(result);
|
|
83
|
+
int32() {
|
|
84
|
+
return this.uint32() | 0;
|
|
123
85
|
}
|
|
124
86
|
/**
|
|
125
|
-
*
|
|
126
|
-
* Escape scheme: 0x00 0xFF -> 0x00, 0xFF 0xFF -> 0xFF
|
|
127
|
-
* This reverses the escaping done to avoid H.264 emulation prevention issues.
|
|
128
|
-
*
|
|
129
|
-
* @param data - Escaped data
|
|
130
|
-
* @returns Unescaped data
|
|
131
|
-
* @internal
|
|
87
|
+
* Read a `sint32` field, a signed, zigzag-encoded 32-bit varint.
|
|
132
88
|
*/
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
while (i < data.length) {
|
|
137
|
-
if (i + 1 < data.length && data[i] === 0 && data[i + 1] === 255) {
|
|
138
|
-
result.push(0);
|
|
139
|
-
i += 2;
|
|
140
|
-
} else if (i + 1 < data.length && data[i] === 255 && data[i + 1] === 255) {
|
|
141
|
-
result.push(255);
|
|
142
|
-
i += 2;
|
|
143
|
-
} else {
|
|
144
|
-
result.push(data[i]);
|
|
145
|
-
i++;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
return new Uint8Array(result);
|
|
89
|
+
sint32() {
|
|
90
|
+
let zze = this.uint32();
|
|
91
|
+
return zze >>> 1 ^ -(zze & 1);
|
|
149
92
|
}
|
|
150
93
|
/**
|
|
151
|
-
*
|
|
152
|
-
* Uses 'deflate' format (not gzip) to avoid H.264 emulation prevention issues
|
|
153
|
-
* with gzip's mtime field containing 00 00 00 00.
|
|
154
|
-
*
|
|
155
|
-
* @param data - Zlib compressed data
|
|
156
|
-
* @returns Decompressed data
|
|
157
|
-
* @internal
|
|
94
|
+
* Read a `int64` field, a signed 64-bit varint.
|
|
158
95
|
*/
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
const writer = ds.writable.getWriter();
|
|
162
|
-
const copy = new Uint8Array(data);
|
|
163
|
-
writer.write(copy);
|
|
164
|
-
writer.close();
|
|
165
|
-
const reader = ds.readable.getReader();
|
|
166
|
-
const chunks = [];
|
|
167
|
-
let totalLength = 0;
|
|
168
|
-
while (true) {
|
|
169
|
-
const { done, value } = await reader.read();
|
|
170
|
-
if (done) break;
|
|
171
|
-
chunks.push(value);
|
|
172
|
-
totalLength += value.length;
|
|
173
|
-
}
|
|
174
|
-
const result = new Uint8Array(totalLength);
|
|
175
|
-
let offset = 0;
|
|
176
|
-
for (const chunk of chunks) {
|
|
177
|
-
result.set(chunk, offset);
|
|
178
|
-
offset += chunk.length;
|
|
179
|
-
}
|
|
180
|
-
return result;
|
|
96
|
+
int64() {
|
|
97
|
+
return protoInt64.dec(...this.varint64());
|
|
181
98
|
}
|
|
182
99
|
/**
|
|
183
|
-
*
|
|
184
|
-
* @param seiData - Raw SEI payload
|
|
185
|
-
* @internal
|
|
100
|
+
* Read a `uint64` field, an unsigned 64-bit varint.
|
|
186
101
|
*/
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
if (!this.callbacks) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
this.totalFrameCount++;
|
|
193
|
-
this.intervalFrameCount++;
|
|
194
|
-
const cleanedData = this.ebspToRbsp(seiData);
|
|
195
|
-
if (cleanedData.length < SEI_HEADER_SIZE) {
|
|
196
|
-
logger.warn("SEIExtractor", `SEI data too short: ${cleanedData.length}`);
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
const flags = cleanedData[0];
|
|
200
|
-
const msgLen = new DataView(
|
|
201
|
-
cleanedData.buffer,
|
|
202
|
-
cleanedData.byteOffset + 1,
|
|
203
|
-
4
|
|
204
|
-
).getUint32(0, true);
|
|
205
|
-
if (this.debugLogging && (this.totalFrameCount <= 5 || this.totalFrameCount % 50 === 0)) {
|
|
206
|
-
logger.info(
|
|
207
|
-
"SEIExtractor",
|
|
208
|
-
`SEI packet #${this.totalFrameCount}: flags=0x${flags.toString(16)}, msgLen=${msgLen}, cleanedLen=${cleanedData.length}`
|
|
209
|
-
);
|
|
210
|
-
}
|
|
211
|
-
const isIdle = (flags & PacketFlags.Idle) !== 0;
|
|
212
|
-
if (isIdle || msgLen === 0) {
|
|
213
|
-
if (!this.lastWasIdle) {
|
|
214
|
-
this.lastWasIdle = true;
|
|
215
|
-
this.isInStartTransition = false;
|
|
216
|
-
this.isInEndTransition = false;
|
|
217
|
-
this.callbacks.onIdleStart();
|
|
218
|
-
}
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
const rawPayload = cleanedData.slice(SEI_HEADER_SIZE);
|
|
222
|
-
const compressedPayload = this.unescapeZeroBytes(rawPayload);
|
|
223
|
-
let payload;
|
|
224
|
-
if ((flags & PacketFlags.Gzipped) !== 0) {
|
|
225
|
-
payload = await this.decompressZlib(compressedPayload);
|
|
226
|
-
} else {
|
|
227
|
-
payload = compressedPayload;
|
|
228
|
-
}
|
|
229
|
-
const isTransition = (flags & PacketFlags.Transition) !== 0;
|
|
230
|
-
const isTransitionEnd = (flags & PacketFlags.TransitionEnd) !== 0;
|
|
231
|
-
const isStart = (flags & PacketFlags.Start) !== 0;
|
|
232
|
-
const isEnd = (flags & PacketFlags.End) !== 0;
|
|
233
|
-
let protobufData;
|
|
234
|
-
let frameSeq;
|
|
235
|
-
if (isTransition || isTransitionEnd) {
|
|
236
|
-
protobufData = new Uint8Array(payload).buffer;
|
|
237
|
-
} else {
|
|
238
|
-
if (payload.length < FRAME_SEQ_SIZE) {
|
|
239
|
-
logger.warn("SEIExtractor", "Payload too short for frame sequence");
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
frameSeq = new DataView(payload.buffer, payload.byteOffset, 4).getUint32(
|
|
243
|
-
0,
|
|
244
|
-
true
|
|
245
|
-
);
|
|
246
|
-
if (this.debugLogging && (this.totalFrameCount <= 5 || this.totalFrameCount % 50 === 0)) {
|
|
247
|
-
logger.info("SEIExtractor", `Animation frame seq=${frameSeq}`);
|
|
248
|
-
}
|
|
249
|
-
protobufData = new Uint8Array(
|
|
250
|
-
payload.subarray(FRAME_SEQ_SIZE)
|
|
251
|
-
).buffer;
|
|
252
|
-
}
|
|
253
|
-
if (isTransition) {
|
|
254
|
-
if (!this.isInStartTransition) {
|
|
255
|
-
this.isInStartTransition = true;
|
|
256
|
-
this.isInEndTransition = false;
|
|
257
|
-
if (this.debugLogging) {
|
|
258
|
-
logger.info("SEIExtractor", "Transition START (first packet)");
|
|
259
|
-
}
|
|
260
|
-
this.callbacks.onTransition(protobufData, this.transitionStartFrameCount);
|
|
261
|
-
}
|
|
262
|
-
return;
|
|
263
|
-
}
|
|
264
|
-
if (isTransitionEnd) {
|
|
265
|
-
if (!this.isInEndTransition) {
|
|
266
|
-
this.isInEndTransition = true;
|
|
267
|
-
this.isInStartTransition = false;
|
|
268
|
-
if (this.debugLogging) {
|
|
269
|
-
logger.info("SEIExtractor", "Transition END (first packet)");
|
|
270
|
-
}
|
|
271
|
-
this.callbacks.onTransitionEnd(protobufData, this.transitionEndFrameCount);
|
|
272
|
-
}
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
this.isInStartTransition = false;
|
|
276
|
-
this.isInEndTransition = false;
|
|
277
|
-
const isFirstFrame = this.lastWasIdle || isStart;
|
|
278
|
-
this.lastWasIdle = false;
|
|
279
|
-
if (isFirstFrame) {
|
|
280
|
-
if (this.debugLogging) {
|
|
281
|
-
logger.info("SEIExtractor", "Session start");
|
|
282
|
-
}
|
|
283
|
-
(_b = (_a = this.callbacks).onSessionStart) == null ? void 0 : _b.call(_a);
|
|
284
|
-
}
|
|
285
|
-
this.callbacks.onAnimationData(protobufData, {
|
|
286
|
-
frameSeq,
|
|
287
|
-
isStart: isFirstFrame,
|
|
288
|
-
isEnd,
|
|
289
|
-
isIdle: false,
|
|
290
|
-
isRecovered: false
|
|
291
|
-
// Agora handles reliability internally
|
|
292
|
-
});
|
|
293
|
-
if (isEnd) {
|
|
294
|
-
if (this.debugLogging) {
|
|
295
|
-
logger.info("SEIExtractor", "Session end");
|
|
296
|
-
}
|
|
297
|
-
(_d = (_c = this.callbacks).onSessionEnd) == null ? void 0 : _d.call(_c);
|
|
298
|
-
}
|
|
102
|
+
uint64() {
|
|
103
|
+
return protoInt64.uDec(...this.varint64());
|
|
299
104
|
}
|
|
300
105
|
/**
|
|
301
|
-
*
|
|
302
|
-
* @internal
|
|
106
|
+
* Read a `sint64` field, a signed, zig-zag-encoded 64-bit varint.
|
|
303
107
|
*/
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
}
|
|
311
|
-
if (seiData.length >= SEI_HEADER_SIZE) {
|
|
312
|
-
const flags = seiData[0];
|
|
313
|
-
const msgLen = new DataView(
|
|
314
|
-
seiData.buffer,
|
|
315
|
-
seiData.byteOffset + 1,
|
|
316
|
-
4
|
|
317
|
-
).getUint32(0, true);
|
|
318
|
-
logger.error(
|
|
319
|
-
"SEIExtractor",
|
|
320
|
-
`SEI header: flags=0x${flags.toString(16)}, msgLen=${msgLen}`
|
|
321
|
-
);
|
|
322
|
-
}
|
|
108
|
+
sint64() {
|
|
109
|
+
let [lo, hi] = this.varint64();
|
|
110
|
+
let s = -(lo & 1);
|
|
111
|
+
lo = (lo >>> 1 | (hi & 1) << 31) ^ s;
|
|
112
|
+
hi = hi >>> 1 ^ s;
|
|
113
|
+
return protoInt64.dec(lo, hi);
|
|
323
114
|
}
|
|
324
115
|
/**
|
|
325
|
-
*
|
|
326
|
-
* @internal
|
|
116
|
+
* Read a `bool` field, a variant.
|
|
327
117
|
*/
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
const now = Date.now();
|
|
332
|
-
const elapsedSeconds = (now - this.lastStatsTime) / 1e3;
|
|
333
|
-
if (elapsedSeconds > 0 && this.callbacks) {
|
|
334
|
-
const fps = this.intervalFrameCount / elapsedSeconds;
|
|
335
|
-
const stats = {
|
|
336
|
-
framesPerSec: Math.round(fps * 10) / 10,
|
|
337
|
-
totalFrames: this.totalFrameCount,
|
|
338
|
-
framesSent: this.totalFrameCount,
|
|
339
|
-
framesLost: 0,
|
|
340
|
-
framesRecovered: 0,
|
|
341
|
-
framesDropped: 0,
|
|
342
|
-
framesOutOfOrder: 0,
|
|
343
|
-
framesDuplicate: 0,
|
|
344
|
-
lastRenderedSeq: -1
|
|
345
|
-
};
|
|
346
|
-
this.callbacks.onStreamStats(stats);
|
|
347
|
-
}
|
|
348
|
-
this.intervalFrameCount = 0;
|
|
349
|
-
this.lastStatsTime = now;
|
|
350
|
-
}, 1e3);
|
|
118
|
+
bool() {
|
|
119
|
+
let [lo, hi] = this.varint64();
|
|
120
|
+
return lo !== 0 || hi !== 0;
|
|
351
121
|
}
|
|
352
122
|
/**
|
|
353
|
-
*
|
|
354
|
-
* @internal
|
|
123
|
+
* Read a `fixed32` field, an unsigned, fixed-length 32-bit integer.
|
|
355
124
|
*/
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
125
|
+
fixed32() {
|
|
126
|
+
return this.view.getUint32((this.pos += 4) - 4, true);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Read a `sfixed32` field, a signed, fixed-length 32-bit integer.
|
|
130
|
+
*/
|
|
131
|
+
sfixed32() {
|
|
132
|
+
return this.view.getInt32((this.pos += 4) - 4, true);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Read a `fixed64` field, an unsigned, fixed-length 64 bit integer.
|
|
136
|
+
*/
|
|
137
|
+
fixed64() {
|
|
138
|
+
return protoInt64.uDec(this.sfixed32(), this.sfixed32());
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Read a `fixed64` field, a signed, fixed-length 64-bit integer.
|
|
142
|
+
*/
|
|
143
|
+
sfixed64() {
|
|
144
|
+
return protoInt64.dec(this.sfixed32(), this.sfixed32());
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Read a `float` field, 32-bit floating point number.
|
|
148
|
+
*/
|
|
149
|
+
float() {
|
|
150
|
+
return this.view.getFloat32((this.pos += 4) - 4, true);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Read a `double` field, a 64-bit floating point number.
|
|
154
|
+
*/
|
|
155
|
+
double() {
|
|
156
|
+
return this.view.getFloat64((this.pos += 8) - 8, true);
|
|
361
157
|
}
|
|
362
158
|
/**
|
|
363
|
-
*
|
|
364
|
-
* Call this when reconnecting or starting a new session.
|
|
365
|
-
* @internal
|
|
159
|
+
* Read a `bytes` field, length-delimited arbitrary data.
|
|
366
160
|
*/
|
|
367
|
-
|
|
368
|
-
this.
|
|
369
|
-
this.
|
|
370
|
-
this.
|
|
371
|
-
this.
|
|
372
|
-
this.intervalFrameCount = 0;
|
|
373
|
-
this.lastStatsTime = Date.now();
|
|
161
|
+
bytes() {
|
|
162
|
+
let len = this.uint32(), start = this.pos;
|
|
163
|
+
this.pos += len;
|
|
164
|
+
this.assertBounds();
|
|
165
|
+
return this.buf.subarray(start, start + len);
|
|
374
166
|
}
|
|
375
167
|
/**
|
|
376
|
-
*
|
|
377
|
-
* @internal
|
|
168
|
+
* Read a `string` field, length-delimited data converted to UTF-8 text.
|
|
378
169
|
*/
|
|
379
|
-
|
|
380
|
-
this.
|
|
381
|
-
this.callbacks = null;
|
|
382
|
-
this.lastWasIdle = true;
|
|
383
|
-
this.isInStartTransition = false;
|
|
384
|
-
this.isInEndTransition = false;
|
|
170
|
+
string() {
|
|
171
|
+
return this.decodeUtf8(this.bytes());
|
|
385
172
|
}
|
|
386
173
|
}
|
|
387
174
|
export {
|
|
388
|
-
|
|
175
|
+
BinaryReader,
|
|
176
|
+
WireType
|
|
389
177
|
};
|
|
390
178
|
//# sourceMappingURL=index13.js.map
|
package/dist/index13.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index13.js","sources":["../src/providers/agora/SEIExtractor.ts"],"sourcesContent":["/**\n * SEI Data Extractor for Agora.\n *\n * Extracts animation data from Agora's H.264 SEI events.\n *\n * SEI Packet Format:\n * ```\n * [1B flags][4B msgLen (LE)][msgLen bytes compressed data]\n * ```\n *\n * Packet Flags:\n * - 0x01: Idle (no payload)\n * - 0x02: Start (first frame of session)\n * - 0x04: End (last frame of session)\n * - 0x08: Gzipped (payload is zlib compressed)\n * - 0x10: Transition (transition from idle to animation)\n * - 0x20: TransitionEnd (transition from animation back to idle)\n *\n * Key differences from LiveKit VP8Extractor:\n * - No VP8 header parsing needed\n * - No ALR (Application-Level Redundancy) - Agora handles reliability\n * - Uses native SEI events instead of RTCRtpScriptTransform\n * - Requires EBSP to RBSP conversion (H.264 emulation prevention byte removal)\n *\n * @internal\n * @packageDocumentation\n */\n\nimport type { AnimationTrackCallbacks } from '../../core/types';\nimport type { StreamStats } from '../../types';\nimport { logger } from '../../utils';\n\n/**\n * SEI Packet Flags - must match backend animation_track.go\n * @internal\n */\nconst PacketFlags = {\n /** Idle packet - no payload */\n Idle: 0x01,\n /** First frame of animation session */\n Start: 0x02,\n /** Last frame of animation session */\n End: 0x04,\n /** Payload is zlib compressed */\n Gzipped: 0x08,\n /** Transition from idle to animation */\n Transition: 0x10,\n /** Transition from animation back to idle */\n TransitionEnd: 0x20,\n} as const;\n\n/** SEI header size: 1 byte flags + 4 bytes length */\nconst SEI_HEADER_SIZE = 5;\n\n/** Frame sequence prefix size (4 bytes) for normal animation frames */\nconst FRAME_SEQ_SIZE = 4;\n\n// Default transition frame counts (internal constants)\nconst DEFAULT_TRANSITION_START_FRAMES = 8;\nconst DEFAULT_TRANSITION_END_FRAMES = 12;\n\n/**\n * SEIExtractor - Extracts animation data from Agora SEI events.\n *\n * Handles SEI header parsing, EBSP conversion, decompression, and callback dispatch.\n *\n * @internal\n */\nexport class SEIExtractor {\n /** @internal */\n private callbacks: AnimationTrackCallbacks | null = null;\n\n // Session state tracking\n /** @internal */\n private lastWasIdle = true;\n\n // Transition state tracking (to handle consecutive packets)\n /** @internal */\n private isInStartTransition = false;\n /** @internal */\n private isInEndTransition = false;\n\n // Transition frame counts\n /** @internal */\n private transitionStartFrameCount: number;\n /** @internal */\n private transitionEndFrameCount: number;\n\n // Statistics tracking\n /** @internal */\n private totalFrameCount = 0;\n /** @internal */\n private intervalFrameCount = 0;\n /** @internal */\n private lastStatsTime = 0;\n /** @internal */\n private statsInterval: ReturnType<typeof setInterval> | null = null;\n\n // Debug logging\n /** @internal */\n private debugLogging = false;\n\n constructor() {\n this.transitionStartFrameCount = DEFAULT_TRANSITION_START_FRAMES;\n this.transitionEndFrameCount = DEFAULT_TRANSITION_END_FRAMES;\n }\n\n /**\n * Initialize the extractor with callbacks.\n * @param callbacks - Callbacks to receive extracted data\n * @internal\n */\n initialize(callbacks: AnimationTrackCallbacks): void {\n this.callbacks = callbacks;\n this.startStatsInterval();\n }\n\n /**\n * Enable or disable debug logging.\n * @param enabled - Whether to enable debug logging\n * @internal\n */\n setDebugLogging(enabled: boolean): void {\n this.debugLogging = enabled;\n }\n\n /**\n * Handle SEI data from Agora.\n * Wraps async processing to not block the event handler.\n * @param seiData - Raw SEI payload\n * @internal\n */\n handleSEIData(seiData: Uint8Array): void {\n this.processSEIData(seiData).catch((error) => {\n logger.error('SEIExtractor', 'Failed to process SEI data:', error);\n this.logDebugInfo(seiData);\n });\n }\n\n /**\n * Convert EBSP (Encapsulated Byte Sequence Payload) to RBSP (Raw Byte Sequence Payload).\n * This removes H.264 emulation prevention bytes (0x03) inserted after 00 00 sequences.\n *\n * H.264 spec: When encoding, 0x03 is inserted after 00 00 to prevent start code emulation:\n * - 00 00 00 → 00 00 03 00\n * - 00 00 01 → 00 00 03 01\n * - 00 00 02 → 00 00 03 02\n * - 00 00 03 → 00 00 03 03\n *\n * @param data - EBSP data\n * @returns RBSP data\n * @internal\n */\n private ebspToRbsp(data: Uint8Array): Uint8Array {\n if (data.length === 0) {\n return data;\n }\n\n const result: number[] = [];\n let zeroCount = 0;\n\n for (let i = 0; i < data.length; i++) {\n const byte = data[i];\n\n // Check for emulation prevention byte: 00 00 03 XX where XX <= 0x03\n if (zeroCount >= 2 && byte === 0x03) {\n if (i + 1 < data.length) {\n const nextByte = data[i + 1];\n if (nextByte <= 0x03) {\n // Skip the 0x03 emulation prevention byte\n zeroCount = 0;\n continue;\n }\n }\n }\n\n // Track consecutive zeros\n if (byte === 0x00) {\n zeroCount++;\n } else {\n zeroCount = 0;\n }\n\n result.push(byte);\n }\n\n return new Uint8Array(result);\n }\n\n /**\n * Unescape zero bytes that were escaped by the server.\n * Escape scheme: 0x00 0xFF -> 0x00, 0xFF 0xFF -> 0xFF\n * This reverses the escaping done to avoid H.264 emulation prevention issues.\n *\n * @param data - Escaped data\n * @returns Unescaped data\n * @internal\n */\n private unescapeZeroBytes(data: Uint8Array): Uint8Array {\n const result: number[] = [];\n let i = 0;\n while (i < data.length) {\n if (i + 1 < data.length && data[i] === 0x00 && data[i + 1] === 0xff) {\n // 00 FF -> 00\n result.push(0x00);\n i += 2;\n } else if (\n i + 1 < data.length &&\n data[i] === 0xff &&\n data[i + 1] === 0xff\n ) {\n // FF FF -> FF\n result.push(0xff);\n i += 2;\n } else {\n result.push(data[i]);\n i++;\n }\n }\n return new Uint8Array(result);\n }\n\n /**\n * Decompress zlib data using DecompressionStream API.\n * Uses 'deflate' format (not gzip) to avoid H.264 emulation prevention issues\n * with gzip's mtime field containing 00 00 00 00.\n *\n * @param data - Zlib compressed data\n * @returns Decompressed data\n * @internal\n */\n private async decompressZlib(data: Uint8Array): Promise<Uint8Array> {\n const ds = new DecompressionStream('deflate');\n const writer = ds.writable.getWriter();\n // Create a copy to ensure we have a plain ArrayBuffer\n const copy = new Uint8Array(data);\n writer.write(copy);\n writer.close();\n\n const reader = ds.readable.getReader();\n const chunks: Uint8Array[] = [];\n let totalLength = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n totalLength += value.length;\n }\n\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n }\n\n /**\n * Process SEI data asynchronously.\n * @param seiData - Raw SEI payload\n * @internal\n */\n private async processSEIData(seiData: Uint8Array): Promise<void> {\n if (!this.callbacks) {\n return;\n }\n\n this.totalFrameCount++;\n this.intervalFrameCount++;\n\n // Remove H.264 emulation prevention bytes using EBSP to RBSP conversion\n const cleanedData = this.ebspToRbsp(seiData);\n\n // Parse SEI header: [1B flags][4B msgLen (LE)][payload]\n if (cleanedData.length < SEI_HEADER_SIZE) {\n logger.warn('SEIExtractor', `SEI data too short: ${cleanedData.length}`);\n return;\n }\n\n const flags = cleanedData[0];\n const msgLen = new DataView(\n cleanedData.buffer,\n cleanedData.byteOffset + 1,\n 4\n ).getUint32(0, true);\n\n // Debug logging for first few packets\n if (\n this.debugLogging &&\n (this.totalFrameCount <= 5 || this.totalFrameCount % 50 === 0)\n ) {\n logger.info(\n 'SEIExtractor',\n `SEI packet #${this.totalFrameCount}: flags=0x${flags.toString(16)}, msgLen=${msgLen}, cleanedLen=${cleanedData.length}`\n );\n }\n\n // Check for idle packet (no payload)\n const isIdle = (flags & PacketFlags.Idle) !== 0;\n if (isIdle || msgLen === 0) {\n if (!this.lastWasIdle) {\n this.lastWasIdle = true;\n // Reset transition states when idle\n this.isInStartTransition = false;\n this.isInEndTransition = false;\n this.callbacks.onIdleStart();\n }\n return;\n }\n\n // Extract payload - use all remaining bytes after header instead of msgLen\n // This handles cases where EP removal changes the data length\n const rawPayload = cleanedData.slice(SEI_HEADER_SIZE);\n\n // Unescape zero bytes that were escaped by the server\n const compressedPayload = this.unescapeZeroBytes(rawPayload);\n\n // Decompress if compressed using zlib\n let payload: Uint8Array;\n if ((flags & PacketFlags.Gzipped) !== 0) {\n payload = await this.decompressZlib(compressedPayload);\n } else {\n payload = compressedPayload;\n }\n\n // Check packet type flags\n const isTransition = (flags & PacketFlags.Transition) !== 0;\n const isTransitionEnd = (flags & PacketFlags.TransitionEnd) !== 0;\n const isStart = (flags & PacketFlags.Start) !== 0;\n const isEnd = (flags & PacketFlags.End) !== 0;\n\n // Extract protobuf data\n // Transition frames don't have frame sequence prefix\n let protobufData: ArrayBuffer;\n let frameSeq: number | undefined;\n\n if (isTransition || isTransitionEnd) {\n // Create a copy to ensure we have a plain ArrayBuffer\n protobufData = new Uint8Array(payload).buffer;\n } else {\n // Normal animation frame: [4B frameSeq][protobuf]\n if (payload.length < FRAME_SEQ_SIZE) {\n logger.warn('SEIExtractor', 'Payload too short for frame sequence');\n return;\n }\n frameSeq = new DataView(payload.buffer, payload.byteOffset, 4).getUint32(\n 0,\n true\n );\n\n if (\n this.debugLogging &&\n (this.totalFrameCount <= 5 || this.totalFrameCount % 50 === 0)\n ) {\n logger.info('SEIExtractor', `Animation frame seq=${frameSeq}`);\n }\n\n // Create a copy of the protobuf data portion\n protobufData = new Uint8Array(\n payload.subarray(FRAME_SEQ_SIZE)\n ).buffer;\n }\n\n // Handle transition packets\n // Only trigger transition on first packet of consecutive transition packets\n if (isTransition) {\n if (!this.isInStartTransition) {\n this.isInStartTransition = true;\n this.isInEndTransition = false;\n if (this.debugLogging) {\n logger.info('SEIExtractor', 'Transition START (first packet)');\n }\n this.callbacks.onTransition(protobufData, this.transitionStartFrameCount);\n }\n return;\n }\n\n if (isTransitionEnd) {\n if (!this.isInEndTransition) {\n this.isInEndTransition = true;\n this.isInStartTransition = false;\n if (this.debugLogging) {\n logger.info('SEIExtractor', 'Transition END (first packet)');\n }\n this.callbacks.onTransitionEnd(protobufData, this.transitionEndFrameCount);\n }\n return;\n }\n\n // Normal animation frame - clear transition states\n this.isInStartTransition = false;\n this.isInEndTransition = false;\n\n // Normal animation frame\n const isFirstFrame = this.lastWasIdle || isStart;\n this.lastWasIdle = false;\n\n // Session start callback\n if (isFirstFrame) {\n if (this.debugLogging) {\n logger.info('SEIExtractor', 'Session start');\n }\n this.callbacks.onSessionStart?.();\n }\n\n // Call animation data callback\n this.callbacks.onAnimationData(protobufData, {\n frameSeq,\n isStart: isFirstFrame,\n isEnd,\n isIdle: false,\n isRecovered: false, // Agora handles reliability internally\n });\n\n // Session end callback\n if (isEnd) {\n if (this.debugLogging) {\n logger.info('SEIExtractor', 'Session end');\n }\n this.callbacks.onSessionEnd?.();\n }\n }\n\n /**\n * Log debug information for failed SEI processing.\n * @internal\n */\n private logDebugInfo(seiData: Uint8Array): void {\n const totalLen = seiData.length;\n logger.error('SEIExtractor', `Total SEI length: ${totalLen}`);\n if (seiData.length >= 20) {\n const hexBytes = Array.from(seiData.slice(0, 20))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join(' ');\n logger.error('SEIExtractor', 'First 20 bytes of SEI:', hexBytes);\n }\n if (seiData.length >= SEI_HEADER_SIZE) {\n const flags = seiData[0];\n const msgLen = new DataView(\n seiData.buffer,\n seiData.byteOffset + 1,\n 4\n ).getUint32(0, true);\n logger.error(\n 'SEIExtractor',\n `SEI header: flags=0x${flags.toString(16)}, msgLen=${msgLen}`\n );\n }\n }\n\n /**\n * Start the statistics reporting interval.\n * @internal\n */\n private startStatsInterval(): void {\n this.lastStatsTime = Date.now();\n this.statsInterval = setInterval(() => {\n const now = Date.now();\n const elapsedSeconds = (now - this.lastStatsTime) / 1000;\n\n if (elapsedSeconds > 0 && this.callbacks) {\n const fps = this.intervalFrameCount / elapsedSeconds;\n\n const stats: StreamStats = {\n framesPerSec: Math.round(fps * 10) / 10,\n totalFrames: this.totalFrameCount,\n framesSent: this.totalFrameCount,\n framesLost: 0,\n framesRecovered: 0,\n framesDropped: 0,\n framesOutOfOrder: 0,\n framesDuplicate: 0,\n lastRenderedSeq: -1,\n };\n\n this.callbacks.onStreamStats(stats);\n }\n\n this.intervalFrameCount = 0;\n this.lastStatsTime = now;\n }, 1000);\n }\n\n /**\n * Stop the statistics reporting interval.\n * @internal\n */\n private stopStatsInterval(): void {\n if (this.statsInterval) {\n clearInterval(this.statsInterval);\n this.statsInterval = null;\n }\n }\n\n /**\n * Reset session state.\n * Call this when reconnecting or starting a new session.\n * @internal\n */\n reset(): void {\n this.lastWasIdle = true;\n this.isInStartTransition = false;\n this.isInEndTransition = false;\n this.totalFrameCount = 0;\n this.intervalFrameCount = 0;\n this.lastStatsTime = Date.now();\n }\n\n /**\n * Dispose the extractor and release resources.\n * @internal\n */\n dispose(): void {\n this.stopStatsInterval();\n this.callbacks = null;\n this.lastWasIdle = true;\n this.isInStartTransition = false;\n this.isInEndTransition = false;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index13.js","sources":["../node_modules/.pnpm/@bufbuild+protobuf@2.11.0/node_modules/@bufbuild/protobuf/dist/esm/wire/binary-encoding.js"],"sourcesContent":["// Copyright 2021-2026 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { varint32read, varint32write, varint64read, varint64write, } from \"./varint.js\";\nimport { protoInt64 } from \"../proto-int64.js\";\nimport { getTextEncoding } from \"./text-encoding.js\";\n/**\n * Protobuf binary format wire types.\n *\n * A wire type provides just enough information to find the length of the\n * following value.\n *\n * See https://developers.google.com/protocol-buffers/docs/encoding#structure\n */\nexport var WireType;\n(function (WireType) {\n /**\n * Used for int32, int64, uint32, uint64, sint32, sint64, bool, enum\n */\n WireType[WireType[\"Varint\"] = 0] = \"Varint\";\n /**\n * Used for fixed64, sfixed64, double.\n * Always 8 bytes with little-endian byte order.\n */\n WireType[WireType[\"Bit64\"] = 1] = \"Bit64\";\n /**\n * Used for string, bytes, embedded messages, packed repeated fields\n *\n * Only repeated numeric types (types which use the varint, 32-bit,\n * or 64-bit wire types) can be packed. In proto3, such fields are\n * packed by default.\n */\n WireType[WireType[\"LengthDelimited\"] = 2] = \"LengthDelimited\";\n /**\n * Start of a tag-delimited aggregate, such as a proto2 group, or a message\n * in editions with message_encoding = DELIMITED.\n */\n WireType[WireType[\"StartGroup\"] = 3] = \"StartGroup\";\n /**\n * End of a tag-delimited aggregate.\n */\n WireType[WireType[\"EndGroup\"] = 4] = \"EndGroup\";\n /**\n * Used for fixed32, sfixed32, float.\n * Always 4 bytes with little-endian byte order.\n */\n WireType[WireType[\"Bit32\"] = 5] = \"Bit32\";\n})(WireType || (WireType = {}));\n/**\n * Maximum value for a 32-bit floating point value (Protobuf FLOAT).\n */\nexport const FLOAT32_MAX = 3.4028234663852886e38;\n/**\n * Minimum value for a 32-bit floating point value (Protobuf FLOAT).\n */\nexport const FLOAT32_MIN = -3.4028234663852886e38;\n/**\n * Maximum value for an unsigned 32-bit integer (Protobuf UINT32, FIXED32).\n */\nexport const UINT32_MAX = 0xffffffff;\n/**\n * Maximum value for a signed 32-bit integer (Protobuf INT32, SFIXED32, SINT32).\n */\nexport const INT32_MAX = 0x7fffffff;\n/**\n * Minimum value for a signed 32-bit integer (Protobuf INT32, SFIXED32, SINT32).\n */\nexport const INT32_MIN = -0x80000000;\nexport class BinaryWriter {\n constructor(encodeUtf8 = getTextEncoding().encodeUtf8) {\n this.encodeUtf8 = encodeUtf8;\n /**\n * Previous fork states.\n */\n this.stack = [];\n this.chunks = [];\n this.buf = [];\n }\n /**\n * Return all bytes written and reset this writer.\n */\n finish() {\n if (this.buf.length) {\n this.chunks.push(new Uint8Array(this.buf)); // flush the buffer\n this.buf = [];\n }\n let len = 0;\n for (let i = 0; i < this.chunks.length; i++)\n len += this.chunks[i].length;\n let bytes = new Uint8Array(len);\n let offset = 0;\n for (let i = 0; i < this.chunks.length; i++) {\n bytes.set(this.chunks[i], offset);\n offset += this.chunks[i].length;\n }\n this.chunks = [];\n return bytes;\n }\n /**\n * Start a new fork for length-delimited data like a message\n * or a packed repeated field.\n *\n * Must be joined later with `join()`.\n */\n fork() {\n this.stack.push({ chunks: this.chunks, buf: this.buf });\n this.chunks = [];\n this.buf = [];\n return this;\n }\n /**\n * Join the last fork. Write its length and bytes, then\n * return to the previous state.\n */\n join() {\n // get chunk of fork\n let chunk = this.finish();\n // restore previous state\n let prev = this.stack.pop();\n if (!prev)\n throw new Error(\"invalid state, fork stack empty\");\n this.chunks = prev.chunks;\n this.buf = prev.buf;\n // write length of chunk as varint\n this.uint32(chunk.byteLength);\n return this.raw(chunk);\n }\n /**\n * Writes a tag (field number and wire type).\n *\n * Equivalent to `uint32( (fieldNo << 3 | type) >>> 0 )`.\n *\n * Generated code should compute the tag ahead of time and call `uint32()`.\n */\n tag(fieldNo, type) {\n return this.uint32(((fieldNo << 3) | type) >>> 0);\n }\n /**\n * Write a chunk of raw bytes.\n */\n raw(chunk) {\n if (this.buf.length) {\n this.chunks.push(new Uint8Array(this.buf));\n this.buf = [];\n }\n this.chunks.push(chunk);\n return this;\n }\n /**\n * Write a `uint32` value, an unsigned 32 bit varint.\n */\n uint32(value) {\n assertUInt32(value);\n // write value as varint 32, inlined for speed\n while (value > 0x7f) {\n this.buf.push((value & 0x7f) | 0x80);\n value = value >>> 7;\n }\n this.buf.push(value);\n return this;\n }\n /**\n * Write a `int32` value, a signed 32 bit varint.\n */\n int32(value) {\n assertInt32(value);\n varint32write(value, this.buf);\n return this;\n }\n /**\n * Write a `bool` value, a variant.\n */\n bool(value) {\n this.buf.push(value ? 1 : 0);\n return this;\n }\n /**\n * Write a `bytes` value, length-delimited arbitrary data.\n */\n bytes(value) {\n this.uint32(value.byteLength); // write length of chunk as varint\n return this.raw(value);\n }\n /**\n * Write a `string` value, length-delimited data converted to UTF-8 text.\n */\n string(value) {\n let chunk = this.encodeUtf8(value);\n this.uint32(chunk.byteLength); // write length of chunk as varint\n return this.raw(chunk);\n }\n /**\n * Write a `float` value, 32-bit floating point number.\n */\n float(value) {\n assertFloat32(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setFloat32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `double` value, a 64-bit floating point number.\n */\n double(value) {\n let chunk = new Uint8Array(8);\n new DataView(chunk.buffer).setFloat64(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `fixed32` value, an unsigned, fixed-length 32-bit integer.\n */\n fixed32(value) {\n assertUInt32(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setUint32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `sfixed32` value, a signed, fixed-length 32-bit integer.\n */\n sfixed32(value) {\n assertInt32(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setInt32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `sint32` value, a signed, zigzag-encoded 32-bit varint.\n */\n sint32(value) {\n assertInt32(value);\n // zigzag encode\n value = ((value << 1) ^ (value >> 31)) >>> 0;\n varint32write(value, this.buf);\n return this;\n }\n /**\n * Write a `fixed64` value, a signed, fixed-length 64-bit integer.\n */\n sfixed64(value) {\n let chunk = new Uint8Array(8), view = new DataView(chunk.buffer), tc = protoInt64.enc(value);\n view.setInt32(0, tc.lo, true);\n view.setInt32(4, tc.hi, true);\n return this.raw(chunk);\n }\n /**\n * Write a `fixed64` value, an unsigned, fixed-length 64 bit integer.\n */\n fixed64(value) {\n let chunk = new Uint8Array(8), view = new DataView(chunk.buffer), tc = protoInt64.uEnc(value);\n view.setInt32(0, tc.lo, true);\n view.setInt32(4, tc.hi, true);\n return this.raw(chunk);\n }\n /**\n * Write a `int64` value, a signed 64-bit varint.\n */\n int64(value) {\n let tc = protoInt64.enc(value);\n varint64write(tc.lo, tc.hi, this.buf);\n return this;\n }\n /**\n * Write a `sint64` value, a signed, zig-zag-encoded 64-bit varint.\n */\n sint64(value) {\n const tc = protoInt64.enc(value), \n // zigzag encode\n sign = tc.hi >> 31, lo = (tc.lo << 1) ^ sign, hi = ((tc.hi << 1) | (tc.lo >>> 31)) ^ sign;\n varint64write(lo, hi, this.buf);\n return this;\n }\n /**\n * Write a `uint64` value, an unsigned 64-bit varint.\n */\n uint64(value) {\n const tc = protoInt64.uEnc(value);\n varint64write(tc.lo, tc.hi, this.buf);\n return this;\n }\n}\nexport class BinaryReader {\n constructor(buf, decodeUtf8 = getTextEncoding().decodeUtf8) {\n this.decodeUtf8 = decodeUtf8;\n this.varint64 = varint64read; // dirty cast for `this`\n /**\n * Read a `uint32` field, an unsigned 32 bit varint.\n */\n this.uint32 = varint32read;\n this.buf = buf;\n this.len = buf.length;\n this.pos = 0;\n this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n }\n /**\n * Reads a tag - field number and wire type.\n */\n tag() {\n let tag = this.uint32(), fieldNo = tag >>> 3, wireType = tag & 7;\n if (fieldNo <= 0 || wireType < 0 || wireType > 5)\n throw new Error(\"illegal tag: field no \" + fieldNo + \" wire type \" + wireType);\n return [fieldNo, wireType];\n }\n /**\n * Skip one element and return the skipped data.\n *\n * When skipping StartGroup, provide the tags field number to check for\n * matching field number in the EndGroup tag.\n */\n skip(wireType, fieldNo) {\n let start = this.pos;\n switch (wireType) {\n case WireType.Varint:\n while (this.buf[this.pos++] & 0x80) {\n // ignore\n }\n break;\n // @ts-ignore TS7029: Fallthrough case in switch -- ignore instead of expect-error for compiler settings without noFallthroughCasesInSwitch: true\n case WireType.Bit64:\n this.pos += 4;\n case WireType.Bit32:\n this.pos += 4;\n break;\n case WireType.LengthDelimited:\n let len = this.uint32();\n this.pos += len;\n break;\n case WireType.StartGroup:\n for (;;) {\n const [fn, wt] = this.tag();\n if (wt === WireType.EndGroup) {\n if (fieldNo !== undefined && fn !== fieldNo) {\n throw new Error(\"invalid end group tag\");\n }\n break;\n }\n this.skip(wt, fn);\n }\n break;\n default:\n throw new Error(\"cant skip wire type \" + wireType);\n }\n this.assertBounds();\n return this.buf.subarray(start, this.pos);\n }\n /**\n * Throws error if position in byte array is out of range.\n */\n assertBounds() {\n if (this.pos > this.len)\n throw new RangeError(\"premature EOF\");\n }\n /**\n * Read a `int32` field, a signed 32 bit varint.\n */\n int32() {\n return this.uint32() | 0;\n }\n /**\n * Read a `sint32` field, a signed, zigzag-encoded 32-bit varint.\n */\n sint32() {\n let zze = this.uint32();\n // decode zigzag\n return (zze >>> 1) ^ -(zze & 1);\n }\n /**\n * Read a `int64` field, a signed 64-bit varint.\n */\n int64() {\n return protoInt64.dec(...this.varint64());\n }\n /**\n * Read a `uint64` field, an unsigned 64-bit varint.\n */\n uint64() {\n return protoInt64.uDec(...this.varint64());\n }\n /**\n * Read a `sint64` field, a signed, zig-zag-encoded 64-bit varint.\n */\n sint64() {\n let [lo, hi] = this.varint64();\n // decode zig zag\n let s = -(lo & 1);\n lo = ((lo >>> 1) | ((hi & 1) << 31)) ^ s;\n hi = (hi >>> 1) ^ s;\n return protoInt64.dec(lo, hi);\n }\n /**\n * Read a `bool` field, a variant.\n */\n bool() {\n let [lo, hi] = this.varint64();\n return lo !== 0 || hi !== 0;\n }\n /**\n * Read a `fixed32` field, an unsigned, fixed-length 32-bit integer.\n */\n fixed32() {\n // biome-ignore lint/suspicious/noAssignInExpressions: no\n return this.view.getUint32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `sfixed32` field, a signed, fixed-length 32-bit integer.\n */\n sfixed32() {\n // biome-ignore lint/suspicious/noAssignInExpressions: no\n return this.view.getInt32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `fixed64` field, an unsigned, fixed-length 64 bit integer.\n */\n fixed64() {\n return protoInt64.uDec(this.sfixed32(), this.sfixed32());\n }\n /**\n * Read a `fixed64` field, a signed, fixed-length 64-bit integer.\n */\n sfixed64() {\n return protoInt64.dec(this.sfixed32(), this.sfixed32());\n }\n /**\n * Read a `float` field, 32-bit floating point number.\n */\n float() {\n // biome-ignore lint/suspicious/noAssignInExpressions: no\n return this.view.getFloat32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `double` field, a 64-bit floating point number.\n */\n double() {\n // biome-ignore lint/suspicious/noAssignInExpressions: no\n return this.view.getFloat64((this.pos += 8) - 8, true);\n }\n /**\n * Read a `bytes` field, length-delimited arbitrary data.\n */\n bytes() {\n let len = this.uint32(), start = this.pos;\n this.pos += len;\n this.assertBounds();\n return this.buf.subarray(start, start + len);\n }\n /**\n * Read a `string` field, length-delimited data converted to UTF-8 text.\n */\n string() {\n return this.decodeUtf8(this.bytes());\n }\n}\n/**\n * Assert a valid signed protobuf 32-bit integer as a number or string.\n */\nfunction assertInt32(arg) {\n if (typeof arg == \"string\") {\n arg = Number(arg);\n }\n else if (typeof arg != \"number\") {\n throw new Error(\"invalid int32: \" + typeof arg);\n }\n if (!Number.isInteger(arg) ||\n arg > INT32_MAX ||\n arg < INT32_MIN)\n throw new Error(\"invalid int32: \" + arg);\n}\n/**\n * Assert a valid unsigned protobuf 32-bit integer as a number or string.\n */\nfunction assertUInt32(arg) {\n if (typeof arg == \"string\") {\n arg = Number(arg);\n }\n else if (typeof arg != \"number\") {\n throw new Error(\"invalid uint32: \" + typeof arg);\n }\n if (!Number.isInteger(arg) ||\n arg > UINT32_MAX ||\n arg < 0)\n throw new Error(\"invalid uint32: \" + arg);\n}\n/**\n * Assert a valid protobuf float value as a number or string.\n */\nfunction assertFloat32(arg) {\n if (typeof arg == \"string\") {\n const o = arg;\n arg = Number(arg);\n if (Number.isNaN(arg) && o !== \"NaN\") {\n throw new Error(\"invalid float32: \" + o);\n }\n }\n else if (typeof arg != \"number\") {\n throw new Error(\"invalid float32: \" + typeof arg);\n }\n if (Number.isFinite(arg) &&\n (arg > FLOAT32_MAX || arg < FLOAT32_MIN))\n throw new Error(\"invalid float32: \" + arg);\n}\n"],"names":["WireType"],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/index14.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index14.js","sources":["../src/providers/livekit/animation-transform.ts"],"sourcesContent":["/**\n * Animation Transform for Video Track.\n *\n * Uses RTCRtpScriptTransform to extract animation data from the video track.\n * The video track carries animation data in binary format (not actual video).\n *\n * @internal\n * @packageDocumentation\n */\n\nimport type { AnimationTransformEvent } from './types';\nimport { logger } from '../../utils';\n\nexport { METADATA_FIXED_HEADER_SIZE, PACKET_FLAGS } from './types';\n\n/**\n * Check if browser supports RTCRtpScriptTransform.\n * @returns true if RTCRtpScriptTransform is available\n * @internal\n */\nexport function supportsScriptTransform(): boolean {\n return typeof RTCRtpScriptTransform !== 'undefined';\n}\n\n/**\n * Create RTCRtpScriptTransform for animation receiver (video track).\n * @param workerOrUrl - Either a Worker instance or a URL string to the worker script\n * @param onEvent - Optional callback for transform events\n * @returns RTCRtpScriptTransform instance\n * @internal\n */\nexport function createAnimationReceiverTransform(\n workerOrUrl: Worker | string | URL,\n onEvent?: (evt: AnimationTransformEvent) => void
|
|
1
|
+
{"version":3,"file":"index14.js","sources":["../src/providers/livekit/animation-transform.ts"],"sourcesContent":["/**\n * Animation Transform for Video Track.\n *\n * Uses RTCRtpScriptTransform to extract animation data from the video track.\n * The video track carries animation data in binary format (not actual video).\n *\n * @internal\n * @packageDocumentation\n */\n\nimport type { AnimationTransformEvent } from './types';\nimport { logger } from '../../utils';\n\nexport { METADATA_FIXED_HEADER_SIZE, PACKET_FLAGS } from './types';\n\n/**\n * Check if browser supports RTCRtpScriptTransform.\n * @returns true if RTCRtpScriptTransform is available\n * @internal\n */\nexport function supportsScriptTransform(): boolean {\n return typeof RTCRtpScriptTransform !== 'undefined';\n}\n\n/**\n * Create RTCRtpScriptTransform for animation receiver (video track).\n * @param workerOrUrl - Either a Worker instance or a URL string to the worker script\n * @param onEvent - Optional callback for transform events\n * @returns RTCRtpScriptTransform instance\n * @internal\n */\nexport function createAnimationReceiverTransform(\n workerOrUrl: Worker | string | URL,\n onEvent?: (evt: AnimationTransformEvent) => void,\n): RTCRtpScriptTransform {\n // Create worker if URL is provided, otherwise use the provided Worker\n const worker =\n workerOrUrl instanceof Worker\n ? workerOrUrl\n : new Worker(workerOrUrl, { type: 'module', name: 'animation-receiver' });\n\n worker.onmessage = (event) => {\n const { type } = event.data;\n\n if (type === 'ready') {\n onEvent?.({ type: 'ready', operation: 'receiver' });\n } else if (type === 'metadata') {\n onEvent?.(event.data);\n } else if (type === 'animation') {\n onEvent?.({\n type: 'animation',\n protobufData: event.data.protobufData,\n flags: event.data.flags,\n isIdle: event.data.isIdle,\n isStart: event.data.isStart,\n isEnd: event.data.isEnd,\n frameSeq: event.data.frameSeq,\n isRecovered: event.data.isRecovered,\n });\n } else if (type === 'transition') {\n onEvent?.({\n type: 'transition',\n protobufData: event.data.protobufData,\n flags: event.data.flags,\n });\n } else if (type === 'transitionEnd') {\n onEvent?.({\n type: 'transitionEnd',\n protobufData: event.data.protobufData,\n flags: event.data.flags,\n });\n } else if (type === 'idleStart') {\n onEvent?.({ type: 'idleStart' });\n } else if (type === 'error') {\n logger.error('AnimationTransform', 'Error:', event.data.error);\n onEvent?.(event.data);\n }\n };\n\n worker.onerror = (event) => {\n logger.error('AnimationTransform', 'Worker error:', event.message);\n };\n\n return new RTCRtpScriptTransform(worker, { operation: 'receiver' });\n}\n"],"names":[],"mappings":";AA+BO,SAAS,iCACd,aACA,SACuB;AAEvB,QAAM,SACJ,uBAAuB,SACnB,cACA,IAAI,OAAO,aAAa,EAAE,MAAM,UAAU,MAAM,qBAAA,CAAsB;AAE5E,SAAO,YAAY,CAAC,UAAU;AAC5B,UAAM,EAAE,SAAS,MAAM;AAEvB,QAAI,SAAS,SAAS;AACpB,yCAAU,EAAE,MAAM,SAAS,WAAW;IACxC,WAAW,SAAS,YAAY;AAC9B,yCAAU,MAAM;AAAA,IAClB,WAAW,SAAS,aAAa;AAC/B,yCAAU;AAAA,QACR,MAAM;AAAA,QACN,cAAc,MAAM,KAAK;AAAA,QACzB,OAAO,MAAM,KAAK;AAAA,QAClB,QAAQ,MAAM,KAAK;AAAA,QACnB,SAAS,MAAM,KAAK;AAAA,QACpB,OAAO,MAAM,KAAK;AAAA,QAClB,UAAU,MAAM,KAAK;AAAA,QACrB,aAAa,MAAM,KAAK;AAAA,MAAA;AAAA,IAE5B,WAAW,SAAS,cAAc;AAChC,yCAAU;AAAA,QACR,MAAM;AAAA,QACN,cAAc,MAAM,KAAK;AAAA,QACzB,OAAO,MAAM,KAAK;AAAA,MAAA;AAAA,IAEtB,WAAW,SAAS,iBAAiB;AACnC,yCAAU;AAAA,QACR,MAAM;AAAA,QACN,cAAc,MAAM,KAAK;AAAA,QACzB,OAAO,MAAM,KAAK;AAAA,MAAA;AAAA,IAEtB,WAAW,SAAS,aAAa;AAC/B,yCAAU,EAAE,MAAM;IACpB,WAAW,SAAS,SAAS;AAC3B,aAAO,MAAM,sBAAsB,UAAU,MAAM,KAAK,KAAK;AAC7D,yCAAU,MAAM;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,UAAU,CAAC,UAAU;AAC1B,WAAO,MAAM,sBAAsB,iBAAiB,MAAM,OAAO;AAAA,EACnE;AAEA,SAAO,IAAI,sBAAsB,QAAQ,EAAE,WAAW,YAAY;AACpE;"}
|