From 3339e16516f20fd85cd6eeec4595657b38bb1672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gilbert=20R=C3=B6hrbein?= Date: Tue, 15 Aug 2023 23:51:52 +0200 Subject: [PATCH] refactor and impl mjpeg --- Cargo.toml | 2 ++ src/linux_v4l2/mod.rs | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1f6a887..04a42b4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,8 +35,10 @@ windows = { version = "0.48", features = [ v4l = "0.14" ffimage = "0.9" ffimage_yuv = "0.9" +mozjpeg = "0.9" [dev-dependencies] softbuffer = "0.3" winit = "0.28" iced = { version = "0.10", features = ["advanced", "image"] } + diff --git a/src/linux_v4l2/mod.rs b/src/linux_v4l2/mod.rs index 9de61f3..2a09f63 100644 --- a/src/linux_v4l2/mod.rs +++ b/src/linux_v4l2/mod.rs @@ -10,7 +10,7 @@ use std::marker::PhantomData; use std::sync::RwLock; -use crate::{ CameraInfo, InnerCamera }; +use crate::{CameraInfo, InnerCamera}; pub struct Camera { device: RwLock, @@ -95,7 +95,10 @@ impl InnerCamera for Camera { fn enumerate_cameras() -> Vec { enum_devices() .iter() - .map(|d| CameraInfo { device_id: name_or_path(d), label: d.path().to_string_lossy().to_string() }) + .map(|d| CameraInfo { + device_id: name_or_path(d), + label: d.path().to_string_lossy().to_string(), + }) .collect() } @@ -120,7 +123,7 @@ impl InnerCamera for Camera { let data = match &format.fourcc.repr { b"RGB3" => buf.to_vec(), b"YUYV" => yuyv_to_rgb32(buf, size.0, size.1), - b"MJPG" => todo!("NJPG not implemented"), + b"MJPG" => mjpeg_to_rgb32(buf, size.0, size.1), _ => panic!("invalid buffer pixelformat"), }; @@ -206,3 +209,9 @@ fn yuyv_to_rgb32(buf: &[u8], w: u32, h: u32) -> Vec { rgba.into_buf() } + +fn mjpeg_to_rgb32(buf: &[u8], w: u32, h: u32) -> Vec { + let jpeg = mozjpeg::Decompress::new_mem(buf).unwrap(); + let mut decompress = jpeg.rgba().unwrap(); + decompress.read_scanlines_flat().unwrap() +}