test(lesavka): repair HEVC guard contract harness

This commit is contained in:
Brad Stein 2026-05-18 21:42:22 -03:00
parent 71846c90a5
commit 518f74b91a
7 changed files with 72 additions and 56 deletions

1
Cargo.lock generated
View File

@ -1749,6 +1749,7 @@ dependencies = [
"gstreamer-app", "gstreamer-app",
"gstreamer-video", "gstreamer-video",
"gtk4", "gtk4",
"jpeg-decoder",
"lesavka_client", "lesavka_client",
"lesavka_common", "lesavka_common",
"lesavka_server", "lesavka_server",

View File

@ -44,6 +44,7 @@ gstreamer = { version = "0.23", features = ["v1_22"] }
gstreamer-app = { version = "0.23", features = ["v1_22"] } gstreamer-app = { version = "0.23", features = ["v1_22"] }
gstreamer-video = { version = "0.23", features = ["v1_22"] } gstreamer-video = { version = "0.23", features = ["v1_22"] }
gtk = { version = "0.8", package = "gtk4", features = ["v4_6"] } gtk = { version = "0.8", package = "gtk4", features = ["v4_6"] }
jpeg-decoder = { version = "0.3", default-features = false }
winit = "0.30" winit = "0.30"
serial_test = { workspace = true } serial_test = { workspace = true }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }

View File

