🚧 wip: messing with JPEG decoding

it's slooow even going to YUV, so I may skip this
main
_ 2023-09-10 11:18:10 -05:00
parent 22d20afcda
commit 99f1f92c1b
3 changed files with 96 additions and 9 deletions

27
Cargo.lock generated
View File

@ -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",
]

View File

@ -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"] }

View File

@ -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);