aboutsummaryrefslogtreecommitdiffstats
path: root/src/frmwriter.rs
blob: d4ea654f707d970e80fc2bec919709432c537d14 (plain) (blame)
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;
    }
}