- pub fn new(max_depth: usize) -> Self {
- Self {
- frames: Vec::with_capacity(max_depth),
- max_depth,
- last_ft: FrameType::Other,
+ /// Constructs a new instance of `IPBReorderer`.
+ pub fn new() -> Self { Self::default() }
+}
+
+impl FrameReorderer for IPBReorderer {
+ fn add_frame(&mut self, fref: NAFrameRef) -> bool {
+ if self.rframe.is_some() && self.bframe.is_some() { return false; }
+ let is_b = fref.get_frame_type() == FrameType::B;
+ if is_b && self.bframe.is_some() { return false; }
+ if is_b {
+ self.bframe = Some(fref);
+ } else {
+ std::mem::swap(&mut self.bframe, &mut self.rframe);
+ self.rframe = Some(fref);
+ }
+ true
+ }
+ fn get_frame(&mut self) -> Option<NAFrameRef> {
+ let mut ret = None;
+ if self.bframe.is_some() {
+ std::mem::swap(&mut ret, &mut self.bframe);
+ }
+ ret
+ }
+ fn flush(&mut self) {
+ self.rframe = None;
+ self.bframe = None;
+ }
+ fn get_last_frames(&mut self) -> Option<NAFrameRef> {
+ let mut ret = None;
+ if self.bframe.is_some() {
+ std::mem::swap(&mut ret, &mut self.bframe);
+ } else if self.rframe.is_some() {
+ std::mem::swap(&mut ret, &mut self.rframe);