#![allow(dead_code)]
use std::path::Path;
pub mod corpus;
pub mod report;
pub use musefs_format::fuzz_check::fixtures::{
flac_block, make_flac, streaminfo_body, vorbis_comment_body,
};
pub fn real_mtime(p: &std::path::Path) -> i64 {
std::fs::metadata(p)
.unwrap()
.modified()
.unwrap()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs()
.cast_signed()
}
pub fn real_mtime_ns(p: &std::path::Path) -> i64 {
use std::os::unix::fs::MetadataExt;
let meta = std::fs::metadata(p).unwrap();
meta.mtime() * 1_000_000_000 + meta.mtime_nsec()
}
pub fn real_ctime_ns(p: &std::path::Path) -> i64 {
use std::os::unix::fs::MetadataExt;
let meta = std::fs::metadata(p).unwrap();
meta.ctime() * 1_000_000_000 + meta.ctime_nsec()
}
pub fn write_flac(path: &Path, comments: &[&str], audio: &[u8]) -> (u64, u64) {
let si = streaminfo_body();
let vc = vorbis_comment_body("orig", comments);
let bytes = make_flac(&[(0, si), (4, vc)], audio);
let audio_offset = (bytes.len() - audio.len()) as u64;
std::fs::write(path, &bytes).unwrap();
(audio_offset, audio.len() as u64)
}
pub fn write_mp3(path: &Path, audio: &[u8]) -> (u64, u64) {
let mut bytes = Vec::new();
bytes.extend_from_slice(b"ID3");
bytes.extend_from_slice(&[0x04, 0x00, 0x00]); bytes.extend_from_slice(&[0x00, 0x00, 0x00, 0x00]); let audio_offset = bytes.len() as u64;
bytes.extend_from_slice(audio);
std::fs::write(path, &bytes).unwrap();
(audio_offset, audio.len() as u64)
}
pub fn write_m4a(path: &Path, audio: &[u8]) -> (u64, u64) {
let bytes = minimal_m4a(audio);
let audio_offset = (bytes.len() - audio.len()) as u64;
std::fs::write(path, &bytes).unwrap();
(audio_offset, audio.len() as u64)
}
pub fn write_wav(path: &Path, audio: &[u8]) -> (u64, u64) {
let mut fmt = Vec::new();
fmt.extend_from_slice(&1u16.to_le_bytes()); fmt.extend_from_slice(&1u16.to_le_bytes()); fmt.extend_from_slice(&44_100u32.to_le_bytes()); fmt.extend_from_slice(&88_200u32.to_le_bytes()); fmt.extend_from_slice(&2u16.to_le_bytes()); fmt.extend_from_slice(&16u16.to_le_bytes());
let mut body = Vec::new();
for (id, payload) in [(&b"fmt "[..], &fmt[..]), (&b"data"[..], audio)] {
body.extend_from_slice(id);
body.extend_from_slice(&u32::try_from(payload.len()).unwrap().to_le_bytes());
body.extend_from_slice(payload);
}
let mut bytes = b"RIFF".to_vec();
bytes.extend_from_slice(&u32::try_from(body.len() + 4).unwrap().to_le_bytes());
bytes.extend_from_slice(b"WAVE");
bytes.extend_from_slice(&body);
let audio_offset = (bytes.len() - audio.len()) as u64;
std::fs::write(path, &bytes).unwrap();
(audio_offset, audio.len() as u64)
}
fn bx(kind: &[u8; 4], payload: &[u8]) -> Vec<u8> {
let mut v = u32::try_from(8 + payload.len())
.unwrap()
.to_be_bytes()
.to_vec();
v.extend_from_slice(kind);
v.extend_from_slice(payload);
v
}
fn m4a_data_atom(type_code: u32, value: &[u8]) -> Vec<u8> {
let mut p = type_code.to_be_bytes().to_vec();
p.extend_from_slice(&0u32.to_be_bytes()); p.extend_from_slice(value);
bx(b"data", &p)
}
pub fn minimal_m4a(mdat_payload: &[u8]) -> Vec<u8> {
let ilst_atoms = [
bx(b"\xa9nam", &m4a_data_atom(1, b"Orig M4A")),
bx(b"\xa9ART", &m4a_data_atom(1, b"Orig Artist")),
]
.concat();
let ilst = bx(b"ilst", &ilst_atoms);
let mut meta_hdlr = vec![0u8; 8];
meta_hdlr.extend_from_slice(b"mdir");
meta_hdlr.extend_from_slice(b"appl");
meta_hdlr.extend_from_slice(&[0u8; 9]);
let mut meta = vec![0u8; 4]; meta.extend(bx(b"hdlr", &meta_hdlr));
meta.extend(ilst);
let udta = bx(b"udta", &bx(b"meta", &meta));
let mut soun_hdlr = vec![0u8; 8];
soun_hdlr.extend_from_slice(b"soun");
soun_hdlr.extend_from_slice(&[0u8; 12]);
let mut stco = vec![0u8; 4];
stco.extend_from_slice(&1u32.to_be_bytes());
stco.extend_from_slice(&0u32.to_be_bytes());
let minf = bx(b"minf", &bx(b"stbl", &bx(b"stco", &stco)));
let trak = bx(
b"trak",
&bx(b"mdia", &[bx(b"hdlr", &soun_hdlr), minf].concat()),
);
let moov = bx(b"moov", &[bx(b"mvhd", &[0u8; 8]), trak, udta].concat());
let ftyp = bx(b"ftyp", b"M4A isom");
let mdat = bx(b"mdat", mdat_payload);
let mut out = [ftyp, moov, mdat].concat();
let mdat_payload_offset = u32::try_from(out.len() - mdat_payload.len()).unwrap();
let stco = out
.windows(4)
.position(|w| w == b"stco")
.expect("stco present");
let entry = stco + 4 + 4 + 4; out[entry..entry + 4].copy_from_slice(&mdat_payload_offset.to_be_bytes());
out
}
pub fn minimal_m4a_moov_last(mdat_payload: &[u8]) -> Vec<u8> {
let ilst_atoms = [
bx(b"\xa9nam", &m4a_data_atom(1, b"Orig M4A")),
bx(b"\xa9ART", &m4a_data_atom(1, b"Orig Artist")),
]
.concat();
let ilst = bx(b"ilst", &ilst_atoms);
let mut meta_hdlr = vec![0u8; 8];
meta_hdlr.extend_from_slice(b"mdir");
meta_hdlr.extend_from_slice(b"appl");
meta_hdlr.extend_from_slice(&[0u8; 9]);
let mut meta = vec![0u8; 4]; meta.extend(bx(b"hdlr", &meta_hdlr));
meta.extend(ilst);
let udta = bx(b"udta", &bx(b"meta", &meta));
let mut soun_hdlr = vec![0u8; 8];
soun_hdlr.extend_from_slice(b"soun");
soun_hdlr.extend_from_slice(&[0u8; 12]);
let mut stco = vec![0u8; 4];
stco.extend_from_slice(&1u32.to_be_bytes());
stco.extend_from_slice(&0u32.to_be_bytes());
let minf = bx(b"minf", &bx(b"stbl", &bx(b"stco", &stco)));
let trak = bx(
b"trak",
&bx(b"mdia", &[bx(b"hdlr", &soun_hdlr), minf].concat()),
);
let moov = bx(b"moov", &[bx(b"mvhd", &[0u8; 8]), trak, udta].concat());
let ftyp = bx(b"ftyp", b"M4A isom");
let mdat = bx(b"mdat", mdat_payload);
let moov_start = ftyp.len() + mdat.len();
let mut out = [ftyp, mdat, moov].concat();
let mdat_payload_offset = u32::try_from(8 + b"M4A isom".len() + 8).unwrap();
let stco_pos = moov_start
+ out[moov_start..]
.windows(4)
.position(|w| w == b"stco")
.expect("stco present");
let entry = stco_pos + 4 + 4 + 4; out[entry..entry + 4].copy_from_slice(&mdat_payload_offset.to_be_bytes());
out
}
pub fn write_m4a_moov_last(path: &Path, audio: &[u8]) -> (u64, u64) {
let bytes = minimal_m4a_moov_last(audio);
let audio_offset = (8 + b"M4A isom".len() + 8) as u64;
std::fs::write(path, &bytes).unwrap();
(audio_offset, audio.len() as u64)
}
pub fn write_ogg(path: &Path, audio: &[u8]) -> (u64, u64) {
use musefs_format::ogg::page_test_support::{
build_header_pub, lace_packet_pub, vorbis_body_empty,
};
let head = b"OpusHead\x01\x02\x38\x01\x80\xbb\x00\x00\x00\x00\x00".to_vec();
let mut tags = b"OpusTags".to_vec();
tags.extend_from_slice(&vorbis_body_empty());
let serial = 0x6d75_7366; let (mut bytes, header_pages) = build_header_pub(serial, &[&head, &tags]);
let header_len = bytes.len();
let (page, _) = lace_packet_pub(serial, header_pages, false, 960, audio);
bytes.extend_from_slice(&page);
std::fs::write(path, &bytes).unwrap();
(header_len as u64, (bytes.len() - header_len) as u64)
}
pub fn picture_block_body(data: &[u8]) -> Vec<u8> {
let mut v = Vec::new();
v.extend_from_slice(&3u32.to_be_bytes()); v.extend_from_slice(&u32::try_from(b"image/png".len()).unwrap().to_be_bytes());
v.extend_from_slice(b"image/png");
v.extend_from_slice(&0u32.to_be_bytes()); v.extend_from_slice(&1u32.to_be_bytes()); v.extend_from_slice(&1u32.to_be_bytes()); v.extend_from_slice(&0u32.to_be_bytes()); v.extend_from_slice(&0u32.to_be_bytes()); v.extend_from_slice(&u32::try_from(data.len()).unwrap().to_be_bytes());
v.extend_from_slice(data);
v
}
pub fn write_opus_with_art(
path: &Path,
comments: &[&str],
picture: &[u8],
audio: &[u8],
) -> (u64, u64) {
use base64::Engine as _;
use musefs_format::ogg::page_test_support::{build_header_pub, lace_packet_pub};
let head = b"OpusHead\x01\x02\x38\x01\x80\xbb\x00\x00\x00\x00\x00".to_vec();
let mbp = format!(
"METADATA_BLOCK_PICTURE={}",
base64::engine::general_purpose::STANDARD.encode(picture)
);
let mut all: Vec<&str> = comments.to_vec();
all.push(&mbp);
let mut tags = b"OpusTags".to_vec();
tags.extend_from_slice(&vorbis_comment_body("v", &all));
let serial = 0x6d75_7366; let (mut bytes, header_pages) = build_header_pub(serial, &[&head, &tags]);
let header_len = bytes.len();
let (page, _) = lace_packet_pub(serial, header_pages, false, 960, audio);
bytes.extend_from_slice(&page);
std::fs::write(path, &bytes).unwrap();
(header_len as u64, (bytes.len() - header_len) as u64)
}
pub fn write_oggflac_with_art(
path: &Path,
comments: &[&str],
picture: &[u8],
audio: &[u8],
) -> (u64, u64) {
use musefs_format::ogg::page_test_support::{build_header_pub, lace_packet_pub};
let mut pkt0 = vec![0x7F];
pkt0.extend_from_slice(b"FLAC");
pkt0.extend_from_slice(&[1, 0]); pkt0.extend_from_slice(&2u16.to_be_bytes()); pkt0.extend_from_slice(b"fLaC");
pkt0.extend_from_slice(&flac_block(0, &streaminfo_body(), false));
let vc_pkt = flac_block(4, &vorbis_comment_body("v", comments), false);
let pic_pkt = flac_block(6, picture, true);
let serial = 0x6f67_666c;
let (mut bytes, header_pages) = build_header_pub(serial, &[&pkt0, &vc_pkt, &pic_pkt]);
let header_len = bytes.len();
let (page, _) = lace_packet_pub(serial, header_pages, false, 960, audio);
bytes.extend_from_slice(&page);
std::fs::write(path, &bytes).unwrap();
(header_len as u64, (bytes.len() - header_len) as u64)
}