use adder_codec_core::codec::rate_controller::Crf;
use adder_codec_core::codec::{EncoderOptions, EncoderType};
use adder_codec_core::SourceCamera::Dvs;
use adder_codec_core::{PixelMultiMode, TimeMode};
use adder_codec_rs::transcoder::source::prophesee::Prophesee;
use adder_codec_rs::transcoder::source::video::{Source, SourceError, VideoBuilder};
use adder_codec_rs::utils::viz::ShowFeatureMode;
use clap::Parser;
use std::fs::File;
use std::io::BufWriter;
#[derive(Parser, Debug, Default, serde::Deserialize)]
#[clap(author, version, about, long_about = None)]
pub struct MyArgs {
#[clap(short, long, default_value_t = 1)]
pub ref_time: u32,
#[clap(short, long, default_value_t = 2)]
pub delta_t_max: u32,
#[clap(short, long, default_value = "./in.dat")]
pub input: String,
#[clap(long, default_value = "")]
pub output: String,
#[clap(long, default_value_t = 3)]
pub crf: u8,
#[clap(long, default_value_t = 8)]
pub thread_count: u8,
#[clap(short, long, action)]
pub features: bool,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: MyArgs = MyArgs::parse();
let mut prophesee_source: Prophesee<BufWriter<File>> =
Prophesee::new(args.ref_time, args.input)?.crf(args.crf);
let adu_interval =
(prophesee_source.get_video_ref().state.tps as f32 / args.ref_time as f32) as usize;
let plane = prophesee_source.get_video_ref().state.plane;
let writer = BufWriter::new(File::create(args.output)?);
prophesee_source = *prophesee_source.write_out(
Dvs,
TimeMode::AbsoluteT,
PixelMultiMode::Collapse,
Some(adu_interval),
EncoderType::Compressed,
EncoderOptions {
event_drop: Default::default(),
event_order: Default::default(),
crf: Crf::new(Some(args.crf), plane),
},
writer,
)?;
prophesee_source.get_video_mut().update_detect_features(
args.features,
ShowFeatureMode::Off,
true,
true,
);
let pool = rayon::ThreadPoolBuilder::new()
.num_threads(args.thread_count.into())
.build()
.unwrap();
loop {
match prophesee_source.consume() {
Ok(_) => {}
Err(SourceError::Open) => return Ok(()),
Err(e) => {
eprintln!("Consume Error: {e:?}");
prophesee_source.get_video_mut().end_write_stream()?;
return Ok(());
}
};
}
Ok(())
}