aboutsummaryrefslogtreecommitdiff
path: root/old/bv1/codec-web/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'old/bv1/codec-web/src/lib.rs')
-rw-r--r--old/bv1/codec-web/src/lib.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/old/bv1/codec-web/src/lib.rs b/old/bv1/codec-web/src/lib.rs
new file mode 100644
index 0000000..cb2ad3c
--- /dev/null
+++ b/old/bv1/codec-web/src/lib.rs
@@ -0,0 +1,60 @@
+use bv1::{Decoder, Frame, P2};
+use std::{collections::VecDeque, sync::RwLock};
+use wasm_bindgen::prelude::*;
+
+static DECODER: RwLock<Option<State>> = RwLock::new(None);
+
+struct State {
+ buffer: VecDeque<u8>,
+ 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<u8> {
+ let mut arr = Vec::new();
+ let mut g = DECODER.write().unwrap();
+ let state = g.as_mut().unwrap();
+ state.buffer.extend(buf.iter());
+
+ state
+ .decoder
+ .decode_frame(&mut state.buffer, &mut state.frame, debug)
+ .unwrap();
+
+ 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
+}