@ -1308,17 +1308,22 @@
"server/src/video_sinks/hevc_mjpeg_guard.rs": { "server/src/video_sinks/hevc_mjpeg_guard.rs": {
"clippy_warnings": 0, "clippy_warnings": 0,
"doc_debt": 0, "doc_debt": 0,
"loc": 375 "loc": 383
}, },
"server/src/video_sinks/hevc_mjpeg_guard/mjpeg_frame_inspection.rs": { "server/src/video_sinks/hevc_mjpeg_guard/mjpeg_frame_inspection.rs": {
"clippy_warnings": 0, "clippy_warnings": 0,
"doc_debt": 1, "doc_debt": 1,
"loc": 167 "loc": 167
}, },
"server/src/video_sinks/hevc_mjpeg_guard/mjpeg_visual_guard.rs": {
"clippy_warnings": 0,
"doc_debt": 8,
"loc": 475
},
"server/src/video_sinks/hevc_mjpeg_guard/tests.rs": { "server/src/video_sinks/hevc_mjpeg_guard/tests.rs": {
"clippy_warnings": 0, "clippy_warnings": 0,
"doc_debt": 5, "doc_debt": 11,
"loc": 258 "loc": 422
}, },
"server/src/video_sinks/mjpeg_spool.rs": { "server/src/video_sinks/mjpeg_spool.rs": {
"clippy_warnings": 0, "clippy_warnings": 0,

View File

@ -15,33 +15,36 @@ mod video_support {
} }
} }
#[allow(clippy::items_after_test_module)] mod video_sinks {
mod guard { #[allow(clippy::items_after_test_module)]
include!(concat!( pub mod hevc_mjpeg_guard {
env!("CARGO_MANIFEST_DIR"), include!(concat!(
"/server/src/video_sinks/hevc_mjpeg_guard.rs" env!("CARGO_MANIFEST_DIR"),
)); "/server/src/video_sinks/hevc_mjpeg_guard.rs"
));
pub fn should_freeze(previous_bytes: u64, next_bytes: usize) -> bool { pub fn should_freeze(previous_bytes: u64, next_bytes: usize) -> bool {
should_freeze_decoded_mjpeg(previous_bytes, next_bytes) should_freeze_decoded_mjpeg(previous_bytes, next_bytes)
} }
pub fn should_freeze_frame(previous_bytes: u64, decoded_mjpeg: &[u8]) -> bool { pub fn should_freeze_frame(previous_bytes: u64, decoded_mjpeg: &[u8]) -> bool {
should_freeze_decoded_mjpeg_frame(previous_bytes, decoded_mjpeg) should_freeze_decoded_mjpeg_frame(previous_bytes, decoded_mjpeg)
} }
pub fn should_reject_direct_frame(previous_bytes: u64, mjpeg: &[u8]) -> bool { pub fn should_reject_direct_frame(previous_bytes: u64, mjpeg: &[u8]) -> bool {
should_reject_direct_mjpeg_frame(previous_bytes, mjpeg) should_reject_direct_mjpeg_frame(previous_bytes, mjpeg)
} }
pub fn should_reject_direct_frame_with_budget( pub fn should_reject_direct_frame_with_budget(
previous_bytes: u64, previous_bytes: u64,
max_bytes: usize, max_bytes: usize,
mjpeg: &[u8], mjpeg: &[u8],
) -> bool { ) -> bool {
direct_mjpeg_reject_reason(previous_bytes, Some(max_bytes), None, mjpeg).is_some() direct_mjpeg_reject_reason(previous_bytes, Some(max_bytes), None, mjpeg).is_some()
}
} }
} }
use video_sinks::hevc_mjpeg_guard as guard;
const WEBCAM_SINK: &str = include_str!(concat!( const WEBCAM_SINK: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"), env!("CARGO_MANIFEST_DIR"),

View File

@ -20,7 +20,7 @@ mod video_support {
mod media_timing; mod media_timing;
#[allow(warnings)] #[allow(warnings)]
mod video_sinks_include_contract { mod video_sinks {
include!(env!("LESAVKA_SERVER_VIDEO_SINKS_SRC")); include!(env!("LESAVKA_SERVER_VIDEO_SINKS_SRC"));
use crate::camera::{CameraOutput, HdmiConnector, HdmiMode}; use crate::camera::{CameraOutput, HdmiConnector, HdmiMode};

View File

@ -18,21 +18,24 @@ mod video_support {
} }
} }
#[allow(clippy::items_after_test_module)] mod video_sinks {
mod guard { #[allow(clippy::items_after_test_module)]
include!(concat!( pub mod hevc_mjpeg_guard {
env!("CARGO_MANIFEST_DIR"), include!(concat!(
"/server/src/video_sinks/hevc_mjpeg_guard.rs" env!("CARGO_MANIFEST_DIR"),
)); "/server/src/video_sinks/hevc_mjpeg_guard.rs"
));
pub fn normalizer_enabled() -> bool { pub fn normalizer_enabled() -> bool {
direct_mjpeg_normalize_enabled() direct_mjpeg_normalize_enabled()
} }
pub fn normalizer_rss_limit_kb() -> Option<u64> { pub fn normalizer_rss_limit_kb() -> Option<u64> {
direct_mjpeg_normalize_rss_limit_kb() direct_mjpeg_normalize_rss_limit_kb()
}
} }
} }
use video_sinks::hevc_mjpeg_guard as guard;
const SERVER_INSTALL: &str = include_str!(concat!( const SERVER_INSTALL: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"), env!("CARGO_MANIFEST_DIR"),

View File

@ -16,33 +16,36 @@ mod video_support {
} }
} }
#[allow(clippy::items_after_test_module)] mod video_sinks {
mod guard { #[allow(clippy::items_after_test_module)]
include!(concat!( pub mod hevc_mjpeg_guard {
env!("CARGO_MANIFEST_DIR"), include!(concat!(
"/server/src/video_sinks/hevc_mjpeg_guard.rs" env!("CARGO_MANIFEST_DIR"),
)); "/server/src/video_sinks/hevc_mjpeg_guard.rs"
));
pub fn jpeg_quality() -> u32 { pub fn jpeg_quality() -> u32 {
hevc_jpeg_quality() hevc_jpeg_quality()
} }
pub fn min_reference() -> u32 { pub fn min_reference() -> u32 {
min_reference_bytes() min_reference_bytes()
} }
pub fn drop_pct() -> u32 { pub fn drop_pct() -> u32 {
size_drop_pct() size_drop_pct()
} }
pub fn should_freeze(previous_bytes: u64, next_bytes: usize) -> bool { pub fn should_freeze(previous_bytes: u64, next_bytes: usize) -> bool {
should_freeze_decoded_mjpeg(previous_bytes, next_bytes) should_freeze_decoded_mjpeg(previous_bytes, next_bytes)
} }
pub fn should_freeze_frame(previous_bytes: u64, decoded_mjpeg: &[u8]) -> bool { pub fn should_freeze_frame(previous_bytes: u64, decoded_mjpeg: &[u8]) -> bool {
should_freeze_decoded_mjpeg_frame(previous_bytes, decoded_mjpeg) should_freeze_decoded_mjpeg_frame(previous_bytes, decoded_mjpeg)
}
} }
} }
use video_sinks::hevc_mjpeg_guard as guard;
#[derive(Default)] #[derive(Default)]
struct GuardedFrameEmitter { struct GuardedFrameEmitter {