aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-01-24 02:16:03 +0100
committermetamuffin <metamuffin@disroot.org>2024-01-24 02:16:03 +0100
commit330cbef6f1953de3e1cbeb5aed03e951bc101965 (patch)
treefc4566dc27ac3d6487fbfe125166335324fd7d88
parent754ebf34cbb6280ef77421e1ca54d35d727dc6f7 (diff)
downloadvideo-codec-experiments-330cbef6f1953de3e1cbeb5aed03e951bc101965.tar
video-codec-experiments-330cbef6f1953de3e1cbeb5aed03e951bc101965.tar.bz2
video-codec-experiments-330cbef6f1953de3e1cbeb5aed03e951bc101965.tar.zst
fix it?
-rw-r--r--flowy/Cargo.toml3
-rw-r--r--flowy/src/main.rs17
-rw-r--r--flowy/src/motion/debug.wgsl12
-rw-r--r--flowy/src/motion/enc.rs4
-rw-r--r--flowy/src/motion/enc.wgsl17
-rw-r--r--flowy/src/motion/mod.rs43
6 files changed, 79 insertions, 17 deletions
diff --git a/flowy/Cargo.toml b/flowy/Cargo.toml
index c51d957..3c9696b 100644
--- a/flowy/Cargo.toml
+++ b/flowy/Cargo.toml
@@ -5,10 +5,9 @@ edition = "2021"
[dependencies]
wgpu = "0.18.0"
-bytemuck = "1.14.0"
+bytemuck = { version = "1.14.0", features = ["derive"] }
pollster = "0.3.0"
env_logger = "0.10.1"
log = "0.4.20"
oneshot = "0.1.6"
framework = { path = "../framework" }
-
diff --git a/flowy/src/main.rs b/flowy/src/main.rs
index 8529f2c..33ab4c9 100644
--- a/flowy/src/main.rs
+++ b/flowy/src/main.rs
@@ -1,6 +1,6 @@
pub mod motion;
-use framework::Framework;
+use framework::{CodecMode, Framework};
use log::{debug, info};
use motion::{dec::MotionDecoder, enc::MotionEncoder, CommonBuffers, Params};
use pollster::FutureExt;
@@ -100,18 +100,17 @@ fn main() {
framework.next_frame_manual();
debug!("upload");
- bufs.upload(&queue, &params, &rp, &buffer);
+ bufs.upload_texture(&queue, &params, &rp, &buffer);
debug!("compute");
-
let mut encoder = device.create_command_encoder(&Default::default());
- if i > 1 {
+ if let CodecMode::Encode = fparams.mode {
menc.pass(&mut encoder, &params, &rp);
- mdec.pass(&mut encoder, &params, &rp);
- if rp.debug {
- mdeb.pass(&mut encoder, &params, &rp);
- }
+ }
+ mdec.pass(&mut encoder, &params, &rp);
+ if rp.debug {
+ mdeb.pass(&mut encoder, &params, &rp);
}
if rp.preview {
bufs.prepare_texture_download(&mut encoder, &params, &rp);
@@ -121,7 +120,7 @@ fn main() {
device.poll(MaintainBase::Wait);
debug!("download");
- bufs.download(&device, &mut buffer);
+ bufs.download_texture(&device, &mut buffer);
framework.encode_done(&[]);
debug!("write");
diff --git a/flowy/src/motion/debug.wgsl b/flowy/src/motion/debug.wgsl
index 7da5c57..d2c56a4 100644
--- a/flowy/src/motion/debug.wgsl
+++ b/flowy/src/motion/debug.wgsl
@@ -29,6 +29,18 @@ struct BlockOffset {
textureStore(out, base, col);
}
}
+
+ // for (var x = 0; x < params.block_size.x; x++) {
+ // for (var y = 0; y < params.block_size.y; y++) {
+ // let base = uv + vec2(x, y);
+ // let col_dec = textureLoad(prev, base + bl.offset, 0) + vec4(bl.tint, 1.);
+ // let col_orig = textureLoad(next, base, 0);
+
+ // let col = vec4( saturate((0.5) + (col_orig.rgb - col_dec.rgb) * 100.), 1.0);
+
+ // textureStore(out, base, col);
+ // }
+ // }
}
diff --git a/flowy/src/motion/enc.rs b/flowy/src/motion/enc.rs
index d3e8a81..1a46aa6 100644
--- a/flowy/src/motion/enc.rs
+++ b/flowy/src/motion/enc.rs
@@ -37,8 +37,8 @@ impl MotionEncoder {
let uniform = EncoderUniform {
block_size: [params.block_width as i32, params.block_height as i32],
output_stride: (params.width / params.block_width) as u32,
- search_radius: 16,
- skip_threshold: 0.1,
+ search_radius: 24,
+ skip_threshold: 1.,
..Default::default()
};
diff --git a/flowy/src/motion/enc.wgsl b/flowy/src/motion/enc.wgsl
index 80618b7..ca3c769 100644
--- a/flowy/src/motion/enc.wgsl
+++ b/flowy/src/motion/enc.wgsl
@@ -30,16 +30,28 @@ var<private> best_tint: vec3<f32> = vec3(0.);
apply_tint(uv);
if best_error < params.skip_threshold { break; }
best_tint = vec3(0.);
+ best_error = 10000000.;
+ do_dist(uv, 64);
+ if best_error < params.skip_threshold { break; }
do_dist(uv, 32);
+ if best_error < params.skip_threshold { break; }
+ do_dist(uv, 24);
+ if best_error < params.skip_threshold { break; }
do_dist(uv, 16);
- do_dist(uv, 10);
+ if best_error < params.skip_threshold { break; }
+ do_dist(uv, 12);
+ if best_error < params.skip_threshold { break; }
do_dist(uv, 8);
if best_error < params.skip_threshold { break; }
do_dist(uv, 6);
- do_dist(uv, 3);
+ if best_error < params.skip_threshold { break; }
do_dist(uv, 4);
+ if best_error < params.skip_threshold { break; }
+ do_dist(uv, 3);
+ if best_error < params.skip_threshold { break; }
do_dist(uv, 2);
+ if best_error < params.skip_threshold { break; }
do_dist(uv, 1);
if best_error < params.skip_threshold { break; }
@@ -85,6 +97,7 @@ fn apply_tint(uv: vec2<i32>) {
}
}
if err < best_error {
+ best_error = err;
best_tint = tint;
}
}
diff --git a/flowy/src/motion/mod.rs b/flowy/src/motion/mod.rs
index cd53550..337290f 100644
--- a/flowy/src/motion/mod.rs
+++ b/flowy/src/motion/mod.rs
@@ -102,7 +102,7 @@ impl CommonBuffers {
}
}
- pub fn upload(&self, queue: &Queue, params: &Params, rp: &RoundParams, buffer: &[u8]) {
+ pub fn upload_texture(&self, queue: &Queue, params: &Params, rp: &RoundParams, buffer: &[u8]) {
queue.write_texture(
ImageCopyTexture {
aspect: wgpu::TextureAspect::All,
@@ -119,6 +119,23 @@ impl CommonBuffers {
params.extent,
);
}
+ // pub fn upload_offsets(&self, queue: &Queue, params: &Params, rp: &RoundParams, buffer: &[u8]) {
+ // queue.write_texture(
+ // ImageCopyTexture {
+ // aspect: wgpu::TextureAspect::All,
+ // mip_level: 0,
+ // origin: Origin3d::ZERO,
+ // texture: &self.textures[rp.swap],
+ // },
+ // buffer,
+ // wgpu::ImageDataLayout {
+ // offset: 0,
+ // bytes_per_row: Some(params.extent.width * 4),
+ // rows_per_image: Some(params.extent.height),
+ // },
+ // params.extent,
+ // );
+ // }
pub fn prepare_texture_download(
&self,
@@ -148,8 +165,30 @@ impl CommonBuffers {
params.extent,
);
}
+ pub fn prepare_offsets_download(&self, encoder: &mut CommandEncoder, params: &Params) {
+ encoder.copy_buffer_to_buffer(
+ &self.offsets,
+ 0,
+ self.offsets_download.as_ref().unwrap(),
+ 0,
+ (params.blocks * size_of::<BlockOffset>()) as u64,
+ );
+ }
+
+ pub fn download_offsets(&self, device: &Device, buffer: &mut [u8]) {
+ let buffer_slice = self.offsets_download.as_ref().unwrap().slice(..);
+ let (sender, receiver) = oneshot::channel();
+ buffer_slice.map_async(wgpu::MapMode::Read, move |r| sender.send(r).unwrap());
+ device.poll(wgpu::Maintain::Wait);
+ receiver.recv().unwrap().unwrap();
+ {
+ let view = buffer_slice.get_mapped_range();
+ buffer.copy_from_slice(&view[..]);
+ }
+ self.offsets_download.as_ref().unwrap().unmap();
+ }
- pub fn download(&self, device: &Device, buffer: &mut [u8]) {
+ pub fn download_texture(&self, device: &Device, buffer: &mut [u8]) {
let buffer_slice = self.texture_download.as_ref().unwrap().slice(..);
let (sender, receiver) = oneshot::channel();
buffer_slice.map_async(wgpu::MapMode::Read, move |r| sender.send(r).unwrap());