1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//! Read-only **DVD-Video** disc reader — ISO 9660 + UDF 1.02 mount +
//! `VIDEO_TS/` directory walk.
//!
//! Phase 1 (this release) handles the physical + filesystem + disc-
//! identification layers — enough to point a player at a DVD-Video
//! disc image or block device and enumerate the title-set files.
//! **No IFO / VOB / PGC / VM / CSS parsing yet.**
//!
//! ## Scope
//!
//! - ISO 9660 PVD + path-table + directory walk (the ECMA-268
//! bridge layer).
//! - UDF 1.02 mount: AVDP, Volume Descriptor Sequence, File Set
//! Descriptor, root File Identifier Descriptor walk, File Entry
//! parsing with short_ad / long_ad / ext_ad allocation descriptors.
//! - `VIDEO_TS/` file enumeration: `VIDEO_TS.IFO` + per-VTS
//! `VTS_xx_0.IFO` / `VTS_xx_0.VOB` (menu) / `VTS_xx_1..9.VOB`
//! (title content) / `VTS_xx_0.BUP`.
//! - `dvd://` URI handler (default-on `registry` feature) that
//! surfaces a `DvdDiscSource` to `oxideav_core::SourceRegistry`.
//!
//! Out of scope (deferred to Phase 2 / Phase 3):
//! - IFO body parsing (VMGI, VTSI, PGCI, cell-address tables).
//! - VOB demuxing (MPEG-2 Program Stream + nav-pack overlays).
//! - VM execution (HDMV navigation opcodes, SPRMs / GPRMs).
//! - CSS authentication + descrambling (lives in a future
//! `oxideav-css` sibling crate).
//!
//! ## Sub-Picture Unit decoder (`spu` module)
//!
//! The `spu` module parses one DVD subpicture (subtitle / menu
//! overlay) blob assembled from concatenated PES packet payloads
//! on substream `0x20..=0x3F`: SPUH + the chained
//! `SP_DCSQT` command stream + the two PXD fields' 2-bit
//! run-length-encoded pixel data. [`spu::SubPictureUnit::composite`]
//! optionally resolves those palette indices through the PGC's
//! 16-entry [`ifo::PaletteEntry`] colour-LUT (BT.601 studio-swing
//! YCbCr → RGB plus the SET_CONTR alpha) into a finished RGBA
//! [`spu::SpuBitmap`] overlay; blending it onto the decoded video
//! frame stays with the player.
//!
//! ## Phase 3b — `mkv-output` feature (default off)
//!
//! Enable `mkv-output` to pull in [`pipeline::convert_dvd_to_mkv`],
//! which walks a title's VOBs and writes a Matroska file with the
//! PGC's chapter timeline. The feature pulls in `oxideav-mkv` as a
//! runtime dependency; default builds (and default-feature CI) stay
//! free of it so the crate keeps compiling against any published
//! `oxideav-mkv` version.
//!
//! ## Clean-room references
//!
//! - `docs/container/dvd/physical/ECMA-267_3rd_edition_april_2001.pdf`
//! - `docs/container/dvd/physical/ECMA-268_3rd_edition_april_2001.pdf`
//! - `docs/container/dvd/physical/OSTA_UDF_1.02.pdf`
//! - `docs/container/bluray/ECMA-167_3rd_edition_june_1997.pdf` (cross-ref)
//! - `docs/container/dvd/application/mpucoder-ifo.html` (for the
//! VIDEO_TS directory layout, file-naming convention, and BUP
//! backup semantics only — IFO bodies are out of Phase-1 scope)
//!
//! ## Quick start
//!
//! ```no_run
//! use oxideav_dvd::DvdDisc;
//!
//! let disc = DvdDisc::open("path/to/disc.iso").unwrap();
//! println!("volume_id = {}", disc.volume_id);
//! println!("title_set_count = {}", disc.title_set_count);
//! for f in &disc.video_ts_files {
//! println!(" {:?} lba={} size={}", f.kind, f.lba, f.size);
//! }
//! ```
//!
//! ## Standalone build
//!
//! `oxideav-core` is gated behind the default-on `registry` feature.
//! Drop the framework dependency entirely with:
//!
//! ```toml
//! oxideav-dvd = { version = "0.0", default-features = false }
//! ```
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use register;
pub use ;
pub use ;
// Canonical sibling entry point. Registers the `dvd://` source driver
// under `oxideav_core::RuntimeContext::sources`.
register!;