From 7494981595712cf42681823e8fd79977b9b5f9dc Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 9 Mar 2023 22:01:20 +0100 Subject: web! --- lvc/codec-web/src/lib.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 lvc/codec-web/src/lib.rs (limited to 'lvc/codec-web/src/lib.rs') diff --git a/lvc/codec-web/src/lib.rs b/lvc/codec-web/src/lib.rs new file mode 100644 index 0000000..c26da29 --- /dev/null +++ b/lvc/codec-web/src/lib.rs @@ -0,0 +1,64 @@ +use bv1::{Decoder, Frame, P2}; +use std::{collections::VecDeque, sync::RwLock}; +use wasm_bindgen::prelude::*; + +static DECODER: RwLock> = RwLock::new(None); + +struct State { + buffer: VecDeque, + frame: Frame, + decoder: Decoder, +} + +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen(js_namespace = console)] + fn log(s: &str); + #[wasm_bindgen(js_namespace = console, js_name = "log")] + fn logs(s: String); +} + +#[wasm_bindgen(start)] +fn panic_init() { + std::panic::set_hook(Box::new(console_error_panic_hook::hook)); +} + +#[wasm_bindgen] +pub fn decode_init(width: i32, height: i32) { + let size = P2 { + x: width, + y: height, + }; + *DECODER.write().unwrap() = Some(State { + frame: Frame::new(size), + decoder: Decoder::new(size), + buffer: VecDeque::new(), + }); +} + +#[wasm_bindgen] +pub fn decode_frame(buf: &[u8], debug: bool) -> Vec { + let mut arr = Vec::new(); + let mut g = DECODER.write().unwrap(); + let state = g.as_mut().unwrap(); + state.buffer.extend(buf.iter()); + log("d"); + logs(format!("{}", state.buffer.len())); + + log("a"); + state + .decoder + .decode_frame(&mut state.buffer, &mut state.frame, debug) + .unwrap(); + log("b"); + + for y in 0..state.frame.size.y { + for x in 0..state.frame.size.x { + arr.push(state.frame[P2 { x, y }].r.clamp(0, 255) as u8); + arr.push(state.frame[P2 { x, y }].g.clamp(0, 255) as u8); + arr.push(state.frame[P2 { x, y }].b.clamp(0, 255) as u8); + } + } + + arr +} -- cgit v1.2.3-70-g09d2