use rusty_opus::repacketizer::{Repacketizer, pad_packet, parse_packet, unpad_packet};
use std::fs::File;
use std::io::{Read, Write};
fn main() {
let a: Vec<String> = std::env::args().collect();
let mut data = Vec::new();
File::open(&a[1]).unwrap().read_to_end(&mut data).unwrap();
let mut pkts: Vec<Vec<u8>> = Vec::new();
let mut pos = 0;
while pos + 8 <= data.len() {
let ln =
u32::from_be_bytes([data[pos], data[pos + 1], data[pos + 2], data[pos + 3]]) as usize;
pos += 8;
pkts.push(data[pos..pos + ln].to_vec());
pos += ln;
}
let mut pad_fail = 0;
for p in &pkts {
let mut q = p.clone();
pad_packet(&mut q, p.len() + 5).unwrap();
let back = unpad_packet(&q).unwrap();
let (_t0, f0, _) = parse_packet(p, false).unwrap();
let (_t1, f1, _) = parse_packet(&back, false).unwrap();
let fr0: Vec<&[u8]> = f0.iter().map(|&(o, l)| &p[o..o + l]).collect();
let fr1: Vec<&[u8]> = f1.iter().map(|&(o, l)| &back[o..o + l]).collect();
if fr0 != fr1 {
pad_fail += 1;
}
}
let mut merged = Vec::new();
let mut merge_fail = 0;
let mut i = 0;
while i + 1 < pkts.len() {
let mut rp = Repacketizer::new();
if rp.cat(&pkts[i]).is_err() || rp.cat(&pkts[i + 1]).is_err() {
i += 2;
continue;
}
match rp.out() {
Ok(m) => {
merged.push(m);
}
Err(_) => {
merge_fail += 1;
}
}
i += 2;
}
println!(
"packets={} pad/unpad_mismatches={pad_fail} merged={} merge_fail={merge_fail}",
pkts.len(),
merged.len()
);
let mut out = File::create(&a[2]).unwrap();
for m in &merged {
out.write_all(&(m.len() as u32).to_be_bytes()).unwrap();
out.write_all(&0u32.to_be_bytes()).unwrap();
out.write_all(m).unwrap();
}
}
#[global_allocator]
static RUSTY_ALLOC: rusty_alloc_api::RustyAlloc = rusty_alloc_api::RustyAlloc;