fix(uvc): use write mode for mjpeg sink
This commit is contained in:
parent
ce8f855db2
commit
9b610425e1
6
Cargo.lock
generated
6
Cargo.lock
generated
@ -1642,7 +1642,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.14.44"
|
version = "0.14.45"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-stream",
|
"async-stream",
|
||||||
@ -1676,7 +1676,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.14.44"
|
version = "0.14.45"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
@ -1688,7 +1688,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.14.44"
|
version = "0.14.45"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
|
|||||||
@ -4,7 +4,7 @@ path = "src/main.rs"
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.14.44"
|
version = "0.14.45"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.14.44"
|
version = "0.14.45"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ bench = false
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.14.44"
|
version = "0.14.45"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
autobins = false
|
autobins = false
|
||||||
|
|
||||||
|
|||||||
@ -38,6 +38,21 @@ fn uvc_sink_session_clock_align_enabled() -> bool {
|
|||||||
.unwrap_or(true)
|
.unwrap_or(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn uvc_mjpeg_v4l2sink_io_mode() -> String {
|
||||||
|
let value = std::env::var("LESAVKA_UVC_MJPEG_IO_MODE").unwrap_or_else(|_| "rw".to_string());
|
||||||
|
let trimmed = value.trim().to_ascii_lowercase();
|
||||||
|
match trimmed.as_str() {
|
||||||
|
"auto" | "rw" | "mmap" | "userptr" | "dmabuf" | "dmabuf-import" => trimmed,
|
||||||
|
_ => {
|
||||||
|
warn!(
|
||||||
|
value,
|
||||||
|
"invalid LESAVKA_UVC_MJPEG_IO_MODE; falling back to rw"
|
||||||
|
);
|
||||||
|
"rw".to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl WebcamSink {
|
impl WebcamSink {
|
||||||
/// Build a new webcam sink pipeline.
|
/// Build a new webcam sink pipeline.
|
||||||
///
|
///
|
||||||
@ -126,6 +141,9 @@ impl WebcamSink {
|
|||||||
let sink = gst::ElementFactory::make("v4l2sink")
|
let sink = gst::ElementFactory::make("v4l2sink")
|
||||||
.property("device", uvc_dev)
|
.property("device", uvc_dev)
|
||||||
.build()?;
|
.build()?;
|
||||||
|
// The control helper keeps the gadget node open for UVC requests.
|
||||||
|
// RW mode avoids the MMAP/REQBUFS path that conflicts with that fd.
|
||||||
|
sink.set_property_from_str("io-mode", &uvc_mjpeg_v4l2sink_io_mode());
|
||||||
if clock_align_enabled {
|
if clock_align_enabled {
|
||||||
crate::media_timing::enable_sink_clock_sync(&sink);
|
crate::media_timing::enable_sink_clock_sync(&sink);
|
||||||
} else if sink.has_property("sync", None) {
|
} else if sink.has_property("sync", None) {
|
||||||
@ -255,4 +273,19 @@ mod tests {
|
|||||||
assert!(super::uvc_sink_session_clock_align_enabled());
|
assert!(super::uvc_sink_session_clock_align_enabled());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn mjpeg_uvc_sink_defaults_to_rw_io_mode_with_safe_override() {
|
||||||
|
temp_env::with_var_unset("LESAVKA_UVC_MJPEG_IO_MODE", || {
|
||||||
|
assert_eq!(super::uvc_mjpeg_v4l2sink_io_mode(), "rw");
|
||||||
|
});
|
||||||
|
|
||||||
|
temp_env::with_var("LESAVKA_UVC_MJPEG_IO_MODE", Some("mmap"), || {
|
||||||
|
assert_eq!(super::uvc_mjpeg_v4l2sink_io_mode(), "mmap");
|
||||||
|
});
|
||||||
|
|
||||||
|
temp_env::with_var("LESAVKA_UVC_MJPEG_IO_MODE", Some("not-real"), || {
|
||||||
|
assert_eq!(super::uvc_mjpeg_v4l2sink_io_mode(), "rw");
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user