From b1ffbf9ff850affd4d5fa47585f66fbf7a088663 Mon Sep 17 00:00:00 2001 From: Nicole LeGare Date: Tue, 6 Feb 2024 16:15:04 -0800 Subject: [PATCH] `Rav1dFrameContext_frame_thread::pal`: Make into a `Vec` --- src/decode.rs | 39 ++++++++++++++------------------------- src/internal.rs | 2 +- src/lib.rs | 4 +--- src/recon.rs | 17 +++++++---------- 4 files changed, 23 insertions(+), 39 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 5201a04ca..0cc276ff5 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -689,7 +689,7 @@ unsafe fn read_pal_plane( let not_pl = !pl as u16; let ts = &mut *t.ts; - let f = &*t.f; + let f = &mut *t.f; // Must come before `pal`, which mutably borrows `t`. // TODO: `DEBUG_BLOCK_INFO` really should take a subset of `f` and `t`, @@ -793,10 +793,8 @@ unsafe fn read_pal_plane( // parse new entries let pal = if t.frame_thread.pass != 0 { - &mut (*(f.frame_thread.pal).offset( - ((t.by >> 1) + (t.bx & 1)) as isize * (f.b4_stride >> 1) - + ((t.bx >> 1) + (t.by & 1)) as isize, - ))[pli] + &mut f.frame_thread.pal[(((t.by >> 1) + (t.bx & 1)) as isize * (f.b4_stride >> 1) + + ((t.bx >> 1) + (t.by & 1)) as isize) as usize][pli] } else { &mut t.scratch.c2rust_unnamed_0.pal[pli] }; @@ -874,17 +872,15 @@ unsafe fn read_pal_uv( // V pal coding let ts = &mut *t.ts; - let f = &*t.f; + let f = &mut *t.f; // Hoisted so the `&` borrow of `t` // doesn't conflict with `pal`'s `&mut` borrow of `t`. let dbg = DEBUG_BLOCK_INFO(&*f, &*t); let pal = if t.frame_thread.pass != 0 { - &mut (*(f.frame_thread.pal).offset( - ((t.by >> 1) + (t.bx & 1)) as isize * (f.b4_stride >> 1) - + ((t.bx >> 1) + (t.by & 1)) as isize, - ))[2] + &mut f.frame_thread.pal[(((t.by >> 1) + (t.bx & 1)) as isize * (f.b4_stride >> 1) + + ((t.bx >> 1) + (t.by & 1)) as isize) as usize][2] } else { &mut t.scratch.c2rust_unnamed_0.pal[2] }; @@ -2226,7 +2222,7 @@ unsafe fn decode_b( let pal = if t.frame_thread.pass != 0 { let index = ((t.by >> 1) + (t.bx & 1)) as isize * (f.b4_stride >> 1) + ((t.bx >> 1) + (t.by & 1)) as isize; - &(*f.frame_thread.pal.offset(index))[0] + &f.frame_thread.pal[index as usize][0] } else { &t.scratch.c2rust_unnamed_0.pal[0] }; @@ -2250,7 +2246,7 @@ unsafe fn decode_b( let pal = if t.frame_thread.pass != 0 { let index = ((t.by >> 1) + (t.bx & 1)) as isize * (f.b4_stride >> 1) + ((t.bx >> 1) + (t.by & 1)) as isize; - &*f.frame_thread.pal.offset(index) + &f.frame_thread.pal[index as usize] } else { &t.scratch.c2rust_unnamed_0.pal }; @@ -4361,17 +4357,10 @@ pub(crate) unsafe fn rav1d_decode_frame_init( if frame_hdr.allow_screen_content_tools != 0 { if num_sb128 != f.frame_thread.pal_sz { - rav1d_freep_aligned( - &mut f.frame_thread.pal as *mut *mut [[u16; 8]; 3] as *mut c_void, - ); - f.frame_thread.pal = rav1d_alloc_aligned( - ::core::mem::size_of::<[[u16; 8]; 3]>() * num_sb128 as usize * 16 * 16, - 64, - ) as *mut [[u16; 8]; 3]; - if f.frame_thread.pal.is_null() { - f.frame_thread.pal_sz = 0; - return Err(ENOMEM); - } + // TODO: Fallible allocation + f.frame_thread + .pal + .resize_with(num_sb128 as usize * 16 * 16, Default::default); f.frame_thread.pal_sz = num_sb128; } @@ -4388,8 +4377,8 @@ pub(crate) unsafe fn rav1d_decode_frame_init( } f.frame_thread.pal_idx_sz = pal_idx_sz; } - } else if !f.frame_thread.pal.is_null() { - rav1d_freep_aligned(&mut f.frame_thread.pal as *mut *mut [[u16; 8]; 3] as *mut c_void); + } else if !f.frame_thread.pal.is_empty() { + let _ = mem::take(&mut f.frame_thread.pal); rav1d_freep_aligned(&mut f.frame_thread.pal_idx as *mut *mut u8 as *mut c_void); f.frame_thread.pal_idx_sz = 0; f.frame_thread.pal_sz = f.frame_thread.pal_idx_sz; diff --git a/src/internal.rs b/src/internal.rs index a3a3796e7..1cc10c7f9 100644 --- a/src/internal.rs +++ b/src/internal.rs @@ -369,7 +369,7 @@ pub struct Rav1dFrameContext_frame_thread { pub b: Vec, pub cbi: Vec, // indexed using (t->by >> 1) * (f->b4_stride >> 1) + (t->bx >> 1) - pub pal: *mut [[u16; 8]; 3], /* [3 plane][8 idx] */ + pub pal: Vec<[[u16; 8]; 3]>, /* [3 plane][8 idx] */ // iterated over inside tile state pub pal_idx: *mut u8, pub cf: *mut DynCoef, diff --git a/src/lib.rs b/src/lib.rs index bbf6e51fe..16c1f82c5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -958,9 +958,7 @@ impl Drop for Rav1dContext { &mut (*f).frame_thread.cf as *mut *mut DynCoef as *mut c_void, ); freep(&mut (*f).frame_thread.tile_start_off as *mut *mut c_int as *mut c_void); - rav1d_freep_aligned( - &mut (*f).frame_thread.pal as *mut *mut [[u16; 8]; 3] as *mut c_void, - ); + let _ = mem::take(&mut (*f).frame_thread.pal); // TODO: remove when context is owned let _ = mem::take(&mut (*f).frame_thread.cbi); // TODO: remove when context is owned } if self.n_tc > 1 as c_uint { diff --git a/src/recon.rs b/src/recon.rs index b6166d5fe..ae82cf5bd 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -2568,11 +2568,10 @@ pub(crate) unsafe fn rav1d_recon_b_intra( pal_idx = (t.scratch.c2rust_unnamed_0.pal_idx).as_mut_ptr(); } let pal: *const u16 = if t.frame_thread.pass != 0 { - ((*((*f).frame_thread.pal).offset( + let index = (((t.by as isize >> 1) + (t.bx as isize & 1)) * ((*f).b4_stride >> 1) - + ((t.bx >> 1) + (t.by & 1)) as isize) as isize, - ))[0]) - .as_mut_ptr() + + ((t.bx >> 1) + (t.by & 1)) as isize) as isize; + (*f).frame_thread.pal[index as usize][0].as_mut_ptr() } else { (t.scratch.c2rust_unnamed_0.pal[0]).as_mut_ptr() }; @@ -2919,12 +2918,10 @@ pub(crate) unsafe fn rav1d_recon_b_intra( if ((*ts).frame_thread[p as usize].pal_idx).is_null() { unreachable!(); } - pal = (*((*f).frame_thread.pal).offset( - (((t.by >> 1) + (t.bx & 1)) as isize * ((*f).b4_stride >> 1) - + ((t.bx as isize >> 1) as isize + (t.by as isize & 1)) as isize) - as isize, - )) - .as_mut_ptr() as *const [u16; 8]; + let index = (((t.by >> 1) + (t.bx & 1)) as isize * ((*f).b4_stride >> 1) + + ((t.bx as isize >> 1) as isize + (t.by as isize & 1)) as isize) + as isize; + pal = &(*f).frame_thread.pal[index as usize][0] as *const [u16; 8]; pal_idx = (*ts).frame_thread[p as usize].pal_idx; (*ts).frame_thread[p as usize].pal_idx = ((*ts).frame_thread[p as usize] .pal_idx)