aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2019-09-25 18:31:40 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2019-09-25 18:31:40 +0200
commitf15f3836e13cc132ea67202a74cf85847ccccabb (patch)
tree95b8e090cb2b20a92de0b5d83a9b51de4d7381c4
parent0a90d212b18560a8983170a9282451225fa5503c (diff)
downloadnihav-tool-f15f3836e13cc132ea67202a74cf85847ccccabb.tar.gz
make natool write full-width chroma PGMYUV
-rw-r--r--src/frmwriter.rs58
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 {