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 75
|
// Ogg decoder and encoder written in Rust
//
// Copyright (c) 2018 est31 <MTest31@outlook.com>
// and contributors. All rights reserved.
// Licensed under MIT license, or Apache 2 license,
// at your option. Please see the LICENSE file
// attached to this source distribution for details.
extern crate ogg;
use std::env;
use ogg::{PacketReader, PacketWriter};
use ogg::writing::PacketWriteEndInfo;
use std::fs::File;
fn main() {
match run() {
Ok(_) =>(),
Err(err) => println!("Error: {}", err),
}
}
macro_rules! btry {
($e:expr) => {
match $e {
Ok(v) => v,
Err(e) => {
println!("Encountered Error: {:?}", e);
break;
},
}
};
}
fn run() -> Result<(), std::io::Error> {
let input_path = env::args().nth(1).expect("No arg for input path found. Please specify a file to open.");
let output_path = env::args().nth(2).expect("No arg for output path found. Please specify a file to save to.");
println!("Opening file: {}", input_path);
println!("Writing to: {}", output_path);
let mut f_i = File::open(input_path)?;
let mut f_o = File::create(output_path)?;
let mut pck_rdr = PacketReader::new(&mut f_i);
// This call doesn't discard anything as nothing has
// been stored yet, but it does set bits that
// make reading logic a bit more tolerant towards
// errors.
pck_rdr.delete_unread_packets();
let mut pck_wtr = PacketWriter::new(&mut f_o);
loop {
let r = btry!(pck_rdr.read_packet());
match r {
Some(pck) => {
let inf = if pck.last_in_stream() {
PacketWriteEndInfo::EndStream
} else if pck.last_in_page() {
PacketWriteEndInfo::EndPage
} else {
PacketWriteEndInfo::NormalPacket
};
let stream_serial = pck.stream_serial();
let absgp_page = pck.absgp_page();
btry!(pck_wtr.write_packet(pck.data,
stream_serial,
inf,
absgp_page));
},
// End of stream
None => break,
}
}
Ok(())
}
|