X-Git-Url: https://git.nihav.org/?p=nihav.git;a=blobdiff_plain;f=nihav-itu%2Fsrc%2Fcodecs%2Fh264%2Fpic_ref.rs;fp=nihav-itu%2Fsrc%2Fcodecs%2Fh264%2Fpic_ref.rs;h=a0472163c949bab1579aa06563dd7372a16ca0a5;hp=fd2ae974fa557e7ee8203cdae60858d08191b3c6;hb=11d7aef2ac58fe8d3341ffdcec7eaf9ee4e266f1;hpb=93839abd64a4c725e0194a790ffd743dd8c19916 diff --git a/nihav-itu/src/codecs/h264/pic_ref.rs b/nihav-itu/src/codecs/h264/pic_ref.rs index fd2ae97..a047216 100644 --- a/nihav-itu/src/codecs/h264/pic_ref.rs +++ b/nihav-itu/src/codecs/h264/pic_ref.rs @@ -1,5 +1,5 @@ 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; @@ -10,10 +10,13 @@ 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: NABufferRef, @@ -54,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 { @@ -171,6 +182,20 @@ 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 ltpic in self.long_term.iter() { + if let Some(ref pic) = ltpic { + 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 {