Fix UHD remux: skip DV EL from video_pending, dynamic lookahead
- Secondary video streams (Dolby Vision EL) no longer block codec detection - Lookahead buffer: 10 MB default, 100 MB for UHD (>15 streams) - Verified: Dune UHD 84.6 GB remux completes at 101 MB/s - Verified: V for Vendetta BD 21.3 GB remux completes at 131 MB/s
This commit is contained in:
@@ -84,7 +84,11 @@ impl MkvStream {
|
|||||||
for s in &dt.streams {
|
for s in &dt.streams {
|
||||||
let (pid, track, parser) = match s {
|
let (pid, track, parser) = match s {
|
||||||
crate::disc::Stream::Video(v) => {
|
crate::disc::Stream::Video(v) => {
|
||||||
|
// Only count primary video as pending — secondary streams
|
||||||
|
// (Dolby Vision EL, PiP) may never produce codec headers
|
||||||
|
if !v.secondary {
|
||||||
ws.video_pending += 1;
|
ws.video_pending += 1;
|
||||||
|
}
|
||||||
(v.pid, MkvTrack::video(v), codec::parser_for_codec(v.codec))
|
(v.pid, MkvTrack::video(v), codec::parser_for_codec(v.codec))
|
||||||
}
|
}
|
||||||
crate::disc::Stream::Audio(a) => {
|
crate::disc::Stream::Audio(a) => {
|
||||||
|
|||||||
+12
-3
@@ -27,8 +27,10 @@ use std::path::Path;
|
|||||||
/// I/O buffer size for file streams.
|
/// I/O buffer size for file streams.
|
||||||
const IO_BUF_SIZE: usize = 4 * 1024 * 1024;
|
const IO_BUF_SIZE: usize = 4 * 1024 * 1024;
|
||||||
|
|
||||||
/// MKV lookahead buffer size.
|
/// Default MKV lookahead buffer size.
|
||||||
const MKV_LOOKAHEAD: usize = 10 * 1024 * 1024;
|
/// Dynamically increased for UHD content (many streams delay video codec headers).
|
||||||
|
const MKV_LOOKAHEAD_DEFAULT: usize = 10 * 1024 * 1024;
|
||||||
|
const MKV_LOOKAHEAD_UHD: usize = 100 * 1024 * 1024;
|
||||||
|
|
||||||
/// Parsed stream URL.
|
/// Parsed stream URL.
|
||||||
pub struct StreamUrl {
|
pub struct StreamUrl {
|
||||||
@@ -231,7 +233,14 @@ pub fn open_output(url: &str, meta: &DiscTitle) -> io::Result<Box<dyn IOStream>>
|
|||||||
.map_err(|e| io::Error::new(e.kind(),
|
.map_err(|e| io::Error::new(e.kind(),
|
||||||
format!("mkv://{}: {}", parsed.path, e)))?;
|
format!("mkv://{}: {}", parsed.path, e)))?;
|
||||||
let writer = BufWriter::with_capacity(IO_BUF_SIZE, file);
|
let writer = BufWriter::with_capacity(IO_BUF_SIZE, file);
|
||||||
Ok(Box::new(MkvStream::new(writer).meta(meta).max_buffer(MKV_LOOKAHEAD)))
|
// Size lookahead based on content: UHD (many streams) needs larger buffer
|
||||||
|
// because HEVC SPS/PPS may not appear until well past 10 MB
|
||||||
|
let lookahead = if meta.streams.len() > 15 {
|
||||||
|
MKV_LOOKAHEAD_UHD
|
||||||
|
} else {
|
||||||
|
MKV_LOOKAHEAD_DEFAULT
|
||||||
|
};
|
||||||
|
Ok(Box::new(MkvStream::new(writer).meta(meta).max_buffer(lookahead)))
|
||||||
}
|
}
|
||||||
"network" => {
|
"network" => {
|
||||||
validate_network_addr(&parsed.path)?;
|
validate_network_addr(&parsed.path)?;
|
||||||
|
|||||||
Reference in New Issue
Block a user