use bytes::BytesMut;
fn import_ts(data: &[u8]) -> hang::Catalog {
let mut broadcast = moq_net::Broadcast::new().produce();
let catalog = crate::catalog::hang::Producer::new(&mut broadcast).unwrap();
let mut import = crate::container::ts::Import::new(broadcast, catalog.clone());
let mut buf = BytesMut::from(data);
import.decode(&mut buf).unwrap();
import.finish().unwrap();
catalog.snapshot()
}
#[test]
fn import_bbb_catalog() {
let data = include_bytes!("test_data/bbb.ts");
let catalog = import_ts(data);
assert_eq!(catalog.video.renditions.len(), 1, "expected one H.264 track");
assert_eq!(catalog.audio.renditions.len(), 1, "expected one AAC track");
let video = catalog.video.renditions.values().next().unwrap();
assert!(
video.codec.to_string().starts_with("avc3"),
"video codec was {}",
video.codec
);
let audio = catalog.audio.renditions.values().next().unwrap();
assert!(
audio.codec.to_string().starts_with("mp4a"),
"audio codec was {}",
audio.codec
);
assert!(audio.description.is_some(), "AAC track missing AudioSpecificConfig");
}
#[tokio::test(start_paused = true)]
async fn import_export_import_roundtrip() {
let data = include_bytes!("test_data/bbb.ts");
let mut broadcast = moq_net::Broadcast::new().produce();
let consumer = broadcast.consume();
let catalog = crate::catalog::hang::Producer::new(&mut broadcast).unwrap();
let mut import = crate::container::ts::Import::new(broadcast, catalog.clone());
let mut buf = BytesMut::from(&data[..]);
import.decode(&mut buf).unwrap();
import.finish().unwrap();
let mut exporter = crate::container::ts::Export::new(consumer).unwrap();
let mut out = BytesMut::new();
while let Ok(res) = tokio::time::timeout(std::time::Duration::from_secs(1), exporter.next()).await {
match res.expect("exporter error") {
Some(chunk) => out.extend_from_slice(&chunk),
None => break,
}
}
assert!(!out.is_empty(), "exporter produced no TS");
assert_eq!(out.len() % 188, 0, "exported TS not packet-aligned");
let roundtrip = import_ts(&out);
assert_eq!(roundtrip.video.renditions.len(), 1, "round-trip lost the video track");
assert_eq!(roundtrip.audio.renditions.len(), 1, "round-trip lost the audio track");
}
#[test]
fn import_handles_unaligned_chunks() {
let data = include_bytes!("test_data/bbb.ts");
let mut broadcast = moq_net::Broadcast::new().produce();
let catalog = crate::catalog::hang::Producer::new(&mut broadcast).unwrap();
let mut import = crate::container::ts::Import::new(broadcast, catalog.clone());
for chunk in data.chunks(100) {
let mut buf = BytesMut::from(chunk);
import.decode(&mut buf).unwrap();
}
import.finish().unwrap();
let snapshot = catalog.snapshot();
assert_eq!(snapshot.video.renditions.len(), 1);
assert_eq!(snapshot.audio.renditions.len(), 1);
}