X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-itu%2Fsrc%2Fcodecs%2Fh264%2Fpic_ref.rs;h=a24e9d0e0a4fb582b4cb9806501c891819673bea;hb=e6aaad5c5273cd814b5748b7faf3751835a37217;hp=bf838be4204e1cc4bf096e8fa02edb03da1bc552;hpb=56a17e69f584e41c2bfd2cb808b812be6b8796e5;p=nihav.git diff --git a/nihav-itu/src/codecs/h264/pic_ref.rs b/nihav-itu/src/codecs/h264/pic_ref.rs index bf838be..a24e9d0 100644 --- a/nihav-itu/src/codecs/h264/pic_ref.rs +++ b/nihav-itu/src/codecs/h264/pic_ref.rs @@ -1,5 +1,6 @@ use nihav_core::codecs::DecoderResult; -use nihav_core::frame::{FrameType, NAVideoBufferRef}; +use nihav_core::frame::{FrameType, NAVideoBufferRef, NATimeInfo}; +use nihav_core::refs::*; use nihav_codec_support::codecs::MV; use super::sets::SeqParameterSet; use super::slice::*; @@ -9,13 +10,16 @@ use super::types::*; pub struct PictureInfo { pub id: u16, pub full_id: u32, + pub time: NATimeInfo, + pub user_id: u32, pub pic_type: FrameType, pub buf: NAVideoBufferRef, pub cur_mb: usize, pub is_ref: bool, + pub is_idr: bool, pub long_term: Option, - pub mv_info: FrameMV, //todo replace with refcounted index to a pool + pub mv_info: NABufferRef, } #[derive(Clone,Copy,Default, Debug)] @@ -53,6 +57,14 @@ pub struct SliceRefs { } impl SliceRefs { + pub fn get_ref_id(&self, list_id: u8, ref_id: usize) -> Option { + let ref_list = if list_id == 0 { &self.ref_list0 } else { &self.ref_list1 }; + if ref_list.len() > ref_id { + ref_list[ref_id].as_ref().map(|pic| pic.full_id) + } else { + None + } + } pub fn select_ref_pic(&self, list_id: u8, ref_id: usize) -> Option> { let ref_list = if list_id == 0 { &self.ref_list0 } else { &self.ref_list1 }; if ref_list.len() > ref_id { @@ -170,6 +182,18 @@ impl FrameRefs { max_frame_num: 0, } } + pub fn fill_ref_nums(&self, dst: &mut Vec) { + for pic in self.ref_pics.iter() { + if !dst.contains(&pic.full_id) { + dst.push(pic.full_id); + } + } + for pic in self.long_term.iter().flatten() { + if !dst.contains(&pic.full_id) { + dst.push(pic.full_id); + } + } + } pub fn calc_picture_num(&mut self, slice_hdr: &SliceHeader, is_idr: bool, ref_id: u8, sps: &SeqParameterSet) -> u32 { self.max_frame_num = 1 << sps.log2_max_frame_num; match sps.pic_order_cnt_type {