From 378e27a4ed3185d4397721ca05a4b8ad6b230961 Mon Sep 17 00:00:00 2001 From: Folkert Date: Mon, 18 Mar 2024 13:40:25 +0100 Subject: [PATCH 1/3] `enum InterIntraType`: make a real enum --- src/decode.rs | 30 +++++++++++--------- src/levels.rs | 16 ++++++----- src/recon.rs | 78 +++++++++++++++++++++++++++------------------------ 3 files changed, 67 insertions(+), 57 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index fcd0d75e4..9ed301f26 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -82,6 +82,7 @@ use crate::src::levels::BS_64x64; use crate::src::levels::BlockLevel; use crate::src::levels::BlockPartition; use crate::src::levels::BlockSize; +use crate::src::levels::InterIntraType; use crate::src::levels::MotionMode; use crate::src::levels::RectTxfmSize; use crate::src::levels::TxfmSize; @@ -96,9 +97,6 @@ use crate::src::levels::FILTER_2D_BILINEAR; use crate::src::levels::FILTER_PRED; use crate::src::levels::GLOBALMV; use crate::src::levels::GLOBALMV_GLOBALMV; -use crate::src::levels::INTER_INTRA_BLEND; -use crate::src::levels::INTER_INTRA_NONE; -use crate::src::levels::INTER_INTRA_WEDGE; use crate::src::levels::MM_OBMC; use crate::src::levels::MM_TRANSLATION; use crate::src::levels::MM_WARP; @@ -1163,7 +1161,10 @@ unsafe fn splat_oneref_mv( r#ref: refmvs_refpair { r#ref: [ b.r#ref()[0] + 1, - if b.interintra_type() != 0 { 0 } else { -1 }, + match b.interintra_type() { + InterIntraType::None => -1, + _ => 0, + }, ], }, bs: bs as u8, @@ -2970,12 +2971,15 @@ unsafe fn decode_b_inner( N_INTER_INTRA_PRED_MODES as usize - 1, ) as u8; let wedge_ctx = dav1d_wedge_ctx_lut[bs as usize] as c_int; - *b.interintra_type_mut() = INTER_INTRA_BLEND - + rav1d_msac_decode_bool_adapt( - &mut ts.msac, - &mut ts.cdf.m.interintra_wedge[wedge_ctx as usize], - ) as u8; - if b.interintra_type() == INTER_INTRA_WEDGE { + *b.interintra_type_mut() = if rav1d_msac_decode_bool_adapt( + &mut ts.msac, + &mut ts.cdf.m.interintra_wedge[wedge_ctx as usize], + ) { + InterIntraType::Wedge + } else { + InterIntraType::Blend + }; + if b.interintra_type() == InterIntraType::Wedge { *b.wedge_idx_mut() = rav1d_msac_decode_symbol_adapt16( &mut ts.msac, &mut ts.cdf.m.wedge_idx[wedge_ctx as usize], @@ -2983,14 +2987,14 @@ unsafe fn decode_b_inner( ) as u8; } } else { - *b.interintra_type_mut() = INTER_INTRA_NONE; + *b.interintra_type_mut() = InterIntraType::None; } if debug_block_info!(f, t) && seq_hdr.inter_intra != 0 && interintra_allowed_mask & (1 << bs) != 0 { println!( - "Post-interintra[t={},m={},w={}]: r={}", + "Post-interintra[t={:?},m={},w={}]: r={}", b.interintra_type(), b.interintra_mode(), b.wedge_idx(), @@ -3000,7 +3004,7 @@ unsafe fn decode_b_inner( // motion variation if frame_hdr.switchable_motion_mode != 0 - && b.interintra_type() == INTER_INTRA_NONE + && b.interintra_type() == InterIntraType::None && cmp::min(bw4, bh4) >= 2 // is not warped global motion && !(!frame_hdr.force_integer_mv diff --git a/src/levels.rs b/src/levels.rs index 757ab1637..a9dd82aa2 100644 --- a/src/levels.rs +++ b/src/levels.rs @@ -209,10 +209,12 @@ pub const COMP_INTER_AVG: CompInterType = 2; pub const COMP_INTER_WEIGHTED_AVG: CompInterType = 1; pub const COMP_INTER_NONE: CompInterType = 0; -pub type InterIntraType = u8; -pub const INTER_INTRA_WEDGE: InterIntraType = 2; -pub const INTER_INTRA_BLEND: InterIntraType = 1; -pub const INTER_INTRA_NONE: InterIntraType = 0; +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum InterIntraType { + None = 0, + Blend = 1, + Wedge = 2, +} /// Note that this is legitimately [`Copy`] /// (unlike other transpiled types that are [`Copy`] due to being from C). @@ -308,7 +310,7 @@ pub struct Av1Block_inter { pub r#ref: [i8; 2], pub max_ytx: u8, pub filter2d: u8, - pub interintra_type: u8, + pub interintra_type: InterIntraType, pub tx_split0: u8, pub tx_split1: u16, } @@ -526,11 +528,11 @@ impl Av1Block { &mut self.c2rust_unnamed.c2rust_unnamed_0.max_ytx } - pub unsafe fn interintra_type(&self) -> u8 { + pub unsafe fn interintra_type(&self) -> InterIntraType { self.c2rust_unnamed.c2rust_unnamed_0.interintra_type } - pub unsafe fn interintra_type_mut(&mut self) -> &mut u8 { + pub unsafe fn interintra_type_mut(&mut self) -> &mut InterIntraType { &mut self.c2rust_unnamed.c2rust_unnamed_0.interintra_type } diff --git a/src/recon.rs b/src/recon.rs index 8c31f865d..80f442441 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -28,6 +28,7 @@ use crate::src::levels::mv; use crate::src::levels::Av1Block; use crate::src::levels::BlockSize; use crate::src::levels::Filter2d; +use crate::src::levels::InterIntraType; use crate::src::levels::IntraPredMode; use crate::src::levels::RectTxfmSize; use crate::src::levels::TxClass; @@ -43,7 +44,6 @@ use crate::src::levels::GLOBALMV; use crate::src::levels::GLOBALMV_GLOBALMV; use crate::src::levels::IDTX; use crate::src::levels::II_SMOOTH_PRED; -use crate::src::levels::INTER_INTRA_BLEND; use crate::src::levels::MM_OBMC; use crate::src::levels::MM_WARP; use crate::src::levels::RTX_16X32; @@ -3439,7 +3439,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( } } } - if b.c2rust_unnamed.c2rust_unnamed_0.interintra_type != 0 { + if b.c2rust_unnamed.c2rust_unnamed_0.interintra_type != InterIntraType::None { let interintra_edge = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); let tl_edge_array = &mut interintra_edge.0.edge; let tl_edge_offset = 32; @@ -3510,22 +3510,25 @@ pub(crate) unsafe fn rav1d_recon_b_inter( 0 as c_int, BD::from_c(f.bitdepth_max), ); - let ii_mask = if b.c2rust_unnamed.c2rust_unnamed_0.interintra_type as c_int - == INTER_INTRA_BLEND as c_int - { - dav1d_ii_masks[bs as usize][0][b - .c2rust_unnamed - .c2rust_unnamed_0 - .c2rust_unnamed - .c2rust_unnamed - .interintra_mode as usize] - } else { - dav1d_wedge_masks[bs as usize][0][0][b - .c2rust_unnamed - .c2rust_unnamed_0 - .c2rust_unnamed - .c2rust_unnamed - .wedge_idx as usize] + let ii_mask = match b.c2rust_unnamed.c2rust_unnamed_0.interintra_type { + InterIntraType::Blend => { + dav1d_ii_masks[bs as usize][0][b + .c2rust_unnamed + .c2rust_unnamed_0 + .c2rust_unnamed + .c2rust_unnamed + .interintra_mode + as usize] + } + _ => { + dav1d_wedge_masks[bs as usize][0][0][b + .c2rust_unnamed + .c2rust_unnamed_0 + .c2rust_unnamed + .c2rust_unnamed + .wedge_idx + as usize] + } }; ((*dsp).mc.blend)( dst.cast(), @@ -3839,25 +3842,26 @@ pub(crate) unsafe fn rav1d_recon_b_inter( pl += 1; } } - if b.c2rust_unnamed.c2rust_unnamed_0.interintra_type != 0 { - let ii_mask = if b.c2rust_unnamed.c2rust_unnamed_0.interintra_type as c_int - == INTER_INTRA_BLEND as c_int - { - dav1d_ii_masks[bs as usize][chr_layout_idx as usize][b - .c2rust_unnamed - .c2rust_unnamed_0 - .c2rust_unnamed - .c2rust_unnamed - .interintra_mode - as usize] - } else { - dav1d_wedge_masks[bs as usize][chr_layout_idx as usize][0][b - .c2rust_unnamed - .c2rust_unnamed_0 - .c2rust_unnamed - .c2rust_unnamed - .wedge_idx - as usize] + if b.c2rust_unnamed.c2rust_unnamed_0.interintra_type != InterIntraType::None { + let ii_mask = match b.c2rust_unnamed.c2rust_unnamed_0.interintra_type { + InterIntraType::Blend => { + dav1d_ii_masks[bs as usize][chr_layout_idx as usize][b + .c2rust_unnamed + .c2rust_unnamed_0 + .c2rust_unnamed + .c2rust_unnamed + .interintra_mode + as usize] + } + _ => { + dav1d_wedge_masks[bs as usize][chr_layout_idx as usize][0][b + .c2rust_unnamed + .c2rust_unnamed_0 + .c2rust_unnamed + .c2rust_unnamed + .wedge_idx + as usize] + } }; let mut pl = 0; while pl < 2 { From 57891e3d00ee2d18de1c6af9ea0aed146ac31588 Mon Sep 17 00:00:00 2001 From: Folkert Date: Tue, 19 Mar 2024 12:28:24 +0100 Subject: [PATCH 2/3] use `Option` and remove the `None` variant --- src/decode.rs | 15 ++++++--------- src/levels.rs | 11 +++++------ src/recon.rs | 12 ++++++------ 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 9ed301f26..e954e1c8f 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -1161,10 +1161,7 @@ unsafe fn splat_oneref_mv( r#ref: refmvs_refpair { r#ref: [ b.r#ref()[0] + 1, - match b.interintra_type() { - InterIntraType::None => -1, - _ => 0, - }, + b.interintra_type().map(|_| 0).unwrap_or(-1), ], }, bs: bs as u8, @@ -2975,11 +2972,11 @@ unsafe fn decode_b_inner( &mut ts.msac, &mut ts.cdf.m.interintra_wedge[wedge_ctx as usize], ) { - InterIntraType::Wedge + Some(InterIntraType::Wedge) } else { - InterIntraType::Blend + Some(InterIntraType::Blend) }; - if b.interintra_type() == InterIntraType::Wedge { + if b.interintra_type() == Some(InterIntraType::Wedge) { *b.wedge_idx_mut() = rav1d_msac_decode_symbol_adapt16( &mut ts.msac, &mut ts.cdf.m.wedge_idx[wedge_ctx as usize], @@ -2987,7 +2984,7 @@ unsafe fn decode_b_inner( ) as u8; } } else { - *b.interintra_type_mut() = InterIntraType::None; + *b.interintra_type_mut() = None; } if debug_block_info!(f, t) && seq_hdr.inter_intra != 0 @@ -3004,7 +3001,7 @@ unsafe fn decode_b_inner( // motion variation if frame_hdr.switchable_motion_mode != 0 - && b.interintra_type() == InterIntraType::None + && b.interintra_type() == None && cmp::min(bw4, bh4) >= 2 // is not warped global motion && !(!frame_hdr.force_integer_mv diff --git a/src/levels.rs b/src/levels.rs index a9dd82aa2..02c427476 100644 --- a/src/levels.rs +++ b/src/levels.rs @@ -211,9 +211,8 @@ pub const COMP_INTER_NONE: CompInterType = 0; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum InterIntraType { - None = 0, - Blend = 1, - Wedge = 2, + Blend, + Wedge, } /// Note that this is legitimately [`Copy`] @@ -310,7 +309,7 @@ pub struct Av1Block_inter { pub r#ref: [i8; 2], pub max_ytx: u8, pub filter2d: u8, - pub interintra_type: InterIntraType, + pub interintra_type: Option, pub tx_split0: u8, pub tx_split1: u16, } @@ -528,11 +527,11 @@ impl Av1Block { &mut self.c2rust_unnamed.c2rust_unnamed_0.max_ytx } - pub unsafe fn interintra_type(&self) -> InterIntraType { + pub unsafe fn interintra_type(&self) -> Option { self.c2rust_unnamed.c2rust_unnamed_0.interintra_type } - pub unsafe fn interintra_type_mut(&mut self) -> &mut InterIntraType { + pub unsafe fn interintra_type_mut(&mut self) -> &mut Option { &mut self.c2rust_unnamed.c2rust_unnamed_0.interintra_type } diff --git a/src/recon.rs b/src/recon.rs index 80f442441..a196987e3 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -3439,7 +3439,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( } } } - if b.c2rust_unnamed.c2rust_unnamed_0.interintra_type != InterIntraType::None { + if let Some(interintra_type) = b.c2rust_unnamed.c2rust_unnamed_0.interintra_type { let interintra_edge = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge); let tl_edge_array = &mut interintra_edge.0.edge; let tl_edge_offset = 32; @@ -3510,7 +3510,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( 0 as c_int, BD::from_c(f.bitdepth_max), ); - let ii_mask = match b.c2rust_unnamed.c2rust_unnamed_0.interintra_type { + let ii_mask = match interintra_type { InterIntraType::Blend => { dav1d_ii_masks[bs as usize][0][b .c2rust_unnamed @@ -3520,7 +3520,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( .interintra_mode as usize] } - _ => { + InterIntraType::Wedge => { dav1d_wedge_masks[bs as usize][0][0][b .c2rust_unnamed .c2rust_unnamed_0 @@ -3842,8 +3842,8 @@ pub(crate) unsafe fn rav1d_recon_b_inter( pl += 1; } } - if b.c2rust_unnamed.c2rust_unnamed_0.interintra_type != InterIntraType::None { - let ii_mask = match b.c2rust_unnamed.c2rust_unnamed_0.interintra_type { + if let Some(interintra_type) = b.c2rust_unnamed.c2rust_unnamed_0.interintra_type { + let ii_mask = match interintra_type { InterIntraType::Blend => { dav1d_ii_masks[bs as usize][chr_layout_idx as usize][b .c2rust_unnamed @@ -3853,7 +3853,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( .interintra_mode as usize] } - _ => { + InterIntraType::Wedge => { dav1d_wedge_masks[bs as usize][chr_layout_idx as usize][0][b .c2rust_unnamed .c2rust_unnamed_0 From 9626bb7f3927b9b872f870df196d97a6e325d876 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Tue, 19 Mar 2024 15:25:21 -0700 Subject: [PATCH 3/3] `fn decode_b_inner`: Refactor out `ii_type` var. --- src/decode.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index e954e1c8f..f0a2b1193 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -2968,15 +2968,16 @@ unsafe fn decode_b_inner( N_INTER_INTRA_PRED_MODES as usize - 1, ) as u8; let wedge_ctx = dav1d_wedge_ctx_lut[bs as usize] as c_int; - *b.interintra_type_mut() = if rav1d_msac_decode_bool_adapt( + let ii_type = if rav1d_msac_decode_bool_adapt( &mut ts.msac, &mut ts.cdf.m.interintra_wedge[wedge_ctx as usize], ) { - Some(InterIntraType::Wedge) + InterIntraType::Wedge } else { - Some(InterIntraType::Blend) + InterIntraType::Blend }; - if b.interintra_type() == Some(InterIntraType::Wedge) { + *b.interintra_type_mut() = Some(ii_type); + if ii_type == InterIntraType::Wedge { *b.wedge_idx_mut() = rav1d_msac_decode_symbol_adapt16( &mut ts.msac, &mut ts.cdf.m.wedge_idx[wedge_ctx as usize],