feat(player): add ASR/YOLO overlays, zoom, and text rendering

- Add TTF text rendering for subtitles and YOLO labels
- Implement ASR subtitle display with background
- Add YOLO bbox rendering with class labels
- Add zoom in/out (+/-) and reset (Backquote)
- Add frame/time info display
- Fix YOLO metadata parsing for actual file format
- Add Shift+Arrow for 1-second seek
This commit is contained in:
accusys
2026-03-19 01:33:46 +08:00
parent 0b75987fd0
commit 5587e6a67a
5272 changed files with 103480 additions and 45 deletions

4358
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -20,7 +20,7 @@ tao = "0.30"
wry = "0.54"
# Video/Audio
sdl2 = "0.38"
sdl2 = { version = "0.38", features = ["ttf"] }
ffmpeg-sidecar = "2.4"
# Error handling

View File

@@ -3,8 +3,10 @@
//! Unified media player with ASR/YOLO/Chunks overlay support
use anyhow::Result;
use log::{error, info};
use log::{error, info, warn};
use sdl2::pixels::PixelFormatEnum;
use sdl2::rect::Rect;
use sdl2::ttf::{self, Font};
use std::path::Path;
mod config;
@@ -38,6 +40,11 @@ fn run(config: &Config) -> Result<()> {
.video()
.map_err(|e| anyhow::anyhow!("Video subsystem failed: {}", e))?;
let ttf_context = ttf::init().map_err(|e| anyhow::anyhow!("TTF init failed: {}", e))?;
let font: Option<Font> = ttf_context
.load_font("/System/Library/Fonts/Supplemental/Arial.ttf", 20)
.ok();
let window = video_subsystem
.window("MoMentry Playground", config.width, config.height)
.position_centered()
@@ -53,6 +60,7 @@ fn run(config: &Config) -> Result<()> {
let mut decoder: Option<FFmpegDecoder> = None;
let mut texture: Option<sdl2::render::Texture> = None;
let mut video_info = None;
let mut asr: Option<AsrLoader> = None;
let mut yolo: Option<YoloLoader> = None;
@@ -61,6 +69,7 @@ fn run(config: &Config) -> Result<()> {
let path = Path::new(video_path);
let mut dec = FFmpegDecoder::new(path)?;
let info = dec.get_info();
video_info = Some(info.clone());
info!(
"Video info: {}x{} @ {:.2}fps, {} frames",
info.width, info.height, info.fps, info.frame_count
@@ -102,8 +111,7 @@ fn run(config: &Config) -> Result<()> {
}
let mut player_state = PlayerState::default();
if let Some(ref dec) = decoder {
let info = dec.get_info();
if let Some(ref info) = video_info {
player_state.total_frames = info.frame_count;
player_state.duration_ms = info.duration_ms;
player_state.fps = info.fps;
@@ -122,8 +130,12 @@ fn run(config: &Config) -> Result<()> {
sdl2::event::Event::Quit { .. } => {
running = false;
}
sdl2::event::Event::KeyDown { keycode, .. } => {
sdl2::event::Event::KeyDown {
keycode, keymod, ..
} => {
if let Some(key) = keycode {
let shift = keymod.intersects(sdl2::keyboard::Mod::LSHIFTMOD)
|| keymod.intersects(sdl2::keyboard::Mod::RSHIFTMOD);
match key {
sdl2::keyboard::Keycode::Escape => running = false,
sdl2::keyboard::Keycode::Space => {
@@ -136,9 +148,21 @@ fn run(config: &Config) -> Result<()> {
}
sdl2::keyboard::Keycode::S => {
player_state.show_subtitle = !player_state.show_subtitle;
info!(
"Subtitle: {}",
if player_state.show_subtitle {
"ON"
} else {
"OFF"
}
);
}
sdl2::keyboard::Keycode::Y => {
player_state.show_yolo = !player_state.show_yolo;
info!(
"YOLO: {}",
if player_state.show_yolo { "ON" } else { "OFF" }
);
}
sdl2::keyboard::Keycode::C => {
player_state.show_chunks = !player_state.show_chunks;
@@ -146,24 +170,63 @@ fn run(config: &Config) -> Result<()> {
sdl2::keyboard::Keycode::M => {
player_state.muted = !player_state.muted;
}
sdl2::keyboard::Keycode::F => {
// Fullscreen toggle - skip for now to avoid borrow issues
}
sdl2::keyboard::Keycode::Left => {
if let Some(ref mut dec) = decoder {
let current = player_state.current_frame.saturating_sub(1);
dec.seek(
((current as f64 / player_state.fps) * 1000.0) as u64,
)?;
player_state.current_frame = current;
if shift {
if let Some(ref mut dec) = decoder {
let current = player_state.current_frame.saturating_sub(60);
dec.seek(
((current as f64 / player_state.fps) * 1000.0) as u64,
)?;
player_state.current_frame = current;
}
} else {
if let Some(ref mut dec) = decoder {
let current = player_state.current_frame.saturating_sub(1);
dec.seek(
((current as f64 / player_state.fps) * 1000.0) as u64,
)?;
player_state.current_frame = current;
}
}
}
sdl2::keyboard::Keycode::Right => {
if let Some(ref mut dec) = decoder {
let current = player_state.current_frame + 1;
dec.seek(
((current as f64 / player_state.fps) * 1000.0) as u64,
)?;
player_state.current_frame = current;
if shift {
if let Some(ref mut dec) = decoder {
let current = player_state.current_frame + 60;
dec.seek(
((current as f64 / player_state.fps) * 1000.0) as u64,
)?;
player_state.current_frame = current;
}
} else {
if let Some(ref mut dec) = decoder {
let current = player_state.current_frame + 1;
dec.seek(
((current as f64 / player_state.fps) * 1000.0) as u64,
)?;
player_state.current_frame = current;
}
}
}
sdl2::keyboard::Keycode::Equals | sdl2::keyboard::Keycode::KpPlus => {
player_state.zoom = (player_state.zoom * 1.2).min(5.0);
}
sdl2::keyboard::Keycode::Minus | sdl2::keyboard::Keycode::KpMinus => {
player_state.zoom = (player_state.zoom / 1.2).max(0.5);
}
sdl2::keyboard::Keycode::Backquote => {
player_state.zoom = 1.0;
player_state.pan_x = 0.0;
player_state.pan_y = 0.0;
}
sdl2::keyboard::Keycode::R => {
player_state.zoom = 1.0;
player_state.pan_x = 0.0;
player_state.pan_y = 0.0;
}
_ => {}
}
}
@@ -180,33 +243,14 @@ fn run(config: &Config) -> Result<()> {
if let Some(ref mut tex) = texture {
match dec.read_frame() {
Ok(Some(data)) => {
let info = dec.get_info();
player_state.current_frame += 1;
player_state.current_time_ms =
((player_state.current_frame as f64 / info.fps) * 1000.0) as u64;
if let Some(ref info) = video_info {
player_state.current_frame += 1;
player_state.current_time_ms =
((player_state.current_frame as f64 / info.fps) * 1000.0)
as u64;
tex.update(None, &data, (info.width * 3) as usize)
.map_err(|e| anyhow::anyhow!("Texture update failed: {}", e))?;
canvas
.copy(tex, None, None)
.map_err(|e| anyhow::anyhow!("Copy failed: {}", e))?;
if player_state.show_yolo {
if let Some(ref mut yolo_loader) = yolo {
let detections =
yolo_loader.get_detections(player_state.current_frame);
for det in detections {
let x1 = det.x1 as i32;
let y1 = det.y1 as i32;
let w = (det.x2 - det.x1) as u32;
let h = (det.y2 - det.y1) as u32;
canvas.set_draw_color(sdl2::pixels::Color::RGB(0, 255, 0));
let _ =
canvas.draw_rect(sdl2::rect::Rect::new(x1, y1, w, h));
}
}
tex.update(None, &data, (info.width * 3) as usize)
.map_err(|e| anyhow::anyhow!("Texture update failed: {}", e))?;
}
}
Ok(None) => {
@@ -214,7 +258,7 @@ fn run(config: &Config) -> Result<()> {
break;
}
Err(e) => {
error!("Frame read error: {}", e);
warn!("Frame read error: {}", e);
break;
}
}
@@ -222,6 +266,140 @@ fn run(config: &Config) -> Result<()> {
}
}
if let Some(ref mut tex) = texture {
let dst = if player_state.zoom != 1.0 {
let info = video_info.as_ref().unwrap();
let w = (info.width as f32 * player_state.zoom) as u32;
let h = (info.height as f32 * player_state.zoom) as u32;
let x = ((config.width as i32 - w as i32) / 2) as i32 + player_state.pan_x as i32;
let y = ((config.height as i32 - h as i32) / 2) as i32 + player_state.pan_y as i32;
Rect::new(x, y, w, h)
} else {
Rect::new(0, 0, 0, 0)
};
if player_state.zoom == 1.0 {
canvas.copy(tex, None, None).ok();
} else {
canvas.copy(tex, None, Some(dst)).ok();
}
}
if player_state.show_yolo {
if let Some(ref mut yolo_loader) = yolo {
let detections = yolo_loader.get_detections(player_state.current_frame);
for det in detections {
let x1 = (det.x1 as f32 * player_state.zoom) as i32
+ player_state.pan_x as i32
+ ((config.width as i32
- video_info.as_ref().map(|i| i.width as i32).unwrap_or(0))
/ 2);
let y1 = (det.y1 as f32 * player_state.zoom) as i32
+ player_state.pan_y as i32
+ ((config.height as i32
- video_info.as_ref().map(|i| i.height as i32).unwrap_or(0))
/ 2);
let w = ((det.x2 - det.x1) as f32 * player_state.zoom) as u32;
let h = ((det.y2 - det.y1) as f32 * player_state.zoom) as u32;
canvas.set_draw_color(sdl2::pixels::Color::RGB(0, 255, 0));
let _ = canvas.draw_rect(Rect::new(x1, y1, w, h));
if let Some(ref f) = font {
let label = format!("{} {:.0}%", det.class_name, det.confidence * 100.0);
if let Ok(surface) =
f.render(&label).solid(sdl2::pixels::Color::RGB(0, 255, 0))
{
let tex_label =
texture_creator.create_texture_from_surface(&surface).ok();
if let Some(tex_label) = tex_label {
let label_rect = Rect::new(x1, y1 - 24, w.min(150), 24);
canvas.copy(&tex_label, None, Some(label_rect)).ok();
}
}
}
}
}
}
if player_state.show_subtitle {
if let Some(ref asr_loader) = asr {
if let Some(text) = asr_loader.get_text_at(player_state.current_time_ms as f64) {
if let Some(ref f) = font {
if let Ok(surface) = f
.render(&text)
.blended(sdl2::pixels::Color::RGBA(255, 255, 255, 255))
{
let tex_label =
texture_creator.create_texture_from_surface(&surface).ok();
if let Some(tex_label) = tex_label {
let query = tex_label.query();
let x = (config.width - query.width) / 2;
let y = config.height - query.height - 40;
let rect = Rect::new(x as i32, y as i32, query.width, query.height);
canvas.set_draw_color(sdl2::pixels::Color::RGBA(0, 0, 0, 180));
let _ = canvas.fill_rect(Rect::new(
rect.x() - 10,
rect.y() - 5,
rect.width() + 20,
rect.height() + 10,
));
canvas.copy(&tex_label, None, Some(rect)).ok();
}
}
}
}
}
}
if let Some(ref f) = font {
let time_str = format_time(player_state.current_time_ms);
let frame_str = format!(
"Frame: {}/{} ({:.1}fps)",
player_state.current_frame, player_state.total_frames, player_state.fps
);
let status_parts = vec![
format!("Time: {}", time_str),
frame_str,
if player_state.show_subtitle {
"Subtitle: ON".to_string()
} else {
String::new()
},
if player_state.show_yolo {
"YOLO: ON".to_string()
} else {
String::new()
},
if player_state.zoom != 1.0 {
format!("Zoom: {:.1}x", player_state.zoom)
} else {
String::new()
},
];
let y_offset = 10;
for (i, part) in status_parts.iter().enumerate() {
if !part.is_empty() {
if let Ok(surface) = f
.render(part)
.solid(sdl2::pixels::Color::RGB(200, 200, 200))
{
let tex_label = texture_creator.create_texture_from_surface(&surface).ok();
if let Some(tex_label) = tex_label {
let rect = Rect::new(
10,
y_offset + (i as i32 * 22),
surface.width(),
surface.height(),
);
canvas.copy(&tex_label, None, Some(rect)).ok();
}
}
}
}
}
canvas.present();
std::thread::sleep(std::time::Duration::from_millis(16));
@@ -230,3 +408,16 @@ fn run(config: &Config) -> Result<()> {
info!("Application closed");
Ok(())
}
fn format_time(ms: u64) -> String {
let total_secs = ms / 1000;
let hours = total_secs / 3600;
let minutes = (total_secs % 3600) / 60;
let seconds = total_secs % 60;
let millis = ms % 1000;
if hours > 0 {
format!("{:02}:{:02}:{:02}.{:03}", hours, minutes, seconds, millis)
} else {
format!("{:02}:{:02}.{:03}", minutes, seconds, millis)
}
}

View File

@@ -41,12 +41,23 @@ pub struct YoloMetadata {
pub status: Option<String>,
pub total_detections: u64,
pub avg_detections_per_frame: f64,
#[serde(default)]
pub auto_save_interval: Option<u32>,
#[serde(default)]
pub processing_time: Option<f64>,
#[serde(default)]
pub avg_time_per_frame: Option<f64>,
#[serde(default)]
pub last_saved_at: Option<String>,
#[serde(default)]
pub completed_at: Option<String>,
#[serde(default)]
pub auto_save_count: Option<u32>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct YoloData {
pub metadata: YoloMetadata,
#[serde(flatten)]
pub frames: HashMap<String, FrameData>,
}

1
target/.rustc_info.json Normal file
View File

@@ -0,0 +1 @@
{"rustc_fingerprint":7910028290815472967,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.92.0 (ded5c06cf 2025-12-08)\nbinary: rustc\ncommit-hash: ded5c06cf21d2b93bffd5d884aa6e96934ee4234\ncommit-date: 2025-12-08\nhost: aarch64-apple-darwin\nrelease: 1.92.0\nLLVM version: 21.1.3\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.dylib\nlib___.dylib\nlib___.a\nlib___.dylib\n/Users/accusys/.rustup/toolchains/stable-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"aarch64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"aes\"\ntarget_feature=\"crc\"\ntarget_feature=\"dit\"\ntarget_feature=\"dotprod\"\ntarget_feature=\"dpb\"\ntarget_feature=\"dpb2\"\ntarget_feature=\"fcma\"\ntarget_feature=\"fhm\"\ntarget_feature=\"flagm\"\ntarget_feature=\"fp16\"\ntarget_feature=\"frintts\"\ntarget_feature=\"jsconv\"\ntarget_feature=\"lor\"\ntarget_feature=\"lse\"\ntarget_feature=\"neon\"\ntarget_feature=\"paca\"\ntarget_feature=\"pacg\"\ntarget_feature=\"pan\"\ntarget_feature=\"pmuv3\"\ntarget_feature=\"ras\"\ntarget_feature=\"rcpc\"\ntarget_feature=\"rcpc2\"\ntarget_feature=\"rdm\"\ntarget_feature=\"sb\"\ntarget_feature=\"sha2\"\ntarget_feature=\"sha3\"\ntarget_feature=\"ssbs\"\ntarget_feature=\"vh\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"macos\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"apple\"\nunix\n","stderr":""}},"successes":{}}

3
target/CACHEDIR.TAG Normal file
View File

@@ -0,0 +1,3 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/

0
target/debug/.cargo-lock Normal file
View File

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
cafaf23dcf812b49

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[\"core\", \"default\", \"rustc-dep-of-std\", \"std\"]","target":6569825234462323107,"profile":5347358027863023418,"path":15149082351976033191,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/adler2-41b0dd48552c20c5/dep-lib-adler2","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
ac3a9d80f9cd03e9

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"perf-literal\", \"std\"]","declared_features":"[\"default\", \"logging\", \"perf-literal\", \"std\"]","target":7534583537114156500,"profile":5347358027863023418,"path":2498799609881310857,"deps":[[1363051979936526615,"memchr",false,16761034740145381771]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/aho-corasick-88b3cd4431528e8d/dep-lib-aho_corasick","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
621c37ce8678a92d

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"alloc\"]","declared_features":"[\"alloc\", \"default\", \"fresh-rust\", \"nightly\", \"serde\", \"std\"]","target":5388200169723499962,"profile":8526714817676984181,"path":9266711163172033080,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/allocator-api2-5e7341e257c04569/dep-lib-allocator_api2","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
35fdd6938cddbe96

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"auto\", \"wincon\"]","declared_features":"[\"auto\", \"default\", \"test\", \"wincon\"]","target":11278316191512382530,"profile":11459093354283867776,"path":1368805165058083929,"deps":[[5652275617566266604,"anstyle_query",false,8874033107635935327],[7098682853475662231,"anstyle",false,12300851714675958605],[7711617929439759244,"colorchoice",false,3274431315892103036],[7727459912076845739,"is_terminal_polyfill",false,12638843975273980479],[11410867133969439143,"anstyle_parse",false,3908141501184340663],[17716308468579268865,"utf8parse",false,6151700546281254876]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstream-5c7ee89b12f2f0af/dep-lib-anstream","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
df1b360d59411b84

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"auto\", \"default\", \"wincon\"]","declared_features":"[\"auto\", \"default\", \"test\", \"wincon\"]","target":11278316191512382530,"profile":8255941854203129366,"path":14237504360179493621,"deps":[[2608044744973004659,"anstyle_parse",false,1360650918450305252],[5652275617566266604,"anstyle_query",false,8874033107635935327],[7098682853475662231,"anstyle",false,12300851714675958605],[7711617929439759244,"colorchoice",false,3274431315892103036],[7727459912076845739,"is_terminal_polyfill",false,12638843975273980479],[17716308468579268865,"utf8parse",false,6151700546281254876]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstream-cbae704d8623b559/dep-lib-anstream","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
4de303387667b5aa

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"std\"]","target":6165884447290141869,"profile":8255941854203129366,"path":1622006416877328561,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-0c8ab8bd38595486/dep-lib-anstyle","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
e4188a21cd00e212

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"default\", \"utf8\"]","declared_features":"[\"core\", \"default\", \"utf8\"]","target":10225663410500332907,"profile":8255941854203129366,"path":13053215332907560763,"deps":[[17716308468579268865,"utf8parse",false,6151700546281254876]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-parse-392f1d4c1d178323/dep-lib-anstyle_parse","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
b7f20d36fd813c36

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"default\", \"utf8\"]","declared_features":"[\"core\", \"default\", \"utf8\"]","target":10225663410500332907,"profile":11459093354283867776,"path":14980379806015639209,"deps":[[17716308468579268865,"utf8parse",false,6151700546281254876]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-parse-584c63468a348cbd/dep-lib-anstyle_parse","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
5f18b24118e6267b

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[]","target":10705714425685373190,"profile":14848920055892446256,"path":4316627989718112974,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anstyle-query-3a5ace2dbec2ae9f/dep-lib-anstyle_query","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
edc67d7f466199ec

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"default\", \"std\"]","declared_features":"[\"backtrace\", \"default\", \"std\"]","target":5408242616063297496,"profile":3033921117576893,"path":15975461479635710502,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anyhow-24ec003b790501cc/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
bc6796b89332f94d

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[12478428894219133322,"build_script_build",false,17048764819802277613]],"local":[{"RerunIfChanged":{"output":"debug/build/anyhow-40fe6c014f4e8bb6/output","paths":["src/nightly.rs"]}},{"RerunIfEnvChanged":{"var":"RUSTC_BOOTSTRAP","val":null}}],"rustflags":[],"config":0,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
acdf419166c7c9f4

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"default\", \"std\"]","declared_features":"[\"backtrace\", \"default\", \"std\"]","target":1563897884725121975,"profile":5347358027863023418,"path":8136069237744135612,"deps":[[12478428894219133322,"build_script_build",false,5618577620159850428]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/anyhow-d838341a95e3a987/dep-lib-anyhow","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
28cf21415662fb90

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[\"portable-atomic\"]","target":14411119108718288063,"profile":5347358027863023418,"path":11009143541493348455,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/atomic-waker-b0bffc3cf38abbeb/dep-lib-atomic_waker","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
1477b7ed36cbf522

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[]","target":6962977057026645649,"profile":3033921117576893,"path":10045383212328745351,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/autocfg-e2e21eab783460c2/dep-lib-autocfg","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
0c8f0e4e099d8852

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"std\"]","target":13060062996227388079,"profile":5347358027863023418,"path":2443796168128073955,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/base64-80c574e62179e036/dep-lib-base64","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
2ef398f319cb65f8

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"std\"]","declared_features":"[\"arbitrary\", \"bytemuck\", \"example_generated\", \"serde\", \"serde_core\", \"std\"]","target":7691312148208718491,"profile":5347358027863023418,"path":1039962568932081109,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bitflags-ccb9bc03a9edff55/dep-lib-bitflags","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
0375a828b8d21fda

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"default\"]","declared_features":"[\"compiler_builtins\", \"core\", \"default\", \"example_generated\", \"rustc-dep-of-std\"]","target":12919857562465245259,"profile":5347358027863023418,"path":3910279081600245434,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bitflags-fc563d35d55f7f61/dep-lib-bitflags","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
b63146aeea754deb

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[]","target":6813287393046767197,"profile":5347358027863023418,"path":7951925049428246312,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/block-7f847bd28d463d32/dep-lib-block","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
649d78e788b7a9f2

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"compiler-rt\", \"default\", \"gnustep-1-7\", \"gnustep-1-8\", \"gnustep-1-9\", \"gnustep-2-0\", \"gnustep-2-1\", \"std\", \"unstable-coerce-pointee\", \"unstable-objfw\", \"unstable-private\", \"unstable-winobjc\"]","target":8611651741325771798,"profile":8196097686603091492,"path":14352777551528949466,"deps":[[5711497484949304150,"objc2",false,9362850287131531880]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/block2-2dc27831c2863634/dep-lib-block2","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
b8b18efa93809b0f

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"default\"]","declared_features":"[\"allocator-api2\", \"allocator_api\", \"bench_allocator_api\", \"boxed\", \"collections\", \"default\", \"serde\", \"std\"]","target":10625613344215589528,"profile":5347358027863023418,"path":18342583852565774136,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bumpalo-9214dc9bc289b3ef/dep-lib-bumpalo","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
fc13a733e8b70924

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"extra-platforms\", \"serde\", \"std\"]","target":11402411492164584411,"profile":7855341030452660939,"path":9738655571473828057,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bytes-5544e1f3425bf39c/dep-lib-bytes","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
160aff27f90efb59

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[\"jobserver\", \"parallel\"]","target":11042037588551934598,"profile":9003321226815314314,"path":17345839170407623127,"deps":[[8410525223747752176,"shlex",false,18384121358634351639],[9159843920629750842,"find_msvc_tools",false,5384539691240515643]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cc-8976cad50f558e48/dep-lib-cc","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
80017c3fea09ccac

View File

@@ -0,0 +1 @@
{"rustc":18415816196306954164,"features":"[]","declared_features":"[\"core\", \"rustc-dep-of-std\"]","target":13840298032947503755,"profile":5347358027863023418,"path":16057951098383942350,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cfg-if-910eb05bc9a9e024/dep-lib-cfg_if","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
5af1874b87688a16

Some files were not shown because too many files have changed in this diff Show More