}
impl Kernel for PackKernel {
- fn init(&mut self, in_fmt: &ScaleInfo, dest_fmt: &ScaleInfo) -> ScaleResult<NABufferType> {
- self.ncomps = in_fmt.fmt.components as usize;
+ fn init(&mut self, in_fmt: &ScaleInfo, dest_fmt: &ScaleInfo, _options: &[(String, String)]) -> ScaleResult<NABufferType> {
+ self.ncomps = in_fmt.fmt.components.min(dest_fmt.fmt.components) as usize;
for i in 0..self.ncomps {
let ichr = in_fmt.fmt.comp_info[i].unwrap();
let ochr = dest_fmt.fmt.comp_info[i].unwrap();
}
impl Kernel for UnpackKernel {
- fn init(&mut self, in_fmt: &ScaleInfo, dest_fmt: &ScaleInfo) -> ScaleResult<NABufferType> {
- self.ncomps = in_fmt.fmt.components as usize;
+ fn init(&mut self, in_fmt: &ScaleInfo, dest_fmt: &ScaleInfo, options: &[(String, String)]) -> ScaleResult<NABufferType> {
+ let mut debug = false;
+ for (name, value) in options.iter() {
+ match (name.as_str(), value.as_str()) {
+ ("debug", "") => { debug = true; },
+ ("debug", "true") => { debug = true; },
+ _ => {},
+ }
+ }
+
+ self.ncomps = in_fmt.fmt.components.min(dest_fmt.fmt.components) as usize;
let mut chr: Vec<Option<NAPixelChromaton>> = Vec::with_capacity(MAX_CHROMATONS);
for i in 0..self.ncomps {
let ichr = in_fmt.fmt.comp_info[i].unwrap();
chr.push(Some(dchr));
}
let mut df = in_fmt.fmt;
- for i in 0..self.ncomps {
- df.comp_info[i] = chr[i];
+ df.comp_info[..self.ncomps].clone_from_slice(&chr[..self.ncomps]);
+ df.components = self.ncomps as u8;
+ df.palette = false;
+ if debug {
+ println!(" [intermediate format {}]", df);
}
-println!(" [intermediate format {}]", df);
let res = alloc_video_buffer(NAVideoInfo::new(in_fmt.width, in_fmt.height, false, df), 3);
if res.is_err() { return Err(ScaleError::AllocError); }
Ok(res.unwrap())
}
fn process(&mut self, pic_in: &NABufferType, pic_out: &mut NABufferType) {
if let Some(ref buf) = pic_in.get_vbuf() {
- let step = buf.get_info().get_format().get_chromaton(0).unwrap().get_step() as usize;
+ let step = buf.get_info().get_format().elem_size as usize;
let mut soff: [usize; MAX_CHROMATONS] = [0; MAX_CHROMATONS];
for i in 0..self.ncomps {
soff[i] = buf.get_info().get_format().get_chromaton(i).unwrap().get_offset() as usize;
let istride = buf.get_stride(0);
let sdata1 = buf.get_data();
let sdata = &sdata1[ioff..];
+ let ychr = buf.get_info().get_format().get_chromaton(0).unwrap();
if let Some(ref mut dbuf) = pic_out.get_vbuf() {
let mut ostride: [usize; MAX_CHROMATONS] = [0; MAX_CHROMATONS];
let mut offs: [usize; MAX_CHROMATONS] = [0; MAX_CHROMATONS];
offs[i] = dbuf.get_offset(i);
}
let dst = dbuf.get_data_mut().unwrap();
- for src in sdata.chunks(istride).take(h) {
- for x in 0..w {
- for i in 0..self.ncomps {
- dst[offs[i] + x] = src[x * step + soff[i]];
+ if ychr.next_elem == 0 || usize::from(ychr.next_elem) == step {
+ for src in sdata.chunks(istride).take(h) {
+ for x in 0..w {
+ for i in 0..self.ncomps {
+ dst[offs[i] + x] = src[x * step + soff[i]];
+ }
}
+ for i in 0..self.ncomps { offs[i] += ostride[i]; }
+ }
+ } else {
+ let mut steps: [usize; MAX_CHROMATONS] = [0; MAX_CHROMATONS];
+ for i in 0..self.ncomps {
+ steps[i] = buf.get_info().get_format().get_chromaton(i).unwrap().next_elem as usize;
+ }
+
+ for src in sdata.chunks(istride).take(h) {
+ let mut x = offs;
+ for piece in src.chunks(step) {
+ for i in 0..self.ncomps {
+ let mut co = soff[i];
+ while co < step {
+ dst[x[i]] = piece[co];
+ x[i] += 1;
+ co += steps[i];
+ }
+ }
+ }
+ for i in 0..self.ncomps { offs[i] += ostride[i]; }
}
- for i in 0..self.ncomps { offs[i] += ostride[i]; }
}
} else {
unimplemented!();
}
impl Kernel for DepalKernel {
- fn init(&mut self, in_fmt: &ScaleInfo, _dest_fmt: &ScaleInfo) -> ScaleResult<NABufferType> {
+ fn init(&mut self, in_fmt: &ScaleInfo, _dest_fmt: &ScaleInfo, options: &[(String, String)]) -> ScaleResult<NABufferType> {
+ let mut debug = false;
+ for (name, value) in options.iter() {
+ match (name.as_str(), value.as_str()) {
+ ("debug", "") => { debug = true; },
+ ("debug", "true") => { debug = true; },
+ _ => {},
+ }
+ }
+
//todo select output more fitting for dest_fmt if possible
self.ncomps = in_fmt.fmt.components as usize;
let mut chr: Vec<Option<NAPixelChromaton>> = Vec::with_capacity(MAX_CHROMATONS);
}
let mut df = in_fmt.fmt;
df.palette = false;
- for i in 0..self.ncomps {
- df.comp_info[i] = chr[i];
+ df.comp_info[..self.ncomps].clone_from_slice(&chr[..self.ncomps]);
+ if debug {
+ println!(" [intermediate format {}]", df);
}
-println!(" [intermediate format {}]", df);
let res = alloc_video_buffer(NAVideoInfo::new(in_fmt.width, in_fmt.height, false, df), 3);
if res.is_err() { return Err(ScaleError::AllocError); }
Ok(res.unwrap())