Skip to content

Commit 5b273ad

Browse files
oxkitsunegrtlr
andauthored
Implement fallback mode for raw MCAP layer (#11136)
Co-authored-by: Jochen Görtler <[email protected]>
1 parent 54fbf4e commit 5b273ad

File tree

20 files changed

+570
-246
lines changed

20 files changed

+570
-246
lines changed

crates/store/re_data_loader/src/loader_mcap.rs

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
33
use std::{io::Cursor, path::Path, sync::mpsc::Sender};
44

5-
use anyhow::Context as _;
65
use re_chunk::RowId;
76
use re_log_types::{SetStoreInfo, StoreId, StoreInfo};
87
use re_mcap::{LayerRegistry, SelectedLayers};
@@ -25,20 +24,33 @@ const MCAP_LOADER_NAME: &str = "McapLoader";
2524
/// - [`re_mcap::layers::McapRawLayer`]
2625
pub struct McapLoader {
2726
selected_layers: SelectedLayers,
27+
raw_fallback_enabled: bool,
2828
}
2929

3030
impl Default for McapLoader {
3131
fn default() -> Self {
3232
Self {
3333
selected_layers: SelectedLayers::All,
34+
raw_fallback_enabled: true,
3435
}
3536
}
3637
}
3738

3839
impl McapLoader {
3940
/// Creates a new [`McapLoader`] that only extracts the specified `layers`.
4041
pub fn new(selected_layers: SelectedLayers) -> Self {
41-
Self { selected_layers }
42+
Self {
43+
selected_layers,
44+
raw_fallback_enabled: true,
45+
}
46+
}
47+
48+
/// Creates a new [`McapLoader`] with configurable raw fallback.
49+
pub fn with_raw_fallback(selected_layers: SelectedLayers, raw_fallback_enabled: bool) -> Self {
50+
Self {
51+
selected_layers,
52+
raw_fallback_enabled,
53+
}
4254
}
4355
}
4456

@@ -67,16 +79,20 @@ impl DataLoader for McapLoader {
6779
// common rayon thread pool.
6880
let settings = settings.clone();
6981
let selected_layers = self.selected_layers.clone();
82+
let raw_fallback_enabled = self.raw_fallback_enabled;
7083
std::thread::Builder::new()
7184
.name(format!("load_mcap({path:?}"))
72-
.spawn(
73-
move || match load_mcap_mmap(&path, &settings, &tx, selected_layers) {
74-
Ok(_) => {}
75-
Err(err) => {
76-
re_log::error!("Failed to load MCAP file: {err}");
77-
}
78-
},
79-
)
85+
.spawn(move || {
86+
if let Err(err) = load_mcap_mmap(
87+
&path,
88+
&settings,
89+
&tx,
90+
&selected_layers,
91+
raw_fallback_enabled,
92+
) {
93+
re_log::error!("Failed to load MCAP file: {err}");
94+
}
95+
})
8096
.map_err(|err| DataLoaderError::Other(err.into()))?;
8197

8298
Ok(())
@@ -98,6 +114,7 @@ impl DataLoader for McapLoader {
98114

99115
let settings = settings.clone();
100116
let selected_layers = self.selected_layers.clone();
117+
let raw_fallback_enabled = self.raw_fallback_enabled;
101118

102119
// NOTE(1): `spawn` is fine, this whole function is native-only.
103120
// NOTE(2): this must spawned on a dedicated thread to avoid a deadlock!
@@ -106,14 +123,17 @@ impl DataLoader for McapLoader {
106123
// common rayon thread pool.
107124
std::thread::Builder::new()
108125
.name(format!("load_mcap({filepath:?}"))
109-
.spawn(
110-
move || match load_mcap_mmap(&filepath, &settings, &tx, selected_layers) {
111-
Ok(_) => {}
112-
Err(err) => {
113-
re_log::error!("Failed to load MCAP file: {err}");
114-
}
115-
},
116-
)
126+
.spawn(move || {
127+
if let Err(err) = load_mcap_mmap(
128+
&filepath,
129+
&settings,
130+
&tx,
131+
&selected_layers,
132+
raw_fallback_enabled,
133+
) {
134+
re_log::error!("Failed to load MCAP file: {err}");
135+
}
136+
})
117137
.map_err(|err| DataLoaderError::Other(err.into()))?;
118138

119139
Ok(())
@@ -133,7 +153,13 @@ impl DataLoader for McapLoader {
133153

134154
let contents = contents.into_owned();
135155

136-
load_mcap(&contents, settings, &tx, self.selected_layers.clone())
156+
load_mcap(
157+
&contents,
158+
settings,
159+
&tx,
160+
&self.selected_layers,
161+
self.raw_fallback_enabled,
162+
)
137163
}
138164
}
139165

@@ -142,7 +168,8 @@ fn load_mcap_mmap(
142168
filepath: &std::path::PathBuf,
143169
settings: &DataLoaderSettings,
144170
tx: &Sender<LoadedData>,
145-
selected_layers: SelectedLayers,
171+
selected_layers: &SelectedLayers,
172+
raw_fallback_enabled: bool,
146173
) -> std::result::Result<(), DataLoaderError> {
147174
use std::fs::File;
148175
let file = File::open(filepath)?;
@@ -151,14 +178,15 @@ fn load_mcap_mmap(
151178
#[allow(unsafe_code)]
152179
let mmap = unsafe { memmap2::Mmap::map(&file)? };
153180

154-
load_mcap(&mmap, settings, tx, selected_layers)
181+
load_mcap(&mmap, settings, tx, selected_layers, raw_fallback_enabled)
155182
}
156183

157184
fn load_mcap(
158185
mcap: &[u8],
159186
settings: &DataLoaderSettings,
160187
tx: &Sender<LoadedData>,
161-
selected_layers: SelectedLayers,
188+
selected_layers: &SelectedLayers,
189+
raw_fallback_enabled: bool,
162190
) -> Result<(), DataLoaderError> {
163191
re_tracing::profile_function!();
164192

@@ -200,21 +228,11 @@ fn load_mcap(
200228
let summary = re_mcap::read_summary(reader)?
201229
.ok_or_else(|| anyhow::anyhow!("MCAP file does not contain a summary"))?;
202230

203-
let registry = LayerRegistry::all();
204-
205231
// TODO(#10862): Add warning for channel that miss semantic information.
206-
207-
let mut empty = true;
208-
for mut layer in registry.layers(selected_layers) {
209-
re_tracing::profile_scope!("process-layer");
210-
empty = false;
211-
layer
212-
.process(mcap, &summary, &mut send_chunk)
213-
.with_context(|| "processing layers")?;
214-
}
215-
if empty {
216-
re_log::warn_once!("No layers were selected");
217-
}
232+
LayerRegistry::all_builtin(raw_fallback_enabled)
233+
.select(selected_layers)
234+
.plan(&summary)?
235+
.run(mcap, &summary, &mut send_chunk)?;
218236

219237
Ok(())
220238
}

crates/top/rerun/src/commands/mcap/mod.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ pub struct ConvertCommand {
2525
#[clap(short = 'l', long = "layer")]
2626
selected_layers: Vec<String>,
2727

28+
/// Disable using the raw layer as a fallback for unsupported channels.
29+
/// By default, channels that cannot be handled by semantic layers (protobuf, ROS2)
30+
/// will be processed by the raw layer.
31+
#[clap(long = "disable-raw-fallback")]
32+
disable_raw_fallback: bool,
33+
2834
/// If set, specifies the recording id of the output.
2935
///
3036
/// When this flag is set and multiple input .rdd files are specified,
@@ -42,6 +48,7 @@ impl ConvertCommand {
4248
application_id,
4349
recording_id,
4450
selected_layers,
51+
disable_raw_fallback,
4552
} = self;
4653

4754
let start_time = std::time::Instant::now();
@@ -68,7 +75,8 @@ impl ConvertCommand {
6875
)
6976
};
7077

71-
let loader: &dyn DataLoader = &McapLoader::new(selected_layers);
78+
let loader: &dyn DataLoader =
79+
&McapLoader::with_raw_fallback(selected_layers, !*disable_raw_fallback);
7280

7381
// TODO(#10862): This currently loads the entire file into memory.
7482
let (tx, rx) = std::sync::mpsc::channel::<LoadedData>();

0 commit comments

Comments
 (0)