aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2019-11-27 15:03:07 +0100
committerKostya Shishkov <kostya.shishkov@gmail.com>2019-11-27 15:03:07 +0100
commit79ec1d51391cccce3c8ca2d4ea7e640cc78f0ee6 (patch)
tree9d4cbd849c68870380670db6d60d78d92d6e7feb
parentb33d38e0cb9907f59e2f354ac7a2ff015e5e978c (diff)
downloadnihav-79ec1d51391cccce3c8ca2d4ea7e640cc78f0ee6.tar.gz
core/scale: copy pictures with different strides too
-rw-r--r--nihav-core/src/scale/mod.rs35
1 files changed, 32 insertions, 3 deletions
diff --git a/nihav-core/src/scale/mod.rs b/nihav-core/src/scale/mod.rs
index d878c4c..13762bd 100644
--- a/nihav-core/src/scale/mod.rs
+++ b/nihav-core/src/scale/mod.rs
@@ -123,9 +123,38 @@ 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()) {
- let sdata = sbuf.get_data();
- let ddata = dbuf.get_data_mut().unwrap();
- ddata.copy_from_slice(&sdata[0..]);
+ let mut same = true;
+ let num_components = sbuf.get_info().get_format().get_num_comp();
+ for i in 0..num_components {
+ if sbuf.get_stride(i) != dbuf.get_stride(i) {
+ same = false;
+ break;
+ }
+ if sbuf.get_offset(i) != dbuf.get_offset(i) {
+ same = false;
+ break;
+ }
+ }
+ if same {
+ let sdata = sbuf.get_data();
+ let ddata = dbuf.get_data_mut().unwrap();
+ ddata.copy_from_slice(&sdata[0..]);
+ } else {
+ let sdata = sbuf.get_data();
+ for comp in 0..num_components {
+ let (_, h) = sbuf.get_dimensions(comp);
+ let src = &sdata[sbuf.get_offset(comp)..];
+ let sstride = sbuf.get_stride(comp);
+ let doff = dbuf.get_offset(comp);
+ let dstride = dbuf.get_stride(comp);
+ let ddata = dbuf.get_data_mut().unwrap();
+ 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]);
+ }
+ }
+ }
} else {
unimplemented!();
}