aboutsummaryrefslogtreecommitdiff
path: root/evc
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-01-04 22:48:02 +0100
committermetamuffin <metamuffin@disroot.org>2023-01-04 22:48:02 +0100
commit200f8064e1b1b96acc7d4a6f0f8321b2da5c2830 (patch)
treea0d5d76b1d6604be8eaab31d6e9eef0a01660e68 /evc
parent23d6c2d3b56145999c14596733853bc6de49eff3 (diff)
downloadvideo-codec-experiments-200f8064e1b1b96acc7d4a6f0f8321b2da5c2830.tar
video-codec-experiments-200f8064e1b1b96acc7d4a6f0f8321b2da5c2830.tar.bz2
video-codec-experiments-200f8064e1b1b96acc7d4a6f0f8321b2da5c2830.tar.zst
rename thing
Diffstat (limited to 'evc')
-rw-r--r--evc/Cargo.lock78
-rw-r--r--evc/Cargo.toml15
-rwxr-xr-xevc/scripts/bench_modes4
-rwxr-xr-xevc/scripts/bench_out6
-rwxr-xr-xevc/scripts/gen2
-rwxr-xr-xevc/scripts/report4
-rwxr-xr-xevc/scripts/stream4
-rwxr-xr-xevc/scripts/stream-nodebug4
-rw-r--r--evc/src/bin/decode.rs9
-rw-r--r--evc/src/bin/encode.rs21
-rw-r--r--evc/src/bin/info.rs5
-rw-r--r--evc/src/block.rs3
-rw-r--r--evc/src/codec/decode.rs3
-rw-r--r--evc/src/debug.rs3
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);