diff options
Diffstat (limited to 'bv1/codec-web')
-rw-r--r-- | bv1/codec-web/Cargo.toml | 13 | ||||
-rw-r--r-- | bv1/codec-web/src/lib.rs | 60 | ||||
-rw-r--r-- | bv1/codec-web/web/.gitignore | 2 | ||||
-rw-r--r-- | bv1/codec-web/web/index.html | 14 | ||||
-rw-r--r-- | bv1/codec-web/web/main.ts | 69 |
5 files changed, 0 insertions, 158 deletions
diff --git a/bv1/codec-web/Cargo.toml b/bv1/codec-web/Cargo.toml deleted file mode 100644 index 7c1892c..0000000 --- a/bv1/codec-web/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "codec-web" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -bv1 = { path = "../codec" } -wasm-bindgen = "0.2.92" -js-sys = "0.3.69" -console_error_panic_hook = "0.1.7" diff --git a/bv1/codec-web/src/lib.rs b/bv1/codec-web/src/lib.rs deleted file mode 100644 index cb2ad3c..0000000 --- a/bv1/codec-web/src/lib.rs +++ /dev/null @@ -1,60 +0,0 @@ -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 -} diff --git a/bv1/codec-web/web/.gitignore b/bv1/codec-web/web/.gitignore deleted file mode 100644 index 93d7118..0000000 --- a/bv1/codec-web/web/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/codec_web* -/bundle* diff --git a/bv1/codec-web/web/index.html b/bv1/codec-web/web/index.html deleted file mode 100644 index b572671..0000000 --- a/bv1/codec-web/web/index.html +++ /dev/null @@ -1,14 +0,0 @@ -<!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> - <noscript>need js</noscript> - <p>loading…</p> - </body> -</html> diff --git a/bv1/codec-web/web/main.ts b/bv1/codec-web/web/main.ts deleted file mode 100644 index b1b1df7..0000000 --- a/bv1/codec-web/web/main.ts +++ /dev/null @@ -1,69 +0,0 @@ -/// <reference lib="dom" /> - -import init, { decode_frame, decode_init } from "./codec_web.js" -console.log("init wasm"); -await init() -console.log("done"); - -index("..") - -async function index(url: string) { - const res = await fetch(url) - if (!res.ok) throw new Error("not ok"); - document.body.innerHTML = await res.text(); - const h1 = document.createElement("h1") - h1.textContent = "bv1 web player" - document.body.prepend(h1) - document.body.querySelectorAll("a").forEach(e => { - const u = url + "/" + e.textContent - e.onclick = ev => { - ev.preventDefault() - if (!u.endsWith(".bv1")) return alert("thats not bv1!") - document.body.innerHTML = "" - play(u.toString()) - } - }) -} - -async function play(url: string) { - decode_init(1920, 1080) - document.body.innerText = "downloading…" - const res = await fetch(url) - if (!res.ok) throw new Error("not ok"); - let buf: Uint8Array | undefined = new Uint8Array(await res.arrayBuffer()) - document.body.innerText = "" - - const canvas = document.createElement("canvas") - canvas.width = 1920 - canvas.height = 1080 - document.body.append(canvas) - document.body.style.backgroundColor = "#111" - const ctx = canvas.getContext("2d")! - let debug = false; - - document.body.addEventListener("keydown", ev => { - if (ev.code == "KeyD") debug = !debug; - }) - - setInterval(() => { - const frame = decode_frame(buf ?? new Uint8Array(), debug); - buf = undefined - - const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); - const data = imageData.data; - - for (let y = 0; y < 1080; y++) { - for (let x = 0; x < 1920; x++) { - const ti = (x + y * 1920) * 4; - const si = (x + y * 1920) * 3; - data[ti + 0] = frame[si + 0] - data[ti + 1] = frame[si + 1] - data[ti + 2] = frame[si + 2] - data[ti + 3] = 255 - } - } - - ctx.putImageData(imageData, 0, 0); - - }, 1000 / 30) -} |