From 35c1153a84a332724cd3a692cf2ae20a63ac1e37 Mon Sep 17 00:00:00 2001 From: Stephen Crane Date: Wed, 27 Mar 2024 16:32:57 -0700 Subject: [PATCH] `struct Rav1dFrameContext_frame_thread`: Add inner mutability to `b` --- include/common/dump.rs | 2 +- src/cdef_apply.rs | 2 +- src/decode.rs | 51 ++++++++++++++++++++++--------------- src/internal.rs | 10 ++++---- src/lf_apply.rs | 4 +-- src/lr_apply.rs | 2 +- src/recon.rs | 58 +++++++++++++++++++++++------------------- 7 files changed, 73 insertions(+), 56 deletions(-) diff --git a/include/common/dump.rs b/include/common/dump.rs index 6d4f9a487..d0a154eb0 100644 --- a/include/common/dump.rs +++ b/include/common/dump.rs @@ -47,7 +47,7 @@ where println!("{}", what); for y in 0..h { for x in 0..w { - print!(" {:0len$}", get(x * y), len = len); + print!(" {:0len$}", get(x + y * w), len = len); } println!(); } diff --git a/src/cdef_apply.rs b/src/cdef_apply.rs index 0f0b043e6..7ad79873c 100644 --- a/src/cdef_apply.rs +++ b/src/cdef_apply.rs @@ -159,7 +159,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 c3df91e4e..7f8cb274c 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -765,7 +765,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, @@ -1151,7 +1151,7 @@ unsafe fn obmc_lowest_px( unsafe fn decode_b( c: &Rav1dContext, t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, bl: BlockLevel, bs: BlockSize, bp: BlockPartition, @@ -1159,27 +1159,32 @@ unsafe fn decode_b( ) -> 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)) + let mut b_mem = Av1Block::default(); + let mut b = if t.frame_thread.pass != 0 { + Some( + f.frame_thread.b[(t.b.y as isize * f.b4_stride + t.b.x as isize) as usize] + .try_lock() + .unwrap(), + ) } else { - (Default::default(), None) + 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 + decode_b_inner( + c, + t, + f, + bl, + bs, + bp, + intra_edge_flags, + b.as_deref_mut().unwrap_or(&mut b_mem), + ) } unsafe fn decode_b_inner( c: &Rav1dContext, t: &mut Rav1dTaskContext, - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, bl: BlockLevel, bs: BlockSize, bp: BlockPartition, @@ -3285,7 +3290,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<(), ()> { @@ -3358,7 +3363,9 @@ 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[(t.b.y as isize * f.b4_stride + t.b.x as isize) as usize] + .try_lock() + .unwrap(); bp = if b.bl == bl { b.bp } else { @@ -3519,7 +3526,9 @@ 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[(t.b.y as isize * f.b4_stride + t.b.x as isize) as usize] + .try_lock() + .unwrap(); is_split = b.bl != bl; } @@ -3572,7 +3581,9 @@ 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[(t.b.y as isize * f.b4_stride + t.b.x as isize) as usize] + .try_lock() + .unwrap(); is_split = b.bl != bl; } diff --git a/src/internal.rs b/src/internal.rs index 89c609bed..ad44ec8b6 100644 --- a/src/internal.rs +++ b/src/internal.rs @@ -355,7 +355,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, @@ -397,7 +397,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, @@ -408,7 +408,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, @@ -418,7 +418,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, @@ -511,7 +511,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: Vec>, pub cbi: Vec<[Atomic; 3]>, diff --git a/src/lf_apply.rs b/src/lf_apply.rs index 0f06e0c9d..e6d315153 100644 --- a/src/lf_apply.rs +++ b/src/lf_apply.rs @@ -596,7 +596,7 @@ 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, @@ -762,7 +762,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 d6d877722..e77d22bbe 100644 --- a/src/lr_apply.rs +++ b/src/lr_apply.rs @@ -261,7 +261,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 4329b3264..240a65457 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -131,22 +131,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, @@ -155,7 +155,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, @@ -165,7 +165,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, @@ -475,7 +475,7 @@ fn get_lo_ctx( } unsafe fn decode_coefs( - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, t: *mut Rav1dTaskContext, a: &mut [u8], l: &mut [u8], @@ -1621,7 +1621,7 @@ enum CfSelect { } impl CfSelect { - fn set( + unsafe fn set( self, f: &Rav1dFrameData, t: &mut Rav1dTaskContext, @@ -1647,8 +1647,8 @@ impl CfSelect { CfSelect::Frame(offset) => { let range = ((offset + index) * mem::size_of::()) ..(offset + index + 1) * mem::size_of::(); - let mut bytes = unsafe { f.frame_thread.cf.index_mut(range) }; - *BD::cast_coef_mut(&mut bytes) + let bytes = f.frame_thread.cf.index(range); + BD::cast_coef(&bytes) } CfSelect::Task => { let cf = unsafe { BD::select(&t.cf).0[index] }; @@ -1659,7 +1659,7 @@ impl CfSelect { } unsafe fn read_coef_tree( - f: &mut Rav1dFrameData, + f: &Rav1dFrameData, t: *mut Rav1dTaskContext, bs: BlockSize, b: &Av1Block, @@ -1864,7 +1864,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, @@ -2463,7 +2463,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, @@ -3232,7 +3232,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, @@ -3669,6 +3669,8 @@ pub(crate) unsafe fn rav1d_recon_b_inter( * f.b4_stride as usize + t.b.x as usize - 1] + .try_lock() + .unwrap() .filter2d() }, )?; @@ -3702,7 +3704,9 @@ pub(crate) unsafe fn rav1d_recon_b_inter( left_filter_2d } else { f.frame_thread.b - [t.b.y as usize * f.b4_stride as usize + t.b.x as usize - 1] + [(t.b.y as isize * f.b4_stride + t.b.x as isize - 1) as usize] + .try_lock() + .unwrap() .filter2d() }, )?; @@ -3735,6 +3739,8 @@ pub(crate) unsafe fn rav1d_recon_b_inter( } else { f.frame_thread.b [(t.b.y as usize - 1) * f.b4_stride as usize + t.b.x as usize] + .try_lock() + .unwrap() .filter2d() }, )?; @@ -4117,7 +4123,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, ) { @@ -4181,7 +4187,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, ) { @@ -4242,7 +4248,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, ) { @@ -4285,7 +4291,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, ) { @@ -4353,7 +4359,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, ) { @@ -4389,7 +4395,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, ) { @@ -4462,7 +4468,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, @@ -4488,7 +4494,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, @@ -4517,7 +4523,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, @@ -4708,7 +4714,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,