aboutsummaryrefslogtreecommitdiff
path: root/evc/src/block.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-12-20 08:57:35 +0100
committermetamuffin <metamuffin@disroot.org>2022-12-20 08:57:35 +0100
commit4df7c1f1cbe0c3f79eec6be2474aead263f166c8 (patch)
treee9c46e76edf436464b31db4f339e6b2d294e95b1 /evc/src/block.rs
parenta7335ae0f8c04c8042f47a56f3845d2e5fc5c452 (diff)
downloadvideo-codec-experiments-4df7c1f1cbe0c3f79eec6be2474aead263f166c8.tar
video-codec-experiments-4df7c1f1cbe0c3f79eec6be2474aead263f166c8.tar.bz2
video-codec-experiments-4df7c1f1cbe0c3f79eec6be2474aead263f166c8.tar.zst
infra for compressed literal
Diffstat (limited to 'evc/src/block.rs')
-rw-r--r--evc/src/block.rs11
1 files changed, 7 insertions, 4 deletions
diff --git a/evc/src/block.rs b/evc/src/block.rs
index cbf69bf..69cc460 100644
--- a/evc/src/block.rs
+++ b/evc/src/block.rs
@@ -1,5 +1,5 @@
use crate::{
- format::ser::{ConstSizeSerExt, Sink, Small, Source},
+ format::ser::{ConstSizeSerExt, Ser, Sink, Small, Source},
helpers::vector::Vec2,
helpers::{matrix::Mat2, pixel::Pixel},
};
@@ -8,7 +8,7 @@ use anyhow::bail;
#[derive(Clone, Debug, PartialEq)]
pub enum Block {
Literal(Vec<Pixel>),
- CompressedLiteral(Vec<Pixel>),
+ CompressedLiteral(Vec<u8>),
Split(Box<[Block; 2]>),
Reference { translation: Vec2<isize> },
AdvancedReference(AdvancedReference),
@@ -32,7 +32,10 @@ impl Block {
sink.put(0u8)?;
pixels.write_const_size(sink, size.area() as usize)?;
}
- Block::CompressedLiteral(_) => bail!("compressed literal is not supported"),
+ Block::CompressedLiteral(data) => {
+ sink.put(1u8)?;
+ data.write(sink)?;
+ }
Block::Split(box [a, b]) => {
sink.put(2u8)?;
let [asize, bsize] = split_size(size);
@@ -58,7 +61,7 @@ impl Block {
pub fn read(source: &mut impl std::io::Read, size: Vec2<isize>) -> anyhow::Result<Self> {
Ok(match source.get::<u8>()? {
0 => Block::Literal(Vec::read_const_size(source, size.area() as usize)?),
- 1 => bail!("compressed literal is not supported"),
+ 1 => Block::CompressedLiteral(Vec::read(source)?),
2 => Block::Split(Box::new({
let [asize, bsize] = split_size(size);
let a = Block::read(source, asize)?;