Skip to content

Commit 211d1cc

Browse files
Add support for Prophesee event cameras (#105)
* prophesee utils * prophesee data read * till parse_data * working prophesee reader * prophesee utils * prophesee data read * till parse_data * working prophesee reader * Scaffolding for prophesee transocder * Most of the consume() function * Incorporate prophesee transcoder in adder-viz * Initialize the transcode with a gray-level event for all pixels * Some fixes for playback * Fix header height/width parsing * Fix ln memory scaling * Start fixing intensity reconstruction * Bigger default compression interval * Cleanup * Fix player memory leak * Fix write invoke * Safety mechanisms * Framer fix with buffer limit * Fixes for tests and file encoding to allow for different settings of adu_interval * Player speed fixes * Player buffer limit fixes * Cleanup * Add feature detection for prophesee * Fix feature display * Davis write_out fix * Remove standalone data reader --------- Co-authored-by: arghasen10 <[email protected]>
1 parent 1835d49 commit 211d1cc

File tree

29 files changed

+857
-109
lines changed

29 files changed

+857
-109
lines changed

.gitignore

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# Generated by Cargo
22
# will have compiled files and executables
3-
/target/
4-
3+
**/target/
4+
**/*.dat
5+
**/*.py
56
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
67
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
78
Cargo.lock

.idea/adder-codec-rs.iml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/runConfigurations/Run_adder_viz_dynamic.xml

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

adder-codec-core/src/codec/compressed/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ mod tests {
6565
}),
6666
);
6767
let meta = *encoder.meta();
68+
dbg!(meta);
6869
encoder.ingest_event(test_event).unwrap();
6970
test_event.t += 100;
7071
encoder.ingest_event(test_event).unwrap();

