mpeg2ps/ps/
system_header.rs

1use 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; //32
46    pub u16,header_length,set_header_length:47,32; //16
47    pub bool,marker_bit1,set_marker_bit1:48; //1
48    pub u32,rate_bound,set_rate_bound:70,49; //22
49    pub bool,marker_bit2,set_marker_bit2: 71; //1
50    pub u8,audio_bound,set_audio_bound:77,72; //6
51    pub bool,fixed_flag,set_fixed_flag:78; //1
52    pub bool,csps_flag,set_csps_flag:79;//1
53    pub bool,system_audio_lock_flag,set_system_audio_lock_flag:80;//1
54    pub bool,system_video_lock_flag,set_system_video_lock_flag: 81;//1
55    pub bool,marker_bit3,set_marker_bit3:82;//1
56    pub u8,video_bound,set_video_bound:87,83; //5
57    pub bool,packet_rate_restriction_flag,set_packet_rate_restriction_flag:88; //1
58    pub u8,reserved_bits,set_reserved_bits:95,89; //7
59
60}
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}