1- use anyhow:: { bail, Result } ;
2-
31use self :: slice:: SliceNAL ;
42
53use super :: { BitVecReader , NALUStartCode } ;
@@ -8,6 +6,7 @@ pub(crate) mod hrd_parameters;
86pub ( crate ) mod pps;
97pub ( crate ) mod profile_tier_level;
108pub ( crate ) mod scaling_list_data;
9+ pub mod sei;
1110pub ( crate ) mod short_term_rps;
1211pub ( crate ) mod slice;
1312pub ( crate ) mod sps;
@@ -46,6 +45,8 @@ pub const NAL_UNSPEC63: u8 = 63;
4645
4746pub const USER_DATA_REGISTERED_ITU_T_35 : u8 = 4 ;
4847
48+ pub use sei:: SeiMessage ;
49+
4950#[ derive( Default , Debug , Clone ) ]
5051pub struct NALUnit {
5152 pub start : usize ,
@@ -73,73 +74,6 @@ pub struct Frame {
7374 pub first_slice : SliceNAL ,
7475}
7576
76- #[ derive( Default , Debug , Clone ) ]
77- pub struct SeiMessage {
78- num_payload_type_ff_bytes : usize ,
79- last_payload_type_byte : u8 ,
80-
81- num_payload_size_ff_bytes : usize ,
82- last_payload_size_byte : u8 ,
83-
84- pub payload_type : u8 ,
85- pub payload_size : usize ,
86- }
87-
88- impl SeiMessage {
89- pub fn from_bytes ( data : & [ u8 ] ) -> Result < SeiMessage > {
90- let mut reader = BitVecReader :: new ( data. to_vec ( ) ) ;
91-
92- SeiMessage :: parse ( & mut reader)
93- }
94-
95- pub fn parse ( reader : & mut BitVecReader ) -> Result < SeiMessage > {
96- // forbidden_zero_bit
97- reader. skip_n ( 1 ) ;
98-
99- let nal_type = reader. get_n :: < u8 > ( 6 ) ;
100-
101- if nal_type != NAL_SEI_PREFIX {
102- bail ! ( "NAL type {} is not SEI_PREFIX" , nal_type) ;
103- }
104-
105- if reader. available ( ) < 9 && matches ! ( nal_type, NAL_EOS_NUT | NAL_EOB_NUT ) {
106- } else {
107- reader. skip_n ( 6 ) ; // nuh_layer_id
108- reader. skip_n ( 3 ) ; // temporal_id
109- }
110-
111- let mut msg = SeiMessage {
112- last_payload_type_byte : reader. get_n ( 8 ) ,
113- ..Default :: default ( )
114- } ;
115-
116- while msg. last_payload_type_byte == 0xFF {
117- msg. num_payload_type_ff_bytes += 1 ;
118- msg. last_payload_type_byte = reader. get_n ( 8 ) ;
119-
120- msg. payload_type += 255 ;
121- }
122-
123- msg. payload_type += msg. last_payload_type_byte ;
124-
125- msg. last_payload_size_byte = reader. get_n ( 8 ) ;
126- while msg. last_payload_size_byte == 0xFF {
127- msg. num_payload_size_ff_bytes += 1 ;
128- msg. last_payload_size_byte = reader. get_n ( 8 ) ;
129-
130- msg. payload_size += 255 ;
131- }
132-
133- msg. payload_size += msg. last_payload_size_byte as usize ;
134-
135- if msg. payload_size > reader. available ( ) {
136- bail ! ( "Payload size is larger than NALU size" ) ;
137- }
138-
139- Ok ( msg)
140- }
141- }
142-
14377impl NALUnit {
14478 pub fn is_type_slice ( nal_type : u8 ) -> bool {
14579 matches ! (
0 commit comments