X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-itu%2Fsrc%2Fcodecs%2Fh264%2Ftypes.rs;h=319ebf5f5aafb9817aa75c04e0cb117c04f3c3c1;hb=42005e259dd77147b77c7a0057aa3cf033e331d0;hp=3456b990b03e3bc5ecd17cce3af7a0af97688b42;hpb=d85f94f7fd0c00c63c33b3bc1dcf2640ec6bd52c;p=nihav.git diff --git a/nihav-itu/src/codecs/h264/types.rs b/nihav-itu/src/codecs/h264/types.rs index 3456b99..319ebf5 100644 --- a/nihav-itu/src/codecs/h264/types.rs +++ b/nihav-itu/src/codecs/h264/types.rs @@ -2,6 +2,7 @@ use nihav_core::frame::NASimpleVideoFrame; use nihav_codec_support::codecs::{MV, ZERO_MV}; use nihav_codec_support::data::GenericCache; use super::FrameRefs; +use super::pic_ref::FrameMBInfo; #[repr(u8)] #[derive(Clone,Copy,Debug,PartialEq)] @@ -35,23 +36,13 @@ pub enum MBType { 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 { @@ -199,42 +190,28 @@ pub enum CompactMBType { 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) } } @@ -312,9 +289,9 @@ impl From for IntraPredMode { } } -impl Into for IntraPredMode { - fn into(self) -> u8 { - match self { +impl From for u8 { + fn from(val: IntraPredMode) -> Self { + match val { IntraPredMode::Vertical => 0, IntraPredMode::Horizontal => 1, IntraPredMode::DC => 2, @@ -522,13 +499,13 @@ impl SliceState { 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 { @@ -549,7 +526,7 @@ impl SliceState { } } } - 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); @@ -559,7 +536,7 @@ impl SliceState { 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; @@ -572,9 +549,9 @@ impl SliceState { 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) { @@ -768,20 +745,20 @@ impl SliceState { 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); + 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]; } @@ -789,12 +766,13 @@ impl SliceState { } pub fn predict_direct_sub(&mut self, frame_refs: &FrameRefs, 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: &FrameRefs, 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)