2
2
3
3
use std:: { io:: Cursor , path:: Path , sync:: mpsc:: Sender } ;
4
4
5
- use anyhow:: Context as _;
6
5
use re_chunk:: RowId ;
7
6
use re_log_types:: { SetStoreInfo , StoreId , StoreInfo } ;
8
7
use re_mcap:: { LayerRegistry , SelectedLayers } ;
@@ -25,20 +24,33 @@ const MCAP_LOADER_NAME: &str = "McapLoader";
25
24
/// - [`re_mcap::layers::McapRawLayer`]
26
25
pub struct McapLoader {
27
26
selected_layers : SelectedLayers ,
27
+ raw_fallback_enabled : bool ,
28
28
}
29
29
30
30
impl Default for McapLoader {
31
31
fn default ( ) -> Self {
32
32
Self {
33
33
selected_layers : SelectedLayers :: All ,
34
+ raw_fallback_enabled : true ,
34
35
}
35
36
}
36
37
}
37
38
38
39
impl McapLoader {
39
40
/// Creates a new [`McapLoader`] that only extracts the specified `layers`.
40
41
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
+ }
42
54
}
43
55
}
44
56
@@ -67,16 +79,20 @@ impl DataLoader for McapLoader {
67
79
// common rayon thread pool.
68
80
let settings = settings. clone ( ) ;
69
81
let selected_layers = self . selected_layers . clone ( ) ;
82
+ let raw_fallback_enabled = self . raw_fallback_enabled ;
70
83
std:: thread:: Builder :: new ( )
71
84
. 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
+ } )
80
96
. map_err ( |err| DataLoaderError :: Other ( err. into ( ) ) ) ?;
81
97
82
98
Ok ( ( ) )
@@ -98,6 +114,7 @@ impl DataLoader for McapLoader {
98
114
99
115
let settings = settings. clone ( ) ;
100
116
let selected_layers = self . selected_layers . clone ( ) ;
117
+ let raw_fallback_enabled = self . raw_fallback_enabled ;
101
118
102
119
// NOTE(1): `spawn` is fine, this whole function is native-only.
103
120
// NOTE(2): this must spawned on a dedicated thread to avoid a deadlock!
@@ -106,14 +123,17 @@ impl DataLoader for McapLoader {
106
123
// common rayon thread pool.
107
124
std:: thread:: Builder :: new ( )
108
125
. 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
+ } )
117
137
. map_err ( |err| DataLoaderError :: Other ( err. into ( ) ) ) ?;
118
138
119
139
Ok ( ( ) )
@@ -133,7 +153,13 @@ impl DataLoader for McapLoader {
133
153
134
154
let contents = contents. into_owned ( ) ;
135
155
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
+ )
137
163
}
138
164
}
139
165
@@ -142,7 +168,8 @@ fn load_mcap_mmap(
142
168
filepath : & std:: path:: PathBuf ,
143
169
settings : & DataLoaderSettings ,
144
170
tx : & Sender < LoadedData > ,
145
- selected_layers : SelectedLayers ,
171
+ selected_layers : & SelectedLayers ,
172
+ raw_fallback_enabled : bool ,
146
173
) -> std:: result:: Result < ( ) , DataLoaderError > {
147
174
use std:: fs:: File ;
148
175
let file = File :: open ( filepath) ?;
@@ -151,14 +178,15 @@ fn load_mcap_mmap(
151
178
#[ allow( unsafe_code) ]
152
179
let mmap = unsafe { memmap2:: Mmap :: map ( & file) ? } ;
153
180
154
- load_mcap ( & mmap, settings, tx, selected_layers)
181
+ load_mcap ( & mmap, settings, tx, selected_layers, raw_fallback_enabled )
155
182
}
156
183
157
184
fn load_mcap (
158
185
mcap : & [ u8 ] ,
159
186
settings : & DataLoaderSettings ,
160
187
tx : & Sender < LoadedData > ,
161
- selected_layers : SelectedLayers ,
188
+ selected_layers : & SelectedLayers ,
189
+ raw_fallback_enabled : bool ,
162
190
) -> Result < ( ) , DataLoaderError > {
163
191
re_tracing:: profile_function!( ) ;
164
192
@@ -200,21 +228,11 @@ fn load_mcap(
200
228
let summary = re_mcap:: read_summary ( reader) ?
201
229
. ok_or_else ( || anyhow:: anyhow!( "MCAP file does not contain a summary" ) ) ?;
202
230
203
- let registry = LayerRegistry :: all ( ) ;
204
-
205
231
// 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) ?;
218
236
219
237
Ok ( ( ) )
220
238
}
0 commit comments