@@ -59,7 +59,7 @@ impl DecoderContext {
5959#[ derive( Debug , Default ) ]
6060pub struct Decoder {
6161 context : DecoderContext ,
62- frame_buffer : Option < VideoFrame > ,
62+ frame_buffer : Vec < VideoFrame > ,
6363}
6464
6565impl Decoder {
@@ -108,8 +108,17 @@ impl Decoder {
108108
109109 info ! ( "non-IDR Slice: {:#?}" , slice) ;
110110 if slice. header . slice_type != SliceType :: I {
111- break ;
111+ todo ! ( "implement P-slices" )
112112 }
113+
114+ let frame = VideoFrame :: new_with_padding (
115+ slice. sps . pic_width ( ) ,
116+ slice. sps . pic_hight ( ) ,
117+ v_frame:: pixel:: ChromaSampling :: Cs420 ,
118+ 16 ,
119+ ) ;
120+ self . frame_buffer . push ( frame) ;
121+
113122 parser:: parse_slice_data ( & mut unit_input, & mut slice)
114123 . map_err ( parse_error_handler) ?;
115124 info ! ( "Blocks: {:#?}" , slice. get_macroblock_count( ) ) ;
@@ -121,23 +130,24 @@ impl Decoder {
121130 . map_err ( parse_error_handler) ?;
122131
123132 info ! ( "IDR Slice: {:#?}" , slice) ;
133+ let frame = VideoFrame :: new_with_padding (
134+ slice. sps . pic_width ( ) ,
135+ slice. sps . pic_hight ( ) ,
136+ v_frame:: pixel:: ChromaSampling :: Cs420 ,
137+ 16 ,
138+ ) ;
139+ self . frame_buffer . push ( frame) ;
140+
124141 parser:: parse_slice_data ( & mut unit_input, & mut slice)
125142 . map_err ( parse_error_handler) ?;
126143 info ! ( "Blocks: {:#?}" , slice. get_macroblock_count( ) ) ;
127- return self . process_slice ( & mut slice) ; // Temporarily stop after first slice
144+ self . process_slice ( & mut slice) ? ; // Temporarily stop after first slice
128145 }
129146 NalUnitType :: SupplementalEnhancementInfo => { }
130147 NalUnitType :: SeqParameterSet => {
131148 let sps = parser:: parse_sps ( & mut unit_input) . map_err ( parse_error_handler) ?;
132149 info ! ( "SPS: {:#?}" , sps) ;
133150 assert_eq ! ( sps. ChromaArrayType ( ) , ChromaFormat :: YUV420 ) ;
134- let frame = VideoFrame :: new_with_padding (
135- sps. pic_width ( ) ,
136- sps. pic_hight ( ) ,
137- v_frame:: pixel:: ChromaSampling :: Cs420 ,
138- 16 ,
139- ) ;
140- self . frame_buffer = Some ( frame) ;
141151 self . context . put_sps ( sps) ;
142152 }
143153 NalUnitType :: PicParameterSet => {
@@ -162,16 +172,16 @@ impl Decoder {
162172 Ok ( ( ) )
163173 }
164174
165- pub fn get_frame_buffer ( & self ) -> Option < & VideoFrame > {
166- self . frame_buffer . as_ref ( )
175+ pub fn get_frame_buffer ( & self ) -> & [ VideoFrame ] {
176+ self . frame_buffer . as_slice ( )
167177 }
168178
169179 fn process_slice ( & mut self , slice : & mut Slice ) -> Result < ( ) , DecodingError > {
170- if self . frame_buffer . is_none ( ) {
180+ if self . frame_buffer . is_empty ( ) {
171181 return Err ( DecodingError :: Wtf ) ;
172182 }
173183 let mut qp = slice. pps . pic_init_qp_minus26 + 26 + slice. header . slice_qp_delta ;
174- let frame = self . frame_buffer . as_mut ( ) . unwrap ( ) ;
184+ let frame = self . frame_buffer . last_mut ( ) . unwrap ( ) ;
175185 for mb_addr in 0 ..( slice. sps . pic_size_in_mbs ( ) as u32 ) {
176186 let mb_loc = slice. get_mb_location ( mb_addr) ;
177187 if let Some ( mb) = slice. get_mb ( mb_addr) {
0 commit comments