@luxonis/visualizer-protobuf 3.1.11 → 3.1.13
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/{FoxgloveServer-B98MHUu6.js → FoxgloveServer-Da9kV1cr.js} +1 -1
- package/dist/{communicator-Bzkx3Qfr.js → communicator-Dh2aL-rj.js} +1 -1
- package/dist/{depth-DlC6A3Te.js → depth-DiD1V2Sg.js} +15 -28
- package/dist/{deserialization.worker-CO4m6y8V.js → deserialization.worker-DU2Hs4UP.js} +577 -341
- package/dist/{foxglove-protocol-yHdoBNaD.js → foxglove-protocol-BtLMVx24.js} +1 -1
- package/dist/{index-CB1fYMKI.js → index--95nXh6E.js} +5 -5
- package/dist/{index-Dqm1x8G2.js → index-B5oN0fQm.js} +1 -1
- package/dist/{index-BXzWxQD4.js → index-B9-rLgJ9.js} +7 -7
- package/dist/{index-DCsDqt-U.js → index-BMp_L7Aa.js} +5 -5
- package/dist/{index-Be6EYnox.js → index-B_3PleIH.js} +49 -35
- package/dist/{index-BYTk-1GW.js → index-BjiepKHF.js} +5 -5
- package/dist/{index-DgUF0rJi.js → index-C45UVGjk.js} +5 -5
- package/dist/{index-D_pNGJGQ.js → index-CCq5_y78.js} +5 -5
- package/dist/{index-D2sxEb00.js → index-CNjpp5xs.js} +5 -5
- package/dist/{index-B-g3aWAt.js → index-CcWunxJv.js} +5 -5
- package/dist/{index-BEUjTghZ.js → index-CidrwlEk.js} +5 -5
- package/dist/{index-CKE7xLWy.js → index-CqayH0_I.js} +5 -5
- package/dist/{index-CDp9Pzg1.js → index-CxKEiKY9.js} +5 -5
- package/dist/{index-BlROWu-J.js → index-D686pHc1.js} +6 -6
- package/dist/{index-DCsBkCC7.js → index-DWt4Nj5G.js} +5 -5
- package/dist/{index-DtnnnQqJ.js → index-DewnJOHY.js} +5 -5
- package/dist/{index-D0BOBLGo.js → index-DnhrXuH6.js} +5 -5
- package/dist/{index-OIOsl1pr.js → index-DopAEQk2.js} +5 -5
- package/dist/{index-D063HnO-.js → index-DzOBiI2h.js} +5 -5
- package/dist/{index-Dvd5sByT.js → index-JlGCfxtk.js} +5 -5
- package/dist/{index-DXmbPIsN.js → index-X1k93Nku.js} +5 -5
- package/dist/index.js +5 -5
- package/dist/lib/src/connection/foxglove-connection.d.ts.map +1 -1
- package/dist/lib/src/connection/foxglove-connection.js +7 -1
- package/dist/lib/src/connection/foxglove-connection.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.js +2 -2
- package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/pointcloud/utils.d.ts.map +1 -1
- package/dist/lib/src/messaging/deserialization/pointcloud/utils.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/depth.d.ts.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/depth.js +11 -1
- package/dist/lib/src/messaging/deserialization/video/depth.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/h264.d.ts +11 -6
- package/dist/lib/src/messaging/deserialization/video/h264.d.ts.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/h264.js +115 -166
- package/dist/lib/src/messaging/deserialization/video/h264.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/h265.d.ts +2 -7
- package/dist/lib/src/messaging/deserialization/video/h265.d.ts.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/h265.js +55 -126
- package/dist/lib/src/messaging/deserialization/video/h265.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/mjpeg.d.ts.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/mjpeg.js +7 -8
- package/dist/lib/src/messaging/deserialization/video/mjpeg.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/video/rgbd-to-pointcloud.d.ts +17 -0
- package/dist/lib/src/messaging/deserialization/video/rgbd-to-pointcloud.d.ts.map +1 -0
- package/dist/lib/src/messaging/deserialization/video/rgbd-to-pointcloud.js +325 -0
- package/dist/lib/src/messaging/deserialization/video/rgbd-to-pointcloud.js.map +1 -0
- package/dist/lib/src/messaging/deserialization.worker.d.ts +4 -0
- package/dist/lib/src/messaging/deserialization.worker.d.ts.map +1 -1
- package/dist/lib/src/messaging/deserialization.worker.js +16 -3
- package/dist/lib/src/messaging/deserialization.worker.js.map +1 -1
- package/dist/lib/src/messaging/protobuf.d.ts +12 -1
- package/dist/lib/src/messaging/protobuf.d.ts.map +1 -1
- package/dist/lib/src/messaging/protobuf.js +8 -0
- package/dist/lib/src/messaging/protobuf.js.map +1 -1
- package/dist/lib/src/messaging/utils.d.ts.map +1 -1
- package/dist/lib/src/messaging/utils.js +2 -0
- package/dist/lib/src/messaging/utils.js.map +1 -1
- package/dist/lib/src/output.css +2 -21
- package/dist/lib/src/panels/PointCloudPanel.d.ts.map +1 -1
- package/dist/lib/src/panels/PointCloudPanel.js +5 -1
- package/dist/lib/src/panels/PointCloudPanel.js.map +1 -1
- package/dist/lib/src/utils/metrics-manager.d.ts +1 -0
- package/dist/lib/src/utils/metrics-manager.d.ts.map +1 -1
- package/dist/lib/src/utils/metrics-manager.js +4 -2
- package/dist/lib/src/utils/metrics-manager.js.map +1 -1
- package/dist/lib/src/utils/poitcloud-sync.d.ts +4 -3
- package/dist/lib/src/utils/poitcloud-sync.d.ts.map +1 -1
- package/dist/lib/src/utils/poitcloud-sync.js +3 -1
- package/dist/lib/src/utils/poitcloud-sync.js.map +1 -1
- package/dist/{pointcloudFromDepth.worker-JLptpLHr.js → pointcloudFromDepth.worker-60RA4Ief.js} +2 -2
- package/dist/{protobuf-Be0G3NFz.js → protobuf-OcbVtxg1.js} +406 -218
- package/dist/{worker-NFznpx6V.js → worker-Be-hru8f.js} +3 -3
- package/dist/{worker-0Q6os6Ck.js → worker-C2MHIq3t.js} +4 -4
- package/package.json +2 -2
|
@@ -6,19 +6,9 @@ import { estimateObjectSize } from "@foxglove/studio-base/players/messageMemoryE
|
|
|
6
6
|
import { ensureWebCodecsSupported } from "../../../utils/compatibility.js";
|
|
7
7
|
import { DecoderRuntimeError } from "../../../utils/error.js";
|
|
8
8
|
import { Logger } from "../../../utils/logger";
|
|
9
|
-
import { parseMessage
|
|
9
|
+
import { parseMessage } from "../../utils.js";
|
|
10
|
+
import { copyVideoFrameToI420 } from "./h264.js";
|
|
10
11
|
const logger = Logger.getLogger();
|
|
11
|
-
function configureDecoder(decoder) {
|
|
12
|
-
decoder.configure({
|
|
13
|
-
codec: "hev1.1.6.L93.B0",
|
|
14
|
-
optimizeForLatency: true,
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
function ensureDecoderConfigured(decoder) {
|
|
18
|
-
if (decoder.state === "unconfigured") {
|
|
19
|
-
configureDecoder(decoder);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
12
|
function closeDecoder(decoder) {
|
|
23
13
|
if (!decoder) {
|
|
24
14
|
return;
|
|
@@ -35,116 +25,29 @@ function closeDecoder(decoder) {
|
|
|
35
25
|
}
|
|
36
26
|
function closeTopicDecoder(topic, topicDecoders) {
|
|
37
27
|
const decoderInfo = topicDecoders.get(topic);
|
|
38
|
-
topicDecoders.delete(topic);
|
|
39
28
|
closeDecoder(decoderInfo?.decoder);
|
|
40
29
|
decoderInfo?.timing.clear();
|
|
41
30
|
decoderInfo?.transformations.clear();
|
|
42
|
-
if (decoderInfo) {
|
|
43
|
-
decoderInfo.pendingFrame = undefined;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
function isUnconfiguredCodecError(error) {
|
|
47
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
48
|
-
return /cannot call ["']decode["'] on an unconfigured (?:codec|decoder)/i.test(message);
|
|
49
|
-
}
|
|
50
|
-
function resetTopicDecoder({ topic, topicDecoders, callback, onError, }) {
|
|
51
|
-
const existingDecoderInfo = topicDecoders.get(topic);
|
|
52
|
-
closeDecoder(existingDecoderInfo?.decoder);
|
|
53
|
-
const decoder = createVideoDecoder({ topic, callback, topicDecoders, onError });
|
|
54
|
-
try {
|
|
55
|
-
configureDecoder(decoder);
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
closeDecoder(decoder);
|
|
59
|
-
closeTopicDecoder(topic, topicDecoders);
|
|
60
|
-
onError(new DecoderRuntimeError(topic, error instanceof Error ? error.message : "Failed to configure H.265 decoder."));
|
|
61
|
-
return undefined;
|
|
62
|
-
}
|
|
63
|
-
if (existingDecoderInfo) {
|
|
64
|
-
existingDecoderInfo.decoder = decoder;
|
|
65
|
-
existingDecoderInfo.timing.clear();
|
|
66
|
-
existingDecoderInfo.transformations.clear();
|
|
67
|
-
existingDecoderInfo.pendingFrame = undefined;
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
topicDecoders.set(topic, {
|
|
71
|
-
decoder,
|
|
72
|
-
timing: new Map(),
|
|
73
|
-
transformations: new Map(),
|
|
74
|
-
pendingFrame: undefined,
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
return decoder;
|
|
78
|
-
}
|
|
79
|
-
function decodePendingFrame(topic, topicDecoders, callback, onError) {
|
|
80
|
-
const decoderInfo = topicDecoders.get(topic);
|
|
81
|
-
if (!decoderInfo) {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
const decoder = decoderInfo.decoder;
|
|
85
|
-
if (decoder.state === "closed" || decoder.decodeQueueSize > 0) {
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
const pendingFrame = decoderInfo.pendingFrame;
|
|
89
|
-
if (!pendingFrame) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
decoderInfo.pendingFrame = undefined;
|
|
93
|
-
decoderInfo.timing.set(pendingFrame.timestamp, pendingFrame.receiveTime);
|
|
94
|
-
decoderInfo.transformations.set(pendingFrame.timestamp, pendingFrame.transformation);
|
|
95
|
-
try {
|
|
96
|
-
ensureDecoderConfigured(decoder);
|
|
97
|
-
if (decoder.state !== "configured" || topicDecoders.get(topic)?.decoder !== decoder) {
|
|
98
|
-
closeTopicDecoder(topic, topicDecoders);
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
const chunk = new EncodedVideoChunk({
|
|
102
|
-
type: "key",
|
|
103
|
-
data: pendingFrame.data,
|
|
104
|
-
timestamp: pendingFrame.timestamp,
|
|
105
|
-
});
|
|
106
|
-
decoder.decode(chunk);
|
|
107
|
-
}
|
|
108
|
-
catch (error) {
|
|
109
|
-
if (isUnconfiguredCodecError(error)) {
|
|
110
|
-
decoderInfo.pendingFrame = pendingFrame;
|
|
111
|
-
const replacementDecoder = resetTopicDecoder({ topic, topicDecoders, callback, onError });
|
|
112
|
-
if (replacementDecoder?.state === "configured") {
|
|
113
|
-
decodePendingFrame(topic, topicDecoders, callback, onError);
|
|
114
|
-
}
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
closeTopicDecoder(topic, topicDecoders);
|
|
118
|
-
onError(new DecoderRuntimeError(topic, error instanceof Error ? error.message : "Failed to decode H.265 frame."));
|
|
119
|
-
}
|
|
120
31
|
}
|
|
121
|
-
function createVideoDecoder({ topic,
|
|
122
|
-
|
|
123
|
-
decoder = new VideoDecoder({
|
|
32
|
+
function createVideoDecoder({ topic, topicDecoders, }) {
|
|
33
|
+
return new VideoDecoder({
|
|
124
34
|
output: async (frame) => {
|
|
125
|
-
|
|
126
|
-
frame.close();
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
const buffer = new Uint8Array(frame.allocationSize());
|
|
130
|
-
await frame.copyTo(buffer);
|
|
35
|
+
const { data: buffer, width, height } = await copyVideoFrameToI420(frame, "H265");
|
|
131
36
|
const receiveTime = topicDecoders.get(topic)?.timing.get(frame.timestamp)
|
|
132
37
|
??
|
|
133
38
|
fromMicros(frame.timestamp);
|
|
134
|
-
topicDecoders.get(topic)?.timing.delete(frame.timestamp);
|
|
135
39
|
const transformation = topicDecoders.get(topic)?.transformations.get(frame.timestamp);
|
|
136
40
|
topicDecoders.get(topic)?.transformations.delete(frame.timestamp);
|
|
137
|
-
const [encoding, step] = parsePixelFormat(frame.format);
|
|
138
41
|
const foxgloveMessage = {
|
|
139
42
|
timestamp: receiveTime,
|
|
140
43
|
frame_id: `h265-${topic}-frame`,
|
|
141
|
-
width
|
|
142
|
-
height
|
|
44
|
+
width,
|
|
45
|
+
height,
|
|
143
46
|
data: buffer,
|
|
144
|
-
encoding,
|
|
145
|
-
step:
|
|
47
|
+
encoding: "yuv420p",
|
|
48
|
+
step: width,
|
|
146
49
|
};
|
|
147
|
-
callback({
|
|
50
|
+
topicDecoders.get(topic)?.callback({
|
|
148
51
|
topic,
|
|
149
52
|
receiveTime,
|
|
150
53
|
message: foxgloveMessage,
|
|
@@ -153,20 +56,13 @@ function createVideoDecoder({ topic, callback, topicDecoders, onError, }) {
|
|
|
153
56
|
depthaiTransformation: transformation,
|
|
154
57
|
});
|
|
155
58
|
frame.close();
|
|
156
|
-
if (topicDecoders.get(topic)?.decoder === decoder) {
|
|
157
|
-
decodePendingFrame(topic, topicDecoders, callback, onError);
|
|
158
|
-
}
|
|
159
59
|
},
|
|
160
60
|
error: (error) => {
|
|
161
|
-
if (topicDecoders.get(topic)?.decoder !== decoder) {
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
61
|
logger.error(error);
|
|
165
62
|
closeTopicDecoder(topic, topicDecoders);
|
|
166
|
-
onError(new DecoderRuntimeError(topic, error.message));
|
|
63
|
+
topicDecoders.get(topic)?.onError(new DecoderRuntimeError(topic, error.message));
|
|
167
64
|
},
|
|
168
65
|
});
|
|
169
|
-
return decoder;
|
|
170
66
|
}
|
|
171
67
|
export async function deserializeEncodedFrameH265({ topic, message, topicDecoders, callback, onError, }) {
|
|
172
68
|
const { receiveTime } = parseMessage(message);
|
|
@@ -175,28 +71,61 @@ export async function deserializeEncodedFrameH265({ topic, message, topicDecoder
|
|
|
175
71
|
return;
|
|
176
72
|
}
|
|
177
73
|
const existingDecoderInfo = topicDecoders.get(topic);
|
|
178
|
-
if (!existingDecoderInfo || existingDecoderInfo.decoder.state
|
|
179
|
-
const decoder =
|
|
180
|
-
|
|
74
|
+
if (!existingDecoderInfo || existingDecoderInfo.decoder.state === "closed") {
|
|
75
|
+
const decoder = createVideoDecoder({ topic, topicDecoders });
|
|
76
|
+
try {
|
|
77
|
+
decoder.configure({
|
|
78
|
+
codec: "hev1.1.6.L93.B0",
|
|
79
|
+
optimizeForLatency: true
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
closeDecoder(decoder);
|
|
84
|
+
onError(new DecoderRuntimeError(topic, error instanceof Error ? error.message : "Failed to configure H.265 decoder."));
|
|
181
85
|
return;
|
|
182
86
|
}
|
|
87
|
+
if (existingDecoderInfo) {
|
|
88
|
+
existingDecoderInfo.decoder = decoder;
|
|
89
|
+
existingDecoderInfo.timing.clear();
|
|
90
|
+
existingDecoderInfo.transformations.clear();
|
|
91
|
+
existingDecoderInfo.callback = callback;
|
|
92
|
+
existingDecoderInfo.onError = onError;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
topicDecoders.set(topic, {
|
|
96
|
+
decoder,
|
|
97
|
+
timing: new Map(),
|
|
98
|
+
transformations: new Map(),
|
|
99
|
+
callback,
|
|
100
|
+
onError,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
183
103
|
}
|
|
184
104
|
const decoderInfo = topicDecoders.get(topic);
|
|
185
105
|
if (!decoderInfo) {
|
|
186
106
|
return;
|
|
187
107
|
}
|
|
108
|
+
decoderInfo.callback = callback;
|
|
109
|
+
decoderInfo.onError = onError;
|
|
110
|
+
if (decoderInfo.decoder.decodeQueueSize > 60) {
|
|
111
|
+
decoderInfo.decoder.reset();
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
188
114
|
const microTimestamp = receiveTime.sec * 1_000_000 + Math.floor(receiveTime.nsec / 1_000);
|
|
115
|
+
decoderInfo.timing.set(microTimestamp, receiveTime);
|
|
116
|
+
decoderInfo.transformations.set(microTimestamp, message.transformation);
|
|
189
117
|
const frame = {
|
|
118
|
+
type: 'key',
|
|
190
119
|
data: message.data,
|
|
191
|
-
timestamp: microTimestamp
|
|
192
|
-
receiveTime,
|
|
193
|
-
transformation: message.transformation,
|
|
120
|
+
timestamp: microTimestamp
|
|
194
121
|
};
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
122
|
+
try {
|
|
123
|
+
const chunk = new EncodedVideoChunk(frame);
|
|
124
|
+
decoderInfo.decoder.decode(chunk);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
closeTopicDecoder(topic, topicDecoders);
|
|
128
|
+
onError(new DecoderRuntimeError(topic, error instanceof Error ? error.message : "Failed to decode H.265 frame."));
|
|
198
129
|
}
|
|
199
|
-
decoderInfo.pendingFrame = frame;
|
|
200
|
-
decodePendingFrame(topic, topicDecoders, callback, onError);
|
|
201
130
|
}
|
|
202
131
|
//# sourceMappingURL=h265.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"h265.js","sourceRoot":"","sources":["../../../../../../src/messaging/deserialization/video/h265.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,oEAAoE;AACpE,0DAA0D;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AAM9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"h265.js","sourceRoot":"","sources":["../../../../../../src/messaging/deserialization/video/h265.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mjpeg.d.ts","sourceRoot":"","sources":["../../../../../../src/messaging/deserialization/video/mjpeg.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"mjpeg.d.ts","sourceRoot":"","sources":["../../../../../../src/messaging/deserialization/video/mjpeg.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAC;AAK3E,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CACzC,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,EAC1C,KAAK,EACL,OAAO,EACP,QAAQ,EACT,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC3C"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/
|
|
4
4
|
import { estimateObjectSize } from "@foxglove/studio-base/players/messageMemoryEstimation.js";
|
|
5
5
|
import { ensureWebCodecsSupported } from "../../../utils/compatibility.js";
|
|
6
|
-
import { parseMessage
|
|
6
|
+
import { parseMessage } from "../../utils.js";
|
|
7
|
+
import { copyVideoFrameToI420 } from "./h264.js";
|
|
7
8
|
export async function deserializeMJPEGFrame({ topic, message, callback }) {
|
|
8
9
|
const { receiveTime } = parseMessage(message);
|
|
9
10
|
const supported = ensureWebCodecsSupported("ImageDecoder");
|
|
@@ -15,17 +16,15 @@ export async function deserializeMJPEGFrame({ topic, message, callback }) {
|
|
|
15
16
|
data: message.data
|
|
16
17
|
});
|
|
17
18
|
const { image: frame } = await decoder.decode();
|
|
18
|
-
const buffer =
|
|
19
|
-
await frame.copyTo(buffer);
|
|
20
|
-
const [encoding, step] = parsePixelFormat(frame.format);
|
|
19
|
+
const { data: buffer, width, height } = await copyVideoFrameToI420(frame, "MJPEG");
|
|
21
20
|
const foxgloveMessage = {
|
|
22
21
|
timestamp: receiveTime,
|
|
23
22
|
frame_id: "camera",
|
|
24
|
-
width
|
|
25
|
-
height
|
|
23
|
+
width,
|
|
24
|
+
height,
|
|
26
25
|
data: buffer,
|
|
27
|
-
encoding,
|
|
28
|
-
step:
|
|
26
|
+
encoding: "yuv420p",
|
|
27
|
+
step: width,
|
|
29
28
|
};
|
|
30
29
|
frame.close();
|
|
31
30
|
callback({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mjpeg.js","sourceRoot":"","sources":["../../../../../../src/messaging/deserialization/video/mjpeg.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,oEAAoE;AACpE,0DAA0D;AAG1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AAI9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"mjpeg.js","sourceRoot":"","sources":["../../../../../../src/messaging/deserialization/video/mjpeg.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,oEAAoE;AACpE,0DAA0D;AAG1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AAI9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAQjD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAC1C,KAAK,EACL,OAAO,EACP,QAAQ,EACkB;IAC1B,MAAM,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IAE7C,MAAM,SAAS,GAAG,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;QAC/B,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC,CAAC;IAEH,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEnF,MAAM,eAAe,GAAa;QAChC,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,QAAQ;QAClB,KAAK;QACL,MAAM;QACN,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE,KAAK;KACZ,CAAC;IAEF,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,QAAQ,CAAC;QACP,KAAK;QACL,WAAW;QACX,OAAO,EAAE,eAAe;QACxB,WAAW,EAAE,kBAAkB,CAAC,eAAe,CAAC;QAChD,UAAU,EAAE,mBAAmB;QAC/B,qBAAqB,EAAE,OAAO,CAAC,cAAc;KAC9B,CAAC,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MessageEvent } from "@foxglove/studio-base/players/types";
|
|
2
|
+
import { type PointCloudWithDimensions } from "./depth";
|
|
3
|
+
import { type TopicDecoders } from "./h264";
|
|
4
|
+
import type { RGBDData } from "../../../protobuf.generated/RGBDData";
|
|
5
|
+
import type { NeuralCameraIntrinsics } from "../pointcloud/utils";
|
|
6
|
+
export type DeserializeRGBDFrameArgs = {
|
|
7
|
+
topic: string;
|
|
8
|
+
topicDecoders: TopicDecoders;
|
|
9
|
+
cameraIntrinsics: NeuralCameraIntrinsics;
|
|
10
|
+
maxStereoDepth: number;
|
|
11
|
+
message: RGBDData;
|
|
12
|
+
callback: (event: MessageEvent) => void;
|
|
13
|
+
onError: (error: Error) => void;
|
|
14
|
+
};
|
|
15
|
+
export type PointCloudWithColorAndDepth = PointCloudWithDimensions;
|
|
16
|
+
export declare function deserializeRGBDFrameToPointCloud({ topic, topicDecoders, cameraIntrinsics, maxStereoDepth, message, callback, onError, }: DeserializeRGBDFrameArgs): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=rgbd-to-pointcloud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rgbd-to-pointcloud.d.ts","sourceRoot":"","sources":["../../../../../../src/messaging/deserialization/video/rgbd-to-pointcloud.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAExE,OAAO,EAAyB,KAAK,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,EAAkD,KAAK,aAAa,EAAE,MAAM,QAAQ,CAAC;AAK5F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAGrE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAGlE,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,EAAE,sBAAsB,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,QAAQ,CAAC;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;AA2VnE,wBAAsB,gCAAgC,CAAC,EACrD,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,OAAO,EACP,QAAQ,EACR,OAAO,GACR,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgF1C"}
|