aboutsummaryrefslogtreecommitdiff
path: root/evc/src/bin
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-12-06 07:47:51 +0100
committermetamuffin <metamuffin@disroot.org>2022-12-06 07:47:51 +0100
commitbafb1df8b7764a0a62f1c656eb52fbe7bfd8b8ac (patch)
tree0e824b9f85ba80ca0082fc8d8ec8bf96bf411823 /evc/src/bin
parentcace782584d19674f70351f462e746d3d589ba90 (diff)
downloadvideo-codec-experiments-bafb1df8b7764a0a62f1c656eb52fbe7bfd8b8ac.tar
video-codec-experiments-bafb1df8b7764a0a62f1c656eb52fbe7bfd8b8ac.tar.bz2
video-codec-experiments-bafb1df8b7764a0a62f1c656eb52fbe7bfd8b8ac.tar.zst
decoder
Diffstat (limited to 'evc/src/bin')
-rw-r--r--evc/src/bin/decode.rs60
-rw-r--r--evc/src/bin/encode.rs13
2 files changed, 69 insertions, 4 deletions
diff --git a/evc/src/bin/decode.rs b/evc/src/bin/decode.rs
new file mode 100644
index 0000000..293181a
--- /dev/null
+++ b/evc/src/bin/decode.rs
@@ -0,0 +1,60 @@
+#![feature(box_patterns)]
+use std::io::{self, BufReader, BufWriter};
+
+use clap::Parser;
+use evc::{
+ block::{Block, BlockInner},
+ frame::Frame,
+ header::Header,
+ ser::Source,
+ view::View,
+};
+
+#[derive(Parser)]
+#[clap(about, version)]
+pub struct DecodeArgs {}
+
+fn main() -> io::Result<()> {
+ let _args = DecodeArgs::parse();
+
+ let mut input = BufReader::new(std::io::stdin());
+ let mut output = BufWriter::new(std::io::stdout());
+
+ let header = input.get::<Header>()?;
+ eprintln!("{header:?}");
+ let size = header.resolution;
+
+ let mut prev = Frame::new(size);
+ loop {
+ let block = Block::read(&mut input, size)?;
+ let mut frame = Frame::new(size);
+
+ blit_block(
+ &block,
+ frame.view_mut((0, 0), size),
+ prev.view((0, 0), size),
+ );
+
+ frame.write(&mut output)?;
+ prev = frame;
+ }
+}
+
+fn blit_block(block: &Block, mut target: View<&mut Frame>, prev: View<&Frame>) {
+ match &block.inner {
+ BlockInner::Literal(pixels) => {
+ for x in 0..block.size.0 {
+ for y in 0..block.size.1 {
+ target[(x, y)] = pixels[x + y * block.size.0]
+ }
+ }
+ }
+ BlockInner::Split(box [a, b]) => {
+ let [at, bt] = target.split_mut_unsafe();
+ let [ap, bp] = prev.split();
+ blit_block(a, at, ap);
+ blit_block(b, bt, bp);
+ }
+ BlockInner::Reference { translation: _ } => target.copy_from(&prev),
+ }
+}
diff --git a/evc/src/bin/encode.rs b/evc/src/bin/encode.rs
index 04b7c42..c426aba 100644
--- a/evc/src/bin/encode.rs
+++ b/evc/src/bin/encode.rs
@@ -2,6 +2,7 @@ use clap::Parser;
use evc::{
block::{Block, BlockInner},
frame::Frame,
+ header::Header,
ser::Sink,
view::View,
};
@@ -23,6 +24,10 @@ fn main() -> io::Result<()> {
let mut output = BufWriter::new(std::io::stdout());
let size = (args.width, args.height);
+ output.put(Header {
+ resolution: size,
+ frame_count: 0,
+ })?;
let mut prev_frame = Frame::new(size);
for i in 0.. {
@@ -41,10 +46,10 @@ fn main() -> io::Result<()> {
Ok(())
}
-fn encode_block(view: View, prev: View) -> Block {
- let diff = View::diff(&view, &prev);
-
- let inner = if diff < 10_000.0 {
+fn encode_block(view: View<&Frame>, prev: View<&Frame>) -> Block {
+ let diff = View::diff(&view, &prev) / view.area() as f64;
+ eprintln!("{:?} {diff}", view.size);
+ let inner = if diff < 0.5 {
BlockInner::Reference {
translation: (0, 0),
}