adder-codec-core/src/codec/compressed/source_model/cabac_contexts.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,11 @@ impl Contexts {
9292
if t_residual_i64.abs() < self.t_residual_max {
9393
(0, t_residual_i64)
9494
} else {
95-
let actual_dt = event.t - prev_event.t;
95+
if event.t < prev_event.t {
96+
// dbg!(event.clone(), prev_event.clone());
97+
}
98+
99+
let actual_dt = event.t.saturating_sub(prev_event.t);
96100
let actual_intensity = self.event_to_intensity(event.d, actual_dt, dt_ref);
97101
let mut recon_intensity = actual_intensity;
98102
let mut bitshift: u8 = 0;

adder-codec-core/src/codec/compressed/source_model/event_structure/event_cube.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,6 @@ impl HandleEvent for EventCube {
123123
event.coord.x -= self.start_x;
124124

125125
let item = EventCoordless::from(event);
126-
self.raw_event_lists[event.coord.c_usize()][event.coord.y_usize()][event.coord.x_usize()]
127-
.push(item);
128126

129127
if self.raw_event_lists[event.coord.c_usize()][event.coord.y_usize()][event.coord.x_usize()]
130128
.len()
@@ -134,10 +132,17 @@ impl HandleEvent for EventCube {
134132
[event.coord.x_usize()][self.raw_event_lists[event.coord.c_usize()]
135133
[event.coord.y_usize()][event.coord.x_usize()]
136134
.len()
137-
- 2];
135+
- 1];
136+
if event.t <= last.t {
137+
// dbg!(event.t, last.t);
138+
return false;
139+
}
138140
debug_assert!(event.t >= last.t);
139141
}
140142

143+
self.raw_event_lists[event.coord.c_usize()][event.coord.y_usize()][event.coord.x_usize()]
144+
.push(item);
145+
141146
self.raw_event_memory[event.coord.c_usize()][event.coord.y_usize()]
142147
[event.coord.x_usize()] = EventCoordless::from(event);
143148

adder-codec-core/src/codec/compressed/stream.rs

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::codec::{CodecError, CodecMetadata, EncoderOptions, ReadCompression, WriteCompression};
22
use bitstream_io::{BigEndian, BitRead, BitReader, BitWrite, BitWriter};
3-
use std::io::{Cursor, Read, Seek, SeekFrom, Write};
3+
use std::io::{BufWriter, Cursor, Read, Seek, SeekFrom, Write};
44

55
use crate::codec::compressed::source_model::event_structure::event_adu::EventAdu;
66
use crate::codec::compressed::source_model::HandleEvent;
@@ -27,12 +27,7 @@ pub struct CompressedInput<R: Read> {
2727
impl<W: Write> CompressedOutput<W> {
2828
/// Create a new compressed output stream.
2929
pub fn new(meta: CodecMetadata, writer: W) -> Self {
30-
let adu = EventAdu::new(
31-
meta.plane,
32-
0,
33-
meta.ref_interval,
34-
(meta.delta_t_max / meta.ref_interval) as usize,
35-
);
30+
let adu = EventAdu::new(meta.plane, 0, meta.ref_interval, meta.adu_interval as usize);
3631

3732
Self {
3833
meta,
@@ -132,7 +127,7 @@ impl<W: Write> WriteCompression<W> for CompressedOutput<W> {
132127

133128
impl<R: Read> CompressedInput<R> {
134129
/// Create a new compressed input stream.
135-
pub fn new(delta_t_max: DeltaT, ref_interval: DeltaT) -> Self
130+
pub fn new(delta_t_max: DeltaT, ref_interval: DeltaT, adu_interval: usize) -> Self
136131
where
137132
Self: Sized,
138133
{
@@ -147,6 +142,7 @@ impl<R: Read> CompressedInput<R> {
147142
delta_t_max,
148143
event_size: 0,
149144
source_camera: Default::default(),
145+
adu_interval,
150146
},
151147
adu: None,
152148
_phantom: std::marker::PhantomData,
@@ -186,7 +182,7 @@ impl<R: Read + Seek> ReadCompression<R> for CompressedInput<R> {
186182
self.meta.plane,
187183
0,
188184
self.meta.ref_interval,
189-
(self.meta.delta_t_max / self.meta.ref_interval) as usize,
185+
self.meta.adu_interval,
190186
));
191187
}
192188

@@ -278,9 +274,10 @@ mod tests {
278274
},
279275
tps: 7650,
280276
ref_interval: dt_ref,
281-
delta_t_max: dt_ref * num_intervals as u32,
277+
delta_t_max: dt_ref * num_intervals,
282278
event_size: 0,
283279
source_camera: SourceCamera::FramedU8,
280+
adu_interval: num_intervals as usize,
284281
},
285282
Cursor::new(Vec::new()),
286283
);
@@ -338,9 +335,10 @@ mod tests {
338335
},
339336
tps: 7650,
340337
ref_interval: dt_ref,
341-
delta_t_max: dt_ref * num_intervals as u32,
338+
delta_t_max: dt_ref * num_intervals,
342339
event_size: 0,
343340
source_camera: SourceCamera::FramedU8,
341+
adu_interval: num_intervals as usize,
344342
},
345343
Cursor::new(Vec::new()),
346344
);
@@ -385,7 +383,11 @@ mod tests {
385383
// Check that the size is less than the raw events
386384
assert!((output.len() as u32) < counter * 9);
387385

388-
let mut compressed_input = CompressedInput::new(dt_ref * num_intervals as u32, dt_ref);
386+
let mut compressed_input = CompressedInput::new(
387+
dt_ref * num_intervals as u32,
388+
dt_ref,
389+
num_intervals as usize,
390+
);
389391
compressed_input.meta.plane = plane;
390392
let mut stream = BitReader::endian(Cursor::new(output), BigEndian);
391393
for _ in 0..counter - 1 {
@@ -431,6 +433,7 @@ mod tests {
431433
delta_t_max: dt_ref * num_intervals as u32,
432434
event_size: 0,
433435
source_camera: SourceCamera::FramedU8,
436+
adu_interval: num_intervals as usize,
434437
},
435438
Cursor::new(Vec::new()),
436439
);
@@ -459,7 +462,11 @@ mod tests {
459462
// Check that the size is less than the raw events
460463
assert!((output.len() as u32) < counter * 9);
461464

462-
let mut compressed_input = CompressedInput::new(dt_ref * num_intervals as u32, dt_ref);
465+
let mut compressed_input = CompressedInput::new(
466+
dt_ref * num_intervals as u32,
467+
dt_ref,
468+
num_intervals as usize,
469+
);
463470
compressed_input.meta.plane = plane;
464471
let mut stream = BitReader::endian(Cursor::new(output), BigEndian);
465472
for _ in 0..counter - 1 {
@@ -514,6 +521,7 @@ mod tests {
514521
delta_t_max: dt_ref * num_intervals as u32,
515522
event_size: 0,
516523
source_camera: SourceCamera::FramedU8,
524+
adu_interval: num_intervals as usize,
517525
},
518526
Cursor::new(Vec::new()),
519527
);
@@ -571,7 +579,11 @@ mod tests {
571579
assert!(!output.is_empty());
572580
// Check that the size is less than the raw events
573581

574-
let mut compressed_input = CompressedInput::new(dt_ref * num_intervals as u32, dt_ref);
582+
let mut compressed_input = CompressedInput::new(
583+
dt_ref * num_intervals as u32,
584+
dt_ref,
585+
num_intervals as usize,
586+
);
575587
compressed_input.meta.plane = plane;
576588
let mut stream = BitReader::endian(Cursor::new(output), BigEndian);
577589
for _ in 0..counter + 1 {
@@ -624,6 +636,7 @@ mod tests {
624636
delta_t_max: dt_ref * num_intervals as u32,
625637
event_size: 0,
626638
source_camera: SourceCamera::FramedU8,
639+
adu_interval: num_intervals as usize,
627640
},
628641
Cursor::new(Vec::new()),
629642
);
@@ -688,7 +701,11 @@ mod tests {
688701
// Check that the size is less than the raw events
689702
assert!((output.len() as u32) < counter * 9);
690703

691-
let mut compressed_input = CompressedInput::new(dt_ref * num_intervals as u32, dt_ref);
704+
let mut compressed_input = CompressedInput::new(
705+
dt_ref * num_intervals as u32,
706+
dt_ref,
707+
num_intervals as usize,
708+
);
692709
compressed_input.meta.plane = plane;
693710
let mut stream = BitReader::endian(Cursor::new(output), BigEndian);
694711
loop {

adder-codec-core/src/codec/decoder.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ use crate::codec::compressed::stream::CompressedInput;
1010

1111
use crate::codec::encoder::Encoder;
1212
use crate::codec::header::{
13-
EventStreamHeader, EventStreamHeaderExtensionV1, EventStreamHeaderExtensionV2, MAGIC_COMPRESSED,
13+
EventStreamHeader, EventStreamHeaderExtensionV1, EventStreamHeaderExtensionV2,
14+
EventStreamHeaderExtensionV3, MAGIC_COMPRESSED,
1415
};
1516
use crate::codec::raw::stream::RawInput;
1617
use crate::codec::CodecError::Deserialize;
@@ -93,7 +94,7 @@ impl<R: Read + Seek> Decoder<R> {
9394
SourceCamera::FramedU64 => U64,
9495
SourceCamera::FramedF32 => F32,
9596
SourceCamera::FramedF64 => F64,
96-
SourceCamera::Dvs => F64,
97+
SourceCamera::Dvs => U8,
9798
SourceCamera::DavisU8 => U8,
9899
SourceCamera::Atis => U8,
99100
SourceCamera::Asint => F64,
@@ -128,7 +129,8 @@ impl<R: Read + Seek> Decoder<R> {
128129
ref_interval: header.ref_interval,
129130
delta_t_max: header.delta_t_max,
130131
event_size: header.event_size,
131-
source_camera: Default::default(),
132+
source_camera: Default::default(), // Gets filled by decoding the V2 header extension
133+
adu_interval: Default::default(), // Gets filled by decoding the V3 header extension
132134
};
133135

134136
// Manual fix for malformed files with old software
@@ -183,6 +185,23 @@ impl<R: Read + Seek> Decoder<R> {
183185
return Ok(());
184186
}
185187

188+
extension_size = bincode::serialized_size(&EventStreamHeaderExtensionV3::default())?;
189+
buffer = vec![0; extension_size as usize];
190+
reader.read_bytes(&mut buffer)?;
191+
let extension_v3 = match self
192+
.bincode
193+
.deserialize_from::<_, EventStreamHeaderExtensionV3>(&*buffer)
194+
{
195+
Ok(header) => header,
196+
Err(_) => return Err(Deserialize),
197+
};
198+
self.input.meta_mut().adu_interval = extension_v3.adu_interval as usize;
199+
self.input.meta_mut().header_size += extension_size as usize;
200+
201+
if codec_version == 3 {
202+
return Ok(());
203+
}
204+
186205
Err(CodecError::UnsupportedVersion(codec_version))
187206
}
188207

@@ -289,6 +308,7 @@ mod tests {
289308
delta_t_max: 255,
290309
event_size: 0,
291310
source_camera: Default::default(),
311+
adu_interval: 1,
292312
},
293313
bufwriter,
294314
);
@@ -325,6 +345,7 @@ mod tests {
325345
delta_t_max: 255,
326346
event_size: 0,
327347
source_camera: Default::default(),
348+
adu_interval: 1,
328349
},
329350
bufwriter,
330351
);
@@ -371,6 +392,7 @@ mod tests {
371392
delta_t_max: 255,
372393
event_size: 0,
373394
source_camera: Default::default(),
395+
adu_interval: 1,
374396
},
375397
bufwriter,
376398
);
@@ -436,7 +458,7 @@ mod tests {
436458
let output = setup_encoded_compressed(0);
437459
let tmp = Cursor::new(&*output);
438460
let bufreader = BufReader::new(tmp);
439-
let compression = CompressedInput::new(255, 255);
461+
let compression = CompressedInput::new(255, 255, 1);
440462

441463
let mut bitreader = BitReader::endian(bufreader, BigEndian);
442464
let reader = Decoder::new_compressed(compression, &mut bitreader).unwrap();
@@ -449,7 +471,7 @@ mod tests {
449471
let output = setup_encoded_compressed(1);
450472
let tmp = Cursor::new(&*output);
451473
let bufreader = BufReader::new(tmp);
452-
let compression = CompressedInput::new(255, 255);
474+
let compression = CompressedInput::new(255, 255, 1);
453475

454476
let mut bitreader = BitReader::endian(bufreader, BigEndian);
455477
let reader = Decoder::new_compressed(compression, &mut bitreader).unwrap();
@@ -462,7 +484,7 @@ mod tests {
462484
let output = setup_encoded_compressed(2);
463485
let tmp = Cursor::new(&*output);
464486
let bufreader = BufReader::new(tmp);
465-
let compression = CompressedInput::new(255, 255);
487+
let compression = CompressedInput::new(255, 255, 1);
466488

467489
let mut bitreader = BitReader::endian(bufreader, BigEndian);
468490
let reader = Decoder::new_compressed(compression, &mut bitreader).unwrap();

0 commit comments

Comments
 (0)