2 pub use crate::frame::{FrameType, NAFrameRef};
4 pub trait FrameReorderer {
5 fn add_frame(&mut self, fref: NAFrameRef) -> bool;
6 fn get_frame(&mut self) -> Option<NAFrameRef>;
8 fn get_last_frames(&mut self) -> Option<NAFrameRef>;
11 pub struct NoReorderer {
12 fref: Option<NAFrameRef>,
16 pub fn new() -> Self {
21 impl FrameReorderer for NoReorderer {
22 fn add_frame(&mut self, fref: NAFrameRef) -> bool {
23 if self.fref.is_none() {
24 self.fref = Some(fref);
30 fn get_frame(&mut self) -> Option<NAFrameRef> {
32 swap(&mut ret, &mut self.fref);
35 fn flush(&mut self) { self.fref = None; }
36 fn get_last_frames(&mut self) -> Option<NAFrameRef> { None }
39 pub struct IPBReorderer {
40 frames: Vec<NAFrameRef>,
46 pub fn new(max_depth: usize) -> Self {
48 frames: Vec::with_capacity(max_depth),
50 last_ft: FrameType::Other,
55 impl 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;
63 let pframe = self.frames.pop();
65 self.frames.push(fref);
66 self.frames.push(pframe.unwrap());
68 self.last_ft = cur_ft;
76 fn get_frame(&mut self) -> Option<NAFrameRef> {
77 if !self.frames.is_empty() {
78 Some(self.frames.remove(0))
85 self.last_ft = FrameType::Other;
87 fn get_last_frames(&mut self) -> Option<NAFrameRef> {