diff options
author | metamuffin <metamuffin@disroot.org> | 2022-12-20 08:57:35 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-12-20 08:57:35 +0100 |
commit | 4df7c1f1cbe0c3f79eec6be2474aead263f166c8 (patch) | |
tree | e9c46e76edf436464b31db4f339e6b2d294e95b1 /evc/src/block.rs | |
parent | a7335ae0f8c04c8042f47a56f3845d2e5fc5c452 (diff) | |
download | video-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.rs | 11 |
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)?; |