Skip to main content

openipc_web/
lib.rs

1//! WebAssembly bindings for the OpenIPC receiver pipeline and WebUSB driver.
2//!
3//! The Rust types in this crate wrap `openipc-core` and `openipc-rtl88xx` for
4//! browser and Tauri-webview frontends. JavaScript receives typed video frames,
5//! raw route payloads, diagnostics, and WebUSB helpers through wasm-bindgen.
6
7mod adaptive;
8mod js;
9mod mock;
10mod receiver;
11mod video;
12mod webusb;
13
14pub use adaptive::OpenIpcAdaptiveLink;
15pub use mock::{OpenIpcMockPayloadRuntime, OpenIpcMockRtpPipeline};
16pub use receiver::OpenIpcReceiver;
17pub use webusb::supported_usb_filters;
18#[cfg(target_arch = "wasm32")]
19pub use webusb::{
20    list_authorized_usb_devices, WebBbDbgportRead, WebFalseAlarmCounters, WebInitReport,
21    WebIqkReport, WebJaguar3PowerTrackingReport, WebPhydmWatchdogReport, WebPowerTrackingReport,
22    WebQueueDepth8814, WebThermalStatus, WebUsbPhydmWatchdog, WebUsbPowerTracking8812,
23    WebUsbPowerTracking8822c, WebUsbRealtekDevice,
24};
25
26use wasm_bindgen::prelude::*;
27
28#[wasm_bindgen(typescript_custom_section)]
29const OPENIPC_VIDEO_FRAME_TYPES: &'static str = r#"
30export type OpenIpcVideoFrame = {
31    data: Uint8Array;
32    codec: "h264" | "h265";
33    codecString: string;
34    isKeyFrame: boolean;
35    timestamp: number;
36    payloadType: number;
37    sequenceNumber: number;
38    nalType: number;
39    decoderConfigComplete: boolean;
40    codecConfig: OpenIpcCodecConfigState;
41};
42
43export type OpenIpcCodecConfigState = {
44    h264Sps: boolean;
45    h264Pps: boolean;
46    h265Vps: boolean;
47    h265Sps: boolean;
48    h265Pps: boolean;
49};
50
51export type OpenIpcRtpStatus = {
52    packets: number;
53    framesEmitted: number;
54    configWaitDrops: number;
55    keyframesWithPrependedConfig: number;
56    parameterSetsPrepended: number;
57    fragmentSequenceGaps: number;
58    fragmentOverflows: number;
59    unsupportedPayloads: number;
60    malformedPackets: number;
61    lastPayloadType: number | null;
62    lastSequenceNumber: number | null;
63    lastTimestamp: number | null;
64    lastCodec: "h264" | "h265" | null;
65    lastNalType: number | null;
66    codecConfig: OpenIpcCodecConfigState;
67    h264ConfigComplete: boolean;
68    h265ConfigComplete: boolean;
69    reorderBufferedPackets: number;
70    reorderedPackets: number;
71    latePackets: number;
72    forcedFlushes: number;
73};
74
75export type OpenIpcMockFrame = {
76    width: number;
77    height: number;
78    frameIndex: string;
79    timestamp: number;
80    rtpPackets: number;
81    rtpBytes: number;
82    rgba: Uint8Array;
83};
84
85export type OpenIpcRawPayload = {
86    data: Uint8Array;
87    packetSeq: string;
88    routeId: number;
89    channelId: number;
90};
91
92export type OpenIpcRxTransferProfile = {
93    frames: OpenIpcVideoFrame[];
94    rawPayloads: OpenIpcRawPayload[];
95    mavlinkPayloads: OpenIpcRawPayload[];
96    rawPayloadCount: number;
97    rawPayloadBytes: number;
98    transferBytes: number;
99    packets: number;
100    acceptedPackets: number;
101    droppedPackets: number;
102    crcDropped: number;
103    icvDropped: number;
104    reportDropped: number;
105    ignoredFrames: number;
106    sessions: number;
107    wfbPayloads: number;
108    rtpPackets: number;
109    videoFrames: number;
110    mavlinkPayloadCount: number;
111    mavlinkBytes: number;
112    parseMs: number;
113    pipelineMs: number;
114    totalMs: number;
115    rtpStatus: OpenIpcRtpStatus;
116};
117"#;