diff --git a/Cargo.lock b/Cargo.lock
index c281cd9..a97ced3 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1531,6 +1531,7 @@ dependencies = [
"keyfork-entropy",
"keyfork-mnemonic-util",
"keyfork-prompt",
+ "keyfork-qrcode",
"keyfork-shard",
"keyforkd",
"keyforkd-client",
@@ -1661,6 +1662,7 @@ name = "keyfork-qrcode"
version = "0.1.0"
dependencies = [
"image",
+ "keyfork-zbar",
"rqrr",
"thiserror",
"v4l",
@@ -1696,6 +1698,24 @@ dependencies = [
"hex",
]
+[[package]]
+name = "keyfork-zbar"
+version = "0.1.0"
+dependencies = [
+ "image",
+ "keyfork-zbar-sys",
+ "thiserror",
+ "v4l",
+]
+
+[[package]]
+name = "keyfork-zbar-sys"
+version = "0.1.0"
+dependencies = [
+ "bindgen 0.68.1",
+ "pkg-config",
+]
+
[[package]]
name = "keyforkd"
version = "0.1.0"
diff --git a/Cargo.toml b/Cargo.toml
index e69d0af..7f2a8af 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,6 +16,8 @@ members = [
"keyfork-shard",
"keyfork-slip10-test-data",
"keyfork-qrcode",
+ "keyfork-zbar",
+ "keyfork-zbar-sys",
"keyforkd",
"keyforkd-client",
"keyforkd-models",
diff --git a/keyfork-qrcode/Cargo.toml b/keyfork-qrcode/Cargo.toml
index 6808922..50ec7cf 100644
--- a/keyfork-qrcode/Cargo.toml
+++ b/keyfork-qrcode/Cargo.toml
@@ -7,8 +7,14 @@ license = "MIT"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+[features]
+default = []
+decode-backend-rqrr = ["dep:rqrr"]
+decode-backend-zbar = ["dep:keyfork-zbar"]
+
[dependencies]
image = { version = "0.24.7", default-features = false, features = ["jpeg"] }
-rqrr = "0.6.0"
+keyfork-zbar = { version = "0.1.0", path = "../keyfork-zbar", optional = true }
+rqrr = { version = "0.6.0", optional = true }
thiserror = "1.0.56"
v4l = "0.14.0"
diff --git a/keyfork-qrcode/src/lib.rs b/keyfork-qrcode/src/lib.rs
index b97f694..e045d83 100644
--- a/keyfork-qrcode/src/lib.rs
+++ b/keyfork-qrcode/src/lib.rs
@@ -1,5 +1,4 @@
use image::io::Reader as ImageReader;
-use rqrr::PreparedImage;
use std::{
io::{Cursor, Write},
time::{Duration, SystemTime},
@@ -8,13 +7,9 @@ use std::{
use v4l::{
buffer::Type,
io::{userptr::Stream, traits::CaptureStream},
- video::Capture,
- Device, FourCC,
+ Device,
};
-static MJPEG: &[u8; 4] = b"MJPG";
-
-
#[derive(thiserror::Error, Debug)]
pub enum QRGenerationError {
#[error("{0}")]
@@ -37,9 +32,6 @@ pub enum QRCodeScanError {
#[error("Could not decode image: {0}")]
ImageDecode(#[from] image::ImageError),
-
- #[error("Could not format FourCC as string (this is a bug!): {0}")]
- FourCC(#[from] std::string::FromUtf8Error),
}
#[derive(Default)]
@@ -81,24 +73,10 @@ pub fn qrencode(
Ok(result)
}
+#[cfg(feature = "decode-backend-rqrr")]
pub fn scan_camera(timeout: Duration, index: usize) -> Result