diff --git a/include/common/bitdepth.rs b/include/common/bitdepth.rs index 32d0e4dc7..81d180afa 100644 --- a/include/common/bitdepth.rs +++ b/include/common/bitdepth.rs @@ -231,14 +231,6 @@ pub trait BitDepth: Clone + Copy { fn get_intermediate_bits(&self) -> u8; - fn _cast_coef_slice(bytes: &[u8]) -> &[Self::Coef] { - Self::Coef::slice_from(bytes).unwrap() - } - - fn cast_coef_slice_mut(bytes: &mut [u8]) -> &mut [Self::Coef] { - Self::Coef::mut_slice_from(bytes).unwrap() - } - const PREP_BIAS: i16; unsafe fn select(bd: &BitDepthUnion) -> &T::T diff --git a/include/common/dump.rs b/include/common/dump.rs index 6120776d8..b8d79ec7d 100644 --- a/include/common/dump.rs +++ b/include/common/dump.rs @@ -42,9 +42,9 @@ pub unsafe fn hex_dump( #[inline] pub fn coef_dump(buf: &[Coef], w: usize, h: usize, len: usize, what: &str) { println!("{}", what); - for buf in buf[..w * h].chunks_exact(w).take(h) { - for x in buf { - print!(" {:0len$}", x, len = len); + for row in buf[..w * h].chunks_exact(w).take(h) { + for coef in row { + print!(" {:0len$}", coef, len = len); } println!(); } diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 15f3884a3..e8151b6ec 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -165,7 +165,7 @@ fn adjust_strength(strength: c_int, var: c_uint) -> c_int { pub(crate) unsafe fn rav1d_cdef_brow( c: &Rav1dContext, tc: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, p: &[*mut BD::Pixel; 3], lflvl_offset: i32, by_start: c_int, diff --git a/src/decode.rs b/src/decode.rs index 8162e0b9e..a6ce08f48 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -755,7 +755,7 @@ unsafe fn read_pal_indices( unsafe fn read_vartx_tree( t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, b: &mut Av1Block, bs: BlockSize, bx4: c_int, @@ -1108,40 +1108,11 @@ unsafe fn obmc_lowest_px( unsafe fn decode_b( c: &Rav1dContext, t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, - bl: BlockLevel, - bs: BlockSize, - bp: BlockPartition, - intra_edge_flags: EdgeFlags, -) -> Result<(), ()> { - // Pull out the current block from Rav1dFrameData so that we can operate on - // it without borrow check errors. - let (mut b_mem, b_idx) = if t.frame_thread.pass != 0 { - let b_idx = (t.b.y as isize * f.b4_stride + t.b.x as isize) as usize; - (mem::take(&mut f.frame_thread.b[b_idx]), Some(b_idx)) - } else { - (Default::default(), None) - }; - let b = &mut b_mem; - let res = decode_b_inner(c, t, f, bl, bs, bp, intra_edge_flags, b); - if let Some(i) = b_idx { - let _old_b = mem::replace(&mut f.frame_thread.b[i], b_mem); - // TODO(SJC): We should be able to compare Av1Blocks, but there are C - // unions in them. - // assert_eq!(old_b, Default::default()); - } - res -} - -unsafe fn decode_b_inner( - c: &Rav1dContext, - t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, bl: BlockLevel, bs: BlockSize, bp: BlockPartition, intra_edge_flags: EdgeFlags, - b: &mut Av1Block, ) -> Result<(), ()> { use std::fmt; @@ -1155,6 +1126,18 @@ unsafe fn decode_b_inner( } } + let mut b_guard; + let mut b_mem = Av1Block::default(); + let b = if t.frame_thread.pass != 0 { + b_guard = f + .frame_thread + .b + .index_mut((t.b.y as isize * f.b4_stride + t.b.x as isize) as usize); + &mut *b_guard + } else { + &mut b_mem + }; + let ts = &mut *f.ts.offset(t.ts as isize); let bd_fn = f.bd_fn(); let b_dim = &dav1d_block_dimensions[bs as usize]; @@ -1784,13 +1767,17 @@ unsafe fn decode_b_inner( } if b.pal_sz()[0] != 0 { + let mut pal_idx_guard; let pal_idx = if t.frame_thread.pass != 0 { let p = t.frame_thread.pass & 1; let frame_thread = &mut ts.frame_thread[p as usize]; let len = usize::try_from(bw4 * bh4 * 16).unwrap(); - let pal_idx = &mut f.frame_thread.pal_idx[frame_thread.pal_idx..][..len]; + pal_idx_guard = f + .frame_thread + .pal_idx + .index_mut(frame_thread.pal_idx..frame_thread.pal_idx + len); frame_thread.pal_idx += len; - pal_idx + &mut *pal_idx_guard } else { &mut t.scratch.c2rust_unnamed_0.pal_idx }; @@ -1811,13 +1798,17 @@ unsafe fn decode_b_inner( } if has_chroma && b.pal_sz()[1] != 0 { + let mut pal_idx_guard; let pal_idx = if t.frame_thread.pass != 0 { let p = t.frame_thread.pass & 1; let frame_thread = &mut ts.frame_thread[p as usize]; let len = usize::try_from(cbw4 * cbh4 * 16).unwrap(); - let pal_idx = &mut f.frame_thread.pal_idx[frame_thread.pal_idx..][..len]; + pal_idx_guard = f + .frame_thread + .pal_idx + .index_mut(frame_thread.pal_idx..frame_thread.pal_idx + len); frame_thread.pal_idx += len; - pal_idx + &mut *pal_idx_guard } else { &mut t.scratch.c2rust_unnamed_0.pal_idx[(bw4 * bh4 * 16) as usize..] }; @@ -1879,7 +1870,7 @@ unsafe fn decode_b_inner( TileStateRef::Local => &ts.lflvlmem, }; rav1d_create_lf_mask_intra( - &mut f.lf.mask[t.lf_mask.unwrap()], + &f.lf.mask[t.lf_mask.unwrap()], &f.lf.level, f.b4_stride, &lflvl[b.seg_id as usize], @@ -2897,7 +2888,7 @@ unsafe fn decode_b_inner( TileStateRef::Local => &ts.lflvlmem, }; rav1d_create_lf_mask_inter( - &mut f.lf.mask[t.lf_mask.unwrap()], + &f.lf.mask[t.lf_mask.unwrap()], &f.lf.level, f.b4_stride, // In C, the inner dimensions (`ref`, `is_gmv`) are offset, @@ -2989,7 +2980,7 @@ unsafe fn decode_b_inner( if b.skip == 0 { let mask = !0u32 >> 32 - bw4 << (bx4 & 15); let bx_idx = (bx4 & 16) >> 4; - for noskip_mask in &mut f.lf.mask[t.lf_mask.unwrap()].noskip_mask[by4 as usize >> 1..] + for noskip_mask in &f.lf.mask[t.lf_mask.unwrap()].noskip_mask[by4 as usize >> 1..] [..(bh4 as usize + 1) / 2] { noskip_mask[bx_idx as usize].fetch_or(mask as u16, Ordering::Relaxed); @@ -3237,7 +3228,7 @@ unsafe fn decode_b_inner( unsafe fn decode_sb( c: &Rav1dContext, t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, bl: BlockLevel, edge_index: EdgeIndex, ) -> Result<(), ()> { @@ -3310,7 +3301,10 @@ unsafe fn decode_sb( ); } } else { - let b = &f.frame_thread.b[(t.b.y as isize * f.b4_stride + t.b.x as isize) as usize]; + let b = f + .frame_thread + .b + .index((t.b.y as isize * f.b4_stride + t.b.x as isize) as usize); bp = if b.bl == bl { b.bp } else { @@ -3471,7 +3465,10 @@ unsafe fn decode_sb( ); } } else { - let b = &f.frame_thread.b[(t.b.y as isize * f.b4_stride + t.b.x as isize) as usize]; + let b = &f + .frame_thread + .b + .index((t.b.y as isize * f.b4_stride + t.b.x as isize) as usize); is_split = b.bl != bl; } @@ -3524,7 +3521,10 @@ unsafe fn decode_sb( ); } } else { - let b = &f.frame_thread.b[(t.b.y as isize * f.b4_stride + t.b.x as isize) as usize]; + let b = &f + .frame_thread + .b + .index((t.b.y as isize * f.b4_stride + t.b.x as isize) as usize); is_split = b.bl != bl; } @@ -4123,7 +4123,10 @@ pub(crate) unsafe fn rav1d_decode_frame_init( let cf_sz = (num_sb128 * size_mul[0] as c_int) << hbd; // TODO: Fallible allocation - f.frame_thread.cf.resize(cf_sz as usize * 128 * 128 / 2, 0); + f.frame_thread + .cf + .get_mut() + .resize(cf_sz as usize * 128 * 128 / 2, 0); if frame_hdr.allow_screen_content_tools { // TODO: Fallible allocation @@ -4539,8 +4542,9 @@ pub(crate) unsafe fn rav1d_decode_frame_exit( if !f.sr_cur.p.data.data[0].is_null() { f.task_thread.error = AtomicI32::new(0); } - if c.n_fc > 1 && retval.is_err() && !f.frame_thread.cf.is_empty() { - f.frame_thread.cf.fill_with(Default::default) + let cf = f.frame_thread.cf.get_mut(); + if c.n_fc > 1 && retval.is_err() && !cf.is_empty() { + cf.fill_with(Default::default); } // TODO(kkysen) use array::zip when stable for i in 0..7 { diff --git a/src/internal.rs b/src/internal.rs index ee1a3d4e9..4d01fec23 100644 --- a/src/internal.rs +++ b/src/internal.rs @@ -402,7 +402,7 @@ pub(crate) struct Rav1dFrameContext_bd_fn { pub filter_sbrow_deblock_cols: filter_sbrow_fn, pub filter_sbrow_deblock_rows: filter_sbrow_fn, pub filter_sbrow_cdef: - unsafe fn(&Rav1dContext, &mut Rav1dFrameData, &mut Rav1dTaskContext, c_int) -> (), + unsafe fn(&Rav1dContext, &Rav1dFrameData, &mut Rav1dTaskContext, c_int) -> (), pub filter_sbrow_resize: filter_sbrow_fn, pub filter_sbrow_lr: filter_sbrow_fn, pub backup_ipred_edge: backup_ipred_edge_fn, @@ -444,7 +444,7 @@ impl Rav1dFrameContext_bd_fn { pub unsafe fn recon_b_intra( &self, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, context: &mut Rav1dTaskContext, block_size: BlockSize, flags: EdgeFlags, @@ -455,7 +455,7 @@ impl Rav1dFrameContext_bd_fn { pub unsafe fn recon_b_inter( &self, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, context: &mut Rav1dTaskContext, block_size: BlockSize, block: &Av1Block, @@ -465,7 +465,7 @@ impl Rav1dFrameContext_bd_fn { pub unsafe fn read_coef_blocks( &self, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, context: &mut Rav1dTaskContext, block_size: BlockSize, block: &Av1Block, @@ -548,7 +548,7 @@ pub struct Rav1dFrameContext_frame_thread { pub next_tile_row: [AtomicI32; 2], /// Indexed using `t.b.y * f.b4_stride + t.b.x`. - pub b: Vec, + pub b: DisjointMut>, pub cbi: Vec<[Atomic; 3]>, @@ -559,10 +559,10 @@ pub struct Rav1dFrameContext_frame_thread { pub pal: Pal, /// Iterated over inside tile state. - pub pal_idx: AlignedVec64, + pub pal_idx: DisjointMut>, /// [`AlignedVec64`]`<`[`DynCoef`]`>` - pub cf: AlignedVec64, + pub cf: DisjointMut>, /// Start offsets per tile pub tile_start_off: Vec, diff --git a/src/lf_apply.rs b/src/lf_apply.rs index f72088b8c..9bffb7212 100644 --- a/src/lf_apply.rs +++ b/src/lf_apply.rs @@ -585,14 +585,14 @@ unsafe fn filter_plane_rows_uv( } pub(crate) unsafe fn rav1d_loopfilter_sbrow_cols( - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, p: &mut [&mut [BD::Pixel]; 3], p_offset: &[usize; 2], lflvl_offset: usize, sby: c_int, start_of_tile_row: c_int, ) { - let lflvl = &mut f.lf.mask[lflvl_offset..]; + let lflvl = &f.lf.mask[lflvl_offset..]; let mut have_left; // Don't filter outside the frame let seq_hdr = &***f.seq_hdr.as_ref().unwrap(); let is_sb64 = (seq_hdr.sb128 == 0) as c_int; @@ -751,7 +751,7 @@ pub(crate) unsafe fn rav1d_loopfilter_sbrow_cols( } pub(crate) unsafe fn rav1d_loopfilter_sbrow_rows( - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, p: &mut [&mut [BD::Pixel]; 3], p_offset: &[usize; 2], lflvl_offset: usize, diff --git a/src/lr_apply.rs b/src/lr_apply.rs index 015f8bd93..70e326222 100644 --- a/src/lr_apply.rs +++ b/src/lr_apply.rs @@ -262,7 +262,7 @@ unsafe fn lr_sbrow( pub(crate) unsafe fn rav1d_lr_sbrow( c: &Rav1dContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, dst: &mut [&mut [BD::Pixel]; 3], dst_offset: &[usize; 2], sby: c_int, diff --git a/src/recon.rs b/src/recon.rs index 6dcabe43f..f7af96813 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -18,6 +18,7 @@ use crate::src::cdef_apply::rav1d_cdef_brow; use crate::src::ctx::CaseSet; use crate::src::env::get_uv_inter_txtp; use crate::src::internal::Bxy; +use crate::src::internal::Cf; use crate::src::internal::CodedBlockInfo; use crate::src::internal::EmuEdge; use crate::src::internal::Rav1dContext; @@ -133,22 +134,22 @@ macro_rules! debug_block_info { pub(crate) use debug_block_info; pub(crate) type recon_b_intra_fn = - unsafe fn(&mut Rav1dFrameData, &mut Rav1dTaskContext, BlockSize, EdgeFlags, &Av1Block) -> (); + unsafe fn(&Rav1dFrameData, &mut Rav1dTaskContext, BlockSize, EdgeFlags, &Av1Block) -> (); pub(crate) type recon_b_inter_fn = - unsafe fn(&mut Rav1dFrameData, &mut Rav1dTaskContext, BlockSize, &Av1Block) -> Result<(), ()>; + unsafe fn(&Rav1dFrameData, &mut Rav1dTaskContext, BlockSize, &Av1Block) -> Result<(), ()>; pub(crate) type filter_sbrow_fn = - unsafe fn(&Rav1dContext, &mut Rav1dFrameData, &mut Rav1dTaskContext, c_int) -> (); + unsafe fn(&Rav1dContext, &Rav1dFrameData, &mut Rav1dTaskContext, c_int) -> (); pub(crate) type backup_ipred_edge_fn = unsafe fn(&Rav1dFrameData, &mut Rav1dTaskContext) -> (); pub(crate) type read_coef_blocks_fn = - unsafe fn(&mut Rav1dFrameData, &mut Rav1dTaskContext, BlockSize, &Av1Block) -> (); + unsafe fn(&Rav1dFrameData, &mut Rav1dTaskContext, BlockSize, &Av1Block) -> (); pub(crate) type copy_pal_block_fn = unsafe fn( t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, bx4: usize, by4: usize, bw4: usize, @@ -157,7 +158,7 @@ pub(crate) type copy_pal_block_fn = unsafe fn( pub(crate) type read_pal_plane_fn = unsafe fn( t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, b: &mut Av1Block, pl: bool, sz_ctx: u8, @@ -167,7 +168,7 @@ pub(crate) type read_pal_plane_fn = unsafe fn( pub(crate) type read_pal_uv_fn = unsafe fn( t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, b: &mut Av1Block, sz_ctx: u8, bx4: usize, @@ -477,7 +478,7 @@ fn get_lo_ctx( } unsafe fn decode_coefs( - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, t: *mut Rav1dTaskContext, a: &mut [u8], l: &mut [u8], @@ -499,13 +500,6 @@ unsafe fn decode_coefs( let frame_hdr = &***f.frame_hdr.as_ref().unwrap(); let lossless = frame_hdr.segmentation.lossless[b.seg_id as usize]; let t_dim = &dav1d_txfm_dimensions[tx as usize]; - let cf = match cf { - CfSelect::Frame(offset) => { - let cf_buf = BD::cast_coef_slice_mut(&mut f.frame_thread.cf); - &mut cf_buf[offset..] - } - CfSelect::Task => &mut BD::select_mut(&mut (*t).cf).0, - }; let dbg = debug_block_info!(f, (*t).b) && plane != 0 && false; if dbg { println!("Start: r={}", ts.msac.rng); @@ -795,7 +789,7 @@ unsafe fn decode_coefs( ); } } - cf[rc as usize] = (tok << 11).as_::(); + cf.set::(f, &mut (*t).cf, rc as usize, (tok << 11).as_::()); levels[(x as isize * stride + y as isize) as usize] = level_tok as u8; let mut i = eob - 1; while i > 0 { @@ -877,7 +871,12 @@ unsafe fn decode_coefs( ); } level[0] = (tok + ((3 as c_int) << 6)) as u8; - cf[rc_i as usize] = ((tok << 11) as c_uint | rc).as_::(); + cf.set::( + f, + &mut (*t).cf, + rc_i as usize, + ((tok << 11) as c_uint | rc).as_::(), + ); rc = rc_i; } else { tok *= 0x17ff41 as c_int; @@ -886,7 +885,7 @@ unsafe fn decode_coefs( if tok != 0 { rc = rc_i; } - cf[rc_i as usize] = tok.as_::(); + cf.set::(f, &mut (*t).cf, rc_i as usize, tok.as_::()); } i -= 1; } @@ -1009,7 +1008,7 @@ unsafe fn decode_coefs( ); } } - cf[rc as usize] = (tok << 11).as_::(); + cf.set::(f, &mut (*t).cf, rc as usize, (tok << 11).as_::()); levels[(x as isize * stride + y as isize) as usize] = level_tok as u8; let mut i = eob - 1; while i > 0 { @@ -1091,7 +1090,12 @@ unsafe fn decode_coefs( ); } level[0] = (tok + ((3 as c_int) << 6)) as u8; - cf[rc_i as usize] = ((tok << 11) as c_uint | rc).as_::(); + cf.set::( + f, + &mut (*t).cf, + rc_i as usize, + ((tok << 11) as c_uint | rc).as_::(), + ); rc = rc_i; } else { tok *= 0x17ff41 as c_int; @@ -1100,7 +1104,7 @@ unsafe fn decode_coefs( if tok != 0 { rc = rc_i; } - cf[rc_i as usize] = tok.as_::(); + cf.set::(f, &mut (*t).cf, rc_i as usize, tok.as_::()); } i -= 1; } @@ -1223,7 +1227,7 @@ unsafe fn decode_coefs( ); } } - cf[rc as usize] = (tok << 11).as_::(); + cf.set::(f, &mut (*t).cf, rc as usize, (tok << 11).as_::()); levels[(x as isize * stride + y as isize) as usize] = level_tok as u8; let mut i = eob - 1; while i > 0 { @@ -1305,7 +1309,12 @@ unsafe fn decode_coefs( ); } level[0] = (tok + ((3 as c_int) << 6)) as u8; - cf[rc_i as usize] = ((tok << 11) as c_uint | rc).as_::(); + cf.set::( + f, + &mut (*t).cf, + rc_i as usize, + ((tok << 11) as c_uint | rc).as_::(), + ); rc = rc_i; } else { tok *= 0x17ff41 as c_int; @@ -1314,7 +1323,7 @@ unsafe fn decode_coefs( if tok != 0 { rc = rc_i; } - cf[rc_i as usize] = tok.as_::(); + cf.set::(f, &mut (*t).cf, rc_i as usize, tok.as_::()); } i -= 1; } @@ -1464,7 +1473,12 @@ unsafe fn decode_coefs( cul_level = dc_tok; dc_dq >>= dq_shift; dc_dq = cmp::min(dc_dq as c_uint, (cf_max + dc_sign) as c_uint) as c_int; - cf[0] = (if dc_sign != 0 { -dc_dq } else { dc_dq }).as_::(); + cf.set::( + f, + &mut (*t).cf, + 0, + (if dc_sign != 0 { -dc_dq } else { dc_dq }).as_::(), + ); if rc != 0 { current_block = 1669574575799829731; } else { @@ -1490,7 +1504,12 @@ unsafe fn decode_coefs( assert!(dc_dq <= cf_max); } cul_level = dc_tok; - cf[0] = (if dc_sign != 0 { -dc_dq } else { dc_dq }).as_::(); + cf.set::( + f, + &mut (*t).cf, + 0, + (if dc_sign != 0 { -dc_dq } else { dc_dq }).as_::(), + ); if rc != 0 { current_block = 2404388531445638768; } else { @@ -1506,7 +1525,7 @@ unsafe fn decode_coefs( if dbg { println!("Post-sign[{}={}]: r={}", rc, sign, ts.msac.rng); } - let rc_tok: c_uint = cf[rc as usize].as_::(); + let rc_tok: c_uint = cf.get::(f, &*t, rc as usize).as_::(); let mut tok: c_uint; let mut dq: c_uint = ac_dq // TODO: Remove `unwrap` once state machine control flow is cleaned up. @@ -1535,7 +1554,12 @@ unsafe fn decode_coefs( cul_level = cul_level.wrapping_add(tok); dq >>= dq_shift; dq_sat = cmp::min(dq, (cf_max + sign) as c_uint) as c_int; - cf[rc as usize] = (if sign != 0 { -dq_sat } else { dq_sat }).as_::(); + cf.set::( + f, + &mut (*t).cf, + rc as usize, + (if sign != 0 { -dq_sat } else { dq_sat }).as_::(), + ); rc = rc_tok & 0x3ff as c_int as c_uint; if !(rc != 0) { break; @@ -1549,7 +1573,7 @@ unsafe fn decode_coefs( if dbg { println!("Post-sign[{}={}]: r={}", rc, sign, ts.msac.rng); } - let rc_tok: c_uint = cf[rc as usize].as_::(); + let rc_tok: c_uint = cf.get::(f, &*t, rc as usize).as_::(); let mut tok: c_uint; let mut dq; if rc_tok >= ((15 as c_int) << 11) as c_uint { @@ -1573,7 +1597,12 @@ unsafe fn decode_coefs( assert!(dq <= cf_max); } cul_level = cul_level.wrapping_add(tok); - cf[rc as usize] = (if sign != 0 { -dq } else { dq }).as_::(); + cf.set::( + f, + &mut (*t).cf, + rc as usize, + (if sign != 0 { -dq } else { dq }).as_::(), + ); rc = rc_tok & 0x3ff as c_int as c_uint; if !(rc != 0) { break; @@ -1595,8 +1624,36 @@ enum CfSelect { Task, } +impl CfSelect { + unsafe fn set( + self, + f: &Rav1dFrameData, + task_cf: &mut BitDepthUnion, + index: usize, + value: BD::Coef, + ) { + match self { + CfSelect::Frame(offset) => { + let mut cf = unsafe { f.frame_thread.cf.mut_element_as(offset + index) }; + *cf = value; + } + CfSelect::Task => { + let cf = &mut unsafe { BD::select_mut(task_cf) }.0[index]; + *cf = value; + } + }; + } + + fn get(self, f: &Rav1dFrameData, t: &Rav1dTaskContext, index: usize) -> BD::Coef { + match self { + CfSelect::Frame(offset) => *f.frame_thread.cf.element_as(offset + index), + CfSelect::Task => unsafe { BD::select(&t.cf).0[index] }, + } + } +} + unsafe fn read_coef_tree( - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, t: *mut Rav1dTaskContext, bs: BlockSize, b: &Av1Block, @@ -1762,10 +1819,15 @@ unsafe fn read_coef_tree( if (*t).frame_thread.pass & 1 == 0 { assert!(!dst.is_null()); if eob >= 0 { + let mut cf_guard; let cf = match cf { CfSelect::Frame(offset) => { - let cf_buf = BD::cast_coef_slice_mut(&mut f.frame_thread.cf); - &mut cf_buf[offset..] + let len = cmp::min((*t_dim).h as usize, 8) + * 4 + * cmp::min((*t_dim).w as usize, 8) + * 4; + cf_guard = f.frame_thread.cf.mut_slice_as(offset..offset + len); + &mut *cf_guard } CfSelect::Task => &mut BD::select_mut(&mut (*t).cf).0, }; @@ -1801,7 +1863,7 @@ unsafe fn read_coef_tree( } pub(crate) unsafe fn rav1d_read_coef_blocks( - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, t: &mut Rav1dTaskContext, bs: BlockSize, b: &Av1Block, @@ -2399,7 +2461,7 @@ unsafe fn warp_affine( } pub(crate) unsafe fn rav1d_recon_b_intra( - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, t: &mut Rav1dTaskContext, bs: BlockSize, intra_edge_flags: EdgeFlags, @@ -2445,13 +2507,17 @@ pub(crate) unsafe fn rav1d_recon_b_intra( (4 * (t.b.y as isize * BD::pxstride(f.cur.stride[0]) + t.b.x as isize)) as isize, ); + let pal_idx_guard; let pal_idx = if t.frame_thread.pass != 0 { let p = t.frame_thread.pass & 1; let frame_thread = &mut ts.frame_thread[p as usize]; let len = (bw4 * bh4 * 16) as usize; - let pal_idx = &f.frame_thread.pal_idx[frame_thread.pal_idx..][..len]; + pal_idx_guard = f + .frame_thread + .pal_idx + .index(frame_thread.pal_idx..frame_thread.pal_idx + len); frame_thread.pal_idx += len; - pal_idx + &*pal_idx_guard } else { &t.scratch.c2rust_unnamed_0.pal_idx }; @@ -2609,16 +2675,22 @@ pub(crate) unsafe fn rav1d_recon_b_intra( } } if b.skip == 0 { + let mut cf_guard; let cf; let eob; let mut txtp: TxfmType = DCT_DCT; if t.frame_thread.pass != 0 { let p = t.frame_thread.pass & 1; - let cf_buf = BD::cast_coef_slice_mut(&mut f.frame_thread.cf); - cf = &mut cf_buf[ts.frame_thread[p as usize].cf..]; - ts.frame_thread[p as usize].cf += cmp::min((*t_dim).w, 8) as usize - * cmp::min((*t_dim).h, 8) as usize - * 16; + let len = cmp::min((*t_dim).h as usize, 8) + * 4 + * cmp::min((*t_dim).w as usize, 8) + * 4; + cf_guard = f.frame_thread.cf.mut_slice_as( + ts.frame_thread[p as usize].cf + ..ts.frame_thread[p as usize].cf + len, + ); + cf = &mut *cf_guard; + ts.frame_thread[p as usize].cf += len; let cbi = f.frame_thread.cbi [(t.b.y as isize * f.b4_stride + t.b.x as isize) as usize][0] .load(atomig::Ordering::Relaxed); @@ -2828,6 +2900,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( let uv_dstoff: ptrdiff_t = 4 * ((t.b.x >> ss_hor) as isize + (t.b.y >> ss_ver) as isize * BD::pxstride(f.cur.stride[1])); + let pal_idx_guard; let pal_guard; let (pal, pal_idx) = if t.frame_thread.pass != 0 { let p = t.frame_thread.pass & 1; @@ -2836,10 +2909,13 @@ pub(crate) unsafe fn rav1d_recon_b_intra( as isize; let pal_idx_offset = &mut ts.frame_thread[p as usize].pal_idx; let len = (cbw4 * cbh4 * 16) as usize; - let pal_idx = &f.frame_thread.pal_idx[*pal_idx_offset..][..len]; + pal_idx_guard = f + .frame_thread + .pal_idx + .index(*pal_idx_offset..*pal_idx_offset + len); *pal_idx_offset += len; pal_guard = f.frame_thread.pal.index::(index as usize); - (&*pal_guard, pal_idx) + (&*pal_guard, &*pal_idx_guard) } else { let interintra_edge_pal = BD::select_mut(&mut t.scratch.c2rust_unnamed_0.interintra_edge_pal); @@ -3043,13 +3119,18 @@ pub(crate) unsafe fn rav1d_recon_b_intra( if b.skip == 0 { let mut txtp: TxfmType = DCT_DCT; let eob; + let mut cf_guard; let cf; if t.frame_thread.pass != 0 { let p = t.frame_thread.pass & 1; - let cf_buf = BD::cast_coef_slice_mut(&mut f.frame_thread.cf); - cf = &mut cf_buf[ts.frame_thread[p as usize].cf..]; - ts.frame_thread[p as usize].cf += - (*uv_t_dim).w as usize * (*uv_t_dim).h as usize * 16; + let len = + (*uv_t_dim).w as usize * 4 * (*uv_t_dim).h as usize * 4; + cf_guard = f.frame_thread.cf.mut_slice_as( + ts.frame_thread[p as usize].cf + ..ts.frame_thread[p as usize].cf + len, + ); + cf = &mut *cf_guard; + ts.frame_thread[p as usize].cf += len; let cbi = f.frame_thread.cbi [(t.b.y as isize * f.b4_stride + t.b.x as isize) as usize] [(pl + 1) as usize] @@ -3160,7 +3241,7 @@ pub(crate) unsafe fn rav1d_recon_b_intra( } pub(crate) unsafe fn rav1d_recon_b_inter( - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, t: &mut Rav1dTaskContext, bs: BlockSize, b: &Av1Block, @@ -3598,11 +3679,14 @@ pub(crate) unsafe fn rav1d_recon_b_inter( if t.frame_thread.pass != 2 { t.tl_4x4_filter } else { - f.frame_thread.b[(t.b.y as usize - 1) as usize - * f.b4_stride as usize - + t.b.x as usize - - 1] - .filter2d() + f.frame_thread + .b + .index( + (t.b.y as usize - 1) as usize * f.b4_stride as usize + + t.b.x as usize + - 1, + ) + .filter2d() }, )?; } @@ -3634,8 +3718,12 @@ pub(crate) unsafe fn rav1d_recon_b_inter( if t.frame_thread.pass != 2 { left_filter_2d } else { - f.frame_thread.b - [t.b.y as usize * f.b4_stride as usize + t.b.x as usize - 1] + f.frame_thread + .b + .index( + (t.b.y as isize * f.b4_stride + t.b.x as isize - 1) + as usize, + ) .filter2d() }, )?; @@ -3667,8 +3755,12 @@ pub(crate) unsafe fn rav1d_recon_b_inter( if t.frame_thread.pass != 2 { top_filter_2d } else { - f.frame_thread.b - [(t.b.y as usize - 1) * f.b4_stride as usize + t.b.x as usize] + f.frame_thread + .b + .index( + (t.b.y as usize - 1) * f.b4_stride as usize + + t.b.x as usize, + ) .filter2d() }, )?; @@ -3951,15 +4043,19 @@ pub(crate) unsafe fn rav1d_recon_b_inter( x = init_x >> ss_hor; t.b.x += init_x; while x < cmp::min(cw4, init_x + 16 >> ss_hor) { + let mut cf_guard; let cf; let eob; let mut txtp; if t.frame_thread.pass != 0 { let p = t.frame_thread.pass & 1; - let cf_buf = BD::cast_coef_slice_mut(&mut f.frame_thread.cf); - cf = &mut cf_buf[ts.frame_thread[p as usize].cf..]; - ts.frame_thread[p as usize].cf += - uvtx.w as usize * uvtx.h as usize * 16; + let len = uvtx.h as usize * 4 * uvtx.w as usize * 4; + cf_guard = f.frame_thread.cf.mut_slice_as( + ts.frame_thread[p as usize].cf + ..ts.frame_thread[p as usize].cf + len, + ); + cf = &mut *cf_guard; + ts.frame_thread[p as usize].cf += len; let cbi = f.frame_thread.cbi [(t.b.y as isize * f.b4_stride + t.b.x as isize) as usize] [(1 + pl) as usize] @@ -4051,7 +4147,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( pub(crate) unsafe fn rav1d_filter_sbrow_deblock_cols( c: &Rav1dContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, _t: &mut Rav1dTaskContext, sby: c_int, ) { @@ -4115,7 +4211,7 @@ pub(crate) unsafe fn rav1d_filter_sbrow_deblock_cols( pub(crate) unsafe fn rav1d_filter_sbrow_deblock_rows( c: &Rav1dContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, _t: &mut Rav1dTaskContext, sby: c_int, ) { @@ -4176,7 +4272,7 @@ pub(crate) unsafe fn rav1d_filter_sbrow_deblock_rows( pub(crate) unsafe fn rav1d_filter_sbrow_cdef( c: &Rav1dContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, tc: &mut Rav1dTaskContext, sby: c_int, ) { @@ -4219,7 +4315,7 @@ pub(crate) unsafe fn rav1d_filter_sbrow_cdef( pub(crate) unsafe fn rav1d_filter_sbrow_resize( _c: &Rav1dContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, _t: &mut Rav1dTaskContext, sby: c_int, ) { @@ -4287,7 +4383,7 @@ pub(crate) unsafe fn rav1d_filter_sbrow_resize( pub(crate) unsafe fn rav1d_filter_sbrow_lr( c: &Rav1dContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, _t: &mut Rav1dTaskContext, sby: c_int, ) { @@ -4323,7 +4419,7 @@ pub(crate) unsafe fn rav1d_filter_sbrow_lr( pub(crate) unsafe fn rav1d_filter_sbrow( c: &Rav1dContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, t: &mut Rav1dTaskContext, sby: c_int, ) { @@ -4396,7 +4492,7 @@ pub(crate) unsafe fn rav1d_backup_ipred_edge( pub(crate) unsafe fn rav1d_copy_pal_block_y( t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, bx4: usize, by4: usize, bw4: usize, @@ -4422,7 +4518,7 @@ pub(crate) unsafe fn rav1d_copy_pal_block_y( pub(crate) unsafe fn rav1d_copy_pal_block_uv( t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, bx4: usize, by4: usize, bw4: usize, @@ -4451,7 +4547,7 @@ pub(crate) unsafe fn rav1d_copy_pal_block_uv( pub(crate) unsafe fn rav1d_read_pal_plane( t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, b: &mut Av1Block, pl: bool, sz_ctx: u8, @@ -4642,7 +4738,7 @@ pub(crate) unsafe fn rav1d_read_pal_plane( pub(crate) unsafe fn rav1d_read_pal_uv( t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, b: &mut Av1Block, sz_ctx: u8, bx4: usize,