@livekit/rtc-node 0.12.1 → 0.13.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/audio_frame.cjs +2 -2
- package/dist/audio_frame.cjs.map +1 -1
- package/dist/audio_frame.d.cts +31 -0
- package/dist/audio_frame.d.ts +11 -5
- package/dist/audio_frame.d.ts.map +1 -1
- package/dist/audio_frame.js +3 -3
- package/dist/audio_frame.js.map +1 -1
- package/dist/audio_resampler.cjs +10 -7
- package/dist/audio_resampler.cjs.map +1 -1
- package/dist/audio_resampler.d.cts +59 -0
- package/dist/audio_resampler.d.ts +11 -3
- package/dist/audio_resampler.d.ts.map +1 -1
- package/dist/audio_resampler.js +13 -10
- package/dist/audio_resampler.js.map +1 -1
- package/dist/audio_source.cjs +6 -4
- package/dist/audio_source.cjs.map +1 -1
- package/dist/audio_source.d.cts +37 -0
- package/dist/audio_source.d.ts +13 -5
- package/dist/audio_source.d.ts.map +1 -1
- package/dist/audio_source.js +9 -7
- package/dist/audio_source.js.map +1 -1
- package/dist/audio_stream.cjs +1 -2
- package/dist/audio_stream.cjs.map +1 -1
- package/dist/audio_stream.d.cts +37 -0
- package/dist/audio_stream.d.ts +16 -5
- package/dist/audio_stream.d.ts.map +1 -1
- package/dist/audio_stream.js +2 -3
- package/dist/audio_stream.js.map +1 -1
- package/dist/e2ee.cjs +19 -20
- package/dist/e2ee.cjs.map +1 -1
- package/dist/e2ee.d.cts +47 -0
- package/dist/e2ee.d.ts +11 -8
- package/dist/e2ee.d.ts.map +1 -1
- package/dist/e2ee.js +29 -30
- package/dist/e2ee.js.map +1 -1
- package/dist/ffi_client.cjs +6 -5
- package/dist/ffi_client.cjs.map +1 -1
- package/dist/ffi_client.d.cts +35 -0
- package/dist/ffi_client.d.ts +23 -11
- package/dist/ffi_client.d.ts.map +1 -1
- package/dist/ffi_client.js +6 -10
- package/dist/ffi_client.js.map +1 -1
- package/dist/index.cjs +16 -49
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -0
- package/dist/index.d.ts +20 -41
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -46
- package/dist/index.js.map +1 -1
- package/dist/napi/native.d.cjs.map +1 -1
- package/dist/napi/native.d.d.cts +21 -0
- package/dist/napi/native.d.d.ts +21 -0
- package/dist/napi/native.d.ts +5 -5
- package/dist/native.d.ts +5 -5
- package/dist/participant.cjs +57 -34
- package/dist/participant.cjs.map +1 -1
- package/dist/participant.d.cts +126 -0
- package/dist/participant.d.ts +34 -20
- package/dist/participant.d.ts.map +1 -1
- package/dist/participant.js +75 -50
- package/dist/participant.js.map +1 -1
- package/dist/proto/audio_frame_pb.cjs +977 -125
- package/dist/proto/audio_frame_pb.cjs.map +1 -1
- package/dist/proto/audio_frame_pb.d.cts +898 -0
- package/dist/proto/audio_frame_pb.d.ts +506 -417
- package/dist/proto/audio_frame_pb.d.ts.map +1 -1
- package/dist/proto/audio_frame_pb.js +943 -85
- package/dist/proto/audio_frame_pb.js.map +1 -1
- package/dist/proto/e2ee_pb.cjs +700 -85
- package/dist/proto/e2ee_pb.cjs.map +1 -1
- package/dist/proto/e2ee_pb.d.cts +653 -0
- package/dist/proto/e2ee_pb.d.ts +333 -263
- package/dist/proto/e2ee_pb.d.ts.map +1 -1
- package/dist/proto/e2ee_pb.js +675 -57
- package/dist/proto/e2ee_pb.js.map +1 -1
- package/dist/proto/ffi_pb.cjs +369 -36
- package/dist/proto/ffi_pb.cjs.map +1 -1
- package/dist/proto/ffi_pb.d.cts +898 -0
- package/dist/proto/ffi_pb.d.ts +164 -112
- package/dist/proto/ffi_pb.d.ts.map +1 -1
- package/dist/proto/ffi_pb.js +364 -29
- package/dist/proto/ffi_pb.js.map +1 -1
- package/dist/proto/handle_pb.cjs +27 -7
- package/dist/proto/handle_pb.cjs.map +1 -1
- package/dist/proto/handle_pb.d.cts +31 -0
- package/dist/proto/handle_pb.d.ts +15 -15
- package/dist/proto/handle_pb.d.ts.map +1 -1
- package/dist/proto/handle_pb.js +26 -5
- package/dist/proto/handle_pb.js.map +1 -1
- package/dist/proto/participant_pb.cjs +112 -15
- package/dist/proto/participant_pb.cjs.map +1 -1
- package/dist/proto/participant_pb.d.cts +181 -0
- package/dist/proto/participant_pb.d.ts +143 -53
- package/dist/proto/participant_pb.d.ts.map +1 -1
- package/dist/proto/participant_pb.js +109 -11
- package/dist/proto/participant_pb.js.map +1 -1
- package/dist/proto/room_pb.cjs +2693 -302
- package/dist/proto/room_pb.cjs.map +1 -1
- package/dist/proto/room_pb.d.cts +2475 -0
- package/dist/proto/room_pb.d.ts +1269 -864
- package/dist/proto/room_pb.d.ts.map +1 -1
- package/dist/proto/room_pb.js +2603 -210
- package/dist/proto/room_pb.js.map +1 -1
- package/dist/proto/rpc_pb.cjs +302 -37
- package/dist/proto/rpc_pb.cjs.map +1 -1
- package/dist/proto/rpc_pb.d.cts +267 -0
- package/dist/proto/rpc_pb.d.ts +140 -108
- package/dist/proto/rpc_pb.d.ts.map +1 -1
- package/dist/proto/rpc_pb.js +291 -25
- package/dist/proto/rpc_pb.js.map +1 -1
- package/dist/proto/stats_pb.cjs +1253 -139
- package/dist/proto/stats_pb.cjs.map +1 -1
- package/dist/proto/stats_pb.d.cts +1764 -0
- package/dist/proto/stats_pb.d.ts +806 -693
- package/dist/proto/stats_pb.d.ts.map +1 -1
- package/dist/proto/stats_pb.js +1216 -93
- package/dist/proto/stats_pb.js.map +1 -1
- package/dist/proto/track_pb.cjs +462 -64
- package/dist/proto/track_pb.cjs.map +1 -1
- package/dist/proto/track_pb.d.cts +434 -0
- package/dist/proto/track_pb.d.ts +254 -220
- package/dist/proto/track_pb.d.ts.map +1 -1
- package/dist/proto/track_pb.js +447 -45
- package/dist/proto/track_pb.js.map +1 -1
- package/dist/proto/track_publication_pb.cjs +130 -0
- package/dist/proto/track_publication_pb.cjs.map +1 -0
- package/dist/proto/track_publication_pb.d.cts +80 -0
- package/dist/proto/track_publication_pb.d.ts +80 -0
- package/dist/proto/track_publication_pb.d.ts.map +1 -0
- package/dist/proto/track_publication_pb.js +103 -0
- package/dist/proto/track_publication_pb.js.map +1 -0
- package/dist/proto/video_frame_pb.cjs +648 -88
- package/dist/proto/video_frame_pb.cjs.map +1 -1
- package/dist/proto/video_frame_pb.d.cts +660 -0
- package/dist/proto/video_frame_pb.d.ts +375 -328
- package/dist/proto/video_frame_pb.d.ts.map +1 -1
- package/dist/proto/video_frame_pb.js +626 -60
- package/dist/proto/video_frame_pb.js.map +1 -1
- package/dist/room.cjs +93 -125
- package/dist/room.cjs.map +1 -1
- package/dist/room.d.cts +123 -0
- package/dist/room.d.ts +37 -34
- package/dist/room.d.ts.map +1 -1
- package/dist/room.js +92 -122
- package/dist/room.js.map +1 -1
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.cts +81 -0
- package/dist/rpc.d.ts +10 -7
- package/dist/rpc.js.map +1 -1
- package/dist/track.cjs +12 -8
- package/dist/track.cjs.map +1 -1
- package/dist/track.d.cts +45 -0
- package/dist/track.d.ts +30 -20
- package/dist/track.d.ts.map +1 -1
- package/dist/track.js +13 -9
- package/dist/track.js.map +1 -1
- package/dist/track_publication.cjs +21 -12
- package/dist/track_publication.cjs.map +1 -1
- package/dist/track_publication.d.cts +47 -0
- package/dist/track_publication.d.ts +30 -19
- package/dist/track_publication.d.ts.map +1 -1
- package/dist/track_publication.js +22 -13
- package/dist/track_publication.js.map +1 -1
- package/dist/transcription.d.cts +15 -0
- package/dist/transcription.d.ts +4 -3
- package/dist/types.d.cts +9 -0
- package/dist/types.d.ts +3 -2
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.d.cts +3 -0
- package/dist/version.d.ts +3 -2
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/video_frame.cjs +26 -45
- package/dist/video_frame.cjs.map +1 -1
- package/dist/video_frame.d.cts +24 -0
- package/dist/video_frame.d.ts +10 -4
- package/dist/video_frame.d.ts.map +1 -1
- package/dist/video_frame.js +29 -48
- package/dist/video_frame.js.map +1 -1
- package/dist/video_source.cjs +7 -4
- package/dist/video_source.cjs.map +1 -1
- package/dist/video_source.d.cts +22 -0
- package/dist/video_source.d.ts +14 -7
- package/dist/video_source.d.ts.map +1 -1
- package/dist/video_source.js +9 -6
- package/dist/video_source.js.map +1 -1
- package/dist/video_stream.cjs +16 -5
- package/dist/video_stream.cjs.map +1 -1
- package/dist/video_stream.d.cts +40 -0
- package/dist/video_stream.d.ts +18 -7
- package/dist/video_stream.d.ts.map +1 -1
- package/dist/video_stream.js +17 -6
- package/dist/video_stream.js.map +1 -1
- package/package.json +17 -12
- package/src/audio_frame.ts +10 -10
- package/src/audio_resampler.ts +15 -13
- package/src/audio_source.ts +11 -8
- package/src/audio_stream.ts +3 -4
- package/src/e2ee.ts +36 -37
- package/src/ffi_client.ts +8 -16
- package/src/index.ts +5 -68
- package/src/napi/native.d.ts +5 -5
- package/src/participant.ts +100 -72
- package/src/proto/audio_frame_pb.ts +1220 -496
- package/src/proto/e2ee_pb.ts +858 -337
- package/src/proto/ffi_pb.ts +442 -135
- package/src/proto/handle_pb.ts +33 -19
- package/src/proto/participant_pb.ts +225 -60
- package/src/proto/room_pb.ts +3149 -1013
- package/src/proto/rpc_pb.ts +358 -129
- package/src/proto/stats_pb.ts +1891 -877
- package/src/proto/track_pb.ts +587 -253
- package/src/proto/track_publication_pb.ts +180 -0
- package/src/proto/video_frame_pb.ts +861 -394
- package/src/room.ts +143 -188
- package/src/rpc.ts +1 -1
- package/src/track.ts +16 -17
- package/src/track_publication.ts +25 -26
- package/src/version.ts +1 -1
- package/src/video_frame.ts +48 -72
- package/src/video_source.ts +11 -8
- package/src/video_stream.ts +18 -8
package/dist/video_frame.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { FfiClient } from "./ffi_client.js";
|
|
3
|
-
import { FfiRequestSchema } from "./proto/ffi_pb.js";
|
|
1
|
+
import { FfiClient, FfiRequest } from "./ffi_client.js";
|
|
4
2
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
VideoBufferInfo,
|
|
4
|
+
VideoBufferInfo_ComponentInfo,
|
|
7
5
|
VideoBufferType
|
|
8
6
|
} from "./proto/video_frame_pb.js";
|
|
9
7
|
class VideoFrame {
|
|
@@ -19,7 +17,7 @@ class VideoFrame {
|
|
|
19
17
|
}
|
|
20
18
|
/** @internal */
|
|
21
19
|
protoInfo() {
|
|
22
|
-
const info =
|
|
20
|
+
const info = new VideoBufferInfo({
|
|
23
21
|
width: this.width,
|
|
24
22
|
height: this.height,
|
|
25
23
|
type: this.type,
|
|
@@ -59,7 +57,7 @@ class VideoFrame {
|
|
|
59
57
|
return FfiClient.instance.copyBuffer(planeInfo.dataPtr, planeInfo.size);
|
|
60
58
|
}
|
|
61
59
|
convert(dstType, flipY = false) {
|
|
62
|
-
const req =
|
|
60
|
+
const req = new FfiRequest({
|
|
63
61
|
message: {
|
|
64
62
|
case: "videoConvert",
|
|
65
63
|
value: {
|
|
@@ -70,10 +68,13 @@ class VideoFrame {
|
|
|
70
68
|
}
|
|
71
69
|
});
|
|
72
70
|
const resp = FfiClient.instance.request(req);
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
switch (resp.message.case) {
|
|
72
|
+
case "buffer":
|
|
73
|
+
return VideoFrame.fromOwnedInfo(resp.message.value);
|
|
74
|
+
case "error":
|
|
75
|
+
default:
|
|
76
|
+
throw resp.message.value;
|
|
75
77
|
}
|
|
76
|
-
return VideoFrame.fromOwnedInfo(resp.message.value);
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
const getPlaneLength = (type, width, height) => {
|
|
@@ -105,17 +106,13 @@ const getPlaneInfos = (dataPtr, type, width, height) => {
|
|
|
105
106
|
const chromaHeight = Math.trunc((height + 1) / 2);
|
|
106
107
|
switch (type) {
|
|
107
108
|
case VideoBufferType.I420: {
|
|
108
|
-
const y =
|
|
109
|
-
|
|
110
|
-
stride: width,
|
|
111
|
-
size: width * height
|
|
112
|
-
});
|
|
113
|
-
const u = create(VideoBufferInfo_ComponentInfoSchema, {
|
|
109
|
+
const y = new VideoBufferInfo_ComponentInfo({ dataPtr, stride: width, size: width * height });
|
|
110
|
+
const u = new VideoBufferInfo_ComponentInfo({
|
|
114
111
|
dataPtr: y.dataPtr + BigInt(y.size),
|
|
115
112
|
stride: chromaWidth,
|
|
116
113
|
size: chromaWidth * chromaHeight
|
|
117
114
|
});
|
|
118
|
-
const v =
|
|
115
|
+
const v = new VideoBufferInfo_ComponentInfo({
|
|
119
116
|
dataPtr: u.dataPtr + BigInt(u.size),
|
|
120
117
|
stride: chromaWidth,
|
|
121
118
|
size: chromaWidth * chromaHeight
|
|
@@ -123,22 +120,18 @@ const getPlaneInfos = (dataPtr, type, width, height) => {
|
|
|
123
120
|
return [y, u, v];
|
|
124
121
|
}
|
|
125
122
|
case VideoBufferType.I420A: {
|
|
126
|
-
const y =
|
|
127
|
-
|
|
128
|
-
stride: width,
|
|
129
|
-
size: width * height
|
|
130
|
-
});
|
|
131
|
-
const u = create(VideoBufferInfo_ComponentInfoSchema, {
|
|
123
|
+
const y = new VideoBufferInfo_ComponentInfo({ dataPtr, stride: width, size: width * height });
|
|
124
|
+
const u = new VideoBufferInfo_ComponentInfo({
|
|
132
125
|
dataPtr: y.dataPtr + BigInt(y.size),
|
|
133
126
|
stride: chromaWidth,
|
|
134
127
|
size: chromaWidth * chromaHeight
|
|
135
128
|
});
|
|
136
|
-
const v =
|
|
129
|
+
const v = new VideoBufferInfo_ComponentInfo({
|
|
137
130
|
dataPtr: u.dataPtr + BigInt(u.size),
|
|
138
131
|
stride: chromaWidth,
|
|
139
132
|
size: chromaWidth * chromaHeight
|
|
140
133
|
});
|
|
141
|
-
const a =
|
|
134
|
+
const a = new VideoBufferInfo_ComponentInfo({
|
|
142
135
|
dataPtr: v.dataPtr + BigInt(v.size),
|
|
143
136
|
stride: width,
|
|
144
137
|
size: width * height
|
|
@@ -146,17 +139,13 @@ const getPlaneInfos = (dataPtr, type, width, height) => {
|
|
|
146
139
|
return [y, u, v, a];
|
|
147
140
|
}
|
|
148
141
|
case VideoBufferType.I422: {
|
|
149
|
-
const y =
|
|
150
|
-
|
|
151
|
-
stride: width,
|
|
152
|
-
size: width * height
|
|
153
|
-
});
|
|
154
|
-
const u = create(VideoBufferInfo_ComponentInfoSchema, {
|
|
142
|
+
const y = new VideoBufferInfo_ComponentInfo({ dataPtr, stride: width, size: width * height });
|
|
143
|
+
const u = new VideoBufferInfo_ComponentInfo({
|
|
155
144
|
dataPtr: y.dataPtr + BigInt(y.size),
|
|
156
145
|
stride: chromaWidth,
|
|
157
146
|
size: chromaWidth * height
|
|
158
147
|
});
|
|
159
|
-
const v =
|
|
148
|
+
const v = new VideoBufferInfo_ComponentInfo({
|
|
160
149
|
dataPtr: u.dataPtr + BigInt(u.size),
|
|
161
150
|
stride: chromaWidth,
|
|
162
151
|
size: chromaWidth * height
|
|
@@ -164,17 +153,13 @@ const getPlaneInfos = (dataPtr, type, width, height) => {
|
|
|
164
153
|
return [y, u, v];
|
|
165
154
|
}
|
|
166
155
|
case VideoBufferType.I444: {
|
|
167
|
-
const y =
|
|
168
|
-
|
|
169
|
-
stride: width,
|
|
170
|
-
size: width * height
|
|
171
|
-
});
|
|
172
|
-
const u = create(VideoBufferInfo_ComponentInfoSchema, {
|
|
156
|
+
const y = new VideoBufferInfo_ComponentInfo({ dataPtr, stride: width, size: width * height });
|
|
157
|
+
const u = new VideoBufferInfo_ComponentInfo({
|
|
173
158
|
dataPtr: y.dataPtr + BigInt(y.size),
|
|
174
159
|
stride: width,
|
|
175
160
|
size: width * height
|
|
176
161
|
});
|
|
177
|
-
const v =
|
|
162
|
+
const v = new VideoBufferInfo_ComponentInfo({
|
|
178
163
|
dataPtr: u.dataPtr + BigInt(u.size),
|
|
179
164
|
stride: width,
|
|
180
165
|
size: width * height
|
|
@@ -182,17 +167,17 @@ const getPlaneInfos = (dataPtr, type, width, height) => {
|
|
|
182
167
|
return [y, u, v];
|
|
183
168
|
}
|
|
184
169
|
case VideoBufferType.I010: {
|
|
185
|
-
const y =
|
|
170
|
+
const y = new VideoBufferInfo_ComponentInfo({
|
|
186
171
|
dataPtr,
|
|
187
172
|
stride: width * 2,
|
|
188
173
|
size: width * height * 2
|
|
189
174
|
});
|
|
190
|
-
const u =
|
|
175
|
+
const u = new VideoBufferInfo_ComponentInfo({
|
|
191
176
|
dataPtr: y.dataPtr + BigInt(y.size),
|
|
192
177
|
stride: chromaWidth * 2,
|
|
193
178
|
size: chromaWidth * chromaHeight * 2
|
|
194
179
|
});
|
|
195
|
-
const v =
|
|
180
|
+
const v = new VideoBufferInfo_ComponentInfo({
|
|
196
181
|
dataPtr: u.dataPtr + BigInt(u.size),
|
|
197
182
|
stride: chromaWidth * 2,
|
|
198
183
|
size: chromaWidth * chromaHeight * 2
|
|
@@ -200,12 +185,8 @@ const getPlaneInfos = (dataPtr, type, width, height) => {
|
|
|
200
185
|
return [y, u, v];
|
|
201
186
|
}
|
|
202
187
|
case VideoBufferType.NV12: {
|
|
203
|
-
const y =
|
|
204
|
-
|
|
205
|
-
stride: width,
|
|
206
|
-
size: width * height
|
|
207
|
-
});
|
|
208
|
-
const uv = create(VideoBufferInfo_ComponentInfoSchema, {
|
|
188
|
+
const y = new VideoBufferInfo_ComponentInfo({ dataPtr, stride: width, size: width * height });
|
|
189
|
+
const uv = new VideoBufferInfo_ComponentInfo({
|
|
209
190
|
dataPtr: y.dataPtr + BigInt(y.size),
|
|
210
191
|
stride: chromaWidth * 2,
|
|
211
192
|
size: chromaWidth * chromaHeight * 2
|
package/dist/video_frame.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/video_frame.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { create } from '@bufbuild/protobuf';\nimport { FfiClient } from './ffi_client.js';\nimport { FfiRequestSchema } from './proto/ffi_pb.js';\nimport type {\n OwnedVideoBuffer,\n VideoBufferInfo,\n VideoBufferInfo_ComponentInfo,\n VideoConvertResponse,\n} from './proto/video_frame_pb.js';\nimport {\n VideoBufferInfoSchema,\n VideoBufferInfo_ComponentInfoSchema,\n VideoBufferType,\n} from './proto/video_frame_pb.js';\n\nexport class VideoFrame {\n data: Uint8Array;\n width: number;\n height: number;\n type: VideoBufferType;\n\n constructor(data: Uint8Array, width: number, height: number, type: VideoBufferType) {\n this.data = data;\n this.width = width;\n this.height = height;\n this.type = type;\n }\n\n /** @internal */\n get dataPtr(): bigint {\n return FfiClient.instance.retrievePtr(new Uint8Array(this.data.buffer));\n }\n\n /** @internal */\n protoInfo(): VideoBufferInfo {\n const info = create(VideoBufferInfoSchema, {\n width: this.width,\n height: this.height,\n type: this.type,\n dataPtr: this.dataPtr,\n });\n\n switch (this.type) {\n case VideoBufferType.ARGB:\n case VideoBufferType.RGBA:\n case VideoBufferType.ABGR:\n case VideoBufferType.BGRA:\n info.stride = this.width * 4;\n break;\n case VideoBufferType.RGB24:\n info.stride = this.width * 3;\n break;\n }\n\n info.components.push(...getPlaneInfos(this.dataPtr, this.type, this.width, this.height));\n\n return info;\n }\n\n /** @internal */\n static fromOwnedInfo(owned: OwnedVideoBuffer): VideoFrame {\n const info = owned.info!;\n return new VideoFrame(\n FfiClient.instance.copyBuffer(\n info.dataPtr,\n getPlaneLength(info.type, info.width, info.height),\n ),\n info.width,\n info.height,\n info.type,\n );\n }\n\n getPlane(planeNth: number): Uint8Array | void {\n const planeInfos = getPlaneInfos(this.dataPtr, this.type, this.width, this.height);\n if (planeNth >= planeInfos.length) return;\n\n const planeInfo = planeInfos[planeNth]!;\n return FfiClient.instance.copyBuffer(planeInfo.dataPtr, planeInfo.size);\n }\n\n convert(dstType: VideoBufferType, flipY = false): VideoFrame {\n const req = create(FfiRequestSchema, {\n message: {\n case: 'videoConvert',\n value: {\n flipY,\n dstType,\n buffer: this.protoInfo(),\n },\n },\n });\n const resp = FfiClient.instance.request<VideoConvertResponse>(req);\n if (resp.message.case !== 'buffer') {\n throw new Error(resp.message.value ?? 'Unknown Error');\n }\n\n return VideoFrame.fromOwnedInfo(resp.message.value);\n }\n}\n\nconst getPlaneLength = (type: VideoBufferType, width: number, height: number): number => {\n const chromaWidth = Math.trunc((width + 1) / 2);\n const chromaHeight = Math.trunc((height + 1) / 2);\n switch (type) {\n case VideoBufferType.ARGB:\n case VideoBufferType.RGBA:\n case VideoBufferType.ABGR:\n case VideoBufferType.BGRA:\n return width * height * 4;\n case VideoBufferType.RGB24:\n case VideoBufferType.I444:\n return width * height * 3;\n case VideoBufferType.I420:\n return width * height + chromaWidth * chromaHeight * 2;\n case VideoBufferType.I420A:\n return width * height * 2 + chromaWidth * chromaWidth * 2;\n case VideoBufferType.I422:\n return width * height + chromaWidth * height * 2;\n case VideoBufferType.I010:\n return width * height * 2 + chromaWidth * chromaHeight * 4;\n case VideoBufferType.NV12:\n return width * height + chromaWidth * chromaWidth * 2;\n }\n};\n\nconst getPlaneInfos = (\n dataPtr: bigint,\n type: VideoBufferType,\n width: number,\n height: number,\n): VideoBufferInfo_ComponentInfo[] => {\n const chromaWidth = Math.trunc((width + 1) / 2);\n const chromaHeight = Math.trunc((height + 1) / 2);\n switch (type) {\n case VideoBufferType.I420: {\n const y = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr,\n stride: width,\n size: width * height,\n });\n const u = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr: y.dataPtr + BigInt(y.size),\n stride: chromaWidth,\n size: chromaWidth * chromaHeight,\n });\n const v = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr: u.dataPtr + BigInt(u.size),\n stride: chromaWidth,\n size: chromaWidth * chromaHeight,\n });\n return [y, u, v];\n }\n case VideoBufferType.I420A: {\n const y = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr,\n stride: width,\n size: width * height,\n });\n const u = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr: y.dataPtr + BigInt(y.size),\n stride: chromaWidth,\n size: chromaWidth * chromaHeight,\n });\n const v = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr: u.dataPtr + BigInt(u.size),\n stride: chromaWidth,\n size: chromaWidth * chromaHeight,\n });\n const a = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr: v.dataPtr + BigInt(v.size),\n stride: width,\n size: width * height,\n });\n return [y, u, v, a];\n }\n case VideoBufferType.I422: {\n const y = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr,\n stride: width,\n size: width * height,\n });\n const u = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr: y.dataPtr + BigInt(y.size),\n stride: chromaWidth,\n size: chromaWidth * height,\n });\n const v = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr: u.dataPtr + BigInt(u.size),\n stride: chromaWidth,\n size: chromaWidth * height,\n });\n return [y, u, v];\n }\n case VideoBufferType.I444: {\n const y = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr,\n stride: width,\n size: width * height,\n });\n const u = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr: y.dataPtr + BigInt(y.size),\n stride: width,\n size: width * height,\n });\n const v = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr: u.dataPtr + BigInt(u.size),\n stride: width,\n size: width * height,\n });\n return [y, u, v];\n }\n case VideoBufferType.I010: {\n const y = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr,\n stride: width * 2,\n size: width * height * 2,\n });\n const u = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr: y.dataPtr + BigInt(y.size),\n stride: chromaWidth * 2,\n size: chromaWidth * chromaHeight * 2,\n });\n const v = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr: u.dataPtr + BigInt(u.size),\n stride: chromaWidth * 2,\n size: chromaWidth * chromaHeight * 2,\n });\n return [y, u, v];\n }\n case VideoBufferType.NV12: {\n const y = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr,\n stride: width,\n size: width * height,\n });\n const uv = create(VideoBufferInfo_ComponentInfoSchema, {\n dataPtr: y.dataPtr + BigInt(y.size),\n stride: chromaWidth * 2,\n size: chromaWidth * chromaHeight * 2,\n });\n return [y, uv];\n }\n default:\n return [];\n }\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/video_frame.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { FfiClient, FfiRequest } from './ffi_client.js';\nimport type { OwnedVideoBuffer, VideoConvertResponse } from './proto/video_frame_pb.js';\nimport {\n VideoBufferInfo,\n VideoBufferInfo_ComponentInfo,\n VideoBufferType,\n} from './proto/video_frame_pb.js';\n\nexport class VideoFrame {\n data: Uint8Array;\n width: number;\n height: number;\n type: VideoBufferType;\n\n constructor(data: Uint8Array, width: number, height: number, type: VideoBufferType) {\n this.data = data;\n this.width = width;\n this.height = height;\n this.type = type;\n }\n\n /** @internal */\n get dataPtr(): bigint {\n return FfiClient.instance.retrievePtr(new Uint8Array(this.data.buffer));\n }\n\n /** @internal */\n protoInfo(): VideoBufferInfo {\n const info = new VideoBufferInfo({\n width: this.width,\n height: this.height,\n type: this.type,\n dataPtr: this.dataPtr,\n });\n\n switch (this.type) {\n case VideoBufferType.ARGB:\n case VideoBufferType.RGBA:\n case VideoBufferType.ABGR:\n case VideoBufferType.BGRA:\n info.stride = this.width * 4;\n break;\n case VideoBufferType.RGB24:\n info.stride = this.width * 3;\n break;\n }\n\n info.components.push(...getPlaneInfos(this.dataPtr, this.type, this.width, this.height));\n\n return info;\n }\n\n /** @internal */\n static fromOwnedInfo(owned: OwnedVideoBuffer): VideoFrame {\n const info = owned.info!;\n return new VideoFrame(\n FfiClient.instance.copyBuffer(\n info.dataPtr!,\n getPlaneLength(info.type!, info.width!, info.height!),\n ),\n info.width!,\n info.height!,\n info.type!,\n );\n }\n\n getPlane(planeNth: number): Uint8Array | void {\n const planeInfos = getPlaneInfos(this.dataPtr, this.type, this.width, this.height);\n if (planeNth >= planeInfos.length) return;\n\n const planeInfo = planeInfos[planeNth]!;\n return FfiClient.instance.copyBuffer(planeInfo.dataPtr!, planeInfo.size!);\n }\n\n convert(dstType: VideoBufferType, flipY = false): VideoFrame {\n const req = new FfiRequest({\n message: {\n case: 'videoConvert',\n value: {\n flipY,\n dstType,\n buffer: this.protoInfo(),\n },\n },\n });\n const resp = FfiClient.instance.request<VideoConvertResponse>(req);\n\n switch (resp.message.case) {\n case 'buffer':\n return VideoFrame.fromOwnedInfo(resp.message.value);\n case 'error':\n default:\n throw resp.message.value;\n }\n }\n}\n\nconst getPlaneLength = (type: VideoBufferType, width: number, height: number): number => {\n const chromaWidth = Math.trunc((width + 1) / 2);\n const chromaHeight = Math.trunc((height + 1) / 2);\n switch (type) {\n case VideoBufferType.ARGB:\n case VideoBufferType.RGBA:\n case VideoBufferType.ABGR:\n case VideoBufferType.BGRA:\n return width * height * 4;\n case VideoBufferType.RGB24:\n case VideoBufferType.I444:\n return width * height * 3;\n case VideoBufferType.I420:\n return width * height + chromaWidth * chromaHeight * 2;\n case VideoBufferType.I420A:\n return width * height * 2 + chromaWidth * chromaWidth * 2;\n case VideoBufferType.I422:\n return width * height + chromaWidth * height * 2;\n case VideoBufferType.I010:\n return width * height * 2 + chromaWidth * chromaHeight * 4;\n case VideoBufferType.NV12:\n return width * height + chromaWidth * chromaWidth * 2;\n }\n};\n\nconst getPlaneInfos = (\n dataPtr: bigint,\n type: VideoBufferType,\n width: number,\n height: number,\n): VideoBufferInfo_ComponentInfo[] => {\n const chromaWidth = Math.trunc((width + 1) / 2);\n const chromaHeight = Math.trunc((height + 1) / 2);\n switch (type) {\n case VideoBufferType.I420: {\n const y = new VideoBufferInfo_ComponentInfo({ dataPtr, stride: width, size: width * height });\n const u = new VideoBufferInfo_ComponentInfo({\n dataPtr: y.dataPtr! + BigInt(y.size!),\n stride: chromaWidth,\n size: chromaWidth * chromaHeight,\n });\n const v = new VideoBufferInfo_ComponentInfo({\n dataPtr: u.dataPtr! + BigInt(u.size!),\n stride: chromaWidth,\n size: chromaWidth * chromaHeight,\n });\n return [y, u, v];\n }\n case VideoBufferType.I420A: {\n const y = new VideoBufferInfo_ComponentInfo({ dataPtr, stride: width, size: width * height });\n const u = new VideoBufferInfo_ComponentInfo({\n dataPtr: y.dataPtr! + BigInt(y.size!),\n stride: chromaWidth,\n size: chromaWidth * chromaHeight,\n });\n const v = new VideoBufferInfo_ComponentInfo({\n dataPtr: u.dataPtr! + BigInt(u.size!),\n stride: chromaWidth,\n size: chromaWidth * chromaHeight,\n });\n const a = new VideoBufferInfo_ComponentInfo({\n dataPtr: v.dataPtr! + BigInt(v.size!),\n stride: width,\n size: width * height,\n });\n return [y, u, v, a];\n }\n case VideoBufferType.I422: {\n const y = new VideoBufferInfo_ComponentInfo({ dataPtr, stride: width, size: width * height });\n const u = new VideoBufferInfo_ComponentInfo({\n dataPtr: y.dataPtr! + BigInt(y.size!),\n stride: chromaWidth,\n size: chromaWidth * height,\n });\n const v = new VideoBufferInfo_ComponentInfo({\n dataPtr: u.dataPtr! + BigInt(u.size!),\n stride: chromaWidth,\n size: chromaWidth * height,\n });\n return [y, u, v];\n }\n case VideoBufferType.I444: {\n const y = new VideoBufferInfo_ComponentInfo({ dataPtr, stride: width, size: width * height });\n const u = new VideoBufferInfo_ComponentInfo({\n dataPtr: y.dataPtr! + BigInt(y.size!),\n stride: width,\n size: width * height,\n });\n const v = new VideoBufferInfo_ComponentInfo({\n dataPtr: u.dataPtr! + BigInt(u.size!),\n stride: width,\n size: width * height,\n });\n return [y, u, v];\n }\n case VideoBufferType.I010: {\n const y = new VideoBufferInfo_ComponentInfo({\n dataPtr,\n stride: width * 2,\n size: width * height * 2,\n });\n const u = new VideoBufferInfo_ComponentInfo({\n dataPtr: y.dataPtr! + BigInt(y.size!),\n stride: chromaWidth * 2,\n size: chromaWidth * chromaHeight * 2,\n });\n const v = new VideoBufferInfo_ComponentInfo({\n dataPtr: u.dataPtr! + BigInt(u.size!),\n stride: chromaWidth * 2,\n size: chromaWidth * chromaHeight * 2,\n });\n return [y, u, v];\n }\n case VideoBufferType.NV12: {\n const y = new VideoBufferInfo_ComponentInfo({ dataPtr, stride: width, size: width * height });\n const uv = new VideoBufferInfo_ComponentInfo({\n dataPtr: y.dataPtr! + BigInt(y.size!),\n stride: chromaWidth * 2,\n size: chromaWidth * chromaHeight * 2,\n });\n return [y, uv];\n }\n default:\n return [];\n }\n};\n"],"mappings":"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","names":[]}
|
package/dist/video_source.cjs
CHANGED
|
@@ -21,14 +21,14 @@ __export(video_source_exports, {
|
|
|
21
21
|
VideoSource: () => VideoSource
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(video_source_exports);
|
|
24
|
-
var import_protobuf = require("@bufbuild/protobuf");
|
|
25
24
|
var import_ffi_client = require("./ffi_client.cjs");
|
|
26
25
|
var import_video_frame_pb = require("./proto/video_frame_pb.cjs");
|
|
27
26
|
class VideoSource {
|
|
28
27
|
constructor(width, height) {
|
|
28
|
+
var _a;
|
|
29
29
|
this.width = width;
|
|
30
30
|
this.height = height;
|
|
31
|
-
const req =
|
|
31
|
+
const req = new import_video_frame_pb.NewVideoSourceRequest({
|
|
32
32
|
type: import_video_frame_pb.VideoSourceType.VIDEO_SOURCE_NATIVE,
|
|
33
33
|
resolution: {
|
|
34
34
|
width,
|
|
@@ -41,11 +41,11 @@ class VideoSource {
|
|
|
41
41
|
value: req
|
|
42
42
|
}
|
|
43
43
|
});
|
|
44
|
-
this.info = res.source.info;
|
|
44
|
+
this.info = (_a = res.source) == null ? void 0 : _a.info;
|
|
45
45
|
this.ffiHandle = new import_ffi_client.FfiHandle(res.source.handle.id);
|
|
46
46
|
}
|
|
47
47
|
captureFrame(frame, timestampUs = BigInt(0), rotation = import_video_frame_pb.VideoRotation.VIDEO_ROTATION_0) {
|
|
48
|
-
const req =
|
|
48
|
+
const req = new import_video_frame_pb.CaptureVideoFrameRequest({
|
|
49
49
|
sourceHandle: this.ffiHandle.handle,
|
|
50
50
|
buffer: frame.protoInfo(),
|
|
51
51
|
rotation,
|
|
@@ -55,6 +55,9 @@ class VideoSource {
|
|
|
55
55
|
message: { case: "captureVideoFrame", value: req }
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
|
+
async close() {
|
|
59
|
+
this.ffiHandle.dispose();
|
|
60
|
+
}
|
|
58
61
|
}
|
|
59
62
|
// Annotate the CommonJS export names for ESM import in node:
|
|
60
63
|
0 && (module.exports = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/video_source.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport {
|
|
1
|
+
{"version":3,"sources":["../src/video_source.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport type {\n CaptureVideoFrameResponse,\n NewVideoSourceResponse,\n VideoSourceInfo,\n} from './proto/video_frame_pb.js';\nimport {\n CaptureVideoFrameRequest,\n NewVideoSourceRequest,\n VideoRotation,\n VideoSourceType,\n} from './proto/video_frame_pb.js';\nimport type { VideoFrame } from './video_frame.js';\n\nexport class VideoSource {\n /** @internal */\n info?: VideoSourceInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n\n width: number;\n height: number;\n\n constructor(width: number, height: number) {\n this.width = width;\n this.height = height;\n\n const req = new NewVideoSourceRequest({\n type: VideoSourceType.VIDEO_SOURCE_NATIVE,\n resolution: {\n width: width,\n height: height,\n },\n });\n\n const res = FfiClient.instance.request<NewVideoSourceResponse>({\n message: {\n case: 'newVideoSource',\n value: req,\n },\n });\n\n this.info = res.source?.info;\n this.ffiHandle = new FfiHandle(res.source!.handle!.id!);\n }\n\n captureFrame(\n frame: VideoFrame,\n timestampUs = BigInt(0),\n rotation = VideoRotation.VIDEO_ROTATION_0,\n ) {\n const req = new CaptureVideoFrameRequest({\n sourceHandle: this.ffiHandle.handle,\n buffer: frame.protoInfo(),\n rotation,\n timestampUs,\n });\n\n FfiClient.instance.request<CaptureVideoFrameResponse>({\n message: { case: 'captureVideoFrame', value: req },\n });\n }\n\n async close() {\n this.ffiHandle.dispose();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,wBAAqC;AAMrC,4BAKO;AAGA,MAAM,YAAY;AAAA,EASvB,YAAY,OAAe,QAAgB;AA1B7C;AA2BI,SAAK,QAAQ;AACb,SAAK,SAAS;AAEd,UAAM,MAAM,IAAI,4CAAsB;AAAA,MACpC,MAAM,sCAAgB;AAAA,MACtB,YAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,MAAM,4BAAU,SAAS,QAAgC;AAAA,MAC7D,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,SAAK,QAAO,SAAI,WAAJ,mBAAY;AACxB,SAAK,YAAY,IAAI,4BAAU,IAAI,OAAQ,OAAQ,EAAG;AAAA,EACxD;AAAA,EAEA,aACE,OACA,cAAc,OAAO,CAAC,GACtB,WAAW,oCAAc,kBACzB;AACA,UAAM,MAAM,IAAI,+CAAyB;AAAA,MACvC,cAAc,KAAK,UAAU;AAAA,MAC7B,QAAQ,MAAM,UAAU;AAAA,MACxB;AAAA,MACA;AAAA,IACF,CAAC;AAED,gCAAU,SAAS,QAAmC;AAAA,MACpD,SAAS,EAAE,MAAM,qBAAqB,OAAO,IAAI;AAAA,IACnD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ;AACZ,SAAK,UAAU,QAAQ;AAAA,EACzB;AACF;","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { FfiHandle } from './napi/native.d.cjs';
|
|
2
|
+
import { VideoSourceInfo, VideoRotation } from './proto/video_frame_pb.cjs';
|
|
3
|
+
import { VideoFrame } from './video_frame.cjs';
|
|
4
|
+
import '@bufbuild/protobuf';
|
|
5
|
+
import './proto/track_pb.cjs';
|
|
6
|
+
import './proto/stats_pb.cjs';
|
|
7
|
+
import './proto/e2ee_pb.cjs';
|
|
8
|
+
import './proto/handle_pb.cjs';
|
|
9
|
+
|
|
10
|
+
declare class VideoSource {
|
|
11
|
+
/** @internal */
|
|
12
|
+
info?: VideoSourceInfo;
|
|
13
|
+
/** @internal */
|
|
14
|
+
ffiHandle: FfiHandle;
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
constructor(width: number, height: number);
|
|
18
|
+
captureFrame(frame: VideoFrame, timestampUs?: bigint, rotation?: VideoRotation): void;
|
|
19
|
+
close(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { VideoSource };
|
package/dist/video_source.d.ts
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
|
-
import { FfiHandle } from './
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
|
|
1
|
+
import { FfiHandle } from './napi/native.d.js';
|
|
2
|
+
import { VideoSourceInfo, VideoRotation } from './proto/video_frame_pb.js';
|
|
3
|
+
import { VideoFrame } from './video_frame.js';
|
|
4
|
+
import '@bufbuild/protobuf';
|
|
5
|
+
import './proto/track_pb.js';
|
|
6
|
+
import './proto/stats_pb.js';
|
|
7
|
+
import './proto/e2ee_pb.js';
|
|
8
|
+
import './proto/handle_pb.js';
|
|
9
|
+
|
|
10
|
+
declare class VideoSource {
|
|
6
11
|
/** @internal */
|
|
7
|
-
info
|
|
12
|
+
info?: VideoSourceInfo;
|
|
8
13
|
/** @internal */
|
|
9
14
|
ffiHandle: FfiHandle;
|
|
10
15
|
width: number;
|
|
11
16
|
height: number;
|
|
12
17
|
constructor(width: number, height: number);
|
|
13
18
|
captureFrame(frame: VideoFrame, timestampUs?: bigint, rotation?: VideoRotation): void;
|
|
19
|
+
close(): Promise<void>;
|
|
14
20
|
}
|
|
15
|
-
|
|
21
|
+
|
|
22
|
+
export { VideoSource };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video_source.d.ts","sourceRoot":"","sources":["../src/video_source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"video_source.d.ts","sourceRoot":"","sources":["../src/video_source.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAGV,eAAe,EAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAGL,aAAa,EAEd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,qBAAa,WAAW;IACtB,gBAAgB;IAChB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,gBAAgB;IAChB,SAAS,EAAE,SAAS,CAAC;IAErB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;gBAEH,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAuBzC,YAAY,CACV,KAAK,EAAE,UAAU,EACjB,WAAW,SAAY,EACvB,QAAQ,gBAAiC;IAcrC,KAAK;CAGZ"}
|
package/dist/video_source.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { create } from "@bufbuild/protobuf";
|
|
2
1
|
import { FfiClient, FfiHandle } from "./ffi_client.js";
|
|
3
2
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
CaptureVideoFrameRequest,
|
|
4
|
+
NewVideoSourceRequest,
|
|
6
5
|
VideoRotation,
|
|
7
6
|
VideoSourceType
|
|
8
7
|
} from "./proto/video_frame_pb.js";
|
|
9
8
|
class VideoSource {
|
|
10
9
|
constructor(width, height) {
|
|
10
|
+
var _a;
|
|
11
11
|
this.width = width;
|
|
12
12
|
this.height = height;
|
|
13
|
-
const req =
|
|
13
|
+
const req = new NewVideoSourceRequest({
|
|
14
14
|
type: VideoSourceType.VIDEO_SOURCE_NATIVE,
|
|
15
15
|
resolution: {
|
|
16
16
|
width,
|
|
@@ -23,11 +23,11 @@ class VideoSource {
|
|
|
23
23
|
value: req
|
|
24
24
|
}
|
|
25
25
|
});
|
|
26
|
-
this.info = res.source.info;
|
|
26
|
+
this.info = (_a = res.source) == null ? void 0 : _a.info;
|
|
27
27
|
this.ffiHandle = new FfiHandle(res.source.handle.id);
|
|
28
28
|
}
|
|
29
29
|
captureFrame(frame, timestampUs = BigInt(0), rotation = VideoRotation.VIDEO_ROTATION_0) {
|
|
30
|
-
const req =
|
|
30
|
+
const req = new CaptureVideoFrameRequest({
|
|
31
31
|
sourceHandle: this.ffiHandle.handle,
|
|
32
32
|
buffer: frame.protoInfo(),
|
|
33
33
|
rotation,
|
|
@@ -37,6 +37,9 @@ class VideoSource {
|
|
|
37
37
|
message: { case: "captureVideoFrame", value: req }
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
|
+
async close() {
|
|
41
|
+
this.ffiHandle.dispose();
|
|
42
|
+
}
|
|
40
43
|
}
|
|
41
44
|
export {
|
|
42
45
|
VideoSource
|
package/dist/video_source.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/video_source.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport {
|
|
1
|
+
{"version":3,"sources":["../src/video_source.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { FfiClient, FfiHandle } from './ffi_client.js';\nimport type {\n CaptureVideoFrameResponse,\n NewVideoSourceResponse,\n VideoSourceInfo,\n} from './proto/video_frame_pb.js';\nimport {\n CaptureVideoFrameRequest,\n NewVideoSourceRequest,\n VideoRotation,\n VideoSourceType,\n} from './proto/video_frame_pb.js';\nimport type { VideoFrame } from './video_frame.js';\n\nexport class VideoSource {\n /** @internal */\n info?: VideoSourceInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n\n width: number;\n height: number;\n\n constructor(width: number, height: number) {\n this.width = width;\n this.height = height;\n\n const req = new NewVideoSourceRequest({\n type: VideoSourceType.VIDEO_SOURCE_NATIVE,\n resolution: {\n width: width,\n height: height,\n },\n });\n\n const res = FfiClient.instance.request<NewVideoSourceResponse>({\n message: {\n case: 'newVideoSource',\n value: req,\n },\n });\n\n this.info = res.source?.info;\n this.ffiHandle = new FfiHandle(res.source!.handle!.id!);\n }\n\n captureFrame(\n frame: VideoFrame,\n timestampUs = BigInt(0),\n rotation = VideoRotation.VIDEO_ROTATION_0,\n ) {\n const req = new CaptureVideoFrameRequest({\n sourceHandle: this.ffiHandle.handle,\n buffer: frame.protoInfo(),\n rotation,\n timestampUs,\n });\n\n FfiClient.instance.request<CaptureVideoFrameResponse>({\n message: { case: 'captureVideoFrame', value: req },\n });\n }\n\n async close() {\n this.ffiHandle.dispose();\n }\n}\n"],"mappings":"AAGA,SAAS,WAAW,iBAAiB;AAMrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGA,MAAM,YAAY;AAAA,EASvB,YAAY,OAAe,QAAgB;AA1B7C;AA2BI,SAAK,QAAQ;AACb,SAAK,SAAS;AAEd,UAAM,MAAM,IAAI,sBAAsB;AAAA,MACpC,MAAM,gBAAgB;AAAA,MACtB,YAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,MAAM,UAAU,SAAS,QAAgC;AAAA,MAC7D,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,SAAK,QAAO,SAAI,WAAJ,mBAAY;AACxB,SAAK,YAAY,IAAI,UAAU,IAAI,OAAQ,OAAQ,EAAG;AAAA,EACxD;AAAA,EAEA,aACE,OACA,cAAc,OAAO,CAAC,GACtB,WAAW,cAAc,kBACzB;AACA,UAAM,MAAM,IAAI,yBAAyB;AAAA,MACvC,cAAc,KAAK,UAAU;AAAA,MAC7B,QAAQ,MAAM,UAAU;AAAA,MACxB;AAAA,MACA;AAAA,IACF,CAAC;AAED,cAAU,SAAS,QAAmC;AAAA,MACpD,SAAS,EAAE,MAAM,qBAAqB,OAAO,IAAI;AAAA,IACnD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ;AACZ,SAAK,UAAU,QAAQ;AAAA,EACzB;AACF;","names":[]}
|
package/dist/video_stream.cjs
CHANGED
|
@@ -21,7 +21,6 @@ __export(video_stream_exports, {
|
|
|
21
21
|
VideoStream: () => VideoStream
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(video_stream_exports);
|
|
24
|
-
var import_protobuf = require("@bufbuild/protobuf");
|
|
25
24
|
var import_mutex = require("@livekit/mutex");
|
|
26
25
|
var import_ffi_client = require("./ffi_client.cjs");
|
|
27
26
|
var import_video_frame_pb = require("./proto/video_frame_pb.cjs");
|
|
@@ -46,9 +45,20 @@ class VideoStream {
|
|
|
46
45
|
const frame = import_video_frame.VideoFrame.fromOwnedInfo(streamEvent.value.buffer);
|
|
47
46
|
const value = { rotation, timestampUs, frame };
|
|
48
47
|
if (this.queueResolve) {
|
|
49
|
-
this.queueResolve({
|
|
48
|
+
this.queueResolve({
|
|
49
|
+
done: false,
|
|
50
|
+
value: {
|
|
51
|
+
frame: value.frame,
|
|
52
|
+
timestampUs: value.timestampUs,
|
|
53
|
+
rotation: value.rotation
|
|
54
|
+
}
|
|
55
|
+
});
|
|
50
56
|
} else {
|
|
51
|
-
this.eventQueue.push(
|
|
57
|
+
this.eventQueue.push({
|
|
58
|
+
frame: value.frame,
|
|
59
|
+
timestampUs: value.timestampUs,
|
|
60
|
+
rotation: value.rotation
|
|
61
|
+
});
|
|
52
62
|
}
|
|
53
63
|
break;
|
|
54
64
|
case "eos":
|
|
@@ -56,8 +66,9 @@ class VideoStream {
|
|
|
56
66
|
break;
|
|
57
67
|
}
|
|
58
68
|
};
|
|
69
|
+
var _a;
|
|
59
70
|
this.track = track;
|
|
60
|
-
const req =
|
|
71
|
+
const req = new import_video_frame_pb.NewVideoStreamRequest({
|
|
61
72
|
type: import_video_frame_pb.VideoStreamType.VIDEO_STREAM_NATIVE,
|
|
62
73
|
trackHandle: track.ffi_handle.handle
|
|
63
74
|
});
|
|
@@ -67,7 +78,7 @@ class VideoStream {
|
|
|
67
78
|
value: req
|
|
68
79
|
}
|
|
69
80
|
});
|
|
70
|
-
this.info = res.stream.info;
|
|
81
|
+
this.info = (_a = res.stream) == null ? void 0 : _a.info;
|
|
71
82
|
this.ffiHandle = new import_ffi_client.FfiHandle(res.stream.handle.id);
|
|
72
83
|
import_ffi_client.FfiClient.instance.on(import_ffi_client.FfiClientEvent.FfiEvent, this.onEvent);
|
|
73
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/video_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport {
|
|
1
|
+
{"version":3,"sources":["../src/video_stream.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { Mutex } from '@livekit/mutex';\nimport type { FfiEvent } from './ffi_client.js';\nimport { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js';\nimport type {\n NewVideoStreamResponse,\n VideoRotation,\n VideoStreamInfo,\n} from './proto/video_frame_pb.js';\nimport { NewVideoStreamRequest, VideoStreamType } from './proto/video_frame_pb.js';\nimport type { Track } from './track.js';\nimport { VideoFrame } from './video_frame.js';\n\nexport type VideoFrameEvent = {\n frame: VideoFrame;\n timestampUs: bigint;\n rotation: VideoRotation;\n};\n\nexport class VideoStream implements AsyncIterableIterator<VideoFrameEvent> {\n /** @internal */\n info?: VideoStreamInfo;\n /** @internal */\n ffiHandle: FfiHandle;\n /** @internal */\n eventQueue: (VideoFrameEvent | null)[] = [];\n /** @internal */\n queueResolve: ((value: IteratorResult<VideoFrameEvent>) => void) | null = null;\n /** @internal */\n mutex = new Mutex();\n\n track: Track;\n\n constructor(track: Track) {\n this.track = track;\n\n const req = new NewVideoStreamRequest({\n type: VideoStreamType.VIDEO_STREAM_NATIVE,\n trackHandle: track.ffi_handle.handle,\n });\n\n const res = FfiClient.instance.request<NewVideoStreamResponse>({\n message: {\n case: 'newVideoStream',\n value: req,\n },\n });\n\n this.info = res.stream?.info;\n this.ffiHandle = new FfiHandle(res.stream!.handle!.id!);\n\n FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onEvent);\n }\n\n private onEvent = (ev: FfiEvent) => {\n if (\n ev.message.case != 'videoStreamEvent' ||\n ev.message.value.streamHandle != this.ffiHandle.handle\n ) {\n return;\n }\n\n const streamEvent = ev.message.value.message;\n switch (streamEvent.case) {\n case 'frameReceived':\n const rotation = streamEvent.value.rotation;\n const timestampUs = streamEvent.value.timestampUs;\n const frame = VideoFrame.fromOwnedInfo(streamEvent.value.buffer!);\n const value = { rotation, timestampUs, frame };\n if (this.queueResolve) {\n this.queueResolve({\n done: false,\n value: {\n frame: value.frame,\n timestampUs: value.timestampUs!,\n rotation: value.rotation!,\n },\n });\n } else {\n this.eventQueue.push({\n frame: value.frame,\n timestampUs: value.timestampUs!,\n rotation: value.rotation!,\n });\n }\n break;\n case 'eos':\n FfiClient.instance.off(FfiClientEvent.FfiEvent, this.onEvent);\n break;\n }\n };\n\n async next(): Promise<IteratorResult<VideoFrameEvent>> {\n const unlock = await this.mutex.lock();\n if (this.eventQueue.length > 0) {\n unlock();\n const value = this.eventQueue.shift();\n if (value) {\n return { done: false, value };\n } else {\n return { done: true, value: undefined };\n }\n }\n const promise = new Promise<IteratorResult<VideoFrameEvent>>(\n (resolve) => (this.queueResolve = resolve),\n );\n unlock();\n return promise;\n }\n\n close() {\n this.eventQueue.push(null);\n this.ffiHandle.dispose();\n }\n\n [Symbol.asyncIterator](): VideoStream {\n return this;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAAsB;AAEtB,wBAAqD;AAMrD,4BAAuD;AAEvD,yBAA2B;AAQpB,MAAM,YAA8D;AAAA,EAczE,YAAY,OAAc;AAR1B;AAAA,sBAAyC,CAAC;AAE1C;AAAA,wBAA0E;AAE1E;AAAA,iBAAQ,IAAI,mBAAM;AAyBlB,SAAQ,UAAU,CAAC,OAAiB;AAClC,UACE,GAAG,QAAQ,QAAQ,sBACnB,GAAG,QAAQ,MAAM,gBAAgB,KAAK,UAAU,QAChD;AACA;AAAA,MACF;AAEA,YAAM,cAAc,GAAG,QAAQ,MAAM;AACrC,cAAQ,YAAY,MAAM;AAAA,QACxB,KAAK;AACH,gBAAM,WAAW,YAAY,MAAM;AACnC,gBAAM,cAAc,YAAY,MAAM;AACtC,gBAAM,QAAQ,8BAAW,cAAc,YAAY,MAAM,MAAO;AAChE,gBAAM,QAAQ,EAAE,UAAU,aAAa,MAAM;AAC7C,cAAI,KAAK,cAAc;AACrB,iBAAK,aAAa;AAAA,cAChB,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,OAAO,MAAM;AAAA,gBACb,aAAa,MAAM;AAAA,gBACnB,UAAU,MAAM;AAAA,cAClB;AAAA,YACF,CAAC;AAAA,UACH,OAAO;AACL,iBAAK,WAAW,KAAK;AAAA,cACnB,OAAO,MAAM;AAAA,cACb,aAAa,MAAM;AAAA,cACnB,UAAU,MAAM;AAAA,YAClB,CAAC;AAAA,UACH;AACA;AAAA,QACF,KAAK;AACH,sCAAU,SAAS,IAAI,iCAAe,UAAU,KAAK,OAAO;AAC5D;AAAA,MACJ;AAAA,IACF;AA5FF;AAoCI,SAAK,QAAQ;AAEb,UAAM,MAAM,IAAI,4CAAsB;AAAA,MACpC,MAAM,sCAAgB;AAAA,MACtB,aAAa,MAAM,WAAW;AAAA,IAChC,CAAC;AAED,UAAM,MAAM,4BAAU,SAAS,QAAgC;AAAA,MAC7D,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,SAAK,QAAO,SAAI,WAAJ,mBAAY;AACxB,SAAK,YAAY,IAAI,4BAAU,IAAI,OAAQ,OAAQ,EAAG;AAEtD,gCAAU,SAAS,GAAG,iCAAe,UAAU,KAAK,OAAO;AAAA,EAC7D;AAAA,EAwCA,MAAM,OAAiD;AACrD,UAAM,SAAS,MAAM,KAAK,MAAM,KAAK;AACrC,QAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,aAAO;AACP,YAAM,QAAQ,KAAK,WAAW,MAAM;AACpC,UAAI,OAAO;AACT,eAAO,EAAE,MAAM,OAAO,MAAM;AAAA,MAC9B,OAAO;AACL,eAAO,EAAE,MAAM,MAAM,OAAO,OAAU;AAAA,MACxC;AAAA,IACF;AACA,UAAM,UAAU,IAAI;AAAA,MAClB,CAAC,YAAa,KAAK,eAAe;AAAA,IACpC;AACA,WAAO;AACP,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,SAAK,WAAW,KAAK,IAAI;AACzB,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAEA,CAAC,OAAO,aAAa,IAAiB;AACpC,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Mutex } from '@livekit/mutex';
|
|
2
|
+
import { FfiHandle } from './napi/native.d.cjs';
|
|
3
|
+
import { VideoRotation, VideoStreamInfo } from './proto/video_frame_pb.cjs';
|
|
4
|
+
import { Track } from './track.cjs';
|
|
5
|
+
import { VideoFrame } from './video_frame.cjs';
|
|
6
|
+
import '@bufbuild/protobuf';
|
|
7
|
+
import './proto/track_pb.cjs';
|
|
8
|
+
import './proto/stats_pb.cjs';
|
|
9
|
+
import './proto/e2ee_pb.cjs';
|
|
10
|
+
import './proto/handle_pb.cjs';
|
|
11
|
+
import './audio_source.cjs';
|
|
12
|
+
import './audio_frame.cjs';
|
|
13
|
+
import './proto/audio_frame_pb.cjs';
|
|
14
|
+
import './video_source.cjs';
|
|
15
|
+
|
|
16
|
+
type VideoFrameEvent = {
|
|
17
|
+
frame: VideoFrame;
|
|
18
|
+
timestampUs: bigint;
|
|
19
|
+
rotation: VideoRotation;
|
|
20
|
+
};
|
|
21
|
+
declare class VideoStream implements AsyncIterableIterator<VideoFrameEvent> {
|
|
22
|
+
/** @internal */
|
|
23
|
+
info?: VideoStreamInfo;
|
|
24
|
+
/** @internal */
|
|
25
|
+
ffiHandle: FfiHandle;
|
|
26
|
+
/** @internal */
|
|
27
|
+
eventQueue: (VideoFrameEvent | null)[];
|
|
28
|
+
/** @internal */
|
|
29
|
+
queueResolve: ((value: IteratorResult<VideoFrameEvent>) => void) | null;
|
|
30
|
+
/** @internal */
|
|
31
|
+
mutex: Mutex;
|
|
32
|
+
track: Track;
|
|
33
|
+
constructor(track: Track);
|
|
34
|
+
private onEvent;
|
|
35
|
+
next(): Promise<IteratorResult<VideoFrameEvent>>;
|
|
36
|
+
close(): void;
|
|
37
|
+
[Symbol.asyncIterator](): VideoStream;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { type VideoFrameEvent, VideoStream };
|
package/dist/video_stream.d.ts
CHANGED
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
import { Mutex } from '@livekit/mutex';
|
|
2
|
-
import { FfiHandle } from './
|
|
3
|
-
import
|
|
4
|
-
import
|
|
2
|
+
import { FfiHandle } from './napi/native.d.js';
|
|
3
|
+
import { VideoRotation, VideoStreamInfo } from './proto/video_frame_pb.js';
|
|
4
|
+
import { Track } from './track.js';
|
|
5
5
|
import { VideoFrame } from './video_frame.js';
|
|
6
|
-
|
|
6
|
+
import '@bufbuild/protobuf';
|
|
7
|
+
import './proto/track_pb.js';
|
|
8
|
+
import './proto/stats_pb.js';
|
|
9
|
+
import './proto/e2ee_pb.js';
|
|
10
|
+
import './proto/handle_pb.js';
|
|
11
|
+
import './audio_source.js';
|
|
12
|
+
import './audio_frame.js';
|
|
13
|
+
import './proto/audio_frame_pb.js';
|
|
14
|
+
import './video_source.js';
|
|
15
|
+
|
|
16
|
+
type VideoFrameEvent = {
|
|
7
17
|
frame: VideoFrame;
|
|
8
18
|
timestampUs: bigint;
|
|
9
19
|
rotation: VideoRotation;
|
|
10
20
|
};
|
|
11
|
-
|
|
21
|
+
declare class VideoStream implements AsyncIterableIterator<VideoFrameEvent> {
|
|
12
22
|
/** @internal */
|
|
13
|
-
info
|
|
23
|
+
info?: VideoStreamInfo;
|
|
14
24
|
/** @internal */
|
|
15
25
|
ffiHandle: FfiHandle;
|
|
16
26
|
/** @internal */
|
|
@@ -26,4 +36,5 @@ export declare class VideoStream implements AsyncIterableIterator<VideoFrameEven
|
|
|
26
36
|
close(): void;
|
|
27
37
|
[Symbol.asyncIterator](): VideoStream;
|
|
28
38
|
}
|
|
29
|
-
|
|
39
|
+
|
|
40
|
+
export { type VideoFrameEvent, VideoStream };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video_stream.d.ts","sourceRoot":"","sources":["../src/video_stream.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"video_stream.d.ts","sourceRoot":"","sources":["../src/video_stream.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAEV,aAAa,EACb,eAAe,EAChB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF,qBAAa,WAAY,YAAW,qBAAqB,CAAC,eAAe,CAAC;IACxE,gBAAgB;IAChB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,gBAAgB;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB;IAChB,UAAU,EAAE,CAAC,eAAe,GAAG,IAAI,CAAC,EAAE,CAAM;IAC5C,gBAAgB;IAChB,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,cAAc,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAC/E,gBAAgB;IAChB,KAAK,QAAe;IAEpB,KAAK,EAAE,KAAK,CAAC;gBAED,KAAK,EAAE,KAAK;IAqBxB,OAAO,CAAC,OAAO,CAoCb;IAEI,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAkBtD,KAAK;IAKL,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW;CAGtC"}
|
package/dist/video_stream.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { create } from "@bufbuild/protobuf";
|
|
2
1
|
import { Mutex } from "@livekit/mutex";
|
|
3
2
|
import { FfiClient, FfiClientEvent, FfiHandle } from "./ffi_client.js";
|
|
4
|
-
import {
|
|
3
|
+
import { NewVideoStreamRequest, VideoStreamType } from "./proto/video_frame_pb.js";
|
|
5
4
|
import { VideoFrame } from "./video_frame.js";
|
|
6
5
|
class VideoStream {
|
|
7
6
|
constructor(track) {
|
|
@@ -23,9 +22,20 @@ class VideoStream {
|
|
|
23
22
|
const frame = VideoFrame.fromOwnedInfo(streamEvent.value.buffer);
|
|
24
23
|
const value = { rotation, timestampUs, frame };
|
|
25
24
|
if (this.queueResolve) {
|
|
26
|
-
this.queueResolve({
|
|
25
|
+
this.queueResolve({
|
|
26
|
+
done: false,
|
|
27
|
+
value: {
|
|
28
|
+
frame: value.frame,
|
|
29
|
+
timestampUs: value.timestampUs,
|
|
30
|
+
rotation: value.rotation
|
|
31
|
+
}
|
|
32
|
+
});
|
|
27
33
|
} else {
|
|
28
|
-
this.eventQueue.push(
|
|
34
|
+
this.eventQueue.push({
|
|
35
|
+
frame: value.frame,
|
|
36
|
+
timestampUs: value.timestampUs,
|
|
37
|
+
rotation: value.rotation
|
|
38
|
+
});
|
|
29
39
|
}
|
|
30
40
|
break;
|
|
31
41
|
case "eos":
|
|
@@ -33,8 +43,9 @@ class VideoStream {
|
|
|
33
43
|
break;
|
|
34
44
|
}
|
|
35
45
|
};
|
|
46
|
+
var _a;
|
|
36
47
|
this.track = track;
|
|
37
|
-
const req =
|
|
48
|
+
const req = new NewVideoStreamRequest({
|
|
38
49
|
type: VideoStreamType.VIDEO_STREAM_NATIVE,
|
|
39
50
|
trackHandle: track.ffi_handle.handle
|
|
40
51
|
});
|
|
@@ -44,7 +55,7 @@ class VideoStream {
|
|
|
44
55
|
value: req
|
|
45
56
|
}
|
|
46
57
|
});
|
|
47
|
-
this.info = res.stream.info;
|
|
58
|
+
this.info = (_a = res.stream) == null ? void 0 : _a.info;
|
|
48
59
|
this.ffiHandle = new FfiHandle(res.stream.handle.id);
|
|
49
60
|
FfiClient.instance.on(FfiClientEvent.FfiEvent, this.onEvent);
|
|
50
61
|
}
|