1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
extern crate nihav;
use nihav::frame::*;
use std::io::prelude::*;
use std::fs::File;
use std::cell::Ref;
pub fn write_pgmyuv(pfx: &str, strno: usize, num: u64, frm: Ref<NAFrame>) {
if let NABufferType::None = frm.get_buffer() { return; }
let name = format!("{}out{:02}_{:08}.pgm", pfx, strno, num);
let mut ofile = File::create(name).unwrap();
let buf = frm.get_buffer().get_vbuf().unwrap();
let (w, h) = buf.get_dimensions(0);
let (w2, h2) = buf.get_dimensions(1);
let tot_h = 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 mut idx = 0;
let mut idx2 = w;
let mut pad: Vec<u8> = Vec::with_capacity((w - w2 * 2) / 2);
pad.resize((w - w2 * 2) / 2, 0xFF);
for _ in 0..h {
let line = &dta[idx..idx2];
ofile.write_all(line).unwrap();
idx += ls;
idx2 += ls;
}
let mut base1 = buf.get_offset(1);
let stride1 = buf.get_stride(1);
let mut base2 = buf.get_offset(2);
let stride2 = buf.get_stride(2);
for _ in 0..h2 {
let bend1 = base1 + w2;
let line = &dta[base1..bend1];
ofile.write_all(line).unwrap();
ofile.write_all(pad.as_slice()).unwrap();
let bend2 = base2 + w2;
let line = &dta[base2..bend2];
ofile.write_all(line).unwrap();
ofile.write_all(pad.as_slice()).unwrap();
base1 += stride1;
base2 += stride2;
}
}
pub fn write_palppm(pfx: &str, strno: usize, num: u64, frm: Ref<NAFrame>) {
let name = format!("{}out{:02}_{:08}.ppm", pfx, strno, num);
let mut ofile = File::create(name).unwrap();
let buf = frm.get_buffer().get_vbuf().unwrap();
let (w, h) = buf.get_dimensions(0);
let paloff = buf.get_offset(1);
let hdr = format!("P6\n{} {}\n255\n", w, h);
ofile.write_all(hdr.as_bytes()).unwrap();
let dta = buf.get_data();
let ls = buf.get_stride(0);
let mut idx = 0;
let mut line: Vec<u8> = Vec::with_capacity(w * 3);
line.resize(w * 3, 0);
for _ in 0..h {
let src = &dta[idx..(idx+w)];
for x in 0..w {
let pix = src[x] as usize;
line[x * 3 + 0] = dta[paloff + pix * 3 + 2];
line[x * 3 + 1] = dta[paloff + pix * 3 + 1];
line[x * 3 + 2] = dta[paloff + pix * 3 + 0];
}
ofile.write_all(line.as_slice()).unwrap();
idx += ls;
}
}
|