xref: /xiu/protocol/rtmp/src/cache/gop.rs (revision 8e71d710)
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