aboutsummaryrefslogtreecommitdiff
path: root/lvc/codec-web
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-03-09 22:01:20 +0100
committermetamuffin <metamuffin@disroot.org>2023-03-09 22:01:20 +0100
commit7494981595712cf42681823e8fd79977b9b5f9dc (patch)
tree7f85af24f4c1e56b6cf1c7baf6fe8a6cd798c7b3 /lvc/codec-web
parent11b78570656bd0ca67594472765fc629aa25fd25 (diff)
downloadvideo-codec-experiments-7494981595712cf42681823e8fd79977b9b5f9dc.tar
video-codec-experiments-7494981595712cf42681823e8fd79977b9b5f9dc.tar.bz2
video-codec-experiments-7494981595712cf42681823e8fd79977b9b5f9dc.tar.zst
web!
Diffstat (limited to 'lvc/codec-web')
-rw-r--r--lvc/codec-web/Cargo.toml13
-rw-r--r--lvc/codec-web/src/lib.rs64
-rw-r--r--lvc/codec-web/web/.gitignore2
-rw-r--r--lvc/codec-web/web/index.html11
-rw-r--r--lvc/codec-web/web/main.ts18
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);