diff options
author | metamuffin <metamuffin@disroot.org> | 2025-05-05 15:09:54 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-05-05 15:09:54 +0200 |
commit | 306f96164784a8cbf405e72fa4364d6523366e95 (patch) | |
tree | 51717fc139871baa438aad806f4923669ae0896c /old/evc/src/refsampler.rs | |
parent | 9cc089e2d6e841879e430b01d2f3d92c8820523e (diff) | |
download | video-codec-experiments-306f96164784a8cbf405e72fa4364d6523366e95.tar video-codec-experiments-306f96164784a8cbf405e72fa4364d6523366e95.tar.bz2 video-codec-experiments-306f96164784a8cbf405e72fa4364d6523366e95.tar.zst |
old dir
Diffstat (limited to 'old/evc/src/refsampler.rs')
-rw-r--r-- | old/evc/src/refsampler.rs | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/old/evc/src/refsampler.rs b/old/evc/src/refsampler.rs new file mode 100644 index 0000000..8a8f44f --- /dev/null +++ b/old/evc/src/refsampler.rs @@ -0,0 +1,51 @@ +use crate::{ + block::AdvancedReference, + format::ser::map_scalar8, + frame::Frame, + helpers::{matrix::Mat2, pixel::Pixel, vector::Vec2}, + view::View, +}; + +#[derive(Debug, Clone)] +pub struct Sampler<'a> { + pub view: View<&'a Frame>, + pub halfsize: Vec2<f32>, + + pub translation: Vec2<f32>, + pub transform: Mat2<f32>, + + pub value_scale: f32, +} + +impl<'a> Sampler<'a> { + #[inline] + pub fn sample(&self, p: Vec2<f32>) -> Pixel { + self.view + .sample(self.translation + self.transform.transform(p - self.halfsize) + self.halfsize) + .scale(self.value_scale) + } + pub fn from_refblock( + view: View<&'a Frame>, + AdvancedReference { + translation, + transform, + value_scale, + }: &AdvancedReference, + ) -> Self { + Self { + transform: Mat2 { + a: map_scalar8(transform.a), + b: map_scalar8(transform.b), + c: map_scalar8(transform.c), + d: map_scalar8(transform.d), + }, + halfsize: Into::<Vec2<f32>>::into(view.size).scale(0.5), + translation: Vec2 { + x: map_scalar8(translation.x), + y: map_scalar8(translation.y), + }, + value_scale: 1.05f32.powf(*value_scale as f32), + view, + } + } +} |