diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2019-09-25 18:31:40 +0200 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2019-09-25 18:31:40 +0200 |
commit | f15f3836e13cc132ea67202a74cf85847ccccabb (patch) | |
tree | 95b8e090cb2b20a92de0b5d83a9b51de4d7381c4 | |
parent | 0a90d212b18560a8983170a9282451225fa5503c (diff) | |
download | nihav-tool-f15f3836e13cc132ea67202a74cf85847ccccabb.tar.gz |
make natool write full-width chroma PGMYUV
-rw-r--r-- | src/frmwriter.rs | 58 |
1 files changed, 41 insertions, 17 deletions
diff --git a/src/frmwriter.rs b/src/frmwriter.rs index 53acdb9..6ae92bc 100644 --- a/src/frmwriter.rs +++ b/src/frmwriter.rs @@ -12,18 +12,20 @@ pub fn write_pgmyuv(pfx: &str, strno: usize, num: u64, frm: NAFrameRef) { let is_flipped = buf.get_info().is_flipped(); let (w, h) = buf.get_dimensions(0); let (w2, h2) = buf.get_dimensions(1); + let full_w = w2 * 2 > w; let has_alpha = buf.get_info().get_format().has_alpha(); - let tot_h; + let mut tot_h = h + h2; if has_alpha { - tot_h = h * 2 + h2; - } else { - tot_h = h + h2; + tot_h += h; + } + if full_w { + tot_h += h2; } let hdr = format!("P5\n{} {}\n255\n", w, tot_h); ofile.write_all(hdr.as_bytes()).unwrap(); let dta = buf.get_data(); let ls = buf.get_stride(0); - let pad: Vec<u8> = vec![0xFF; (w - w2 * 2) / 2]; + let pad: Vec<u8> = vec![0xFF; if !full_w { (w - w2 * 2) / 2 } else { w - w2 } ]; if !is_flipped { let ylines = dta.chunks(ls).take(h); for line in ylines { @@ -41,21 +43,43 @@ pub fn write_pgmyuv(pfx: &str, strno: usize, num: u64, frm: NAFrameRef) { let stride2 = buf.get_stride(2); let u = &dta[base1..][..h2*stride1]; let v = &dta[base2..][..h2*stride2]; - if !is_flipped { - for (uline, vline) in u.chunks(stride1).zip(v.chunks(stride2)) { - ofile.write_all(&uline[..w2]).unwrap(); - ofile.write_all(pad.as_slice()).unwrap(); + if !full_w { + if !is_flipped { + for (uline, vline) in u.chunks(stride1).zip(v.chunks(stride2)) { + ofile.write_all(&uline[..w2]).unwrap(); + ofile.write_all(pad.as_slice()).unwrap(); - ofile.write_all(&vline[..w2]).unwrap(); - ofile.write_all(pad.as_slice()).unwrap(); + ofile.write_all(&vline[..w2]).unwrap(); + ofile.write_all(pad.as_slice()).unwrap(); + } + } else { + for (uline, vline) in u.chunks(stride1).rev().zip(v.chunks(stride2).rev()) { + ofile.write_all(&uline[..w2]).unwrap(); + ofile.write_all(pad.as_slice()).unwrap(); + + ofile.write_all(&vline[..w2]).unwrap(); + ofile.write_all(pad.as_slice()).unwrap(); + } } } else { - for (uline, vline) in u.chunks(stride1).rev().zip(v.chunks(stride2).rev()) { - ofile.write_all(&uline[..w2]).unwrap(); - ofile.write_all(pad.as_slice()).unwrap(); - - ofile.write_all(&vline[..w2]).unwrap(); - ofile.write_all(pad.as_slice()).unwrap(); + if !is_flipped { + for uline in u.chunks(stride1) { + ofile.write_all(&uline[..w2]).unwrap(); + ofile.write_all(pad.as_slice()).unwrap(); + } + for vline in v.chunks(stride2) { + ofile.write_all(&vline[..w2]).unwrap(); + ofile.write_all(pad.as_slice()).unwrap(); + } + } else { + for uline in u.chunks(stride1).rev() { + ofile.write_all(&uline[..w2]).unwrap(); + ofile.write_all(pad.as_slice()).unwrap(); + } + for vline in v.chunks(stride2).rev() { + ofile.write_all(&vline[..w2]).unwrap(); + ofile.write_all(pad.as_slice()).unwrap(); + } } } if has_alpha { |