+use std::sync::Arc;
+
use nihav_core::codecs::*;
use nihav_core::io::bitreader::*;
height: usize,
num_mbs: usize,
nal_len: u8,
- sps: Vec<SeqParameterSet>,
+ sps: Vec<Arc<SeqParameterSet>>,
cur_sps: usize,
- pps: Vec<PicParameterSet>,
+ pps: Vec<Arc<PicParameterSet>>,
cur_pps: usize,
skip_mode: FrameSkipMode,
let mut br = BitReader::new(&src[..(full_size + 7)/8], BitReaderMode::BE);
br.skip(8)?;
- let slice_hdr = parse_slice_header(&mut br, &self.sps, &self.pps, is_idr, nal_ref_idc)?;
+ let slice_hdr = parse_slice_header(&mut br, self.sps.as_slice(), self.pps.as_slice(), is_idr, nal_ref_idc)?;
validate!(br.tell() < full_size);
let full_id;
if slice_hdr.first_mb_in_slice == 0 {
self.cur_pic = Some(PictureInfo {
id: slice_hdr.frame_num,
full_id,
+ user_id: full_id,
+ time: NATimeInfo::new(None, None, None, 0, 0),
pic_type: slice_hdr.slice_type.to_frame_type(),
buf,
cur_mb: 0,
is_ref: nal_ref_idc != 0,
+ is_idr,
long_term: get_long_term_id(is_idr, &slice_hdr),
- mv_info: FrameMV::new(sps.pic_width_in_mbs, sps.pic_height_in_mbs),
+ mv_info: NABufferRef::new(FrameMV::new(sps.pic_width_in_mbs, sps.pic_height_in_mbs)),
});
}
6 => {}, //SEI
7 => {
let sps = parse_sps(&src[1..])?;
- self.sps.push(sps);
+ self.sps.push(Arc::new(sps));
},
8 => {
validate!(full_size >= 8 + 16);
let mut found = false;
for stored_pps in self.pps.iter_mut() {
if stored_pps.pic_parameter_set_id == pps.pic_parameter_set_id {
- *stored_pps = pps.clone();
+ *stored_pps = Arc::clone(&pps);
found = true;
break;
}
Ok(())
}
- fn pred_mv(sstate: &mut SliceState, frame_refs: &FrameRefs, mb_info: &mut CurrentMBInfo, cur_id: u16, temporal_mv: bool, direct_8x8: bool) {
+ fn pred_mv(sstate: &mut SliceState, frame_refs: &SliceRefs, mb_info: &mut CurrentMBInfo, cur_id: u16, temporal_mv: bool, direct_8x8: bool) {
let mb_type = mb_info.mb_type;
if !mb_type.is_4x4() {
let (pw, ph) = mb_type.size();
self.sstate.reset_mb_mv();
}
if !mb_info.mb_type.is_intra() {
- Self::pred_mv(&mut self.sstate, &self.frame_refs, mb_info, self.cur_id, self.temporal_mv, self.sps[self.cur_sps].direct_8x8_inference);
+ Self::pred_mv(&mut self.sstate, &self.frame_refs.cur_refs, mb_info, self.cur_id, self.temporal_mv, self.sps[self.cur_sps].direct_8x8_inference);
}
if !pps.constrained_intra_pred && mb_info.mb_type != MBType::Intra4x4 && mb_info.mb_type != MBType::Intra8x8 {
self.sstate.fill_ipred(IntraPredMode::DC);
} else {
0
};
- recon_mb(&mut frm, slice_hdr, mb_info, &mut self.sstate, &self.frame_refs, &mut self.mc_dsp, weight_mode);
+ recon_mb(&mut frm, slice_hdr, mb_info, &mut self.sstate, &self.frame_refs.cur_refs, &mut self.mc_dsp, weight_mode);
} else {
for (dline, src) in frm.data[frm.offset[0] + xpos + ypos * frm.stride[0]..].chunks_mut(frm.stride[0]).take(16).zip(self.ipcm_buf.chunks(16)) {
dline[..16].copy_from_slice(src);
mb.mv[blk4] = self.sstate.get_cur_blk4(blk4).mv;
}
for blk8 in 0..4 {
- mb.ref_poc[blk8] = self.frame_refs.map_refs(self.sstate.get_cur_blk8(blk8).ref_idx);
+ mb.ref_poc[blk8] = self.frame_refs.cur_refs.map_refs(self.sstate.get_cur_blk8(blk8).ref_idx);
mb.ref_idx[blk8] = self.sstate.get_cur_blk8(blk8).ref_idx;
}
mv_info.mbs[mb_pos] = mb;
}
if !self.deblock_skip && self.deblock_mode != 1 {
- self.sstate.fill_deblock(&self.frame_refs, self.deblock_mode, self.is_s);
+ self.sstate.fill_deblock(&self.frame_refs.cur_refs, self.deblock_mode, self.is_s);
if let Some(ref mut pic) = self.cur_pic {
let mut frm = NASimpleVideoFrame::from_video_buf(&mut pic.buf).unwrap();
loop_filter_mb(&mut frm, &self.sstate, self.lf_alpha, self.lf_beta);