X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-core%2Fsrc%2Fscale%2Fmod.rs;h=c11d8753dc60bad045d79c2ee4edf30c01ec1ad8;hb=2c031ed0963cfb3a37ba6c5d4b64d9bbc4250832;hp=a79232d3e96136d34bfcd2d62f9d6bb7c215cb94;hpb=213e9f9e88cb73c8b21fc61dbf3ddc65e1fb3924;p=nihav.git diff --git a/nihav-core/src/scale/mod.rs b/nihav-core/src/scale/mod.rs index a79232d..c11d875 100644 --- a/nihav-core/src/scale/mod.rs +++ b/nihav-core/src/scale/mod.rs @@ -159,6 +159,30 @@ fn check_format(in_fmt: NAVideoInfo, ref_fmt: &ScaleInfo, just_convert: bool) -> fn copy(pic_in: &NABufferType, pic_out: &mut NABufferType) { if let (Some(ref sbuf), Some(ref mut dbuf)) = (pic_in.get_vbuf(), pic_out.get_vbuf()) { + if sbuf.get_info().get_format().is_paletted() { + let same = sbuf.get_stride(0) == dbuf.get_stride(0) && sbuf.get_offset(1) == dbuf.get_offset(1); + if same { + let src = sbuf.get_data(); + let dst = dbuf.get_data_mut().unwrap(); + dst.copy_from_slice(src); + } else { + let (_, h) = sbuf.get_dimensions(0); + let soff = sbuf.get_offset(0); + let spoff = sbuf.get_offset(1); + let sstride = sbuf.get_stride(0); + let src = sbuf.get_data(); + let doff = dbuf.get_offset(0); + let dpoff = dbuf.get_offset(1); + let dstride = dbuf.get_stride(0); + let dst = dbuf.get_data_mut().unwrap(); + let copy_size = sstride.min(dstride); + for (dline, sline) in dst[doff..].chunks_exact_mut(dstride).take(h).zip(src[soff..].chunks_exact(sstride)) { + dline[..copy_size].copy_from_slice(&sline[..copy_size]); + } + dst[dpoff..].copy_from_slice(&src[spoff..]); + } + return; + } let mut same = true; let num_components = sbuf.get_info().get_format().get_num_comp(); for i in 0..num_components { @@ -187,7 +211,7 @@ fn copy(pic_in: &NABufferType, pic_out: &mut NABufferType) let dst = &mut ddata[doff..]; let copy_size = sstride.min(dstride); for (dline, sline) in dst.chunks_exact_mut(dstride).take(h).zip(src.chunks_exact(sstride)) { - (&mut dline[..copy_size]).copy_from_slice(&sline[..copy_size]); + dline[..copy_size].copy_from_slice(&sline[..copy_size]); } } } @@ -220,7 +244,7 @@ fn copy(pic_in: &NABufferType, pic_out: &mut NABufferType) let dst = &mut ddata[doff..]; let copy_size = sstride.min(dstride); for (dline, sline) in dst.chunks_exact_mut(dstride).take(h).zip(src.chunks_exact(sstride)) { - (&mut dline[..copy_size]).copy_from_slice(&sline[..copy_size]); + dline[..copy_size].copy_from_slice(&sline[..copy_size]); } } } @@ -363,8 +387,8 @@ fn swap_plane(data: &mut [T], stride: usize, h: usize, line0: &mut [T], for _ in 0..h/2 { line0.copy_from_slice(&data[doff0..][..stride]); line1.copy_from_slice(&data[doff1..][..stride]); - (&mut data[doff1..][..stride]).copy_from_slice(line0); - (&mut data[doff0..][..stride]).copy_from_slice(line1); + data[doff1..][..stride].copy_from_slice(line0); + data[doff0..][..stride].copy_from_slice(line1); doff0 += stride; doff1 -= stride; }