feat: ASRX hybrid pipeline, identity history, worker fixes, checkpoint system

This commit is contained in:
Accusys
2026-06-02 07:13:23 +08:00
parent e3066c3f49
commit e1572907ae
198 changed files with 43705 additions and 8910 deletions
+2
View File
@@ -1,3 +1,5 @@
pub mod validator;
use anyhow::{Context, Result};
use serde::{Deserialize, Serialize};
use std::path::{Path, PathBuf};
+202
View File
@@ -0,0 +1,202 @@
use anyhow::{bail, Result};
pub const JPEG_MIN_SIZE: usize = 100;
pub const JPEG_SOI_MARKER: [u8; 3] = [0xFF, 0xD8, 0xFF];
pub const JPEG_EOI_MARKER: [u8; 2] = [0xFF, 0xD9];
pub fn validate_jpeg(data: &[u8]) -> Result<()> {
if data.len() < JPEG_MIN_SIZE {
bail!(
"JPEG too small: {} bytes (minimum {})",
data.len(),
JPEG_MIN_SIZE
);
}
if data[0..3] != JPEG_SOI_MARKER {
bail!(
"Invalid JPEG header: expected {:02X?}, got {:02X?}",
JPEG_SOI_MARKER,
&data[0..3]
);
}
if data[data.len() - 2..] != JPEG_EOI_MARKER {
bail!(
"Incomplete JPEG: missing EOI marker, got {:02X?}",
&data[data.len() - 2..]
);
}
Ok(())
}
pub fn is_valid_jpeg(data: &[u8]) -> bool {
validate_jpeg(data).is_ok()
}
pub fn jpeg_size_ok(data: &[u8]) -> bool {
data.len() >= JPEG_MIN_SIZE
}
pub fn jpeg_header_ok(data: &[u8]) -> bool {
data.len() >= 3 && data[0..3] == JPEG_SOI_MARKER
}
pub fn jpeg_footer_ok(data: &[u8]) -> bool {
data.len() >= 2 && data[data.len() - 2..] == JPEG_EOI_MARKER
}
pub fn validate_frame(frame: i64, total_frames: i64) -> Result<()> {
if frame < 0 {
bail!("Frame number cannot be negative: {}", frame);
}
if frame > total_frames {
bail!("Frame {} exceeds total frames {}", frame, total_frames);
}
Ok(())
}
pub fn validate_crop(
x: i32,
y: i32,
w: i32,
h: i32,
video_width: i32,
video_height: i32,
) -> Result<()> {
if x < 0 || y < 0 || w <= 0 || h <= 0 {
bail!(
"Invalid crop parameters: x={}, y={}, w={}, h={} (must be positive)",
x,
y,
w,
h
);
}
if x + w > video_width {
bail!(
"Crop width exceeds video: x+w={} > video_width={}",
x + w,
video_width
);
}
if y + h > video_height {
bail!(
"Crop height exceeds video: y+h={} > video_height={}",
y + h,
video_height
);
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_validate_jpeg_valid() {
let valid_jpeg = vec![
0xFF, 0xD8, 0xFF, // SOI marker
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B,
0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53,
0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0xFF,
0xD9, // EOI marker
];
assert!(validate_jpeg(&valid_jpeg).is_ok());
}
#[test]
fn test_validate_jpeg_too_small() {
let small_data = vec![0xFF, 0xD8, 0xFF, 0xFF, 0xD9];
assert!(validate_jpeg(&small_data).is_err());
}
#[test]
fn test_validate_jpeg_invalid_header() {
let invalid_header = vec![
0x00, 0x00, 0x00, // wrong header
0x00, 0x01, 0x02, 0x03, 0xFF, 0xD9,
];
assert!(validate_jpeg(&invalid_header).is_err());
}
#[test]
fn test_validate_jpeg_missing_footer() {
let missing_footer = vec![0xFF, 0xD8, 0xFF, 0x00, 0x01, 0x02, 0x03];
assert!(validate_jpeg(&missing_footer).is_err());
}
#[test]
fn test_validate_frame_valid() {
assert!(validate_frame(500, 1000).is_ok());
assert!(validate_frame(0, 1000).is_ok());
assert!(validate_frame(1000, 1000).is_ok());
}
#[test]
fn test_validate_frame_exceeds() {
assert!(validate_frame(1001, 1000).is_err());
assert!(validate_frame(-1, 1000).is_err());
}
#[test]
fn test_validate_crop_valid() {
assert!(validate_crop(100, 100, 200, 200, 1920, 1080).is_ok());
assert!(validate_crop(0, 0, 1920, 1080, 1920, 1080).is_ok());
}
#[test]
fn test_validate_crop_exceeds_width() {
assert!(validate_crop(1800, 100, 200, 200, 1920, 1080).is_err());
}
#[test]
fn test_validate_crop_exceeds_height() {
assert!(validate_crop(100, 900, 200, 200, 1920, 1080).is_err());
}
#[test]
fn test_validate_crop_negative() {
assert!(validate_crop(-1, 100, 200, 200, 1920, 1080).is_err());
assert!(validate_crop(100, -1, 200, 200, 1920, 1080).is_err());
}
#[test]
fn test_is_valid_jpeg() {
let valid_jpeg = vec![
0xFF, 0xD8, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34,
0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42,
0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E,
0x5F, 0xFF, 0xD9,
];
assert!(is_valid_jpeg(&valid_jpeg));
assert!(!is_valid_jpeg(&[0xFF, 0xD8, 0xFF, 0xFF, 0xD9])); // too small
}
#[test]
fn test_jpeg_helpers() {
let valid_jpeg = vec![
0xFF, 0xD8, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34,
0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42,
0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E,
0x5F, 0xFF, 0xD9,
];
assert!(jpeg_size_ok(&valid_jpeg));
assert!(jpeg_header_ok(&valid_jpeg));
assert!(jpeg_footer_ok(&valid_jpeg));
}
}