Magic-number/taxonomy pass: central wire-format + sector + unit consts
- libfreemkv::consts: coding_type::* (ES coding-type bytes), pes_stream_id::* + PAYLOAD_RANGE, SECTOR_BYTES (usize) + SECTOR_BYTES_U64 (offset math) - replace bare wire-code/sector literals across disc, mpls, clpi, labels, m2ts_mux, ps, tsmux, file_sector_source, extract - remove two unreachable secondary-stream match arms in mpls parse_stream_entry
This commit is contained in:
+18
-5
@@ -76,15 +76,18 @@ const PCR_INTERVAL_PACKETS: u64 = 40;
|
||||
/// the picture it timestamps. 200 ms in 90 kHz ticks.
|
||||
const PCR_LEAD_90KHZ: u64 = 90_000 / 5;
|
||||
|
||||
// PMT stream-type codes. These are the same elementary-stream coding-type
|
||||
// registry as the parse side; the single source of truth is `consts::coding_type`.
|
||||
use crate::consts::coding_type;
|
||||
/// HEVC stream-type code, ISO/IEC 13818-1 Table 2-34 (2015 amendment).
|
||||
const STREAM_TYPE_HEVC: u8 = 0x24;
|
||||
const STREAM_TYPE_HEVC: u8 = coding_type::HEVC;
|
||||
/// AC-3 / E-AC-3. Not an ISO assignment — sits in the user-private
|
||||
/// 0x80-0xFF range and is the Blu-ray Disc Association / ATSC A/52
|
||||
/// convention.
|
||||
const STREAM_TYPE_AC3: u8 = 0x81;
|
||||
const STREAM_TYPE_AC3: u8 = coding_type::AC3;
|
||||
/// Dolby TrueHD. Also a private/BD-conventional value in the
|
||||
/// user-private 0x80-0xFF range, not an ISO assignment.
|
||||
const STREAM_TYPE_TRUEHD: u8 = 0x83;
|
||||
const STREAM_TYPE_TRUEHD: u8 = coding_type::TRUEHD;
|
||||
|
||||
/// Audio codec hint for [`M2tsMux::new`] / [`M2tsMux::set_audio`]. The
|
||||
/// muxer needs to know the codec to pick the right PMT `stream_type`
|
||||
@@ -420,7 +423,12 @@ impl<W: Write> M2tsMux<W> {
|
||||
|
||||
/// Build a PES packet for a video access unit.
|
||||
fn build_video_pes(pts_90k: u64, es: &[u8]) -> Vec<u8> {
|
||||
build_pes_packet(0xE0, pts_90k, es, /* length_in_header */ false)
|
||||
build_pes_packet(
|
||||
crate::consts::pes_stream_id::VIDEO,
|
||||
pts_90k,
|
||||
es,
|
||||
/* length_in_header */ false,
|
||||
)
|
||||
}
|
||||
|
||||
/// Build a PES packet for an audio access unit.
|
||||
@@ -430,7 +438,12 @@ fn build_audio_pes(pts_90k: u64, es: &[u8]) -> Vec<u8> {
|
||||
// start code. For an access unit larger than ~64 KiB (rare — e.g. a
|
||||
// large TrueHD frame) the length field falls back to the unbounded
|
||||
// (0x0000) form, which most demuxers tolerate for private_stream_1.
|
||||
build_pes_packet(0xBD, pts_90k, es, /* length_in_header */ true)
|
||||
build_pes_packet(
|
||||
crate::consts::pes_stream_id::PRIVATE_STREAM_1,
|
||||
pts_90k,
|
||||
es,
|
||||
/* length_in_header */ true,
|
||||
)
|
||||
}
|
||||
|
||||
fn build_pes_packet(stream_id: u8, pts_90k: u64, es: &[u8], length_in_header: bool) -> Vec<u8> {
|
||||
|
||||
+8
-8
@@ -23,10 +23,10 @@ const SYSTEM_HEADER_ID: u8 = 0xBB;
|
||||
const PROGRAM_END_ID: u8 = 0xB9;
|
||||
|
||||
/// Private stream 1 (AC3, DTS, LPCM, subtitles).
|
||||
const PRIVATE_STREAM_1: u8 = 0xBD;
|
||||
const PRIVATE_STREAM_1: u8 = crate::consts::pes_stream_id::PRIVATE_STREAM_1;
|
||||
/// Private stream 2 (0xBF) — DVD navigation (PCI/DSI). Carries no muxable
|
||||
/// elementary stream; expected to be dropped on every disc.
|
||||
const PRIVATE_STREAM_2: u8 = 0xBF;
|
||||
const PRIVATE_STREAM_2: u8 = crate::consts::pes_stream_id::PRIVATE_STREAM_2;
|
||||
|
||||
/// Hard cap on the demuxer's reassembly buffer. A length-0 (unbounded) video
|
||||
/// PES is delimited by the next PS-layer boundary; if a corrupt stream declares
|
||||
@@ -107,8 +107,8 @@ impl PsPacket {
|
||||
/// mis-routing the packet.
|
||||
pub fn dvd_pid(&self) -> Option<u16> {
|
||||
match self.stream_id {
|
||||
0xE0..=0xEF => Some(DVD_VIDEO_PID),
|
||||
0xBD => {
|
||||
crate::consts::pes_stream_id::VIDEO..=0xEF => Some(DVD_VIDEO_PID),
|
||||
PRIVATE_STREAM_1 => {
|
||||
let sub = self.sub_stream_id?;
|
||||
dvd_audio_pid(sub).or_else(|| dvd_subtitle_pid(sub))
|
||||
}
|
||||
@@ -348,8 +348,8 @@ fn find_ps_boundary(data: &[u8], from: usize) -> Option<usize> {
|
||||
fn is_pes_stream_id(id: u8) -> bool {
|
||||
// Video: 0xE0-0xEF, MPEG audio: 0xC0-0xDF, private stream 1: 0xBD,
|
||||
// private stream 2: 0xBF, padding: 0xBE, ECM/EMM etc.
|
||||
// We parse anything in the PES range.
|
||||
matches!(id, 0xBD..=0xEF)
|
||||
// We parse anything in the payload-bearing PES range.
|
||||
crate::consts::pes_stream_id::PAYLOAD_RANGE.contains(&id)
|
||||
}
|
||||
|
||||
/// Parse a single PES packet from a byte slice that starts at the start code.
|
||||
@@ -365,12 +365,12 @@ fn parse_pes_packet(data: &[u8]) -> Option<PsPacket> {
|
||||
let stream_id = data[3];
|
||||
|
||||
// Padding stream — skip entirely.
|
||||
if stream_id == 0xBE {
|
||||
if stream_id == crate::consts::pes_stream_id::PADDING_STREAM {
|
||||
return None;
|
||||
}
|
||||
|
||||
// Streams without standard PES header extension.
|
||||
if stream_id == 0xBF {
|
||||
if stream_id == PRIVATE_STREAM_2 {
|
||||
let payload = if data.len() > 6 { &data[6..] } else { &[] };
|
||||
return Some(PsPacket {
|
||||
stream_id,
|
||||
|
||||
+4
-3
@@ -312,11 +312,12 @@ impl<W: Write> TsMuxer<W> {
|
||||
|
||||
/// Build a PES packet header for a BD stream.
|
||||
fn build_pes_header(pid: u16, pts_90k: u64, data_len: usize) -> Vec<u8> {
|
||||
use crate::consts::pes_stream_id;
|
||||
// Determine stream_id from PID range
|
||||
let stream_id: u8 = if is_video_pid(pid) {
|
||||
0xE0 // video
|
||||
pes_stream_id::VIDEO
|
||||
} else {
|
||||
0xBD // audio, PGS subtitle, or default (private stream 1)
|
||||
pes_stream_id::PRIVATE_STREAM_1 // audio, PGS subtitle, or default
|
||||
};
|
||||
|
||||
let pes_data_len = data_len + 8; // 3 header bytes + 5 PTS bytes + data
|
||||
@@ -332,7 +333,7 @@ fn build_pes_header(pid: u16, pts_90k: u64, data_len: usize) -> Vec<u8> {
|
||||
// video; `write_frame` splits oversized 0xBD access units so a private
|
||||
// stream always fits a bounded u16 length here. The `> 65535` arm
|
||||
// remains a defensive fallback for video only.
|
||||
if stream_id == 0xE0 || pes_data_len > 65535 {
|
||||
if stream_id == pes_stream_id::VIDEO || pes_data_len > u16::MAX as usize {
|
||||
header.push(0x00);
|
||||
header.push(0x00);
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user