Files
Syplheed-Reborn/Cargo.toml
MechaCat02 91bd2543f4 feat(viewer): WMV cutscene player with scrub, keyboard + audio
Add an in-explorer video player for the dat/movie/*.wmv cutscenes.

Decode via the ffmpeg/ffprobe CLI (no libav linking): video streams from an
`ffmpeg -f rawvideo -pix_fmt rgba` pipe read into fixed w*h*4 frame chunks over
a bounded channel (paused/behind => ffmpeg back-pressures on its pipe); one
reused Image is overwritten in place each tick. Audio is best-effort: the track
is pre-decoded to a temp stereo WAV and played through a rodio Sink (volume /
play / pause / seek-via-skip_duration for free). Native-only under
cfg(not(wasm32)); VideoPreview registers unconditionally so the UI compiles for
wasm. Mirrors the .pak load pipeline (FileSelected -> bg thread ->
IsoLoaderMsg::VideoLoaded -> apply_loaded_video -> advance_video_playback), with
a single free_video teardown wired into every other viewer's reset.

Controls:
- play/pause button, click-on-frame toggle, Space / arrow (+-10s) shortcuts
- seekable timeline with mm:ss labels; volume slider (greyed when no audio)
- live scrubbing: a coalescing one-shot `ffmpeg -ss -frames:v 1` grabber always
  jumps to the knob's latest position, so dragging shows the frame under the
  knob in real time; that grabbed frame also bridges the gap after a commit-seek
  so there's no black flash while the streaming decoder catches up.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-11 14:31:52 +02:00

57 lines
3.1 KiB
TOML

[workspace]
members = [
"crates/sylpheed-formats",
"crates/sylpheed-viewer",
"crates/sylpheed-cli",
]
resolver = "2"
[workspace.package]
version = "0.1.0"
edition = "2021"
license = "MIT OR Apache-2.0"
authors = ["Project Sylpheed Reborn Contributors"]
repository = "https://github.com/sylpheed-reborn/sylpheed-reborn"
[workspace.dependencies]
# ── Format / parser crates ──────────────────────────────────────────────────
sylpheed-formats = { path = "crates/sylpheed-formats" }
# ── Bevy game engine ────────────────────────────────────────────────────────
bevy = { version = "0.15", default-features = false }
bevy_egui = "0.31"
# ── Xbox 360 XISO / XDVDFS disc image parsing ───────────────────────────────
xdvdfs = { version = "0.8", features = ["log"] }
# ── Binary format parsing with derive macros ────────────────────────────────
binrw = "0.14"
# ── Async runtime ────────────────────────────────────────────────────────────
tokio = { version = "1", features = ["full"] }
futures = "0.3"
# ── Error handling ───────────────────────────────────────────────────────────
thiserror = "2"
anyhow = "1"
# ── Logging ──────────────────────────────────────────────────────────────────
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
# ── Native file dialog ────────────────────────────────────────────────────────
rfd = "0.14"
# ── Audio playback (native video player) ──────────────────────────────────────
rodio = "0.20"
# ── CLI ───────────────────────────────────────────────────────────────────────
clap = { version = "4", features = ["derive"] }
# ── Serialization ─────────────────────────────────────────────────────────────
serde = { version = "1", features = ["derive"] }
serde_json = "1"
# ── Async traits ──────────────────────────────────────────────────────────────
async-trait = "0.1"