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 }
40 pub struct IPBReorderer {
41 rframe: Option<NAFrameRef>,
42 bframe: Option<NAFrameRef>,
46 pub fn new() -> Self { Self::default() }
49 impl FrameReorderer for IPBReorderer {
50 fn add_frame(&mut self, fref: NAFrameRef) -> bool {
51 if self.rframe.is_some() && self.bframe.is_some() { return false; }
52 let is_b = fref.get_frame_type() == FrameType::B;
53 if is_b && self.bframe.is_some() { return false; }
55 self.bframe = Some(fref);
57 std::mem::swap(&mut self.bframe, &mut self.rframe);
58 self.rframe = Some(fref);
62 fn get_frame(&mut self) -> Option<NAFrameRef> {
64 if self.bframe.is_some() {
65 std::mem::swap(&mut ret, &mut self.bframe);
73 fn get_last_frames(&mut self) -> Option<NAFrameRef> {
75 if self.bframe.is_some() {
76 std::mem::swap(&mut ret, &mut self.bframe);
77 } else if self.rframe.is_some() {
78 std::mem::swap(&mut ret, &mut self.rframe);