direct_play_nice 0.1.0-beta.3

CLI program that converts video files to direct-play-compatible formats.
Documentation
#![cfg(feature = "ffmpeg-cli-tests")]

mod common;

use assert_cmd::Command;
use common::{ffprobe_avg_frame_rate, ffprobe_duration};
use std::error::Error;
use std::process::Command as StdCommand;
use tempfile::tempdir;

#[test]
fn preserves_duration_and_fps_after_transcode() -> Result<(), Box<dyn Error>> {
    common::ensure_ffmpeg_present();

    let tmp = tempdir()?;
    let input = tmp.path().join("kaiji_like.mkv");
    let output = tmp.path().join("kaiji_like.fixed.mp4");

    let status = StdCommand::new("ffmpeg")
        .args([
            "-hide_banner",
            "-loglevel",
            "error",
            "-y",
            "-f",
            "lavfi",
            "-i",
            "testsrc2=size=1920x1080:rate=30000/1001",
            "-f",
            "lavfi",
            "-i",
            "sine=frequency=440:sample_rate=48000",
            "-shortest",
            "-t",
            "4",
            "-pix_fmt",
            "yuv420p",
            "-c:v",
            "libx264",
            "-c:a",
            "aac",
            input.to_str().expect("path utf8"),
        ])
        .status()?;
    assert!(status.success(), "ffmpeg sample generation failed");

    Command::cargo_bin("direct_play_nice")?
        .args([
            "--hw-accel",
            "none",
            "--video-quality",
            "720p",
            input.to_str().expect("path utf8"),
            output.to_str().expect("path utf8"),
        ])
        .assert()
        .success();

    let input_duration = ffprobe_duration(&input)?;
    let output_duration = ffprobe_duration(&output)?;
    let duration_delta = (input_duration - output_duration).abs();
    assert!(
        duration_delta < 0.25,
        "duration drift too large: input={} output={} delta={}",
        input_duration,
        output_duration,
        duration_delta
    );

    let output_rate = ffprobe_avg_frame_rate(&output)?;
    assert!(
        (output_rate - 29.97).abs() < 0.5,
        "unexpected avg_frame_rate {}",
        output_rate
    );

    Ok(())
}