🚧 wip: messing with JPEG decoding
it's slooow even going to YUV, so I may skip thismain
parent
22d20afcda
commit
99f1f92c1b
|
@ -14,6 +14,12 @@ version = "1.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "2.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cfg-if"
|
name = "cfg-if"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
|
@ -76,6 +82,8 @@ dependencies = [
|
||||||
"linuxvideo",
|
"linuxvideo",
|
||||||
"rayon",
|
"rayon",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
|
"zune-core",
|
||||||
|
"zune-jpeg",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -94,7 +102,7 @@ checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
|
||||||
name = "linuxvideo"
|
name = "linuxvideo"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"log",
|
"log",
|
||||||
"nix",
|
"nix",
|
||||||
]
|
]
|
||||||
|
@ -129,7 +137,7 @@ version = "0.26.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b"
|
checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"libc",
|
"libc",
|
||||||
"memoffset 0.7.1",
|
"memoffset 0.7.1",
|
||||||
|
@ -234,3 +242,18 @@ name = "unicode-ident"
|
||||||
version = "1.0.11"
|
version = "1.0.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
|
checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zune-core"
|
||||||
|
version = "0.2.14"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.4.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zune-jpeg"
|
||||||
|
version = "0.3.17"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
"zune-core",
|
||||||
|
]
|
||||||
|
|
|
@ -9,3 +9,5 @@ edition = "2021"
|
||||||
linuxvideo = { path = "deps/LinuxVideo" }
|
linuxvideo = { path = "deps/LinuxVideo" }
|
||||||
rayon = "1.7.0"
|
rayon = "1.7.0"
|
||||||
thiserror = "1.0.48"
|
thiserror = "1.0.48"
|
||||||
|
zune-core = { path = "deps/zune-image/zune-core" }
|
||||||
|
zune-jpeg = { path = "deps/zune-image/zune-jpeg", default-features = false, features = ["std"] }
|
||||||
|
|
76
src/main.rs
76
src/main.rs
|
@ -48,10 +48,76 @@ fn main() -> Result <(), Error>
|
||||||
}
|
}
|
||||||
let stop = Instant::now ();
|
let stop = Instant::now ();
|
||||||
|
|
||||||
dbg! (30_000.0f32 / (stop - start).as_millis () as f32);
|
let capture_fps = 30_000.0f32 / (stop - start).as_millis () as f32;
|
||||||
|
dbg! (capture_fps);
|
||||||
|
|
||||||
|
let buf = &buf [0..bytesused];
|
||||||
|
|
||||||
let mut f = std::fs::File::create ("data.jpeg").unwrap ();
|
let mut f = std::fs::File::create ("data.jpeg").unwrap ();
|
||||||
f.write_all (&buf [0..bytesused]).unwrap ();
|
f.write_all (buf).unwrap ();
|
||||||
|
|
||||||
|
let start = Instant::now ();
|
||||||
|
let mut pixels = vec! [];
|
||||||
|
for _ in 0..30
|
||||||
|
{
|
||||||
|
let mut decoder = zune_jpeg::JpegDecoder::new_with_options
|
||||||
|
(
|
||||||
|
buf,
|
||||||
|
zune_core::options::DecoderOptions::new_fast ().jpeg_set_out_colorspace (zune_core::colorspace::ColorSpace::YCbCr),
|
||||||
|
);
|
||||||
|
decoder.decode_headers ().unwrap ();
|
||||||
|
dbg! (decoder.get_output_colorspace ());
|
||||||
|
pixels.resize (decoder.output_buffer_size ().unwrap (), 0);
|
||||||
|
|
||||||
|
decoder.decode_into (&mut pixels).unwrap ();
|
||||||
|
}
|
||||||
|
let stop = Instant::now ();
|
||||||
|
let decode_mpf = (stop - start).as_millis () as f32 / 30.0f32;
|
||||||
|
dbg! (decode_mpf);
|
||||||
|
|
||||||
|
let mut f = std::fs::File::create ("data.raw").unwrap ();
|
||||||
|
f.write_all (&pixels).unwrap ();
|
||||||
|
},
|
||||||
|
Some ("decode") =>
|
||||||
|
{
|
||||||
|
let jpeg = std::fs::read ("data.jpeg").unwrap ();
|
||||||
|
let start = Instant::now ();
|
||||||
|
let mut pixels = vec! [];
|
||||||
|
for _ in 0..30
|
||||||
|
{
|
||||||
|
let mut decoder = zune_jpeg::JpegDecoder::new_with_options
|
||||||
|
(
|
||||||
|
&jpeg,
|
||||||
|
zune_core::options::DecoderOptions::new_fast ().jpeg_set_out_colorspace (zune_core::colorspace::ColorSpace::YCbCr),
|
||||||
|
);
|
||||||
|
decoder.decode_headers ().unwrap ();
|
||||||
|
pixels.resize (decoder.output_buffer_size ().unwrap (), 0);
|
||||||
|
|
||||||
|
decoder.decode_into (&mut pixels).unwrap ();
|
||||||
|
}
|
||||||
|
let stop = Instant::now ();
|
||||||
|
let mpf_ycbcr = (stop - start).as_millis () as f32 / 30.0f32;
|
||||||
|
dbg! (mpf_ycbcr);
|
||||||
|
|
||||||
|
std::fs::write ("raw.data", &pixels);
|
||||||
|
|
||||||
|
let start = Instant::now ();
|
||||||
|
let mut pixels = vec! [];
|
||||||
|
for _ in 0..30
|
||||||
|
{
|
||||||
|
let mut decoder = zune_jpeg::JpegDecoder::new_with_options
|
||||||
|
(
|
||||||
|
&jpeg,
|
||||||
|
zune_core::options::DecoderOptions::new_fast ().jpeg_set_out_colorspace (zune_core::colorspace::ColorSpace::RGB),
|
||||||
|
);
|
||||||
|
decoder.decode_headers ().unwrap ();
|
||||||
|
pixels.resize (decoder.output_buffer_size ().unwrap (), 0);
|
||||||
|
|
||||||
|
decoder.decode_into (&mut pixels).unwrap ();
|
||||||
|
}
|
||||||
|
let stop = Instant::now ();
|
||||||
|
let mpf_rgb = (stop - start).as_millis () as f32 / 30.0f32;
|
||||||
|
dbg! (mpf_rgb);
|
||||||
},
|
},
|
||||||
Some (_) => eprintln! ("Unknown subcommand"),
|
Some (_) => eprintln! ("Unknown subcommand"),
|
||||||
}
|
}
|
||||||
|
@ -160,10 +226,6 @@ impl <'a> Driver <'_>
|
||||||
|
|
||||||
fn handle_tx_event (&mut self, event: TxPipelineEvent) -> Result <(), TaskError>
|
fn handle_tx_event (&mut self, event: TxPipelineEvent) -> Result <(), TaskError>
|
||||||
{
|
{
|
||||||
let thread_sys = &self.thread_sys;
|
|
||||||
let pool = &self.thread_sys.pool;
|
|
||||||
let send = self.thread_sys.send.clone ();
|
|
||||||
|
|
||||||
match event
|
match event
|
||||||
{
|
{
|
||||||
TxPipelineEvent::Capture => CaptureWork::dispatch (self, ())?,
|
TxPipelineEvent::Capture => CaptureWork::dispatch (self, ())?,
|
||||||
|
@ -379,7 +441,7 @@ impl CaptureWork
|
||||||
fn dispatch (driver: &mut Driver, _input: ()) -> Result <(), TaskError>
|
fn dispatch (driver: &mut Driver, _input: ()) -> Result <(), TaskError>
|
||||||
{
|
{
|
||||||
let metadata = ();
|
let metadata = ();
|
||||||
let mut cap = driver.capture.start (metadata)?;
|
let cap = driver.capture.start (metadata)?;
|
||||||
driver.thread_sys.dispatch (move ||
|
driver.thread_sys.dispatch (move ||
|
||||||
{
|
{
|
||||||
let dur_capture = Duration::from_millis (1000);
|
let dur_capture = Duration::from_millis (1000);
|
||||||
|
|
Loading…
Reference in New Issue