Skip to content

Commit

Permalink
fix(codecs): updated avif encoder to new api
Browse files Browse the repository at this point in the history
  • Loading branch information
SalOne22 committed Apr 11, 2024
1 parent 98728e0 commit d07193d
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 11 deletions.
27 changes: 23 additions & 4 deletions src/codecs/avif/encoder/mod.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
use ravif::Img;
use rgb::FromSlice;
use zune_core::{bit_depth::BitDepth, colorspace::ColorSpace};
use zune_core::{
bit_depth::BitDepth,
bytestream::{ZByteWriterTrait, ZWriter},
colorspace::ColorSpace,
};
use zune_image::{
codecs::ImageFormat,
errors::{ImageErrors, ImgEncodeErrors},
image::Image,
traits::EncoderTrait,
};

Expand Down Expand Up @@ -61,10 +66,16 @@ impl EncoderTrait for AvifEncoder {
"avif"
}

fn encode_inner(&mut self, image: &zune_image::image::Image) -> Result<Vec<u8>, ImageErrors> {
fn encode_inner<T: ZByteWriterTrait>(
&mut self,
image: &Image,
sink: T,
) -> Result<usize, ImageErrors> {
let (width, height) = image.dimensions();
let data = &image.flatten_to_u8()[0];

let mut writer = ZWriter::new(sink);

let encoder = ravif::Encoder::new()
.with_quality(self.options.quality)
.with_alpha_quality(self.options.alpha_quality.unwrap_or(self.options.quality))
Expand All @@ -79,15 +90,23 @@ impl EncoderTrait for AvifEncoder {
.encode_rgb(img)
.map_err(|e| ImgEncodeErrors::ImageEncodeErrors(e.to_string()))?;

Ok(result.avif_file)
writer.write(&result.avif_file).map_err(|e| {
ImageErrors::EncodeErrors(ImgEncodeErrors::ImageEncodeErrors(format!("{e:?}")))
})?;

Ok(writer.bytes_written())
}
ColorSpace::RGBA => {
let img = Img::new(data.as_slice().as_rgba(), width, height);
let result = encoder
.encode_rgba(img)
.map_err(|e| ImgEncodeErrors::ImageEncodeErrors(e.to_string()))?;

Ok(result.avif_file)
writer.write(&result.avif_file).map_err(|e| {
ImageErrors::EncodeErrors(ImgEncodeErrors::ImageEncodeErrors(format!("{e:?}")))
})?;

Ok(writer.bytes_written())
}
cs => Err(ImageErrors::EncodeErrors(
ImgEncodeErrors::UnsupportedColorspace(cs, self.supported_colorspaces()),
Expand Down
30 changes: 23 additions & 7 deletions src/codecs/avif/encoder/tests.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::io::Cursor;

use zune_core::colorspace::ColorSpace;

use crate::test_utils::*;
Expand All @@ -19,7 +21,9 @@ fn encode_colorspaces_u8() {

let mut encoder = AvifEncoder::new();

let result = encoder.encode(&image);
let buf = Cursor::new(vec![]);

let result = encoder.encode(&image, buf);

if result.is_err() {
dbg!(&result);
Expand Down Expand Up @@ -50,7 +54,9 @@ fn encode_colorspaces_u16() {

let mut encoder = AvifEncoder::new();

let result = encoder.encode(&image);
let buf = Cursor::new(vec![]);

let result = encoder.encode(&image, buf);

if result.is_err() {
dbg!(&result);
Expand Down Expand Up @@ -81,7 +87,9 @@ fn encode_colorspaces_f32() {

let mut encoder = AvifEncoder::new();

let result = encoder.encode(&image);
let buf = Cursor::new(vec![]);

let result = encoder.encode(&image, buf);

if result.is_err() {
dbg!(&result);
Expand All @@ -102,7 +110,9 @@ fn encode_u8() {
let image = create_test_image_u8(200, 200, ColorSpace::RGB);
let mut encoder = AvifEncoder::new();

let result = encoder.encode(&image);
let buf = Cursor::new(vec![]);

let result = encoder.encode(&image, buf);
dbg!(&result);

assert!(result.is_ok());
Expand All @@ -113,7 +123,9 @@ fn encode_u16() {
let image = create_test_image_u16(200, 200, ColorSpace::RGB);
let mut encoder = AvifEncoder::new();

let result = encoder.encode(&image);
let buf = Cursor::new(vec![]);

let result = encoder.encode(&image, buf);
dbg!(&result);

assert!(result.is_ok());
Expand All @@ -124,7 +136,9 @@ fn encode_f32() {
let image = create_test_image_f32(200, 200, ColorSpace::RGB);
let mut encoder = AvifEncoder::new();

let result = encoder.encode(&image);
let buf = Cursor::new(vec![]);

let result = encoder.encode(&image, buf);
dbg!(&result);

assert!(result.is_ok());
Expand All @@ -135,7 +149,9 @@ fn encode_animated() {
let image = create_test_image_animated(200, 200, ColorSpace::RGB);
let mut encoder = AvifEncoder::new();

let result = encoder.encode(&image);
let buf = Cursor::new(vec![]);

let result = encoder.encode(&image, buf);
dbg!(&result);

assert!(result.is_ok());
Expand Down

0 comments on commit d07193d

Please sign in to comment.