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:
4358
Cargo.lock
generated
Normal file
4358
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
277
src/main.rs
277
src/main.rs
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
1
target/.rustc_info.json
Normal 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
3
target/CACHEDIR.TAG
Normal 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
0
target/debug/.cargo-lock
Normal file
BIN
target/debug/.fingerprint/adler2-41b0dd48552c20c5/dep-lib-adler2
Normal file
BIN
target/debug/.fingerprint/adler2-41b0dd48552c20c5/dep-lib-adler2
Normal file
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
cafaf23dcf812b49
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
ac3a9d80f9cd03e9
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
621c37ce8678a92d
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
35fdd6938cddbe96
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
df1b360d59411b84
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
4de303387667b5aa
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
e4188a21cd00e212
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
b7f20d36fd813c36
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
5f18b24118e6267b
|
||||
@@ -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}
|
||||
@@ -0,0 +1 @@
|
||||
edc67d7f466199ec
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
bc6796b89332f94d
|
||||
@@ -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}
|
||||
BIN
target/debug/.fingerprint/anyhow-d838341a95e3a987/dep-lib-anyhow
Normal file
BIN
target/debug/.fingerprint/anyhow-d838341a95e3a987/dep-lib-anyhow
Normal file
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
acdf419166c7c9f4
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
28cf21415662fb90
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
1477b7ed36cbf522
|
||||
@@ -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}
|
||||
BIN
target/debug/.fingerprint/base64-80c574e62179e036/dep-lib-base64
Normal file
BIN
target/debug/.fingerprint/base64-80c574e62179e036/dep-lib-base64
Normal file
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
0c8f0e4e099d8852
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
2ef398f319cb65f8
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
0375a828b8d21fda
|
||||
@@ -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}
|
||||
BIN
target/debug/.fingerprint/block-7f847bd28d463d32/dep-lib-block
Normal file
BIN
target/debug/.fingerprint/block-7f847bd28d463d32/dep-lib-block
Normal file
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
b63146aeea754deb
|
||||
@@ -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}
|
||||
BIN
target/debug/.fingerprint/block2-2dc27831c2863634/dep-lib-block2
Normal file
BIN
target/debug/.fingerprint/block2-2dc27831c2863634/dep-lib-block2
Normal file
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
649d78e788b7a9f2
|
||||
@@ -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}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
b8b18efa93809b0f
|
||||
@@ -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}
|
||||
BIN
target/debug/.fingerprint/bytes-5544e1f3425bf39c/dep-lib-bytes
Normal file
BIN
target/debug/.fingerprint/bytes-5544e1f3425bf39c/dep-lib-bytes
Normal file
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
fc13a733e8b70924
|
||||
@@ -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}
|
||||
BIN
target/debug/.fingerprint/cc-8976cad50f558e48/dep-lib-cc
Normal file
BIN
target/debug/.fingerprint/cc-8976cad50f558e48/dep-lib-cc
Normal file
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
1
target/debug/.fingerprint/cc-8976cad50f558e48/lib-cc
Normal file
1
target/debug/.fingerprint/cc-8976cad50f558e48/lib-cc
Normal file
@@ -0,0 +1 @@
|
||||
160aff27f90efb59
|
||||
@@ -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}
|
||||
BIN
target/debug/.fingerprint/cfg-if-910eb05bc9a9e024/dep-lib-cfg_if
Normal file
BIN
target/debug/.fingerprint/cfg-if-910eb05bc9a9e024/dep-lib-cfg_if
Normal file
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
80017c3fea09ccac
|
||||
@@ -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}
|
||||
BIN
target/debug/.fingerprint/chrono-5814d22105e1cebc/dep-lib-chrono
Normal file
BIN
target/debug/.fingerprint/chrono-5814d22105e1cebc/dep-lib-chrono
Normal file
Binary file not shown.
@@ -0,0 +1 @@
|
||||
This file has an mtime of when this was started.
|
||||
@@ -0,0 +1 @@
|
||||
5af1874b87688a16
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user