mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-03-29 22:56:45 +08:00
fix(video): 启动时丢弃前三帧无效 MJPEG
This commit is contained in:
@@ -31,6 +31,9 @@ const AUTO_STOP_GRACE_PERIOD_SECS: u64 = 3;
|
|||||||
const CAPTURE_TIMEOUT_RESTART_THRESHOLD: u32 = 5;
|
const CAPTURE_TIMEOUT_RESTART_THRESHOLD: u32 = 5;
|
||||||
/// Minimum valid frame size for capture
|
/// Minimum valid frame size for capture
|
||||||
const MIN_CAPTURE_FRAME_SIZE: usize = 128;
|
const MIN_CAPTURE_FRAME_SIZE: usize = 128;
|
||||||
|
/// Validate every JPEG frame during startup to avoid poisoning HW decoders
|
||||||
|
/// with incomplete UVC warm-up frames.
|
||||||
|
const STARTUP_JPEG_VALIDATE_FRAMES: u64 = 3;
|
||||||
/// Validate JPEG header every N frames to reduce overhead
|
/// Validate JPEG header every N frames to reduce overhead
|
||||||
const JPEG_VALIDATE_INTERVAL: u64 = 30;
|
const JPEG_VALIDATE_INTERVAL: u64 = 30;
|
||||||
/// Throttle repeated encoding errors to avoid log flooding
|
/// Throttle repeated encoding errors to avoid log flooding
|
||||||
@@ -208,6 +211,11 @@ fn log_encoding_error(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn should_validate_jpeg_frame(validate_counter: u64) -> bool {
|
||||||
|
validate_counter <= STARTUP_JPEG_VALIDATE_FRAMES
|
||||||
|
|| validate_counter.is_multiple_of(JPEG_VALIDATE_INTERVAL)
|
||||||
|
}
|
||||||
|
|
||||||
/// Pipeline statistics
|
/// Pipeline statistics
|
||||||
#[derive(Debug, Clone, Default)]
|
#[derive(Debug, Clone, Default)]
|
||||||
pub struct SharedVideoPipelineStats {
|
pub struct SharedVideoPipelineStats {
|
||||||
@@ -1463,7 +1471,7 @@ impl SharedVideoPipeline {
|
|||||||
|
|
||||||
validate_counter = validate_counter.wrapping_add(1);
|
validate_counter = validate_counter.wrapping_add(1);
|
||||||
if pixel_format.is_compressed()
|
if pixel_format.is_compressed()
|
||||||
&& validate_counter.is_multiple_of(JPEG_VALIDATE_INTERVAL)
|
&& should_validate_jpeg_frame(validate_counter)
|
||||||
&& !VideoFrame::is_valid_jpeg_bytes(&owned[..frame_size])
|
&& !VideoFrame::is_valid_jpeg_bytes(&owned[..frame_size])
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
@@ -1788,4 +1796,13 @@ mod tests {
|
|||||||
let h265 = SharedVideoPipelineConfig::h265(Resolution::HD720, BitratePreset::Speed);
|
let h265 = SharedVideoPipelineConfig::h265(Resolution::HD720, BitratePreset::Speed);
|
||||||
assert_eq!(h265.output_codec, VideoEncoderType::H265);
|
assert_eq!(h265.output_codec, VideoEncoderType::H265);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_startup_jpeg_validation_policy() {
|
||||||
|
assert!(should_validate_jpeg_frame(1));
|
||||||
|
assert!(should_validate_jpeg_frame(2));
|
||||||
|
assert!(should_validate_jpeg_frame(3));
|
||||||
|
assert!(!should_validate_jpeg_frame(4));
|
||||||
|
assert!(should_validate_jpeg_frame(30));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user