X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-core%2Fsrc%2Fscale%2Frepack.rs;h=23ba2c93cb56801b562aeac71af5e55439f19d7d;hb=06480aad139b943f8fcef979b16af72036dd604a;hp=350ddf4b5a95a5adcbf328586a6f9995247ec4ca;hpb=6011e20199143f519881660144a4ca95ba77fd2d;p=nihav.git diff --git a/nihav-core/src/scale/repack.rs b/nihav-core/src/scale/repack.rs index 350ddf4..23ba2c9 100644 --- a/nihav-core/src/scale/repack.rs +++ b/nihav-core/src/scale/repack.rs @@ -34,7 +34,7 @@ impl PackKernel { impl Kernel for PackKernel { fn init(&mut self, in_fmt: &ScaleInfo, dest_fmt: &ScaleInfo) -> ScaleResult { - self.ncomps = in_fmt.fmt.components as usize; + 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(); @@ -61,7 +61,7 @@ impl Kernel for PackKernel { let ddata = dbuf.get_data_mut().unwrap(); for (src, dst) in sdata.chunks(istride).zip(ddata.chunks_mut(dstride)).take(h) { for x in 0..w { - dst[x * step + self.ooff[comp]] = convert_depth(src[x] as u32, self.depths[comp], self.osize[comp]) as u8; + dst[x * step + self.ooff[comp]] = convert_depth(u32::from(src[x]), self.depths[comp], self.osize[comp]) as u8; } } } @@ -80,7 +80,7 @@ impl Kernel for PackKernel { for x in 0..w { let mut elem: u32 = 0; for comp in 0..self.ncomps { - let c = src[ioff[comp] + x] as u32; + let c = u32::from(src[ioff[comp] + x]); elem |= convert_depth(c, self.depths[comp], self.osize[comp]) << self.shifts[comp]; } dst[x] = elem as u16; @@ -121,7 +121,7 @@ impl UnpackKernel { impl Kernel for UnpackKernel { fn init(&mut self, in_fmt: &ScaleInfo, dest_fmt: &ScaleInfo) -> ScaleResult { - self.ncomps = in_fmt.fmt.components as usize; + self.ncomps = in_fmt.fmt.components.min(dest_fmt.fmt.components) as usize; let mut chr: Vec> = Vec::with_capacity(MAX_CHROMATONS); for i in 0..self.ncomps { let ichr = in_fmt.fmt.comp_info[i].unwrap(); @@ -143,9 +143,9 @@ impl Kernel for UnpackKernel { 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; 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); } @@ -198,7 +198,7 @@ unimplemented!(); let dst = dbuf.get_data_mut().unwrap(); for src in sdata.chunks(istride).take(h) { for x in 0..w { - let elem = src[x] as u32; + let elem = u32::from(src[x]); for i in 0..self.ncomps { dst[offs[i] + x] = convert_depth((elem >> self.shifts[i]) & self.masks[i], self.depths[i], self.osize[i]) as u8; } @@ -252,9 +252,7 @@ impl Kernel for DepalKernel { } 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]); 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); } @@ -281,7 +279,7 @@ println!(" [intermediate format {}]", df); for x in 0..w { let palidx = src[x] as usize; for i in 0..self.ncomps { - let elem = pal[palidx * self.palstep + self.coffs[i]] as u32; + let elem = u32::from(pal[palidx * self.palstep + self.coffs[i]]); dst[offs[i] + x] = convert_depth(elem, self.depths[i], 8) as u8; } }