All streams complete — DVD PS demux, network/stdio PES, MKV input

- DiscStream: BD (TsDemuxer) or DVD (PsDemuxer) auto-detected
- NetworkStream: Stream impl with PES serialize/deserialize
- StdioStream: Stream impl with PES serialize/deserialize
- MkvStream: Stream read returns PesFrame from EBML blocks
- M2tsStream: Stream read via TsDemuxReader
- PesFrame: serialize/deserialize for wire format
- TsDemuxReader: shared BD-TS demux helper
- All inputs and outputs support PES
This commit is contained in:
MattJackson
2026-04-15 04:03:56 +00:00
parent 7a83f3244d
commit 56fe26c9b8
4 changed files with 87 additions and 27 deletions
+23 -5
View File
@@ -33,7 +33,6 @@ pub struct NetworkStream {
disc_title: DiscTitle,
mode: Mode,
finished: bool,
ts_reader: Option<super::tsreader::TsDemuxReader<BufReader<TcpStream>>>,
}
impl NetworkStream {
@@ -48,7 +47,6 @@ impl NetworkStream {
header_written: false,
},
finished: false,
ts_reader: None,
})
}
@@ -76,16 +74,36 @@ impl NetworkStream {
})?
.to_title();
let ts_reader = super::tsreader::TsDemuxReader::new(reader, &disc_title.streams);
Ok(Self {
disc_title,
mode: Mode::Read { reader: BufReader::new(TcpStream::connect("0.0.0.0:0").unwrap()) }, // placeholder
mode: Mode::Read { reader },
finished: false,
ts_reader: Some(ts_reader),
})
}
}
impl crate::pes::Stream for NetworkStream {
fn read(&mut self) -> io::Result<Option<crate::pes::PesFrame>> {
match &mut self.mode {
Mode::Read { reader } => crate::pes::PesFrame::deserialize(reader),
_ => Err(io::Error::new(io::ErrorKind::Unsupported, "network opened for writing")),
}
}
fn write(&mut self, frame: &crate::pes::PesFrame) -> io::Result<()> {
match &mut self.mode {
Mode::Write { writer, .. } => frame.serialize(writer),
_ => Err(io::Error::new(io::ErrorKind::Unsupported, "network opened for reading")),
}
}
fn finish(&mut self) -> io::Result<()> {
if let Mode::Write { writer, .. } = &mut self.mode {
writer.flush()?;
}
Ok(())
}
fn info(&self) -> &DiscTitle { &self.disc_title }
}
impl IOStream for NetworkStream {
fn info(&self) -> &DiscTitle {
&self.disc_title