fix: pace UVC helper queue by default
This commit is contained in:
parent
3e75028004
commit
3e8d99f6d7
6
Cargo.lock
generated
6
Cargo.lock
generated
@ -1658,7 +1658,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.24.0"
|
version = "0.25.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-stream",
|
"async-stream",
|
||||||
@ -1692,7 +1692,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.24.0"
|
version = "0.25.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
@ -1704,7 +1704,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.24.0"
|
version = "0.25.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
|
|||||||
@ -4,7 +4,7 @@ path = "src/main.rs"
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.24.0"
|
version = "0.25.0"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.24.0"
|
version = "0.25.0"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
|
|||||||
@ -356,7 +356,7 @@ LESAVKA_UVC_HEIGHT=$(uvc_env_value LESAVKA_UVC_HEIGHT 720)
|
|||||||
LESAVKA_UVC_CODEC=${INSTALL_UVC_CODEC}
|
LESAVKA_UVC_CODEC=${INSTALL_UVC_CODEC}
|
||||||
LESAVKA_UVC_BLOCKING=$(uvc_env_value LESAVKA_UVC_BLOCKING 1)
|
LESAVKA_UVC_BLOCKING=$(uvc_env_value LESAVKA_UVC_BLOCKING 1)
|
||||||
LESAVKA_UVC_CONTROL_READ_ONLY=$(uvc_env_value LESAVKA_UVC_CONTROL_READ_ONLY 0)
|
LESAVKA_UVC_CONTROL_READ_ONLY=$(uvc_env_value LESAVKA_UVC_CONTROL_READ_ONLY 0)
|
||||||
LESAVKA_UVC_QUEUE_PACING=$(uvc_env_value LESAVKA_UVC_QUEUE_PACING 0)
|
LESAVKA_UVC_QUEUE_PACING=$(uvc_env_value LESAVKA_UVC_QUEUE_PACING 1)
|
||||||
LESAVKA_UVC_MAXBURST=$(uvc_env_value LESAVKA_UVC_MAXBURST 0)
|
LESAVKA_UVC_MAXBURST=$(uvc_env_value LESAVKA_UVC_MAXBURST 0)
|
||||||
LESAVKA_UVC_BULK=$(uvc_env_value LESAVKA_UVC_BULK 1)
|
LESAVKA_UVC_BULK=$(uvc_env_value LESAVKA_UVC_BULK 1)
|
||||||
LESAVKA_UVC_FRAME_SIZE_GUARD=$(uvc_env_value LESAVKA_UVC_FRAME_SIZE_GUARD 1)
|
LESAVKA_UVC_FRAME_SIZE_GUARD=$(uvc_env_value LESAVKA_UVC_FRAME_SIZE_GUARD 1)
|
||||||
|
|||||||
@ -16,7 +16,7 @@ bench = false
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.24.0"
|
version = "0.25.0"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
autobins = false
|
autobins = false
|
||||||
|
|
||||||
|
|||||||
@ -51,6 +51,7 @@ const IDLE_MJPEG_FRAME: &[u8] = include_bytes!("lesavka_uvc/idle_1280x720_black.
|
|||||||
const DEFAULT_UVC_BUFFER_COUNT: u32 = 4;
|
const DEFAULT_UVC_BUFFER_COUNT: u32 = 4;
|
||||||
const DEFAULT_UVC_IDLE_PUMP_MS: u64 = 2;
|
const DEFAULT_UVC_IDLE_PUMP_MS: u64 = 2;
|
||||||
const DEFAULT_UVC_FRAME_MAX_AGE_MS: u64 = 1_000;
|
const DEFAULT_UVC_FRAME_MAX_AGE_MS: u64 = 1_000;
|
||||||
|
const DEFAULT_UVC_QUEUE_PACING: bool = true;
|
||||||
const DEFAULT_UVC_MJPEG_BUDGET_BYTES_PER_SEC: u32 = 10_000_000;
|
const DEFAULT_UVC_MJPEG_BUDGET_BYTES_PER_SEC: u32 = 10_000_000;
|
||||||
const DEFAULT_UVC_ISOCHRONOUS_LIMIT_PCT: u32 = 85;
|
const DEFAULT_UVC_ISOCHRONOUS_LIMIT_PCT: u32 = 85;
|
||||||
const HIGH_SPEED_ISOCHRONOUS_MICROFRAMES_PER_SEC: u32 = 8_000;
|
const HIGH_SPEED_ISOCHRONOUS_MICROFRAMES_PER_SEC: u32 = 8_000;
|
||||||
@ -656,7 +657,7 @@ fn uvc_idle_pump_sleep() -> Duration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn uvc_queue_period(fps: u32) -> Option<Duration> {
|
fn uvc_queue_period(fps: u32) -> Option<Duration> {
|
||||||
if !env_flag_enabled("LESAVKA_UVC_QUEUE_PACING", false) {
|
if !env_flag_enabled("LESAVKA_UVC_QUEUE_PACING", DEFAULT_UVC_QUEUE_PACING) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let fps = fps.max(1);
|
let fps = fps.max(1);
|
||||||
|
|||||||
@ -56,6 +56,8 @@ const DEFAULT_UVC_IDLE_PUMP_MS: u64 = 2;
|
|||||||
#[cfg(coverage)]
|
#[cfg(coverage)]
|
||||||
const DEFAULT_UVC_FRAME_MAX_AGE_MS: u64 = 1_000;
|
const DEFAULT_UVC_FRAME_MAX_AGE_MS: u64 = 1_000;
|
||||||
#[cfg(coverage)]
|
#[cfg(coverage)]
|
||||||
|
const DEFAULT_UVC_QUEUE_PACING: bool = true;
|
||||||
|
#[cfg(coverage)]
|
||||||
const DEFAULT_UVC_MJPEG_BUDGET_BYTES_PER_SEC: u32 = 10_000_000;
|
const DEFAULT_UVC_MJPEG_BUDGET_BYTES_PER_SEC: u32 = 10_000_000;
|
||||||
#[cfg(coverage)]
|
#[cfg(coverage)]
|
||||||
const DEFAULT_UVC_ISOCHRONOUS_LIMIT_PCT: u32 = 85;
|
const DEFAULT_UVC_ISOCHRONOUS_LIMIT_PCT: u32 = 85;
|
||||||
|
|||||||
@ -180,7 +180,7 @@ fn uvc_idle_pump_sleep() -> std::time::Duration {
|
|||||||
/// `None` when pacing is explicitly disabled. Why: the RCT-facing host must
|
/// `None` when pacing is explicitly disabled. Why: the RCT-facing host must
|
||||||
/// not be overfed faster than the advertised descriptor cadence.
|
/// not be overfed faster than the advertised descriptor cadence.
|
||||||
fn uvc_queue_period(fps: u32) -> Option<std::time::Duration> {
|
fn uvc_queue_period(fps: u32) -> Option<std::time::Duration> {
|
||||||
if !env_flag_enabled("LESAVKA_UVC_QUEUE_PACING", false) {
|
if !env_flag_enabled("LESAVKA_UVC_QUEUE_PACING", DEFAULT_UVC_QUEUE_PACING) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
let fps = fps.max(1);
|
let fps = fps.max(1);
|
||||||
|
|||||||
@ -136,17 +136,17 @@ fn uvc_frame_budget_caps_isochronous_transport() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn uvc_queue_pacing_defaults_off_but_remains_opt_in() {
|
fn uvc_queue_pacing_defaults_on_but_can_be_disabled() {
|
||||||
with_var("LESAVKA_UVC_QUEUE_PACING", None::<&str>, || {
|
with_var("LESAVKA_UVC_QUEUE_PACING", None::<&str>, || {
|
||||||
assert_eq!(uvc_queue_period(30), None);
|
|
||||||
});
|
|
||||||
|
|
||||||
with_var("LESAVKA_UVC_QUEUE_PACING", Some("1"), || {
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
uvc_queue_period(30),
|
uvc_queue_period(30),
|
||||||
Some(std::time::Duration::from_nanos(33_333_333))
|
Some(std::time::Duration::from_nanos(33_333_333))
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
with_var("LESAVKA_UVC_QUEUE_PACING", Some("0"), || {
|
||||||
|
assert_eq!(uvc_queue_period(30), None);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
@ -207,6 +207,7 @@ fn server_install_pins_hdmi_camera_and_display_defaults() {
|
|||||||
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_WIDTH 1280"));
|
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_WIDTH 1280"));
|
||||||
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_HEIGHT 720"));
|
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_HEIGHT 720"));
|
||||||
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_CONTROL_READ_ONLY 0"));
|
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_CONTROL_READ_ONLY 0"));
|
||||||
|
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_QUEUE_PACING 1"));
|
||||||
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_BULK 1"));
|
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_BULK 1"));
|
||||||
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_FRAME_SIZE_GUARD 1"));
|
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_FRAME_SIZE_GUARD 1"));
|
||||||
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_FRAME_MAX_BYTES 0"));
|
assert!(SERVER_INSTALL.contains("uvc_env_value LESAVKA_UVC_FRAME_MAX_BYTES 0"));
|
||||||
|
|||||||
@ -361,7 +361,10 @@ mod uvc_binary_extra {
|
|||||||
with_var("LESAVKA_UVC_FRAME_MAX_AGE_MS", None::<&str>, || {
|
with_var("LESAVKA_UVC_FRAME_MAX_AGE_MS", None::<&str>, || {
|
||||||
assert_eq!(uvc_buffer_count(), 4);
|
assert_eq!(uvc_buffer_count(), 4);
|
||||||
assert_eq!(uvc_idle_pump_sleep(), std::time::Duration::from_millis(2));
|
assert_eq!(uvc_idle_pump_sleep(), std::time::Duration::from_millis(2));
|
||||||
assert_eq!(uvc_queue_period(30), None);
|
assert_eq!(
|
||||||
|
uvc_queue_period(30),
|
||||||
|
Some(std::time::Duration::from_nanos(33_333_333))
|
||||||
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
frame_spool_max_age(),
|
frame_spool_max_age(),
|
||||||
Some(std::time::Duration::from_millis(1_000))
|
Some(std::time::Duration::from_millis(1_000))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user