From e3de2f9d27a44fd329f2b4532153e9d16dd76219 Mon Sep 17 00:00:00 2001 From: haixuantao Date: Sun, 6 Apr 2025 14:50:48 +0200 Subject: [PATCH] Add support for rgb8 --- node-hub/dora-rav1e/src/main.rs | 56 ++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/node-hub/dora-rav1e/src/main.rs b/node-hub/dora-rav1e/src/main.rs index 91e37973..076bee23 100644 --- a/node-hub/dora-rav1e/src/main.rs +++ b/node-hub/dora-rav1e/src/main.rs @@ -280,7 +280,61 @@ fn main() -> Result<()> { }, } } else if encoding == "rgb8" { - unimplemented!("We haven't worked on additional encodings."); + let buffer: &UInt8Array = data.as_any().downcast_ref().unwrap(); + let buffer: Vec = buffer.values().to_vec(); + let buffer: Vec = + buffer.chunks(3).flat_map(|x| [x[2], x[1], x[0]]).collect(); + let (y, u, v) = bgr8_to_yuv420(buffer, width, height); + + // Transpose values from BGR to RGB + + let mut ctx: Context = cfg.new_context().unwrap(); + let mut f = ctx.new_frame(); + + let xdec = f.planes[0].cfg.xdec; + let stride = (width + xdec) >> xdec; + f.planes[0].copy_from_raw_u8(&y, stride, 1); + let xdec = f.planes[1].cfg.xdec; + let stride = (width + xdec) >> xdec; + f.planes[1].copy_from_raw_u8(&u, stride, 1); + let xdec = f.planes[2].cfg.xdec; + let stride = (width + xdec) >> xdec; + f.planes[2].copy_from_raw_u8(&v, stride, 1); + + match ctx.send_frame(f) { + Ok(_) => {} + Err(e) => match e { + EncoderStatus::EnoughData => { + warn!("Unable to send frame "); + continue; + } + _ => { + warn!("Unable to send frame "); + continue; + } + }, + } + metadata + .parameters + .insert("encoding".to_string(), Parameter::String("av1".to_string())); + ctx.flush(); + match ctx.receive_packet() { + Ok(pkt) => { + let data = pkt.data; + let arrow = data.into_arrow(); + node.send_output(id, metadata.parameters, arrow) + .context("could not send output") + .unwrap(); + } + Err(e) => match e { + EncoderStatus::LimitReached => {} + EncoderStatus::Encoded => {} + EncoderStatus::NeedMoreData => {} + _ => { + panic!("Unable to receive packet",); + } + }, + } } else { unimplemented!("We haven't worked on additional encodings."); }