1 use {std::collections::VecDeque, streamhub::define::FrameData}; 2 #[derive(Clone)] 3 pub struct Gop { 4 datas: Vec<FrameData>, 5 } 6 7 impl Default for Gop { default() -> Self8 fn default() -> Self { 9 Self::new() 10 } 11 } 12 13 impl Gop { new() -> Self14 pub fn new() -> Self { 15 Self { datas: Vec::new() } 16 } 17 save_frame_data(&mut self, data: FrameData)18 fn save_frame_data(&mut self, data: FrameData) { 19 self.datas.push(data); 20 } 21 get_frame_data(self) -> Vec<FrameData>22 pub fn get_frame_data(self) -> Vec<FrameData> { 23 self.datas 24 } 25 len(&self) -> usize26 pub fn len(&self) -> usize { 27 self.datas.len() 28 } 29 is_empty(&self) -> bool30 pub fn is_empty(&self) -> bool { 31 self.len() == 0 32 } 33 } 34 35 #[derive(Clone)] 36 pub struct Gops { 37 gops: VecDeque<Gop>, 38 size: usize, 39 } 40 41 impl Default for Gops { default() -> Self42 fn default() -> Self { 43 Self::new(1) 44 } 45 } 46 47 impl Gops { new(size: usize) -> Self48 pub fn new(size: usize) -> Self { 49 Self { 50 gops: VecDeque::from([Gop::new()]), 51 size, 52 } 53 } 54 save_frame_data(&mut self, data: FrameData, is_key_frame: bool)55 pub fn save_frame_data(&mut self, data: FrameData, is_key_frame: bool) { 56 if self.size == 0 { 57 return; 58 } 59 60 if is_key_frame { 61 //todo It may be possible to optimize here 62 if self.gops.len() == self.size { 63 self.gops.pop_front(); 64 } 65 self.gops.push_back(Gop::new()); 66 } 67 68 if let Some(gop) = self.gops.back_mut() { 69 gop.save_frame_data(data); 70 } else { 71 log::error!("should not be here!"); 72 } 73 } 74 setted(&self) -> bool75 pub fn setted(&self) -> bool { 76 self.size != 0 77 } 78 get_gops(&self) -> VecDeque<Gop>79 pub fn get_gops(&self) -> VecDeque<Gop> { 80 self.gops.clone() 81 } 82 } 83