diff options
Diffstat (limited to 'lvc/codec-web')
-rw-r--r-- | lvc/codec-web/Cargo.toml | 13 | ||||
-rw-r--r-- | lvc/codec-web/src/lib.rs | 64 | ||||
-rw-r--r-- | lvc/codec-web/web/.gitignore | 2 | ||||
-rw-r--r-- | lvc/codec-web/web/index.html | 11 | ||||
-rw-r--r-- | lvc/codec-web/web/main.ts | 18 |
5 files changed, 108 insertions, 0 deletions
diff --git a/lvc/codec-web/Cargo.toml b/lvc/codec-web/Cargo.toml new file mode 100644 index 0000000..f1a3f6a --- /dev/null +++ b/lvc/codec-web/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "codec-web" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +bv1 = { path = "../codec" } +wasm-bindgen = "0.2.84" +js-sys = "0.3.61" +console_error_panic_hook = "0.1.7" 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<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()); + 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 +} diff --git a/lvc/codec-web/web/.gitignore b/lvc/codec-web/web/.gitignore new file mode 100644 index 0000000..93d7118 --- /dev/null +++ b/lvc/codec-web/web/.gitignore @@ -0,0 +1,2 @@ +/codec_web* +/bundle* diff --git a/lvc/codec-web/web/index.html b/lvc/codec-web/web/index.html new file mode 100644 index 0000000..2580ed9 --- /dev/null +++ b/lvc/codec-web/web/index.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <meta http-equiv="X-UA-Compatible" content="IE=edge" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>bv1 web player</title> + <script defer async src="./bundle.js" type="module"></script> + </head> + <body></body> +</html> diff --git a/lvc/codec-web/web/main.ts b/lvc/codec-web/web/main.ts new file mode 100644 index 0000000..150e1c3 --- /dev/null +++ b/lvc/codec-web/web/main.ts @@ -0,0 +1,18 @@ +/// <reference lib="dom" /> + +import init, { decode_frame, decode_init } from "./codec_web.js" +console.log("init wasm"); +await init() +console.log("done"); + +decode_init(1920, 1080) + +const res = await fetch("/data/encoded") +if (!res.ok) throw new Error("not ok"); + +const buf = new Uint8Array(await res.arrayBuffer()) + +console.log("decode"); +const frame = decode_frame(buf.slice(0, 500000), true); +console.log("done"); +console.log(frame); |