mpeg2ps/ps/
system_header.rs1use crate::ps::stream_table::PsSystemHeaderStreamTable;
2use crate::Result;
3use bitfield::bitfield;
4use std::io::{repeat, Read};
5use std::iter;
6
7#[derive(Debug)]
8pub struct PsSystemSystemHeaderExt {
9 pub ps_system_header: PsSystemHeader<[u8; 12]>,
10 pub ps_system_table: Option<Vec<PsSystemHeaderStreamTable<[u8; 3]>>>,
11}
12
13impl PsSystemSystemHeaderExt {
14 pub(super) fn read_from<R: Read>(mut reader: R) -> Result<Self> {
15 let reader_ref = reader.by_ref();
16 let ps_system_header = PsSystemHeader::read_from(reader_ref)?;
17 let st_size = 6 + ps_system_header.header_length() - 12;
18 if st_size > 0 {
19 let table_item_count = st_size / 3;
20 assert_eq!(st_size % 3, 0);
21 let mut ps_system_table = Vec::with_capacity(table_item_count as usize);
22 for _ in 0..table_item_count {
23 let reader_ref = reader.by_ref();
24 let ps_system_table_row = PsSystemHeaderStreamTable::read_from(reader_ref)?;
25 ps_system_table.push(ps_system_table_row);
26 }
27
28 Ok(PsSystemSystemHeaderExt {
29 ps_system_header,
30 ps_system_table: Some(ps_system_table),
31 })
32 } else {
33 Ok(PsSystemSystemHeaderExt {
34 ps_system_header,
35 ps_system_table: None,
36 })
37 }
38 }
39}
40
41bitfield! {
42 pub struct PsSystemHeader(MSB0 [u8]);
43 impl Debug;
44 u8;
45 pub u32,start_code,set_start_code:31,0; pub u16,header_length,set_header_length:47,32; pub bool,marker_bit1,set_marker_bit1:48; pub u32,rate_bound,set_rate_bound:70,49; pub bool,marker_bit2,set_marker_bit2: 71; pub u8,audio_bound,set_audio_bound:77,72; pub bool,fixed_flag,set_fixed_flag:78; pub bool,csps_flag,set_csps_flag:79;pub bool,system_audio_lock_flag,set_system_audio_lock_flag:80;pub bool,system_video_lock_flag,set_system_video_lock_flag: 81;pub bool,marker_bit3,set_marker_bit3:82;pub u8,video_bound,set_video_bound:87,83; pub bool,packet_rate_restriction_flag,set_packet_rate_restriction_flag:88; pub u8,reserved_bits,set_reserved_bits:95,89; }
61
62impl PsSystemHeader<[u8; 12]> {
63 pub(super) fn read_from<R: Read>(mut reader: R) -> Result<Self> {
64 let mut buf = [0; 12];
65 reader.read_exact(&mut buf);
66 let system_header = PsSystemHeader(buf);
67 Ok(system_header)
68 }
69}