pub mod disc;
pub mod pipelined_stream;
pub mod resolve;
#[allow(dead_code)]
pub(crate) mod codec;
#[allow(dead_code)]
pub(crate) mod demux_thread;
pub(crate) mod ebml;
pub(crate) mod m2ts;
pub mod meta;
#[allow(dead_code)]
pub(crate) mod fmp4;
#[allow(dead_code)]
pub(crate) mod hevc;
#[allow(dead_code)]
pub(crate) mod m2ts_mux;
pub(crate) mod mkv;
pub(crate) mod mkvstream;
pub(crate) mod network;
pub(crate) mod null;
pub(crate) mod ps;
pub(crate) mod stdio;
pub(crate) mod ts;
pub(crate) mod tsmux;
pub use disc::DiscStream;
pub use m2ts::M2tsStream;
pub use mkvstream::MkvStream;
pub use network::NetworkStream;
pub use null::NullStream;
pub use pipelined_stream::PipelinedPesStream;
pub use resolve::build_iso_pipeline;
pub use resolve::{InputOptions, StreamUrl, input, output, parse_url};
pub use stdio::StdioStream;
use std::io::{Seek, Write};
pub trait WriteSeek: Write + Seek {}
impl<T: Write + Seek> WriteSeek for T {}
#[cfg(test)]
mod tests {
use super::resolve::{StreamUrl, parse_url};
use std::path::PathBuf;
#[test]
fn scheme_names_match_the_documented_table() {
assert_eq!(parse_url("disc://").scheme(), "disc");
assert_eq!(parse_url("m2ts://f").scheme(), "m2ts");
assert_eq!(parse_url("mkv://f").scheme(), "mkv");
assert_eq!(parse_url("network://h:1").scheme(), "network");
assert_eq!(parse_url("stdio://").scheme(), "stdio");
assert_eq!(parse_url("iso://f").scheme(), "iso");
assert_eq!(parse_url("null://").scheme(), "null");
assert_eq!(parse_url("bogus://x").scheme(), "unknown");
}
#[test]
fn path_str_returns_the_path_component_for_file_schemes() {
assert_eq!(parse_url("iso://Disc.iso").path_str(), "Disc.iso");
assert_eq!(parse_url("m2ts:///abs/x.m2ts").path_str(), "/abs/x.m2ts");
assert_eq!(parse_url("mkv://out.mkv").path_str(), "out.mkv");
}
#[test]
fn path_str_returns_address_for_network() {
assert_eq!(
parse_url("network://203.0.113.5:9000").path_str(),
"203.0.113.5:9000"
);
}
#[test]
fn path_str_empty_for_scheme_only_urls() {
assert_eq!(parse_url("disc://").path_str(), "");
assert_eq!(parse_url("stdio://").path_str(), "");
assert_eq!(parse_url("null://").path_str(), "");
}
#[test]
fn path_str_for_unknown_echoes_raw_input() {
assert_eq!(parse_url("plain/path").path_str(), "plain/path");
assert_eq!(parse_url("ftp://x").path_str(), "ftp://x");
}
#[test]
fn disc_url_with_device_carries_path() {
let u = parse_url("disc:///dev/sg1");
assert!(matches!(u, StreamUrl::Disc { device: Some(_) }));
assert_eq!(u.path_str(), "/dev/sg1");
}
#[test]
fn is_disc_source_only_for_disc_and_iso() {
assert!(parse_url("disc://").is_disc_source());
assert!(parse_url("disc:///dev/sg1").is_disc_source());
assert!(parse_url("iso://x.iso").is_disc_source());
assert!(!parse_url("m2ts://x").is_disc_source());
assert!(!parse_url("mkv://x").is_disc_source());
assert!(!parse_url("network://h:1").is_disc_source());
assert!(!parse_url("stdio://").is_disc_source());
assert!(!parse_url("null://").is_disc_source());
assert!(!parse_url("junk").is_disc_source());
}
#[test]
fn null_and_stdio_with_trailing_path_are_unknown_not_silently_discarded() {
assert!(matches!(parse_url("null://x"), StreamUrl::Unknown { .. }));
assert!(matches!(parse_url("stdio://x"), StreamUrl::Unknown { .. }));
assert!(matches!(parse_url("null://"), StreamUrl::Null));
assert!(matches!(parse_url("stdio://"), StreamUrl::Stdio));
}
#[test]
fn bare_path_without_scheme_is_unknown() {
assert!(matches!(parse_url("/dev/sg1"), StreamUrl::Unknown { .. }));
assert!(matches!(parse_url("movie.mkv"), StreamUrl::Unknown { .. }));
assert!(matches!(parse_url(""), StreamUrl::Unknown { .. }));
}
#[test]
fn empty_iso_and_m2ts_paths_parse_but_keep_empty_pathbuf() {
assert!(
matches!(parse_url("iso://"), StreamUrl::Iso { ref path } if path.as_os_str().is_empty())
);
assert!(
matches!(parse_url("m2ts://"), StreamUrl::M2ts { ref path } if path.as_os_str().is_empty())
);
}
#[test]
fn first_matching_scheme_wins_no_double_prefix_confusion() {
let u = parse_url("iso://m2ts://x");
assert!(matches!(u, StreamUrl::Iso { ref path } if path == &PathBuf::from("m2ts://x")));
}
}