core: add frame reordering functionality
[nihav.git] / nihav-core / src / reorder.rs
CommitLineData
ca8452f0
KS
1use std::mem::swap;
2pub use crate::frame::{FrameType, NAFrameRef};
3
4pub trait FrameReorderer {
5 fn add_frame(&mut self, fref: NAFrameRef) -> bool;
6 fn get_frame(&mut self) -> Option<NAFrameRef>;
7 fn flush(&mut self);
8 fn get_last_frames(&mut self) -> Option<NAFrameRef>;
9}
10
11pub struct NoReorderer {
12 fref: Option<NAFrameRef>,
13}
14
15impl NoReorderer {
16 pub fn new() -> Self {
17 Self { fref: None }
18 }
19}
20
21impl FrameReorderer for NoReorderer {
22 fn add_frame(&mut self, fref: NAFrameRef) -> bool {
23 if self.fref.is_none() {
24 self.fref = Some(fref);
25 true
26 } else {
27 false
28 }
29 }
30 fn get_frame(&mut self) -> Option<NAFrameRef> {
31 let mut ret = None;
32 swap(&mut ret, &mut self.fref);
33 ret
34 }
35 fn flush(&mut self) { self.fref = None; }
36 fn get_last_frames(&mut self) -> Option<NAFrameRef> { None }
37}
38
39pub struct IPBReorderer {
40 frames: Vec<NAFrameRef>,
41 max_depth: usize,
42 last_ft: FrameType,
43}
44
45impl IPBReorderer {
46 pub fn new(max_depth: usize) -> Self {
47 Self {
48 frames: Vec::with_capacity(max_depth),
49 max_depth,
50 last_ft: FrameType::Other,
51 }
52 }
53}
54
55impl FrameReorderer for IPBReorderer {
56 fn add_frame(&mut self, fref: NAFrameRef) -> bool {
57 if self.frames.len() < self.max_depth {
58 let cur_ft = fref.get_frame_type();
59 if cur_ft != FrameType::B {
60 self.frames.push(fref);
61 self.last_ft = cur_ft;
62 } else {
63 let pframe = self.frames.pop();
64 if pframe.is_some() {
65 self.frames.push(fref);
66 self.frames.push(pframe.unwrap());
67 } else {
68 self.last_ft = cur_ft;
69 }
70 }
71 true
72 } else {
73 false
74 }
75 }
76 fn get_frame(&mut self) -> Option<NAFrameRef> {
77 if !self.frames.is_empty() {
78 Some(self.frames.remove(0))
79 } else {
80 None
81 }
82 }
83 fn flush(&mut self) {
84 self.frames.clear();
85 self.last_ft = FrameType::Other;
86 }
87 fn get_last_frames(&mut self) -> Option<NAFrameRef> {
88 self.get_frame()
89 }
90}
91