]>
Commit | Line | Data |
---|---|---|
1 | use super::*; | |
2 | use super::kernel::Kernel; | |
3 | ||
4 | struct NNResampler {} | |
5 | ||
6 | impl NNResampler { | |
7 | fn new() -> Self { Self{} } | |
8 | } | |
9 | ||
10 | macro_rules! scale_loop { | |
11 | ($sbuf:expr, $dbuf:expr) => { | |
12 | let fmt = $sbuf.get_info().get_format(); | |
13 | let ncomp = fmt.get_num_comp(); | |
14 | for comp in 0..ncomp { | |
15 | let istride = $sbuf.get_stride(comp); | |
16 | let dstride = $dbuf.get_stride(comp); | |
17 | let (sw, sh) = $sbuf.get_dimensions(comp); | |
18 | let (dw, dh) = $dbuf.get_dimensions(comp); | |
19 | let ioff = $sbuf.get_offset(comp); | |
20 | let mut doff = $dbuf.get_offset(comp); | |
21 | let src = $sbuf.get_data(); | |
22 | let dst = $dbuf.get_data_mut().unwrap(); | |
23 | for y in 0..dh { | |
24 | let sy = y * sh / dh; | |
25 | let soff = ioff + sy * istride; | |
26 | for x in 0..dw { | |
27 | let sx = x * sw / dw; | |
28 | dst[doff + x] = src[soff + sx]; | |
29 | } | |
30 | doff += dstride; | |
31 | } | |
32 | } | |
33 | }; | |
34 | } | |
35 | ||
36 | impl Kernel for NNResampler { | |
37 | fn init(&mut self, in_fmt: &ScaleInfo, dest_fmt: &ScaleInfo) -> ScaleResult<NABufferType> { | |
38 | let res = alloc_video_buffer(NAVideoInfo::new(dest_fmt.width, dest_fmt.height, false, in_fmt.fmt), 3); | |
39 | if res.is_err() { return Err(ScaleError::AllocError); } | |
40 | Ok(res.unwrap()) | |
41 | } | |
42 | fn process(&mut self, pic_in: &NABufferType, pic_out: &mut NABufferType) { | |
43 | if let (Some(ref sbuf), Some(ref mut dbuf)) = (pic_in.get_vbuf(), pic_out.get_vbuf()) { | |
44 | scale_loop!(sbuf, dbuf); | |
45 | } else if let (Some(ref sbuf), Some(ref mut dbuf)) = (pic_in.get_vbuf16(), pic_out.get_vbuf16()) { | |
46 | scale_loop!(sbuf, dbuf); | |
47 | } else if let (Some(ref sbuf), Some(ref mut dbuf)) = (pic_in.get_vbuf32(), pic_out.get_vbuf32()) { | |
48 | scale_loop!(sbuf, dbuf); | |
49 | } else { | |
50 | unreachable!(); | |
51 | } | |
52 | } | |
53 | } | |
54 | ||
55 | pub fn create_scale() -> Box<dyn Kernel> { | |
56 | Box::new(NNResampler::new()) | |
57 | } | |
58 |