diff options
-rw-r--r-- | evc/Cargo.lock | 78 | ||||
-rw-r--r-- | evc/Cargo.toml | 15 | ||||
-rwxr-xr-x | evc/scripts/bench_modes | 4 | ||||
-rwxr-xr-x | evc/scripts/bench_out | 6 | ||||
-rwxr-xr-x | evc/scripts/gen | 2 | ||||
-rwxr-xr-x | evc/scripts/report | 4 | ||||
-rwxr-xr-x | evc/scripts/stream | 4 | ||||
-rwxr-xr-x | evc/scripts/stream-nodebug | 4 | ||||
-rw-r--r-- | evc/src/bin/decode.rs | 9 | ||||
-rw-r--r-- | evc/src/bin/encode.rs | 21 | ||||
-rw-r--r-- | evc/src/bin/info.rs | 5 | ||||
-rw-r--r-- | evc/src/block.rs | 3 | ||||
-rw-r--r-- | evc/src/codec/decode.rs | 3 | ||||
-rw-r--r-- | evc/src/debug.rs | 3 |
14 files changed, 120 insertions, 41 deletions
diff --git a/evc/Cargo.lock b/evc/Cargo.lock index 9e3ca03..632b23f 100644 --- a/evc/Cargo.lock +++ b/evc/Cargo.lock @@ -79,6 +79,25 @@ dependencies = [ ] [[package]] +name = "console" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9b6515d269224923b26b5febea2ed42b2d5f2ce37284a4dd670fedd6cb8347a" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys", +] + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] name = "env_logger" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -113,17 +132,6 @@ dependencies = [ ] [[package]] -name = "evc" -version = "0.1.0" -dependencies = [ - "anyhow", - "clap", - "env_logger", - "log", - "rustdct", -] - -[[package]] name = "heck" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -145,6 +153,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] +name = "indicatif" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4295cbb7573c16d310e99e713cf9e75101eb190ab31fccd35f2d2691b4352b19" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width", +] + +[[package]] name = "io-lifetimes" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -167,12 +187,30 @@ dependencies = [ ] [[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] name = "libc" version = "0.2.138" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" [[package]] +name = "libreschmux" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "env_logger", + "indicatif", + "log", + "rustdct", +] + +[[package]] name = "linux-raw-sys" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -222,6 +260,12 @@ dependencies = [ ] [[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] name = "once_cell" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -234,6 +278,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" [[package]] +name = "portable-atomic" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26f6a7b87c2e435a3241addceeeff740ff8b7e76b74c13bf9acb17fa454ea00b" + +[[package]] name = "primal-check" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -388,6 +438,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" [[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/evc/Cargo.toml b/evc/Cargo.toml index 7a1178b..9669d1c 100644 --- a/evc/Cargo.toml +++ b/evc/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "evc" +name = "libreschmux" version = "0.1.0" edition = "2021" @@ -9,3 +9,16 @@ anyhow = "1.0.66" log = "0.4.17" env_logger = "0.10.0" rustdct = "0.7.1" +indicatif = "*" + +[[bin]] +path = "src/bin/encode.rs" +name = "reschmux-encode" + +[[bin]] +path = "src/bin/decode.rs" +name = "reschmux-decode" + +[[bin]] +path = "src/bin/info.rs" +name = "reschmux-info" diff --git a/evc/scripts/bench_modes b/evc/scripts/bench_modes index 87ccf93..2e66454 100755 --- a/evc/scripts/bench_modes +++ b/evc/scripts/bench_modes @@ -14,9 +14,9 @@ echo "reference (raw): "(du -h samples/raw | cut -f 1) echo "reference (input): "(du -h $argv[4] | cut -f 1) # echo "reference (vp8): "(du -h samples/reference.webm | cut -f 1) # for mode in trivial simple-exhaustive simple-fast advanced advanced-partial -for mode in trivial simple-fast +for mode in trivial simple-fast advanced echo ----------- echo "mode: $mode" - echo "time: $(command time -f %U ./target/release/encode -W {$w} -H {$h} --mode $mode $argv[5..] <samples/raw >samples/encoded-$mode 2>| tail -n 1)s" + echo "time: $(command time -f %U ./target/release/reschmux-encode -W {$w} -H {$h} --mode $mode $argv[5..] <samples/raw >samples/encoded-$mode 2>| tail -n 1)s" echo "size: $(du -h samples/encoded-$mode | cut -f 1)" end diff --git a/evc/scripts/bench_out b/evc/scripts/bench_out index 17aa1a4..d55cf08 100755 --- a/evc/scripts/bench_out +++ b/evc/scripts/bench_out @@ -3,9 +3,9 @@ set w $argv[1] set h $argv[2] # for mode in trivial simple-exhaustive simple-fast advanced advanced-partial -for mode in trivial simple-fast - cargo run --release --bin decode -- --debug < samples/encoded-$mode | +for mode in trivial simple-fast advanced + cargo run --release --bin reschmux-decode -- --debug < samples/encoded-$mode | ffmpeg -y -hide_banner -framerate 25 -video_size {$w}x{$h} -pixel_format rgb24 -f rawvideo -i pipe:0 samples/decoded-$mode-debug.mp4 - cargo run --release --bin decode -- < samples/encoded-$mode | + cargo run --release --bin reschmux-decode -- < samples/encoded-$mode | ffmpeg -y -hide_banner -framerate 25 -video_size {$w}x{$h} -pixel_format rgb24 -f rawvideo -i pipe:0 samples/decoded-$mode.mp4 end diff --git a/evc/scripts/gen b/evc/scripts/gen index da24dec..6c8fa3c 100755 --- a/evc/scripts/gen +++ b/evc/scripts/gen @@ -2,7 +2,7 @@ set w $argv[1] set h $argv[2] ffmpeg -hide_banner -i $argv[3] -vf scale={$w}x{$h},fps=30,format=rgb24 -f rawvideo pipe:1 | - LOG=info cargo run --release --bin encode -- -W {$w} -H {$h} $argv[4..] >samples/encoded + LOG=info cargo run --release --bin reschmux-encode -- -W {$w} -H {$h} $argv[4..] >samples/encoded ffmpeg -hide_banner -y -i $argv[3] -vf scale={$w}x{$h},fps=30,format=rgb24 samples/reference.webm LOG=info cargo run --release --bin decode -- <samples/encoded | ffmpeg -hide_banner -y -framerate 30 -video_size {$w}x{$h} -pixel_format rgb24 -f rawvideo -i pipe:0 samples/decoded.webm diff --git a/evc/scripts/report b/evc/scripts/report index c6f1085..06a5517 100755 --- a/evc/scripts/report +++ b/evc/scripts/report @@ -3,7 +3,7 @@ cargo build --release begin echo "version: $argv[1]" echo "commit: $(cat ../.git/refs/heads/master | head -c 10)" - echo "encode: $(command time -f %U ./target/release/encode -W (math 1920 / 2) -H (math 1080 / 2) <samples/raw >samples/encoded 2>| tail -n 1)s" - echo "decode: $(command time -f %U ./target/release/decode <samples/encoded >samples/decoded 2>| tail -n 1)s" + echo "encode: $(command time -f %U ./target/release/reschmux-encode -W (math 1920 / 2) -H (math 1080 / 2) <samples/raw >samples/encoded 2>| tail -n 1)s" + echo "decode: $(command time -f %U ./target/release/reschmux-decode <samples/encoded >samples/decoded 2>| tail -n 1)s" echo "size: $(du -h samples/encoded | cut -f 1)" end | tee -a reports/(date) diff --git a/evc/scripts/stream b/evc/scripts/stream index cd7e159..7e9400d 100755 --- a/evc/scripts/stream +++ b/evc/scripts/stream @@ -2,6 +2,6 @@ set w $argv[1] set h $argv[2] ffmpeg -hide_banner -i $argv[3] -vf scale={$w}x{$h},fps=30,format=rgb24 -f rawvideo pipe:1 | - cargo run --release --bin encode -- -W {$w} -H {$h} $argv[4..] | - cargo run --release --bin decode -- --debug | + cargo run --release --bin reschmux-encode -- -W {$w} -H {$h} $argv[4..] | + cargo run --release --bin reschmux-decode -- --debug | ffplay -hide_banner -framerate 30 -video_size {$w}x{$h} -pixel_format rgb24 -f rawvideo pipe:0 diff --git a/evc/scripts/stream-nodebug b/evc/scripts/stream-nodebug index 7211b05..380ec5f 100755 --- a/evc/scripts/stream-nodebug +++ b/evc/scripts/stream-nodebug @@ -2,6 +2,6 @@ set w $argv[1] set h $argv[2] ffmpeg -hide_banner -i $argv[3] -vf scale={$w}x{$h},fps=30,format=rgb24 -f rawvideo pipe:1 | - cargo run --release --bin encode -- -W {$w} -H {$h} $argv[4..] | - cargo run --release --bin decode -- | + cargo run --release --bin reschmux-encode -- -W {$w} -H {$h} $argv[4..] | + cargo run --release --bin reschmux-decode -- | ffplay -hide_banner -framerate 30 -video_size {$w}x{$h} -pixel_format rgb24 -f rawvideo pipe:0 diff --git a/evc/src/bin/decode.rs b/evc/src/bin/decode.rs index bb76231..4ac4fc8 100644 --- a/evc/src/bin/decode.rs +++ b/evc/src/bin/decode.rs @@ -1,7 +1,8 @@ #![feature(box_patterns)] use anyhow::Context; use clap::Parser; -use evc::{ +use indicatif::ProgressBar; +use libreschmux::{ block::Block, codec::decode::{decode_block, DecodeConfig}, debug::draw_debug, @@ -39,8 +40,10 @@ fn main() -> anyhow::Result<()> { max_threads: args.jobs, }; + let progress_bar = ProgressBar::new(header.frame_count as u64); + let mut prev = Frame::new(size); - for i in 0.. { + for i in 0..header.frame_count { info!("decode frame {i}"); let block = Block::read(&mut input, size).context("reading encoded frame")?; @@ -48,6 +51,8 @@ fn main() -> anyhow::Result<()> { decode_block(&block, frame.view_mut(), prev.view(), &config); + progress_bar.inc(1); + if args.debug { let mut f2 = frame.clone(); draw_debug(&block, f2.view_mut()); diff --git a/evc/src/bin/encode.rs b/evc/src/bin/encode.rs index 135a0e8..e1f6730 100644 --- a/evc/src/bin/encode.rs +++ b/evc/src/bin/encode.rs @@ -1,9 +1,9 @@ use anyhow::Context; use clap::Parser; -use evc::{ +use indicatif::ProgressBar; +use libreschmux::{ codec::{ - compress::compress_block, - decode::decode_block, + decode::{decode_block, DecodeConfig}, encode::{encode_block, EncodeConfig, EncodeMode}, }, format::{header::Header, ser::Sink}, @@ -31,6 +31,9 @@ pub struct EncodeArgs { #[arg(long)] no_translate: bool, + #[arg[short = 'L', long]] + length: Option<usize>, + #[arg(short, long, default_value = "8")] jobs: usize, @@ -67,10 +70,12 @@ fn main() -> anyhow::Result<()> { output .put(Header { resolution: size, - frame_count: 0, + frame_count: args.length.unwrap_or(usize::MAX), }) .context("writing header")?; + let progress_bar = args.length.map(|len| ProgressBar::new(len as u64)); + let mut prev_frame = Frame::new(size); for i in 0.. { info!("encode frame {i}"); @@ -79,7 +84,7 @@ fn main() -> anyhow::Result<()> { let v1 = frame.view(); let v2 = prev_frame.view(); - let (error, mut root) = encode_block(v1, v2, &config); + let (error, root) = encode_block(v1, v2, &config); // compress_block( // &mut root, @@ -97,11 +102,15 @@ fn main() -> anyhow::Result<()> { error / frame.view().area() as f64 ); + if let Some(progress_bar) = &progress_bar { + progress_bar.inc(1); + } + decode_block( &root, frame.view_mut(), prev_frame.view(), - &evc::codec::decode::DecodeConfig { + &DecodeConfig { max_threads: config.max_threads, }, ); diff --git a/evc/src/bin/info.rs b/evc/src/bin/info.rs index 1e1472a..ebd8442 100644 --- a/evc/src/bin/info.rs +++ b/evc/src/bin/info.rs @@ -1,7 +1,6 @@ -use std::io::BufReader; - use anyhow::Context; -use evc::format::{header::Header, ser::Source}; +use libreschmux::format::{header::Header, ser::Source}; +use std::io::BufReader; fn main() { env_logger::init_from_env("LOG"); diff --git a/evc/src/block.rs b/evc/src/block.rs index 69cc460..d0f940b 100644 --- a/evc/src/block.rs +++ b/evc/src/block.rs @@ -59,7 +59,8 @@ impl Block { } pub fn read(source: &mut impl std::io::Read, size: Vec2<isize>) -> anyhow::Result<Self> { - Ok(match source.get::<u8>()? { + let variant = source.get::<u8>()?; + Ok(match variant { 0 => Block::Literal(Vec::read_const_size(source, size.area() as usize)?), 1 => Block::CompressedLiteral(Vec::read(source)?), 2 => Block::Split(Box::new({ diff --git a/evc/src/codec/decode.rs b/evc/src/codec/decode.rs index 087483c..bb2aadf 100644 --- a/evc/src/codec/decode.rs +++ b/evc/src/codec/decode.rs @@ -1,9 +1,8 @@ +use super::compress::lit_decompress; use crate::{ block::Block, frame::Frame, helpers::threading::both_par, refsampler::Sampler, view::View, }; -use super::compress::lit_decompress; - pub struct DecodeConfig { pub max_threads: usize, } diff --git a/evc/src/debug.rs b/evc/src/debug.rs index 96f5777..a7a9545 100644 --- a/evc/src/debug.rs +++ b/evc/src/debug.rs @@ -93,9 +93,6 @@ pub fn draw_debug(block: &Block, mut target: View<&mut Frame>) { transform(target.size.y_only().into()) + target.offset.into(), transform(target.size.into()) + target.offset.into(), ); - if tl.y != tr.y || tl.x != bl.x { - eprintln!("{tl:?} {tr:?} {bl:?} {br:?}"); - } target.draw_box(Pixel::CYAN); target.frame.draw_line(tl, tr, Pixel::MAGENTA); target.frame.draw_line(tr, br, Pixel::MAGENTA); |