use nihav_core::frame::NASimpleVideoFrame;
use nihav_codec_support::codecs::{MV, ZERO_MV};
use nihav_codec_support::data::GenericCache;
-use super::FrameRefs;
+use super::SliceRefs;
+use super::pic_ref::FrameMBInfo;
#[repr(u8)]
#[derive(Clone,Copy,Debug,PartialEq)]
impl MBType {
pub fn is_intra(self) -> bool {
- match self {
- MBType::Intra4x4 | MBType::Intra8x8 | MBType::Intra16x16(_, _, _) | MBType::PCM => true,
- _ => false,
- }
+ matches!(self, MBType::Intra4x4 | MBType::Intra8x8 | MBType::Intra16x16(_, _, _) | MBType::PCM)
}
pub fn is_intra16x16(self) -> bool {
- if let MBType::Intra16x16(_, _, _) = self {
- true
- } else {
- false
- }
+ matches!(self, MBType::Intra16x16(_, _, _))
}
pub fn is_skip(self) -> bool {
- match self {
- MBType::PSkip | MBType::BSkip => true,
- _ => false,
- }
+ matches!(self, MBType::PSkip | MBType::BSkip)
}
pub fn is_4x4(self) -> bool { self.num_parts() == 4 }
pub fn is_l0(self, part: usize) -> bool {
impl CompactMBType {
pub fn is_intra(self) -> bool {
- match self {
- CompactMBType::Intra4x4 | CompactMBType::Intra8x8 | CompactMBType::Intra16x16 => true,
- _ => false,
- }
+ matches!(self, CompactMBType::Intra4x4 | CompactMBType::Intra8x8 | CompactMBType::Intra16x16)
}
pub fn is_intra16orpcm(self) -> bool {
- match self {
- CompactMBType::Intra16x16 | CompactMBType::PCM => true,
- _ => false,
- }
+ matches!(self, CompactMBType::Intra16x16 | CompactMBType::PCM)
}
pub fn is_skip(self) -> bool {
- match self {
- CompactMBType::PSkip | CompactMBType::BSkip => true,
- _ => false,
- }
+ matches!(self, CompactMBType::PSkip | CompactMBType::BSkip)
}
pub fn is_direct(self) -> bool {
- match self {
- CompactMBType::BSkip | CompactMBType::Direct | CompactMBType::None => true,
- _ => false,
- }
+ matches!(self, CompactMBType::BSkip | CompactMBType::Direct | CompactMBType::None)
}
pub fn is_inter(self) -> bool {
!self.is_intra() && !self.is_skip() && self != CompactMBType::PCM
}
pub fn is_16x16_ref(self) -> bool {
- match self {
+ matches!(self,
CompactMBType::Intra4x4 |
CompactMBType::Intra8x8 |
CompactMBType::Intra16x16 |
CompactMBType::PCM |
CompactMBType::P16x16 |
- CompactMBType::B16x16 => true,
- _ => false,
- }
+ CompactMBType::B16x16)
}
}
}
}
-impl Into<u8> for IntraPredMode {
- fn into(self) -> u8 {
- match self {
+impl From<IntraPredMode> for u8 {
+ fn from(val: IntraPredMode) -> Self {
+ match val {
IntraPredMode::Vertical => 0,
IntraPredMode::Horizontal => 1,
IntraPredMode::DC => 2,
}
}
}
- pub fn fill_deblock(&mut self, frefs: &FrameRefs, deblock_mode: u8, is_s: bool) {
+ pub fn fill_deblock(&mut self, frefs: &SliceRefs, deblock_mode: u8, is_s: bool) {
if deblock_mode == 1 {
return;
}
let tx8x8 = self.get_cur_mb().transform_8x8;
- let cur_mbt = self.get_cur_mb().mb_type;
- let left_mbt = self.get_left_mb().mb_type;
- let mut top_mbt = self.get_top_mb().mb_type;
+ let cur_intra = self.get_cur_mb().mb_type.is_intra();
+ let left_intra = self.get_left_mb().mb_type.is_intra();
+ let mut top_intra = self.get_top_mb().mb_type.is_intra();
for y in 0..4 {
let can_do_top = y != 0 || (self.mb_y != 0 && (self.has_top || deblock_mode != 2));
if can_do_top && (!tx8x8 || (y & 1) == 0) {
- if is_s || cur_mbt.is_intra() || top_mbt.is_intra() {
+ if is_s || cur_intra || top_intra {
let val = if y == 0 { 0x40 } else { 0x30 };
for el in self.deblock[y * 4..][..4].iter_mut() { *el |= val; }
} else {
}
}
}
- let mut lleft_mbt = left_mbt;
+ let mut lleft_intra = left_intra;
for x in 0..4 {
let skip_8 = tx8x8 && (x & 1) != 0;
let can_do_left = x > 0 || self.has_left || (self.mb_x != 0 && deblock_mode != 2);
let blk4 = x + y * 4;
let blk8 = x / 2 + (y / 2) * 2;
if skip_8 {
- } else if is_s || cur_mbt.is_intra() || lleft_mbt.is_intra() {
+ } else if is_s || cur_intra || lleft_intra {
self.deblock[y * 4 + x] |= if x == 0 { 4 } else { 3 };
} else if self.get_cur_blk4(blk4).ncoded != 0 || self.get_left_blk4(blk4).ncoded != 0 {
self.deblock[y * 4 + x] |= 2;
self.deblock[y * 4 + x] |= 1;
}
}
- lleft_mbt = cur_mbt;
+ lleft_intra = cur_intra;
}
- top_mbt = cur_mbt;
+ top_intra = cur_intra;
}
}
pub fn next_mb(&mut self) {
self.fill_mv (0, 0, 16, 16, 0, mv);
self.fill_ref(0, 0, 16, 16, 0, ref_idx);
}
- pub fn predict_direct_mb(&mut self, frame_refs: &FrameRefs, temporal_mv: bool, direct_8x8: bool, cur_id: u16) {
- let (col_mb, _, _) = frame_refs.get_colocated_info(self.mb_x, self.mb_y);
+ pub fn predict_direct_mb(&mut self, frame_refs: &SliceRefs, temporal_mv: bool, direct_8x8: bool, cur_id: u16) {
+ let (col_mb, r1_poc, r1_long) = frame_refs.get_colocated_info(self.mb_x, self.mb_y);
if direct_8x8 {
for blk4 in 0..16 {
- let (mv0, ref0, mv1, ref1) = self.get_direct_mv(frame_refs, temporal_mv, cur_id, BLK4_TO_D8[blk4]);
+ let (mv0, ref0, mv1, ref1) = self.get_direct_mv(frame_refs, &col_mb, r1_poc, r1_long, temporal_mv, cur_id, BLK4_TO_D8[blk4]);
self.get_cur_blk4(blk4).mv = [mv0, mv1];
self.get_cur_blk8(blk4_to_blk8(blk4)).ref_idx = [ref0, ref1];
}
} else if col_mb.mb_type.is_16x16_ref() || !temporal_mv {
- let (mv0, ref0, mv1, ref1) = self.get_direct_mv(frame_refs, temporal_mv, cur_id, 0);
+ let (mv0, ref0, mv1, ref1) = self.get_direct_mv(frame_refs, &col_mb, r1_poc, r1_long, temporal_mv, cur_id, 0);
self.apply_to_blk4(|blk4| blk4.mv = [mv0, mv1]);
self.apply_to_blk8(|blk8| blk8.ref_idx = [ref0, ref1]);
} else {
for blk4 in 0..16 {
- let (mv0, ref0, mv1, ref1) = self.get_direct_mv(frame_refs, temporal_mv, cur_id, blk4);
+ let (mv0, ref0, mv1, ref1) = self.get_direct_mv(frame_refs, &col_mb, r1_poc, r1_long, temporal_mv, cur_id, blk4);
self.get_cur_blk4(blk4).mv = [mv0, mv1];
self.get_cur_blk8(blk4_to_blk8(blk4)).ref_idx = [ref0, ref1];
}
}
}
- pub fn predict_direct_sub(&mut self, frame_refs: &FrameRefs, temporal_mv: bool, direct8x8: bool, cur_id: u16, blk4: usize) {
+ pub fn predict_direct_sub(&mut self, frame_refs: &SliceRefs, temporal_mv: bool, direct8x8: bool, cur_id: u16, blk4: usize) {
let src_blk = if !direct8x8 { blk4 } else { BLK4_TO_D8[blk4] };
- let (mv0, ref0, mv1, ref1) = self.get_direct_mv(frame_refs, temporal_mv, cur_id, src_blk);
+ let (mbi, r1_poc, r1_long) = frame_refs.get_colocated_info(self.mb_x, self.mb_y);
+ let (mv0, ref0, mv1, ref1) = self.get_direct_mv(frame_refs, &mbi, r1_poc, r1_long, temporal_mv, cur_id, src_blk);
self.get_cur_blk4(blk4).mv = [mv0, mv1];
self.get_cur_blk8(blk4_to_blk8(blk4)).ref_idx = [ref0, ref1];
}
- pub fn get_direct_mv(&self, frame_refs: &FrameRefs, temporal_mv: bool, cur_id: u16, blk4: usize) -> (MV, PicRef, MV, PicRef) {
- let (mbi, r1_poc, r1_long) = frame_refs.get_colocated_info(self.mb_x, self.mb_y);
+ #[allow(clippy::nonminimal_bool)]
+ pub fn get_direct_mv(&self, frame_refs: &SliceRefs, mbi: &FrameMBInfo, r1_poc: u16, r1_long: bool, temporal_mv: bool, cur_id: u16, blk4: usize) -> (MV, PicRef, MV, PicRef) {
let blk8 = blk4_to_blk8(blk4);
let (col_mv, r0_poc, col_idx) = if mbi.ref_poc[blk8] == [MISSING_POC; 2] {
(ZERO_MV, MISSING_POC, MISSING_REF)