From f15f3836e13cc132ea67202a74cf85847ccccabb Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Wed, 25 Sep 2019 18:31:40 +0200 Subject: [PATCH] make natool write full-width chroma PGMYUV --- src/frmwriter.rs | 58 ++++++++++++++++++++++++++++++++++-------------- 1 file 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 = vec![0xFF; (w - w2 * 2) / 2]; + let pad: Vec = 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 { -- 2.30.2