Mux Blu-ray 3D (MVC) as a single MVC video track
Fold the MVC dependent (right-eye) view into the base H.264 track as a per-frame BlockAdditional under an mvcC BlockAdditionMapping, so a 3D title produces one MVC video track instead of two independent H.264 tracks. - h264: MVC-passthrough parser mode keeps the dependent view's subset SPS/PPS in-band, so each emitted frame is a self-contained dependent access unit for a BlockAdditional - resolve: route the dependent stream through the passthrough parser - mkvstream: detect the dependent view, pair it to the base frame by PTS (bounded FIFO), attach it as a BlockAdditional (BlockAddID=2), and skip building its own track; build the mvcC MVCDecoderConfigurationRecord from the captured subset SPS/PPS and set it on the base track at activation - mkv: emit the mvcC BlockAdditionMapping and BlockGroup/BlockAdditions, with a ReferenceBlock on non-keyframe base frames - ebml: add BlockAdditions/BlockMore/BlockAdditional/BlockAddID/ BlockAddIDValue/ReferenceBlock elements and a signed-int writer Verified against a Blu-ray 3D ISO: ffprobe shows a single MVC track, the mvcC mapping is present, ~144k BlockAdditionals carry the dependent view (8.7 GB), and the base view decodes cleanly with no regression. MVCDecoderConfigurationRecord follows ISO/IEC 14496-15 7.6.2; StereoMode is intentionally omitted (no enum value describes MVC-in-BlockAdditional; the mvcC mapping is the primary 3D signal per RFC 9559).
This commit is contained in:
@@ -216,6 +216,22 @@ pub struct VideoStream {
|
||||
pub measured_cicp: Option<MeasuredCicp>,
|
||||
}
|
||||
|
||||
/// Label marking a video stream as the Blu-ray 3D **MVC dependent (right-eye)
|
||||
/// view** — the paired substream of the AVC base view. Set by the BD scan
|
||||
/// (`bluray.rs`) and recognised by the mux path (`resolve.rs` builds its parser
|
||||
/// in param-set-preserving mode; `mkvstream.rs` folds it into the base track as
|
||||
/// per-frame `BlockAdditional`). Single source of truth for the contract.
|
||||
pub const MVC_DEPENDENT_LABEL: &str = "MVC dependent view (3D right eye)";
|
||||
|
||||
impl VideoStream {
|
||||
/// Whether this video stream is the MVC dependent (right-eye) view — the
|
||||
/// 3D substream that the muxer merges into the base track as a per-frame
|
||||
/// `BlockAdditional` rather than emitting as an independent track.
|
||||
pub fn is_mvc_dependent(&self) -> bool {
|
||||
self.label == MVC_DEPENDENT_LABEL
|
||||
}
|
||||
}
|
||||
|
||||
/// Measured CICP colour signalling read directly from a video elementary stream
|
||||
/// (ITU-T H.273). Preferred over the coarse [`ColorSpace`] enum when present.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
|
||||
Reference in New Issue
Block a user