From bcf219676e48ddfbef753405e11b1492351bce9c Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 12:46:54 -0700 Subject: [PATCH 01/46] `fn dav1d_submit_frame`: Remove redundant `as` casts. --- src/decode.rs | 263 +++++++++++++++----------------------------------- 1 file changed, 76 insertions(+), 187 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index b6966cfcd..0fabae7a7 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5938,20 +5938,19 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let f: *mut Dav1dFrameContext; let mut res: libc::c_int; let mut out_delayed: *mut Dav1dThreadPicture = 0 as *mut Dav1dThreadPicture; - if (*c).n_fc > 1 as libc::c_uint { + if (*c).n_fc > 1 { pthread_mutex_lock(&mut (*c).task_thread.lock); let fresh39 = (*c).frame_thread.next; (*c).frame_thread.next = ((*c).frame_thread.next).wrapping_add(1); let next: libc::c_uint = fresh39; if (*c).frame_thread.next == (*c).n_fc { - (*c).frame_thread.next = 0 as libc::c_int as libc::c_uint; + (*c).frame_thread.next = 0; } f = &mut *((*c).fc).offset(next as isize) as *mut Dav1dFrameContext; while (*f).n_tile_data > 0 { pthread_cond_wait(&mut (*f).task_thread.cond, &mut (*c).task_thread.lock); } - out_delayed = - &mut *((*c).frame_thread.out_delayed).offset(next as isize) as *mut Dav1dThreadPicture; + out_delayed = &mut *((*c).frame_thread.out_delayed).offset(next as isize); if !((*out_delayed).p.data[0]).is_null() || ::core::intrinsics::atomic_load_seqcst( &mut (*f).task_thread.error as *mut atomic_int, @@ -5959,23 +5958,15 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int { let mut first: libc::c_uint = ::core::intrinsics::atomic_load_seqcst(&mut (*c).task_thread.first); - if first.wrapping_add(1 as libc::c_uint) < (*c).n_fc { - ::core::intrinsics::atomic_xadd_seqcst( - &mut (*c).task_thread.first, - 1 as libc::c_uint, - ); + if first.wrapping_add(1) < (*c).n_fc { + ::core::intrinsics::atomic_xadd_seqcst(&mut (*c).task_thread.first, 1); } else { - ::core::intrinsics::atomic_store_seqcst( - &mut (*c).task_thread.first, - 0 as libc::c_int as libc::c_uint, - ); + ::core::intrinsics::atomic_store_seqcst(&mut (*c).task_thread.first, 0); } let fresh40 = ::core::intrinsics::atomic_cxchg_seqcst_seqcst( &mut (*c).task_thread.reset_task_cur, *&mut first, - (2147483647 as libc::c_int as libc::c_uint) - .wrapping_mul(2 as libc::c_uint) - .wrapping_add(1 as libc::c_uint), + (2147483647 as libc::c_uint).wrapping_mul(2).wrapping_add(1), ); *&mut first = fresh40.0; fresh40.1; @@ -5985,7 +5976,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } let error: libc::c_int = (*f).task_thread.retval; if error != 0 { - (*f).task_thread.retval = 0 as libc::c_int; + (*f).task_thread.retval = 0; (*c).cached_error = error; dav1d_data_props_copy(&mut (*c).cached_error_props, &mut (*out_delayed).p.m); dav1d_thread_picture_unref(out_delayed); @@ -5995,15 +5986,14 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int ); if ((*out_delayed).visible != 0 || (*c).output_invisible_frames != 0) && progress - != (2147483647 as libc::c_int as libc::c_uint) - .wrapping_mul(2 as libc::c_uint) - .wrapping_add(1 as libc::c_uint) - .wrapping_sub(1 as libc::c_int as libc::c_uint) + != (2147483647 as libc::c_uint) + .wrapping_mul(2) + .wrapping_add(1) + .wrapping_sub(1) { dav1d_thread_picture_ref(&mut (*c).out, out_delayed); (*c).event_flags = ::core::mem::transmute::( - (*c).event_flags as libc::c_uint - | dav1d_picture_get_event_flags(out_delayed) as libc::c_uint, + (*c).event_flags | dav1d_picture_get_event_flags(out_delayed), ); } dav1d_thread_picture_unref(out_delayed); @@ -6021,10 +6011,9 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int (*f).dsp = &mut *((*c).dsp).as_mut_ptr().offset((*(*f).seq_hdr).hbd as isize) as *mut Dav1dDSPContext; let bpc = 8 + 2 * (*(*f).seq_hdr).hbd; - if ((*(*f).dsp).ipred.intra_pred[DC_PRED as libc::c_int as usize]).is_none() { + if ((*(*f).dsp).ipred.intra_pred[DC_PRED as usize]).is_none() { let dsp: *mut Dav1dDSPContext = - &mut *((*c).dsp).as_mut_ptr().offset((*(*f).seq_hdr).hbd as isize) - as *mut Dav1dDSPContext; + &mut *((*c).dsp).as_mut_ptr().offset((*(*f).seq_hdr).hbd as isize); match bpc { #[cfg(feature = "bitdepth_8")] 8 => { @@ -6053,7 +6042,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int as *const libc::c_char, 8 + 2 * (*(*f).seq_hdr).hbd, ); - res = -(92 as libc::c_int); + res = -92; return dav1d_submit_frame_error(res, f, c, out_delayed); } } @@ -6061,123 +6050,39 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*(*f).seq_hdr).hbd == 0 { #[cfg(feature = "bitdepth_8")] { - (*f).bd_fn.recon_b_inter = Some( - dav1d_recon_b_inter_8bpc - as unsafe extern "C" fn( - *mut Dav1dTaskContext, - BlockSize, - *const Av1Block, - ) -> libc::c_int, - ); - (*f).bd_fn.recon_b_intra = Some( - dav1d_recon_b_intra_8bpc - as unsafe extern "C" fn( - *mut Dav1dTaskContext, - BlockSize, - EdgeFlags, - *const Av1Block, - ) -> (), - ); - (*f).bd_fn.filter_sbrow = Some( - dav1d_filter_sbrow_8bpc - as unsafe extern "C" fn(*mut Dav1dFrameContext, libc::c_int) -> (), - ); - (*f).bd_fn.filter_sbrow_deblock_cols = Some( - dav1d_filter_sbrow_deblock_cols_8bpc - as unsafe extern "C" fn(*mut Dav1dFrameContext, libc::c_int) -> (), - ); - (*f).bd_fn.filter_sbrow_deblock_rows = Some( - dav1d_filter_sbrow_deblock_rows_8bpc - as unsafe extern "C" fn(*mut Dav1dFrameContext, libc::c_int) -> (), - ); - (*f).bd_fn.filter_sbrow_cdef = Some( - dav1d_filter_sbrow_cdef_8bpc - as unsafe extern "C" fn(*mut Dav1dTaskContext, libc::c_int) -> (), - ); - (*f).bd_fn.filter_sbrow_resize = Some( - dav1d_filter_sbrow_resize_8bpc - as unsafe extern "C" fn(*mut Dav1dFrameContext, libc::c_int) -> (), - ); - (*f).bd_fn.filter_sbrow_lr = Some( - dav1d_filter_sbrow_lr_8bpc - as unsafe extern "C" fn(*mut Dav1dFrameContext, libc::c_int) -> (), - ); - (*f).bd_fn.backup_ipred_edge = Some( - dav1d_backup_ipred_edge_8bpc as unsafe extern "C" fn(*mut Dav1dTaskContext) -> (), - ); - (*f).bd_fn.read_coef_blocks = Some( - dav1d_read_coef_blocks_8bpc - as unsafe extern "C" fn( - *mut Dav1dTaskContext, - BlockSize, - *const Av1Block, - ) -> (), - ); + (*f).bd_fn.recon_b_inter = Some(dav1d_recon_b_inter_8bpc); + (*f).bd_fn.recon_b_intra = Some(dav1d_recon_b_intra_8bpc); + (*f).bd_fn.filter_sbrow = Some(dav1d_filter_sbrow_8bpc); + (*f).bd_fn.filter_sbrow_deblock_cols = Some(dav1d_filter_sbrow_deblock_cols_8bpc); + (*f).bd_fn.filter_sbrow_deblock_rows = Some(dav1d_filter_sbrow_deblock_rows_8bpc); + (*f).bd_fn.filter_sbrow_cdef = Some(dav1d_filter_sbrow_cdef_8bpc); + (*f).bd_fn.filter_sbrow_resize = Some(dav1d_filter_sbrow_resize_8bpc); + (*f).bd_fn.filter_sbrow_lr = Some(dav1d_filter_sbrow_lr_8bpc); + (*f).bd_fn.backup_ipred_edge = Some(dav1d_backup_ipred_edge_8bpc); + (*f).bd_fn.read_coef_blocks = Some(dav1d_read_coef_blocks_8bpc); } } else { #[cfg(feature = "bitdepth_16")] { - (*f).bd_fn.recon_b_inter = Some( - dav1d_recon_b_inter_16bpc - as unsafe extern "C" fn( - *mut Dav1dTaskContext, - BlockSize, - *const Av1Block, - ) -> libc::c_int, - ); - (*f).bd_fn.recon_b_intra = Some( - dav1d_recon_b_intra_16bpc - as unsafe extern "C" fn( - *mut Dav1dTaskContext, - BlockSize, - EdgeFlags, - *const Av1Block, - ) -> (), - ); - (*f).bd_fn.filter_sbrow = Some( - dav1d_filter_sbrow_16bpc - as unsafe extern "C" fn(*mut Dav1dFrameContext, libc::c_int) -> (), - ); - (*f).bd_fn.filter_sbrow_deblock_cols = Some( - dav1d_filter_sbrow_deblock_cols_16bpc - as unsafe extern "C" fn(*mut Dav1dFrameContext, libc::c_int) -> (), - ); - (*f).bd_fn.filter_sbrow_deblock_rows = Some( - dav1d_filter_sbrow_deblock_rows_16bpc - as unsafe extern "C" fn(*mut Dav1dFrameContext, libc::c_int) -> (), - ); - (*f).bd_fn.filter_sbrow_cdef = Some( - dav1d_filter_sbrow_cdef_16bpc - as unsafe extern "C" fn(*mut Dav1dTaskContext, libc::c_int) -> (), - ); - (*f).bd_fn.filter_sbrow_resize = Some( - dav1d_filter_sbrow_resize_16bpc - as unsafe extern "C" fn(*mut Dav1dFrameContext, libc::c_int) -> (), - ); - (*f).bd_fn.filter_sbrow_lr = Some( - dav1d_filter_sbrow_lr_16bpc - as unsafe extern "C" fn(*mut Dav1dFrameContext, libc::c_int) -> (), - ); - (*f).bd_fn.backup_ipred_edge = Some( - dav1d_backup_ipred_edge_16bpc as unsafe extern "C" fn(*mut Dav1dTaskContext) -> (), - ); - (*f).bd_fn.read_coef_blocks = Some( - dav1d_read_coef_blocks_16bpc - as unsafe extern "C" fn( - *mut Dav1dTaskContext, - BlockSize, - *const Av1Block, - ) -> (), - ); + (*f).bd_fn.recon_b_inter = Some(dav1d_recon_b_inter_16bpc); + (*f).bd_fn.recon_b_intra = Some(dav1d_recon_b_intra_16bpc); + (*f).bd_fn.filter_sbrow = Some(dav1d_filter_sbrow_16bpc); + (*f).bd_fn.filter_sbrow_deblock_cols = Some(dav1d_filter_sbrow_deblock_cols_16bpc); + (*f).bd_fn.filter_sbrow_deblock_rows = Some(dav1d_filter_sbrow_deblock_rows_16bpc); + (*f).bd_fn.filter_sbrow_cdef = Some(dav1d_filter_sbrow_cdef_16bpc); + (*f).bd_fn.filter_sbrow_resize = Some(dav1d_filter_sbrow_resize_16bpc); + (*f).bd_fn.filter_sbrow_lr = Some(dav1d_filter_sbrow_lr_16bpc); + (*f).bd_fn.backup_ipred_edge = Some(dav1d_backup_ipred_edge_16bpc); + (*f).bd_fn.read_coef_blocks = Some(dav1d_read_coef_blocks_16bpc); } } let mut ref_coded_width: [libc::c_int; 7] = [0; 7]; - if (*(*f).frame_hdr).frame_type as libc::c_uint & 1 as libc::c_uint != 0 { - if (*(*f).frame_hdr).primary_ref_frame != 7 as libc::c_int { + if (*(*f).frame_hdr).frame_type & 1 != 0 { + if (*(*f).frame_hdr).primary_ref_frame != 7 { let pri_ref: libc::c_int = (*(*f).frame_hdr).refidx[(*(*f).frame_hdr).primary_ref_frame as usize]; if ((*c).refs[pri_ref as usize].p.p.data[0]).is_null() { - res = -(22 as libc::c_int); + res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); } } @@ -6189,8 +6094,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int || ((*(*f).frame_hdr).height * 2) < (*c).refs[refidx as usize].p.p.p.h || (*(*f).frame_hdr).width[0] > (*c).refs[refidx as usize].p.p.p.w * 16 || (*(*f).frame_hdr).height > (*c).refs[refidx as usize].p.p.p.h * 16 - || (*(*f).seq_hdr).layout as libc::c_uint - != (*c).refs[refidx as usize].p.p.p.layout as libc::c_uint + || (*(*f).seq_hdr).layout != (*c).refs[refidx as usize].p.p.p.layout || bpc != (*c).refs[refidx as usize].p.p.p.bpc { let mut j = 0; @@ -6198,7 +6102,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_thread_picture_unref(&mut *((*f).refp).as_mut_ptr().offset(j as isize)); j += 1; } - res = -(22 as libc::c_int); + res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); } dav1d_thread_picture_ref( @@ -6218,18 +6122,16 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int (*f).svc[i as usize][0].step = (*f).svc[i as usize][0].scale + 8 >> 4; (*f).svc[i as usize][1].step = (*f).svc[i as usize][1].scale + 8 >> 4; } else { - (*f).svc[i as usize][1].scale = 0 as libc::c_int; + (*f).svc[i as usize][1].scale = 0; (*f).svc[i as usize][0].scale = (*f).svc[i as usize][1].scale; } - (*f).gmv_warp_allowed[i as usize] = ((*(*f).frame_hdr).gmv[i as usize].type_0 - as libc::c_uint - > DAV1D_WM_TYPE_TRANSLATION as libc::c_int as libc::c_uint - && (*(*f).frame_hdr).force_integer_mv == 0 - && !dav1d_get_shear_params( - &mut *((*(*f).frame_hdr).gmv).as_mut_ptr().offset(i as isize), - ) - && (*f).svc[i as usize][0].scale == 0) - as libc::c_int as uint8_t; + (*f).gmv_warp_allowed[i as usize] = + ((*(*f).frame_hdr).gmv[i as usize].type_0 > DAV1D_WM_TYPE_TRANSLATION + && (*(*f).frame_hdr).force_integer_mv == 0 + && !dav1d_get_shear_params( + &mut *((*(*f).frame_hdr).gmv).as_mut_ptr().offset(i as isize), + ) + && (*f).svc[i as usize][0].scale == 0) as uint8_t; i += 1; } } @@ -6244,11 +6146,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int ); } if (*(*f).frame_hdr).refresh_context != 0 { - res = dav1d_cdf_thread_alloc( - c, - &mut (*f).out_cdf, - ((*c).n_fc > 1 as libc::c_uint) as libc::c_int, - ); + res = dav1d_cdf_thread_alloc(c, &mut (*f).out_cdf, ((*c).n_fc > 1) as libc::c_int); if res < 0 { return dav1d_submit_frame_error(res, f, c, out_delayed); } @@ -6256,7 +6154,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*f).n_tile_data_alloc < (*c).n_tile_data { freep(&mut (*f).tile as *mut *mut Dav1dTileGroup as *mut libc::c_void); if !((*c).n_tile_data - < 2147483647 / ::core::mem::size_of::() as libc::c_ulong as libc::c_int) + < 2147483647 / ::core::mem::size_of::() as libc::c_int) { unreachable!(); } @@ -6265,9 +6163,9 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int .wrapping_mul(::core::mem::size_of::() as libc::c_ulong), ) as *mut Dav1dTileGroup; if ((*f).tile).is_null() { - (*f).n_tile_data = 0 as libc::c_int; + (*f).n_tile_data = 0; (*f).n_tile_data_alloc = (*f).n_tile_data; - res = -(12 as libc::c_int); + res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } (*f).n_tile_data_alloc = (*c).n_tile_data; @@ -6280,11 +6178,11 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int ); memset( (*c).tile as *mut libc::c_void, - 0 as libc::c_int, + 0, ((*c).n_tile_data as size_t).wrapping_mul(::core::mem::size_of::()), ); (*f).n_tile_data = (*c).n_tile_data; - (*c).n_tile_data = 0 as libc::c_int; + (*c).n_tile_data = 0; res = dav1d_thread_picture_alloc(c, f, bpc); if res < 0 { return dav1d_submit_frame_error(res, f, c, out_delayed); @@ -6304,21 +6202,18 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } if (*(*f).frame_hdr).width[0] != (*(*f).frame_hdr).width[1] { (*f).resize_step[0] = (((*f).cur.p.w << 14) + ((*f).sr_cur.p.p.w >> 1)) / (*f).sr_cur.p.p.w; - let ss_hor: libc::c_int = ((*f).cur.p.layout as libc::c_uint - != DAV1D_PIXEL_LAYOUT_I444 as libc::c_int as libc::c_uint) - as libc::c_int; + let ss_hor: libc::c_int = ((*f).cur.p.layout != DAV1D_PIXEL_LAYOUT_I444) as libc::c_int; let in_cw: libc::c_int = (*f).cur.p.w + ss_hor >> ss_hor; let out_cw: libc::c_int = (*f).sr_cur.p.p.w + ss_hor >> ss_hor; (*f).resize_step[1] = ((in_cw << 14) + (out_cw >> 1)) / out_cw; (*f).resize_start[0] = get_upscale_x0((*f).cur.p.w, (*f).sr_cur.p.p.w, (*f).resize_step[0]); (*f).resize_start[1] = get_upscale_x0(in_cw, out_cw, (*f).resize_step[1]); } - if (*c).n_fc == 1 as libc::c_uint { + if (*c).n_fc == 1 { if (*(*f).frame_hdr).show_frame != 0 || (*c).output_invisible_frames != 0 { dav1d_thread_picture_ref(&mut (*c).out, &mut (*f).sr_cur); (*c).event_flags = ::core::mem::transmute::( - (*c).event_flags as libc::c_uint - | dav1d_picture_get_event_flags(&mut (*f).sr_cur) as libc::c_uint, + (*c).event_flags | dav1d_picture_get_event_flags(&mut (*f).sr_cur), ); } } else { @@ -6331,21 +6226,19 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int (*f).sb128w = (*f).bw + 31 >> 5; (*f).sb128h = (*f).bh + 31 >> 5; (*f).sb_shift = 4 + (*(*f).seq_hdr).sb128; - (*f).sb_step = (16 as libc::c_int) << (*(*f).seq_hdr).sb128; + (*f).sb_step = 16 << (*(*f).seq_hdr).sb128; (*f).sbh = (*f).bh + (*f).sb_step - 1 >> (*f).sb_shift; - (*f).b4_stride = ((*f).bw + 31 & !(31 as libc::c_int)) as ptrdiff_t; - (*f).bitdepth_max = ((1 as libc::c_int) << (*f).cur.p.bpc) - 1; - *&mut (*f).task_thread.error = 0 as libc::c_int; - let uses_2pass: libc::c_int = ((*c).n_fc > 1 as libc::c_uint) as libc::c_int; + (*f).b4_stride = ((*f).bw + 31 & !31) as ptrdiff_t; + (*f).bitdepth_max = (1 << (*f).cur.p.bpc) - 1; + *&mut (*f).task_thread.error = 0; + let uses_2pass: libc::c_int = ((*c).n_fc > 1) as libc::c_int; let cols: libc::c_int = (*(*f).frame_hdr).tiling.cols; let rows: libc::c_int = (*(*f).frame_hdr).tiling.rows; ::core::intrinsics::atomic_store_seqcst( &mut (*f).task_thread.task_counter, cols * rows + (*f).sbh << uses_2pass, ); - if (*(*f).frame_hdr).frame_type as libc::c_uint & 1 as libc::c_uint != 0 - || (*(*f).frame_hdr).allow_intrabc != 0 - { + if (*(*f).frame_hdr).frame_type & 1 != 0 || (*(*f).frame_hdr).allow_intrabc != 0 { (*f).mvs_ref = dav1d_ref_create_using_pool( (*c).refmvs_pool, (::core::mem::size_of::()) @@ -6354,7 +6247,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int .wrapping_mul(((*f).b4_stride >> 1) as size_t), ); if ((*f).mvs_ref).is_null() { - res = -(12 as libc::c_int); + res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } (*f).mvs = (*(*f).mvs_ref).data as *mut refmvs_temporal_block; @@ -6368,7 +6261,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } else { memset( ((*f).refpoc).as_mut_ptr() as *mut libc::c_void, - 0 as libc::c_int, + 0, ::core::mem::size_of::<[libc::c_uint; 7]>(), ); } @@ -6400,7 +6293,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } else { memset( ((*f).ref_mvs_ref).as_mut_ptr() as *mut libc::c_void, - 0 as libc::c_int, + 0, ::core::mem::size_of::<[*mut Dav1dRef; 7]>(), ); } @@ -6408,7 +6301,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int (*f).mvs_ref = 0 as *mut Dav1dRef; memset( ((*f).ref_mvs_ref).as_mut_ptr() as *mut libc::c_void, - 0 as libc::c_int, + 0, ::core::mem::size_of::<[*mut Dav1dRef; 7]>(), ); } @@ -6419,7 +6312,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int || (*(*f).frame_hdr).segmentation.update_map == 0 { let pri_ref_1: libc::c_int = (*(*f).frame_hdr).primary_ref_frame; - if !(pri_ref_1 != 7 as libc::c_int) { + if !(pri_ref_1 != 7) { unreachable!(); } let ref_w_0: libc::c_int = (ref_coded_width[pri_ref_1 as usize] + 7 >> 3) << 1; @@ -6443,7 +6336,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int ); if ((*f).cur_segmap_ref).is_null() { dav1d_ref_dec(&mut (*f).prev_segmap_ref); - res = -(12 as libc::c_int); + res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } (*f).cur_segmap = (*(*f).cur_segmap_ref).data as *mut uint8_t; @@ -6458,15 +6351,11 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int .wrapping_mul((*f).sb128h as size_t); (*f).cur_segmap_ref = dav1d_ref_create_using_pool((*c).segmap_pool, segmap_size); if ((*f).cur_segmap_ref).is_null() { - res = -(12 as libc::c_int); + res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } (*f).cur_segmap = (*(*f).cur_segmap_ref).data as *mut uint8_t; - memset( - (*f).cur_segmap as *mut libc::c_void, - 0 as libc::c_int, - segmap_size, - ); + memset((*f).cur_segmap as *mut libc::c_void, 0, segmap_size); } } else { (*f).cur_segmap = 0 as *mut uint8_t; @@ -6476,7 +6365,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let refresh_frame_flags: libc::c_uint = (*(*f).frame_hdr).refresh_frame_flags as libc::c_uint; let mut i_2 = 0; while i_2 < 8 { - if refresh_frame_flags & ((1 as libc::c_int) << i_2) as libc::c_uint != 0 { + if refresh_frame_flags & (1 << i_2) != 0 { if !((*c).refs[i_2 as usize].p.p.frame_hdr).is_null() { dav1d_thread_picture_unref(&mut (*((*c).refs).as_mut_ptr().offset(i_2 as isize)).p); } @@ -6516,13 +6405,13 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } i_2 += 1; } - if (*c).n_fc == 1 as libc::c_uint { + if (*c).n_fc == 1 { res = dav1d_decode_frame(&mut *f); if res < 0 { dav1d_thread_picture_unref(&mut (*c).out); let mut i_3 = 0; while i_3 < 8 { - if refresh_frame_flags & ((1 as libc::c_int) << i_3) as libc::c_uint != 0 { + if refresh_frame_flags & (1 << i_3) != 0 { if !((*c).refs[i_3 as usize].p.p.frame_hdr).is_null() { dav1d_thread_picture_unref( &mut (*((*c).refs).as_mut_ptr().offset(i_3 as isize)).p, @@ -6540,5 +6429,5 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_task_frame_init(f); pthread_mutex_unlock(&mut (*c).task_thread.lock); } - return 0 as libc::c_int; + return 0; } From 445a1148f6556b46b302f02680b6cffc6b4d8531 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 12:50:29 -0700 Subject: [PATCH 02/46] `fn dav1d_submit_frame`: Remove `_[0-9]+` var suffixes. --- src/decode.rs | 104 +++++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 0fabae7a7..368c5ccfd 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6138,11 +6138,11 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*(*f).frame_hdr).primary_ref_frame == 7 { dav1d_cdf_thread_init_static(&mut (*f).in_cdf, (*(*f).frame_hdr).quant.yac); } else { - let pri_ref_0: libc::c_int = + let pri_ref: libc::c_int = (*(*f).frame_hdr).refidx[(*(*f).frame_hdr).primary_ref_frame as usize]; dav1d_cdf_thread_ref( &mut (*f).in_cdf, - &mut *((*c).cdf).as_mut_ptr().offset(pri_ref_0 as isize), + &mut *((*c).cdf).as_mut_ptr().offset(pri_ref as isize), ); } if (*(*f).frame_hdr).refresh_context != 0 { @@ -6252,11 +6252,11 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } (*f).mvs = (*(*f).mvs_ref).data as *mut refmvs_temporal_block; if (*(*f).frame_hdr).allow_intrabc == 0 { - let mut i_0 = 0; - while i_0 < 7 { - (*f).refpoc[i_0 as usize] = - (*(*f).refp[i_0 as usize].p.frame_hdr).frame_offset as libc::c_uint; - i_0 += 1; + let mut i = 0; + while i < 7 { + (*f).refpoc[i as usize] = + (*(*f).refp[i as usize].p.frame_hdr).frame_offset as libc::c_uint; + i += 1; } } else { memset( @@ -6266,29 +6266,29 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int ); } if (*(*f).frame_hdr).use_ref_frame_mvs != 0 { - let mut i_1 = 0; - while i_1 < 7 { - let refidx_0: libc::c_int = (*(*f).frame_hdr).refidx[i_1 as usize]; - let ref_w: libc::c_int = (ref_coded_width[i_1 as usize] + 7 >> 3) << 1; - let ref_h: libc::c_int = ((*f).refp[i_1 as usize].p.p.h + 7 >> 3) << 1; - if !((*c).refs[refidx_0 as usize].refmvs).is_null() + let mut i = 0; + while i < 7 { + let refidx: libc::c_int = (*(*f).frame_hdr).refidx[i as usize]; + let ref_w: libc::c_int = (ref_coded_width[i as usize] + 7 >> 3) << 1; + let ref_h: libc::c_int = ((*f).refp[i as usize].p.p.h + 7 >> 3) << 1; + if !((*c).refs[refidx as usize].refmvs).is_null() && ref_w == (*f).bw && ref_h == (*f).bh { - (*f).ref_mvs_ref[i_1 as usize] = (*c).refs[refidx_0 as usize].refmvs; - dav1d_ref_inc((*f).ref_mvs_ref[i_1 as usize]); - (*f).ref_mvs[i_1 as usize] = - (*(*c).refs[refidx_0 as usize].refmvs).data as *mut refmvs_temporal_block; + (*f).ref_mvs_ref[i as usize] = (*c).refs[refidx as usize].refmvs; + dav1d_ref_inc((*f).ref_mvs_ref[i as usize]); + (*f).ref_mvs[i as usize] = + (*(*c).refs[refidx as usize].refmvs).data as *mut refmvs_temporal_block; } else { - (*f).ref_mvs[i_1 as usize] = 0 as *mut refmvs_temporal_block; - (*f).ref_mvs_ref[i_1 as usize] = 0 as *mut Dav1dRef; + (*f).ref_mvs[i as usize] = 0 as *mut refmvs_temporal_block; + (*f).ref_mvs_ref[i as usize] = 0 as *mut Dav1dRef; } memcpy( - ((*f).refrefpoc[i_1 as usize]).as_mut_ptr() as *mut libc::c_void, - ((*c).refs[refidx_0 as usize].refpoc).as_mut_ptr() as *const libc::c_void, + ((*f).refrefpoc[i as usize]).as_mut_ptr() as *mut libc::c_void, + ((*c).refs[refidx as usize].refpoc).as_mut_ptr() as *const libc::c_void, ::core::mem::size_of::<[libc::c_uint; 7]>() as libc::c_ulong, ); - i_1 += 1; + i += 1; } } else { memset( @@ -6311,15 +6311,15 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*(*f).frame_hdr).segmentation.temporal != 0 || (*(*f).frame_hdr).segmentation.update_map == 0 { - let pri_ref_1: libc::c_int = (*(*f).frame_hdr).primary_ref_frame; - if !(pri_ref_1 != 7) { + let pri_ref: libc::c_int = (*(*f).frame_hdr).primary_ref_frame; + if !(pri_ref != 7) { unreachable!(); } - let ref_w_0: libc::c_int = (ref_coded_width[pri_ref_1 as usize] + 7 >> 3) << 1; - let ref_h_0: libc::c_int = ((*f).refp[pri_ref_1 as usize].p.p.h + 7 >> 3) << 1; - if ref_w_0 == (*f).bw && ref_h_0 == (*f).bh { + let ref_w: libc::c_int = (ref_coded_width[pri_ref as usize] + 7 >> 3) << 1; + let ref_h: libc::c_int = ((*f).refp[pri_ref as usize].p.p.h + 7 >> 3) << 1; + if ref_w == (*f).bw && ref_h == (*f).bh { (*f).prev_segmap_ref = - (*c).refs[(*(*f).frame_hdr).refidx[pri_ref_1 as usize] as usize].segmap; + (*c).refs[(*(*f).frame_hdr).refidx[pri_ref as usize] as usize].segmap; if !((*f).prev_segmap_ref).is_null() { dav1d_ref_inc((*f).prev_segmap_ref); (*f).prev_segmap = (*(*f).prev_segmap_ref).data as *const uint8_t; @@ -6363,65 +6363,65 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int (*f).prev_segmap_ref = 0 as *mut Dav1dRef; } let refresh_frame_flags: libc::c_uint = (*(*f).frame_hdr).refresh_frame_flags as libc::c_uint; - let mut i_2 = 0; - while i_2 < 8 { - if refresh_frame_flags & (1 << i_2) != 0 { - if !((*c).refs[i_2 as usize].p.p.frame_hdr).is_null() { - dav1d_thread_picture_unref(&mut (*((*c).refs).as_mut_ptr().offset(i_2 as isize)).p); + let mut i = 0; + while i < 8 { + if refresh_frame_flags & (1 << i) != 0 { + if !((*c).refs[i as usize].p.p.frame_hdr).is_null() { + dav1d_thread_picture_unref(&mut (*((*c).refs).as_mut_ptr().offset(i as isize)).p); } dav1d_thread_picture_ref( - &mut (*((*c).refs).as_mut_ptr().offset(i_2 as isize)).p, + &mut (*((*c).refs).as_mut_ptr().offset(i as isize)).p, &mut (*f).sr_cur, ); - dav1d_cdf_thread_unref(&mut *((*c).cdf).as_mut_ptr().offset(i_2 as isize)); + dav1d_cdf_thread_unref(&mut *((*c).cdf).as_mut_ptr().offset(i as isize)); if (*(*f).frame_hdr).refresh_context != 0 { dav1d_cdf_thread_ref( - &mut *((*c).cdf).as_mut_ptr().offset(i_2 as isize), + &mut *((*c).cdf).as_mut_ptr().offset(i as isize), &mut (*f).out_cdf, ); } else { dav1d_cdf_thread_ref( - &mut *((*c).cdf).as_mut_ptr().offset(i_2 as isize), + &mut *((*c).cdf).as_mut_ptr().offset(i as isize), &mut (*f).in_cdf, ); } - dav1d_ref_dec(&mut (*((*c).refs).as_mut_ptr().offset(i_2 as isize)).segmap); - (*c).refs[i_2 as usize].segmap = (*f).cur_segmap_ref; + dav1d_ref_dec(&mut (*((*c).refs).as_mut_ptr().offset(i as isize)).segmap); + (*c).refs[i as usize].segmap = (*f).cur_segmap_ref; if !((*f).cur_segmap_ref).is_null() { dav1d_ref_inc((*f).cur_segmap_ref); } - dav1d_ref_dec(&mut (*((*c).refs).as_mut_ptr().offset(i_2 as isize)).refmvs); + dav1d_ref_dec(&mut (*((*c).refs).as_mut_ptr().offset(i as isize)).refmvs); if (*(*f).frame_hdr).allow_intrabc == 0 { - (*c).refs[i_2 as usize].refmvs = (*f).mvs_ref; + (*c).refs[i as usize].refmvs = (*f).mvs_ref; if !((*f).mvs_ref).is_null() { dav1d_ref_inc((*f).mvs_ref); } } memcpy( - ((*c).refs[i_2 as usize].refpoc).as_mut_ptr() as *mut libc::c_void, + ((*c).refs[i as usize].refpoc).as_mut_ptr() as *mut libc::c_void, ((*f).refpoc).as_mut_ptr() as *const libc::c_void, ::core::mem::size_of::<[libc::c_uint; 7]>() as libc::c_ulong, ); } - i_2 += 1; + i += 1; } if (*c).n_fc == 1 { res = dav1d_decode_frame(&mut *f); if res < 0 { dav1d_thread_picture_unref(&mut (*c).out); - let mut i_3 = 0; - while i_3 < 8 { - if refresh_frame_flags & (1 << i_3) != 0 { - if !((*c).refs[i_3 as usize].p.p.frame_hdr).is_null() { + let mut i = 0; + while i < 8 { + if refresh_frame_flags & (1 << i) != 0 { + if !((*c).refs[i as usize].p.p.frame_hdr).is_null() { dav1d_thread_picture_unref( - &mut (*((*c).refs).as_mut_ptr().offset(i_3 as isize)).p, + &mut (*((*c).refs).as_mut_ptr().offset(i as isize)).p, ); } - dav1d_cdf_thread_unref(&mut *((*c).cdf).as_mut_ptr().offset(i_3 as isize)); - dav1d_ref_dec(&mut (*((*c).refs).as_mut_ptr().offset(i_3 as isize)).segmap); - dav1d_ref_dec(&mut (*((*c).refs).as_mut_ptr().offset(i_3 as isize)).refmvs); + dav1d_cdf_thread_unref(&mut *((*c).cdf).as_mut_ptr().offset(i as isize)); + dav1d_ref_dec(&mut (*((*c).refs).as_mut_ptr().offset(i as isize)).segmap); + dav1d_ref_dec(&mut (*((*c).refs).as_mut_ptr().offset(i as isize)).refmvs); } - i_3 += 1; + i += 1; } return dav1d_submit_frame_error(res, f, c, out_delayed); } From 0820e378b6b962f9fb7b9232e2d35ab900f0aae1 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:00:54 -0700 Subject: [PATCH 03/46] `fn dav1d_submit_frame`: Replace `.as_mut_ptr().offset(i as isize)` with `[i as usize]`. --- src/decode.rs | 54 +++++++++++++++++---------------------------------- 1 file changed, 18 insertions(+), 36 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 368c5ccfd..a34a7f775 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6008,12 +6008,10 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int (*f).frame_hdr_ref = (*c).frame_hdr_ref; (*c).frame_hdr = 0 as *mut Dav1dFrameHeader; (*c).frame_hdr_ref = 0 as *mut Dav1dRef; - (*f).dsp = - &mut *((*c).dsp).as_mut_ptr().offset((*(*f).seq_hdr).hbd as isize) as *mut Dav1dDSPContext; + (*f).dsp = &mut (*c).dsp[(*(*f).seq_hdr).hbd as usize]; let bpc = 8 + 2 * (*(*f).seq_hdr).hbd; if ((*(*f).dsp).ipred.intra_pred[DC_PRED as usize]).is_none() { - let dsp: *mut Dav1dDSPContext = - &mut *((*c).dsp).as_mut_ptr().offset((*(*f).seq_hdr).hbd as isize); + let dsp = &mut (*c).dsp[(*(*f).seq_hdr).hbd as usize]; match bpc { #[cfg(feature = "bitdepth_8")] 8 => { @@ -6099,15 +6097,15 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int { let mut j = 0; while j < i { - dav1d_thread_picture_unref(&mut *((*f).refp).as_mut_ptr().offset(j as isize)); + dav1d_thread_picture_unref(&mut (*f).refp[j as usize]); j += 1; } res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); } dav1d_thread_picture_ref( - &mut *((*f).refp).as_mut_ptr().offset(i as isize), - &mut (*((*c).refs).as_mut_ptr().offset(refidx as isize)).p, + &mut (*f).refp[i as usize], + &mut ((*c).refs[refidx as usize]).p, ); ref_coded_width[i as usize] = (*(*c).refs[refidx as usize].p.p.frame_hdr).width[0]; if (*(*f).frame_hdr).width[0] != (*c).refs[refidx as usize].p.p.p.w @@ -6128,9 +6126,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int (*f).gmv_warp_allowed[i as usize] = ((*(*f).frame_hdr).gmv[i as usize].type_0 > DAV1D_WM_TYPE_TRANSLATION && (*(*f).frame_hdr).force_integer_mv == 0 - && !dav1d_get_shear_params( - &mut *((*(*f).frame_hdr).gmv).as_mut_ptr().offset(i as isize), - ) + && !dav1d_get_shear_params(&mut (*(*f).frame_hdr).gmv[i as usize]) && (*f).svc[i as usize][0].scale == 0) as uint8_t; i += 1; } @@ -6140,10 +6136,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } else { let pri_ref: libc::c_int = (*(*f).frame_hdr).refidx[(*(*f).frame_hdr).primary_ref_frame as usize]; - dav1d_cdf_thread_ref( - &mut (*f).in_cdf, - &mut *((*c).cdf).as_mut_ptr().offset(pri_ref as isize), - ); + dav1d_cdf_thread_ref(&mut (*f).in_cdf, &mut (*c).cdf[pri_ref as usize]); } if (*(*f).frame_hdr).refresh_context != 0 { res = dav1d_cdf_thread_alloc(c, &mut (*f).out_cdf, ((*c).n_fc > 1) as libc::c_int); @@ -6367,30 +6360,21 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int while i < 8 { if refresh_frame_flags & (1 << i) != 0 { if !((*c).refs[i as usize].p.p.frame_hdr).is_null() { - dav1d_thread_picture_unref(&mut (*((*c).refs).as_mut_ptr().offset(i as isize)).p); + dav1d_thread_picture_unref(&mut ((*c).refs[i as usize]).p); } - dav1d_thread_picture_ref( - &mut (*((*c).refs).as_mut_ptr().offset(i as isize)).p, - &mut (*f).sr_cur, - ); - dav1d_cdf_thread_unref(&mut *((*c).cdf).as_mut_ptr().offset(i as isize)); + dav1d_thread_picture_ref(&mut ((*c).refs[i as usize]).p, &mut (*f).sr_cur); + dav1d_cdf_thread_unref(&mut (*c).cdf[i as usize]); if (*(*f).frame_hdr).refresh_context != 0 { - dav1d_cdf_thread_ref( - &mut *((*c).cdf).as_mut_ptr().offset(i as isize), - &mut (*f).out_cdf, - ); + dav1d_cdf_thread_ref(&mut (*c).cdf[i as usize], &mut (*f).out_cdf); } else { - dav1d_cdf_thread_ref( - &mut *((*c).cdf).as_mut_ptr().offset(i as isize), - &mut (*f).in_cdf, - ); + dav1d_cdf_thread_ref(&mut (*c).cdf[i as usize], &mut (*f).in_cdf); } - dav1d_ref_dec(&mut (*((*c).refs).as_mut_ptr().offset(i as isize)).segmap); + dav1d_ref_dec(&mut ((*c).refs[i as usize]).segmap); (*c).refs[i as usize].segmap = (*f).cur_segmap_ref; if !((*f).cur_segmap_ref).is_null() { dav1d_ref_inc((*f).cur_segmap_ref); } - dav1d_ref_dec(&mut (*((*c).refs).as_mut_ptr().offset(i as isize)).refmvs); + dav1d_ref_dec(&mut ((*c).refs[i as usize]).refmvs); if (*(*f).frame_hdr).allow_intrabc == 0 { (*c).refs[i as usize].refmvs = (*f).mvs_ref; if !((*f).mvs_ref).is_null() { @@ -6413,13 +6397,11 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int while i < 8 { if refresh_frame_flags & (1 << i) != 0 { if !((*c).refs[i as usize].p.p.frame_hdr).is_null() { - dav1d_thread_picture_unref( - &mut (*((*c).refs).as_mut_ptr().offset(i as isize)).p, - ); + dav1d_thread_picture_unref(&mut ((*c).refs[i as usize]).p); } - dav1d_cdf_thread_unref(&mut *((*c).cdf).as_mut_ptr().offset(i as isize)); - dav1d_ref_dec(&mut (*((*c).refs).as_mut_ptr().offset(i as isize)).segmap); - dav1d_ref_dec(&mut (*((*c).refs).as_mut_ptr().offset(i as isize)).refmvs); + dav1d_cdf_thread_unref(&mut (*c).cdf[i as usize]); + dav1d_ref_dec(&mut ((*c).refs[i as usize]).segmap); + dav1d_ref_dec(&mut ((*c).refs[i as usize]).refmvs); } i += 1; } From c36818fb4f4ff522c4d82845edc40ff4f4ae5105 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:06:22 -0700 Subject: [PATCH 04/46] `fn dav1d_submit_frame`: Replace a `memcpy` of `Dav1dTileGroup`s with `.clone_from_slice` and `impl Clone for Dav1dTileGroup`. --- src/decode.rs | 10 ++++------ src/internal.rs | 1 + 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index a34a7f775..2c75f4d27 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6163,12 +6163,10 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } (*f).n_tile_data_alloc = (*c).n_tile_data; } - memcpy( - (*f).tile as *mut libc::c_void, - (*c).tile as *const libc::c_void, - ((*c).n_tile_data as libc::c_ulong) - .wrapping_mul(::core::mem::size_of::() as libc::c_ulong), - ); + let num_tiles = (*c).n_tile_data.try_into().unwrap(); + let f_tiles = slice::from_raw_parts_mut((*f).tile, num_tiles); + let c_tiles = slice::from_raw_parts((*c).tile, num_tiles); + f_tiles.clone_from_slice(c_tiles); memset( (*c).tile as *mut libc::c_void, 0, diff --git a/src/internal.rs b/src/internal.rs index 74f314a35..106611d82 100644 --- a/src/internal.rs +++ b/src/internal.rs @@ -24,6 +24,7 @@ use crate::src::thread_data::thread_data; use libc::pthread_cond_t; use libc::pthread_mutex_t; +#[derive(Clone)] #[repr(C)] pub struct Dav1dTileGroup { pub data: Dav1dData, From 71a373121d64f7fafb67d921361ed5bf09eedac4 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:11:50 -0700 Subject: [PATCH 05/46] `fn dav1d_submit_frame`: Replace a `memset(0)` of `Dav1dTileGroup`s with `.fill_with(Default::default)` and `impl Default for Dav1dTileGroup` and inner types. --- include/dav1d/common.rs | 13 ++++++++++++- include/dav1d/data.rs | 13 +++++++++++++ src/decode.rs | 8 ++------ src/internal.rs | 2 +- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/include/dav1d/common.rs b/include/dav1d/common.rs index 3fdece7d6..4e7f4db10 100644 --- a/include/dav1d/common.rs +++ b/include/dav1d/common.rs @@ -1,3 +1,5 @@ +use std::ptr; + use crate::include::stddef::size_t; use crate::include::stdint::int64_t; use crate::include::stdint::uint8_t; @@ -10,7 +12,16 @@ pub struct Dav1dUserData { pub r#ref: *mut Dav1dRef, } -#[derive(Clone)] +impl Default for Dav1dUserData { + fn default() -> Self { + Self { + data: ptr::null(), + r#ref: ptr::null_mut(), + } + } +} + +#[derive(Clone, Default)] #[repr(C)] pub struct Dav1dDataProps { pub timestamp: int64_t, diff --git a/include/dav1d/data.rs b/include/dav1d/data.rs index 71fa31f8f..8dc8c228b 100644 --- a/include/dav1d/data.rs +++ b/include/dav1d/data.rs @@ -1,3 +1,5 @@ +use std::ptr; + use crate::include::dav1d::common::Dav1dDataProps; use crate::include::stddef::size_t; use crate::include::stdint::uint8_t; @@ -11,3 +13,14 @@ pub struct Dav1dData { pub r#ref: *mut Dav1dRef, pub m: Dav1dDataProps, } + +impl Default for Dav1dData { + fn default() -> Self { + Self { + data: ptr::null(), + sz: Default::default(), + r#ref: ptr::null_mut(), + m: Default::default(), + } + } +} diff --git a/src/decode.rs b/src/decode.rs index 2c75f4d27..47374c496 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6165,13 +6165,9 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } let num_tiles = (*c).n_tile_data.try_into().unwrap(); let f_tiles = slice::from_raw_parts_mut((*f).tile, num_tiles); - let c_tiles = slice::from_raw_parts((*c).tile, num_tiles); + let c_tiles = slice::from_raw_parts_mut((*c).tile, num_tiles); f_tiles.clone_from_slice(c_tiles); - memset( - (*c).tile as *mut libc::c_void, - 0, - ((*c).n_tile_data as size_t).wrapping_mul(::core::mem::size_of::()), - ); + c_tiles.fill_with(Default::default); (*f).n_tile_data = (*c).n_tile_data; (*c).n_tile_data = 0; res = dav1d_thread_picture_alloc(c, f, bpc); diff --git a/src/internal.rs b/src/internal.rs index 106611d82..4885f6831 100644 --- a/src/internal.rs +++ b/src/internal.rs @@ -24,7 +24,7 @@ use crate::src::thread_data::thread_data; use libc::pthread_cond_t; use libc::pthread_mutex_t; -#[derive(Clone)] +#[derive(Clone, Default)] #[repr(C)] pub struct Dav1dTileGroup { pub data: Dav1dData, From e4b6d0281c563b118bbfd96c3cd8113c86b54588 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:14:06 -0700 Subject: [PATCH 06/46] `fn dav1d_submit_frame`: Replace `memcpy`s of arrays with assignment. --- src/decode.rs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 47374c496..416b05e2a 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6270,11 +6270,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int (*f).ref_mvs[i as usize] = 0 as *mut refmvs_temporal_block; (*f).ref_mvs_ref[i as usize] = 0 as *mut Dav1dRef; } - memcpy( - ((*f).refrefpoc[i as usize]).as_mut_ptr() as *mut libc::c_void, - ((*c).refs[refidx as usize].refpoc).as_mut_ptr() as *const libc::c_void, - ::core::mem::size_of::<[libc::c_uint; 7]>() as libc::c_ulong, - ); + (*f).refrefpoc[i as usize] = (*c).refs[refidx as usize].refpoc; i += 1; } } else { @@ -6375,11 +6371,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_ref_inc((*f).mvs_ref); } } - memcpy( - ((*c).refs[i as usize].refpoc).as_mut_ptr() as *mut libc::c_void, - ((*f).refpoc).as_mut_ptr() as *const libc::c_void, - ::core::mem::size_of::<[libc::c_uint; 7]>() as libc::c_ulong, - ); + (*c).refs[i as usize].refpoc = (*f).refpoc; } i += 1; } From 129e6ffda4e782006a7fbdd5fc80f24913148156 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:21:52 -0700 Subject: [PATCH 07/46] `fn dav1d_submit_frame`: Replace `memset`s of arrays with `.fill`. --- src/decode.rs | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 416b05e2a..022e42f20 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6246,11 +6246,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int i += 1; } } else { - memset( - ((*f).refpoc).as_mut_ptr() as *mut libc::c_void, - 0, - ::core::mem::size_of::<[libc::c_uint; 7]>(), - ); + (*f).refpoc.fill(0); } if (*(*f).frame_hdr).use_ref_frame_mvs != 0 { let mut i = 0; @@ -6274,19 +6270,11 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int i += 1; } } else { - memset( - ((*f).ref_mvs_ref).as_mut_ptr() as *mut libc::c_void, - 0, - ::core::mem::size_of::<[*mut Dav1dRef; 7]>(), - ); + (*f).ref_mvs_ref.fill_with(ptr::null_mut); } } else { (*f).mvs_ref = 0 as *mut Dav1dRef; - memset( - ((*f).ref_mvs_ref).as_mut_ptr() as *mut libc::c_void, - 0, - ::core::mem::size_of::<[*mut Dav1dRef; 7]>(), - ); + (*f).ref_mvs_ref.fill_with(ptr::null_mut); } if (*(*f).frame_hdr).segmentation.enabled != 0 { (*f).prev_segmap_ref = 0 as *mut Dav1dRef; From 661b0d30e1bc065960868416c0089859587777c0 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:22:06 -0700 Subject: [PATCH 08/46] `fn dav1d_submit_frame`: Replace `memset`s of slices with `.fill`. --- src/decode.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decode.rs b/src/decode.rs index 022e42f20..99cbd08da 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6326,7 +6326,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int return dav1d_submit_frame_error(res, f, c, out_delayed); } (*f).cur_segmap = (*(*f).cur_segmap_ref).data as *mut uint8_t; - memset((*f).cur_segmap as *mut libc::c_void, 0, segmap_size); + slice::from_raw_parts_mut((*f).cur_segmap, segmap_size).fill(0); } } else { (*f).cur_segmap = 0 as *mut uint8_t; From 2ba2d263fea7ac374525cc1feb02ba9befb89ce6 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:24:51 -0700 Subject: [PATCH 09/46] `fn dav1d_submit_frame`: Make `c` arg a ref (as a var). --- src/decode.rs | 183 +++++++++++++++++++++++++------------------------- 1 file changed, 90 insertions(+), 93 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 99cbd08da..1c5098896 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5935,83 +5935,85 @@ unsafe extern "C" fn dav1d_submit_frame_error( #[no_mangle] pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int { + let c = &mut *c; // TODO(kkysen) propagate to arg once we deduplicate the fn decl + let f: *mut Dav1dFrameContext; let mut res: libc::c_int; let mut out_delayed: *mut Dav1dThreadPicture = 0 as *mut Dav1dThreadPicture; - if (*c).n_fc > 1 { - pthread_mutex_lock(&mut (*c).task_thread.lock); - let fresh39 = (*c).frame_thread.next; - (*c).frame_thread.next = ((*c).frame_thread.next).wrapping_add(1); + if c.n_fc > 1 { + pthread_mutex_lock(&mut c.task_thread.lock); + let fresh39 = c.frame_thread.next; + c.frame_thread.next = (c.frame_thread.next).wrapping_add(1); let next: libc::c_uint = fresh39; - if (*c).frame_thread.next == (*c).n_fc { - (*c).frame_thread.next = 0; + if c.frame_thread.next == c.n_fc { + c.frame_thread.next = 0; } - f = &mut *((*c).fc).offset(next as isize) as *mut Dav1dFrameContext; + f = &mut *(c.fc).offset(next as isize) as *mut Dav1dFrameContext; while (*f).n_tile_data > 0 { - pthread_cond_wait(&mut (*f).task_thread.cond, &mut (*c).task_thread.lock); + pthread_cond_wait(&mut (*f).task_thread.cond, &mut c.task_thread.lock); } - out_delayed = &mut *((*c).frame_thread.out_delayed).offset(next as isize); + out_delayed = &mut *(c.frame_thread.out_delayed).offset(next as isize); if !((*out_delayed).p.data[0]).is_null() || ::core::intrinsics::atomic_load_seqcst( &mut (*f).task_thread.error as *mut atomic_int, ) != 0 { let mut first: libc::c_uint = - ::core::intrinsics::atomic_load_seqcst(&mut (*c).task_thread.first); - if first.wrapping_add(1) < (*c).n_fc { - ::core::intrinsics::atomic_xadd_seqcst(&mut (*c).task_thread.first, 1); + ::core::intrinsics::atomic_load_seqcst(&mut c.task_thread.first); + if first.wrapping_add(1) < c.n_fc { + ::core::intrinsics::atomic_xadd_seqcst(&mut c.task_thread.first, 1); } else { - ::core::intrinsics::atomic_store_seqcst(&mut (*c).task_thread.first, 0); + ::core::intrinsics::atomic_store_seqcst(&mut c.task_thread.first, 0); } let fresh40 = ::core::intrinsics::atomic_cxchg_seqcst_seqcst( - &mut (*c).task_thread.reset_task_cur, + &mut c.task_thread.reset_task_cur, *&mut first, (2147483647 as libc::c_uint).wrapping_mul(2).wrapping_add(1), ); *&mut first = fresh40.0; fresh40.1; - if (*c).task_thread.cur != 0 && (*c).task_thread.cur < (*c).n_fc { - (*c).task_thread.cur = ((*c).task_thread.cur).wrapping_sub(1); + if c.task_thread.cur != 0 && c.task_thread.cur < c.n_fc { + c.task_thread.cur = (c.task_thread.cur).wrapping_sub(1); } } let error: libc::c_int = (*f).task_thread.retval; if error != 0 { (*f).task_thread.retval = 0; - (*c).cached_error = error; - dav1d_data_props_copy(&mut (*c).cached_error_props, &mut (*out_delayed).p.m); + c.cached_error = error; + dav1d_data_props_copy(&mut c.cached_error_props, &mut (*out_delayed).p.m); dav1d_thread_picture_unref(out_delayed); } else if !((*out_delayed).p.data[0]).is_null() { let progress: libc::c_uint = ::core::intrinsics::atomic_load_relaxed( &mut *((*out_delayed).progress).offset(1) as *mut atomic_uint, ); - if ((*out_delayed).visible != 0 || (*c).output_invisible_frames != 0) + if ((*out_delayed).visible != 0 || c.output_invisible_frames != 0) && progress != (2147483647 as libc::c_uint) .wrapping_mul(2) .wrapping_add(1) .wrapping_sub(1) { - dav1d_thread_picture_ref(&mut (*c).out, out_delayed); - (*c).event_flags = ::core::mem::transmute::( - (*c).event_flags | dav1d_picture_get_event_flags(out_delayed), + dav1d_thread_picture_ref(&mut c.out, out_delayed); + c.event_flags = ::core::mem::transmute::( + c.event_flags | dav1d_picture_get_event_flags(out_delayed), ); } dav1d_thread_picture_unref(out_delayed); } } else { - f = (*c).fc; + f = c.fc; } - (*f).seq_hdr = (*c).seq_hdr; - (*f).seq_hdr_ref = (*c).seq_hdr_ref; + (*f).seq_hdr = c.seq_hdr; + (*f).seq_hdr_ref = c.seq_hdr_ref; dav1d_ref_inc((*f).seq_hdr_ref); - (*f).frame_hdr = (*c).frame_hdr; - (*f).frame_hdr_ref = (*c).frame_hdr_ref; - (*c).frame_hdr = 0 as *mut Dav1dFrameHeader; - (*c).frame_hdr_ref = 0 as *mut Dav1dRef; - (*f).dsp = &mut (*c).dsp[(*(*f).seq_hdr).hbd as usize]; + (*f).frame_hdr = c.frame_hdr; + (*f).frame_hdr_ref = c.frame_hdr_ref; + c.frame_hdr = 0 as *mut Dav1dFrameHeader; + c.frame_hdr_ref = 0 as *mut Dav1dRef; + (*f).dsp = &mut c.dsp[(*(*f).seq_hdr).hbd as usize]; let bpc = 8 + 2 * (*(*f).seq_hdr).hbd; if ((*(*f).dsp).ipred.intra_pred[DC_PRED as usize]).is_none() { - let dsp = &mut (*c).dsp[(*(*f).seq_hdr).hbd as usize]; + let dsp = &mut c.dsp[(*(*f).seq_hdr).hbd as usize]; match bpc { #[cfg(feature = "bitdepth_8")] 8 => { @@ -6079,7 +6081,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*(*f).frame_hdr).primary_ref_frame != 7 { let pri_ref: libc::c_int = (*(*f).frame_hdr).refidx[(*(*f).frame_hdr).primary_ref_frame as usize]; - if ((*c).refs[pri_ref as usize].p.p.data[0]).is_null() { + if (c.refs[pri_ref as usize].p.p.data[0]).is_null() { res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); } @@ -6087,13 +6089,13 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let mut i = 0; while i < 7 { let refidx: libc::c_int = (*(*f).frame_hdr).refidx[i as usize]; - if ((*c).refs[refidx as usize].p.p.data[0]).is_null() - || ((*(*f).frame_hdr).width[0] * 2) < (*c).refs[refidx as usize].p.p.p.w - || ((*(*f).frame_hdr).height * 2) < (*c).refs[refidx as usize].p.p.p.h - || (*(*f).frame_hdr).width[0] > (*c).refs[refidx as usize].p.p.p.w * 16 - || (*(*f).frame_hdr).height > (*c).refs[refidx as usize].p.p.p.h * 16 - || (*(*f).seq_hdr).layout != (*c).refs[refidx as usize].p.p.p.layout - || bpc != (*c).refs[refidx as usize].p.p.p.bpc + if (c.refs[refidx as usize].p.p.data[0]).is_null() + || ((*(*f).frame_hdr).width[0] * 2) < c.refs[refidx as usize].p.p.p.w + || ((*(*f).frame_hdr).height * 2) < c.refs[refidx as usize].p.p.p.h + || (*(*f).frame_hdr).width[0] > c.refs[refidx as usize].p.p.p.w * 16 + || (*(*f).frame_hdr).height > c.refs[refidx as usize].p.p.p.h * 16 + || (*(*f).seq_hdr).layout != c.refs[refidx as usize].p.p.p.layout + || bpc != c.refs[refidx as usize].p.p.p.bpc { let mut j = 0; while j < i { @@ -6103,18 +6105,15 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); } - dav1d_thread_picture_ref( - &mut (*f).refp[i as usize], - &mut ((*c).refs[refidx as usize]).p, - ); - ref_coded_width[i as usize] = (*(*c).refs[refidx as usize].p.p.frame_hdr).width[0]; - if (*(*f).frame_hdr).width[0] != (*c).refs[refidx as usize].p.p.p.w - || (*(*f).frame_hdr).height != (*c).refs[refidx as usize].p.p.p.h + dav1d_thread_picture_ref(&mut (*f).refp[i as usize], &mut (c.refs[refidx as usize]).p); + ref_coded_width[i as usize] = (*c.refs[refidx as usize].p.p.frame_hdr).width[0]; + if (*(*f).frame_hdr).width[0] != c.refs[refidx as usize].p.p.p.w + || (*(*f).frame_hdr).height != c.refs[refidx as usize].p.p.p.h { - (*f).svc[i as usize][0].scale = (((*c).refs[refidx as usize].p.p.p.w << 14) + (*f).svc[i as usize][0].scale = ((c.refs[refidx as usize].p.p.p.w << 14) + ((*(*f).frame_hdr).width[0] >> 1)) / (*(*f).frame_hdr).width[0]; - (*f).svc[i as usize][1].scale = (((*c).refs[refidx as usize].p.p.p.h << 14) + (*f).svc[i as usize][1].scale = ((c.refs[refidx as usize].p.p.p.h << 14) + ((*(*f).frame_hdr).height >> 1)) / (*(*f).frame_hdr).height; (*f).svc[i as usize][0].step = (*f).svc[i as usize][0].scale + 8 >> 4; @@ -6136,23 +6135,21 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } else { let pri_ref: libc::c_int = (*(*f).frame_hdr).refidx[(*(*f).frame_hdr).primary_ref_frame as usize]; - dav1d_cdf_thread_ref(&mut (*f).in_cdf, &mut (*c).cdf[pri_ref as usize]); + dav1d_cdf_thread_ref(&mut (*f).in_cdf, &mut c.cdf[pri_ref as usize]); } if (*(*f).frame_hdr).refresh_context != 0 { - res = dav1d_cdf_thread_alloc(c, &mut (*f).out_cdf, ((*c).n_fc > 1) as libc::c_int); + res = dav1d_cdf_thread_alloc(c, &mut (*f).out_cdf, (c.n_fc > 1) as libc::c_int); if res < 0 { return dav1d_submit_frame_error(res, f, c, out_delayed); } } - if (*f).n_tile_data_alloc < (*c).n_tile_data { + if (*f).n_tile_data_alloc < c.n_tile_data { freep(&mut (*f).tile as *mut *mut Dav1dTileGroup as *mut libc::c_void); - if !((*c).n_tile_data - < 2147483647 / ::core::mem::size_of::() as libc::c_int) - { + if !(c.n_tile_data < 2147483647 / ::core::mem::size_of::() as libc::c_int) { unreachable!(); } (*f).tile = malloc( - ((*c).n_tile_data as libc::c_ulong) + (c.n_tile_data as libc::c_ulong) .wrapping_mul(::core::mem::size_of::() as libc::c_ulong), ) as *mut Dav1dTileGroup; if ((*f).tile).is_null() { @@ -6161,15 +6158,15 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } - (*f).n_tile_data_alloc = (*c).n_tile_data; + (*f).n_tile_data_alloc = c.n_tile_data; } - let num_tiles = (*c).n_tile_data.try_into().unwrap(); + let num_tiles = c.n_tile_data.try_into().unwrap(); let f_tiles = slice::from_raw_parts_mut((*f).tile, num_tiles); - let c_tiles = slice::from_raw_parts_mut((*c).tile, num_tiles); + let c_tiles = slice::from_raw_parts_mut(c.tile, num_tiles); f_tiles.clone_from_slice(c_tiles); c_tiles.fill_with(Default::default); - (*f).n_tile_data = (*c).n_tile_data; - (*c).n_tile_data = 0; + (*f).n_tile_data = c.n_tile_data; + c.n_tile_data = 0; res = dav1d_thread_picture_alloc(c, f, bpc); if res < 0 { return dav1d_submit_frame_error(res, f, c, out_delayed); @@ -6196,11 +6193,11 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int (*f).resize_start[0] = get_upscale_x0((*f).cur.p.w, (*f).sr_cur.p.p.w, (*f).resize_step[0]); (*f).resize_start[1] = get_upscale_x0(in_cw, out_cw, (*f).resize_step[1]); } - if (*c).n_fc == 1 { - if (*(*f).frame_hdr).show_frame != 0 || (*c).output_invisible_frames != 0 { - dav1d_thread_picture_ref(&mut (*c).out, &mut (*f).sr_cur); - (*c).event_flags = ::core::mem::transmute::( - (*c).event_flags | dav1d_picture_get_event_flags(&mut (*f).sr_cur), + if c.n_fc == 1 { + if (*(*f).frame_hdr).show_frame != 0 || c.output_invisible_frames != 0 { + dav1d_thread_picture_ref(&mut c.out, &mut (*f).sr_cur); + c.event_flags = ::core::mem::transmute::( + c.event_flags | dav1d_picture_get_event_flags(&mut (*f).sr_cur), ); } } else { @@ -6218,7 +6215,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int (*f).b4_stride = ((*f).bw + 31 & !31) as ptrdiff_t; (*f).bitdepth_max = (1 << (*f).cur.p.bpc) - 1; *&mut (*f).task_thread.error = 0; - let uses_2pass: libc::c_int = ((*c).n_fc > 1) as libc::c_int; + let uses_2pass: libc::c_int = (c.n_fc > 1) as libc::c_int; let cols: libc::c_int = (*(*f).frame_hdr).tiling.cols; let rows: libc::c_int = (*(*f).frame_hdr).tiling.rows; ::core::intrinsics::atomic_store_seqcst( @@ -6227,7 +6224,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int ); if (*(*f).frame_hdr).frame_type & 1 != 0 || (*(*f).frame_hdr).allow_intrabc != 0 { (*f).mvs_ref = dav1d_ref_create_using_pool( - (*c).refmvs_pool, + c.refmvs_pool, (::core::mem::size_of::()) .wrapping_mul((*f).sb128h as size_t) .wrapping_mul(16) @@ -6254,19 +6251,19 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let refidx: libc::c_int = (*(*f).frame_hdr).refidx[i as usize]; let ref_w: libc::c_int = (ref_coded_width[i as usize] + 7 >> 3) << 1; let ref_h: libc::c_int = ((*f).refp[i as usize].p.p.h + 7 >> 3) << 1; - if !((*c).refs[refidx as usize].refmvs).is_null() + if !(c.refs[refidx as usize].refmvs).is_null() && ref_w == (*f).bw && ref_h == (*f).bh { - (*f).ref_mvs_ref[i as usize] = (*c).refs[refidx as usize].refmvs; + (*f).ref_mvs_ref[i as usize] = c.refs[refidx as usize].refmvs; dav1d_ref_inc((*f).ref_mvs_ref[i as usize]); (*f).ref_mvs[i as usize] = - (*(*c).refs[refidx as usize].refmvs).data as *mut refmvs_temporal_block; + (*c.refs[refidx as usize].refmvs).data as *mut refmvs_temporal_block; } else { (*f).ref_mvs[i as usize] = 0 as *mut refmvs_temporal_block; (*f).ref_mvs_ref[i as usize] = 0 as *mut Dav1dRef; } - (*f).refrefpoc[i as usize] = (*c).refs[refidx as usize].refpoc; + (*f).refrefpoc[i as usize] = c.refs[refidx as usize].refpoc; i += 1; } } else { @@ -6290,7 +6287,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let ref_h: libc::c_int = ((*f).refp[pri_ref as usize].p.p.h + 7 >> 3) << 1; if ref_w == (*f).bw && ref_h == (*f).bh { (*f).prev_segmap_ref = - (*c).refs[(*(*f).frame_hdr).refidx[pri_ref as usize] as usize].segmap; + c.refs[(*(*f).frame_hdr).refidx[pri_ref as usize] as usize].segmap; if !((*f).prev_segmap_ref).is_null() { dav1d_ref_inc((*f).prev_segmap_ref); (*f).prev_segmap = (*(*f).prev_segmap_ref).data as *const uint8_t; @@ -6299,7 +6296,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } if (*(*f).frame_hdr).segmentation.update_map != 0 { (*f).cur_segmap_ref = dav1d_ref_create_using_pool( - (*c).segmap_pool, + c.segmap_pool, (::core::mem::size_of::()) .wrapping_mul((*f).b4_stride as size_t) .wrapping_mul(32) @@ -6320,7 +6317,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int .wrapping_mul((*f).b4_stride as size_t) .wrapping_mul(32) .wrapping_mul((*f).sb128h as size_t); - (*f).cur_segmap_ref = dav1d_ref_create_using_pool((*c).segmap_pool, segmap_size); + (*f).cur_segmap_ref = dav1d_ref_create_using_pool(c.segmap_pool, segmap_size); if ((*f).cur_segmap_ref).is_null() { res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); @@ -6337,45 +6334,45 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let mut i = 0; while i < 8 { if refresh_frame_flags & (1 << i) != 0 { - if !((*c).refs[i as usize].p.p.frame_hdr).is_null() { - dav1d_thread_picture_unref(&mut ((*c).refs[i as usize]).p); + if !(c.refs[i as usize].p.p.frame_hdr).is_null() { + dav1d_thread_picture_unref(&mut (c.refs[i as usize]).p); } - dav1d_thread_picture_ref(&mut ((*c).refs[i as usize]).p, &mut (*f).sr_cur); - dav1d_cdf_thread_unref(&mut (*c).cdf[i as usize]); + dav1d_thread_picture_ref(&mut (c.refs[i as usize]).p, &mut (*f).sr_cur); + dav1d_cdf_thread_unref(&mut c.cdf[i as usize]); if (*(*f).frame_hdr).refresh_context != 0 { - dav1d_cdf_thread_ref(&mut (*c).cdf[i as usize], &mut (*f).out_cdf); + dav1d_cdf_thread_ref(&mut c.cdf[i as usize], &mut (*f).out_cdf); } else { - dav1d_cdf_thread_ref(&mut (*c).cdf[i as usize], &mut (*f).in_cdf); + dav1d_cdf_thread_ref(&mut c.cdf[i as usize], &mut (*f).in_cdf); } - dav1d_ref_dec(&mut ((*c).refs[i as usize]).segmap); - (*c).refs[i as usize].segmap = (*f).cur_segmap_ref; + dav1d_ref_dec(&mut (c.refs[i as usize]).segmap); + c.refs[i as usize].segmap = (*f).cur_segmap_ref; if !((*f).cur_segmap_ref).is_null() { dav1d_ref_inc((*f).cur_segmap_ref); } - dav1d_ref_dec(&mut ((*c).refs[i as usize]).refmvs); + dav1d_ref_dec(&mut (c.refs[i as usize]).refmvs); if (*(*f).frame_hdr).allow_intrabc == 0 { - (*c).refs[i as usize].refmvs = (*f).mvs_ref; + c.refs[i as usize].refmvs = (*f).mvs_ref; if !((*f).mvs_ref).is_null() { dav1d_ref_inc((*f).mvs_ref); } } - (*c).refs[i as usize].refpoc = (*f).refpoc; + c.refs[i as usize].refpoc = (*f).refpoc; } i += 1; } - if (*c).n_fc == 1 { + if c.n_fc == 1 { res = dav1d_decode_frame(&mut *f); if res < 0 { - dav1d_thread_picture_unref(&mut (*c).out); + dav1d_thread_picture_unref(&mut c.out); let mut i = 0; while i < 8 { if refresh_frame_flags & (1 << i) != 0 { - if !((*c).refs[i as usize].p.p.frame_hdr).is_null() { - dav1d_thread_picture_unref(&mut ((*c).refs[i as usize]).p); + if !(c.refs[i as usize].p.p.frame_hdr).is_null() { + dav1d_thread_picture_unref(&mut (c.refs[i as usize]).p); } - dav1d_cdf_thread_unref(&mut (*c).cdf[i as usize]); - dav1d_ref_dec(&mut ((*c).refs[i as usize]).segmap); - dav1d_ref_dec(&mut ((*c).refs[i as usize]).refmvs); + dav1d_cdf_thread_unref(&mut c.cdf[i as usize]); + dav1d_ref_dec(&mut (c.refs[i as usize]).segmap); + dav1d_ref_dec(&mut (c.refs[i as usize]).refmvs); } i += 1; } @@ -6383,7 +6380,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } } else { dav1d_task_frame_init(f); - pthread_mutex_unlock(&mut (*c).task_thread.lock); + pthread_mutex_unlock(&mut c.task_thread.lock); } return 0; } From 6db87e2c6c60027dbb3fe39c35153e4fc5f40f2f Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:26:43 -0700 Subject: [PATCH 10/46] `fn dav1d_submit_frame`: Make `f` var a ref. --- src/decode.rs | 376 ++++++++++++++++++++++++-------------------------- 1 file changed, 182 insertions(+), 194 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 1c5098896..c4b10fd4a 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5937,7 +5937,7 @@ unsafe extern "C" fn dav1d_submit_frame_error( pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int { let c = &mut *c; // TODO(kkysen) propagate to arg once we deduplicate the fn decl - let f: *mut Dav1dFrameContext; + let f; let mut res: libc::c_int; let mut out_delayed: *mut Dav1dThreadPicture = 0 as *mut Dav1dThreadPicture; if c.n_fc > 1 { @@ -5948,15 +5948,14 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if c.frame_thread.next == c.n_fc { c.frame_thread.next = 0; } - f = &mut *(c.fc).offset(next as isize) as *mut Dav1dFrameContext; - while (*f).n_tile_data > 0 { - pthread_cond_wait(&mut (*f).task_thread.cond, &mut c.task_thread.lock); + f = &mut *(c.fc).offset(next as isize); + while f.n_tile_data > 0 { + pthread_cond_wait(&mut f.task_thread.cond, &mut c.task_thread.lock); } out_delayed = &mut *(c.frame_thread.out_delayed).offset(next as isize); if !((*out_delayed).p.data[0]).is_null() - || ::core::intrinsics::atomic_load_seqcst( - &mut (*f).task_thread.error as *mut atomic_int, - ) != 0 + || ::core::intrinsics::atomic_load_seqcst(&mut f.task_thread.error as *mut atomic_int) + != 0 { let mut first: libc::c_uint = ::core::intrinsics::atomic_load_seqcst(&mut c.task_thread.first); @@ -5976,9 +5975,9 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int c.task_thread.cur = (c.task_thread.cur).wrapping_sub(1); } } - let error: libc::c_int = (*f).task_thread.retval; + let error: libc::c_int = f.task_thread.retval; if error != 0 { - (*f).task_thread.retval = 0; + f.task_thread.retval = 0; c.cached_error = error; dav1d_data_props_copy(&mut c.cached_error_props, &mut (*out_delayed).p.m); dav1d_thread_picture_unref(out_delayed); @@ -6001,19 +6000,19 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_thread_picture_unref(out_delayed); } } else { - f = c.fc; + f = &mut *c.fc; } - (*f).seq_hdr = c.seq_hdr; - (*f).seq_hdr_ref = c.seq_hdr_ref; - dav1d_ref_inc((*f).seq_hdr_ref); - (*f).frame_hdr = c.frame_hdr; - (*f).frame_hdr_ref = c.frame_hdr_ref; + f.seq_hdr = c.seq_hdr; + f.seq_hdr_ref = c.seq_hdr_ref; + dav1d_ref_inc(f.seq_hdr_ref); + f.frame_hdr = c.frame_hdr; + f.frame_hdr_ref = c.frame_hdr_ref; c.frame_hdr = 0 as *mut Dav1dFrameHeader; c.frame_hdr_ref = 0 as *mut Dav1dRef; - (*f).dsp = &mut c.dsp[(*(*f).seq_hdr).hbd as usize]; - let bpc = 8 + 2 * (*(*f).seq_hdr).hbd; - if ((*(*f).dsp).ipred.intra_pred[DC_PRED as usize]).is_none() { - let dsp = &mut c.dsp[(*(*f).seq_hdr).hbd as usize]; + f.dsp = &mut c.dsp[(*f.seq_hdr).hbd as usize]; + let bpc = 8 + 2 * (*f.seq_hdr).hbd; + if ((*f.dsp).ipred.intra_pred[DC_PRED as usize]).is_none() { + let dsp = &mut c.dsp[(*f.seq_hdr).hbd as usize]; match bpc { #[cfg(feature = "bitdepth_8")] 8 => { @@ -6040,47 +6039,47 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int c, b"Compiled without support for %d-bit decoding\n\0" as *const u8 as *const libc::c_char, - 8 + 2 * (*(*f).seq_hdr).hbd, + 8 + 2 * (*f.seq_hdr).hbd, ); res = -92; return dav1d_submit_frame_error(res, f, c, out_delayed); } } } - if (*(*f).seq_hdr).hbd == 0 { + if (*f.seq_hdr).hbd == 0 { #[cfg(feature = "bitdepth_8")] { - (*f).bd_fn.recon_b_inter = Some(dav1d_recon_b_inter_8bpc); - (*f).bd_fn.recon_b_intra = Some(dav1d_recon_b_intra_8bpc); - (*f).bd_fn.filter_sbrow = Some(dav1d_filter_sbrow_8bpc); - (*f).bd_fn.filter_sbrow_deblock_cols = Some(dav1d_filter_sbrow_deblock_cols_8bpc); - (*f).bd_fn.filter_sbrow_deblock_rows = Some(dav1d_filter_sbrow_deblock_rows_8bpc); - (*f).bd_fn.filter_sbrow_cdef = Some(dav1d_filter_sbrow_cdef_8bpc); - (*f).bd_fn.filter_sbrow_resize = Some(dav1d_filter_sbrow_resize_8bpc); - (*f).bd_fn.filter_sbrow_lr = Some(dav1d_filter_sbrow_lr_8bpc); - (*f).bd_fn.backup_ipred_edge = Some(dav1d_backup_ipred_edge_8bpc); - (*f).bd_fn.read_coef_blocks = Some(dav1d_read_coef_blocks_8bpc); + f.bd_fn.recon_b_inter = Some(dav1d_recon_b_inter_8bpc); + f.bd_fn.recon_b_intra = Some(dav1d_recon_b_intra_8bpc); + f.bd_fn.filter_sbrow = Some(dav1d_filter_sbrow_8bpc); + f.bd_fn.filter_sbrow_deblock_cols = Some(dav1d_filter_sbrow_deblock_cols_8bpc); + f.bd_fn.filter_sbrow_deblock_rows = Some(dav1d_filter_sbrow_deblock_rows_8bpc); + f.bd_fn.filter_sbrow_cdef = Some(dav1d_filter_sbrow_cdef_8bpc); + f.bd_fn.filter_sbrow_resize = Some(dav1d_filter_sbrow_resize_8bpc); + f.bd_fn.filter_sbrow_lr = Some(dav1d_filter_sbrow_lr_8bpc); + f.bd_fn.backup_ipred_edge = Some(dav1d_backup_ipred_edge_8bpc); + f.bd_fn.read_coef_blocks = Some(dav1d_read_coef_blocks_8bpc); } } else { #[cfg(feature = "bitdepth_16")] { - (*f).bd_fn.recon_b_inter = Some(dav1d_recon_b_inter_16bpc); - (*f).bd_fn.recon_b_intra = Some(dav1d_recon_b_intra_16bpc); - (*f).bd_fn.filter_sbrow = Some(dav1d_filter_sbrow_16bpc); - (*f).bd_fn.filter_sbrow_deblock_cols = Some(dav1d_filter_sbrow_deblock_cols_16bpc); - (*f).bd_fn.filter_sbrow_deblock_rows = Some(dav1d_filter_sbrow_deblock_rows_16bpc); - (*f).bd_fn.filter_sbrow_cdef = Some(dav1d_filter_sbrow_cdef_16bpc); - (*f).bd_fn.filter_sbrow_resize = Some(dav1d_filter_sbrow_resize_16bpc); - (*f).bd_fn.filter_sbrow_lr = Some(dav1d_filter_sbrow_lr_16bpc); - (*f).bd_fn.backup_ipred_edge = Some(dav1d_backup_ipred_edge_16bpc); - (*f).bd_fn.read_coef_blocks = Some(dav1d_read_coef_blocks_16bpc); + f.bd_fn.recon_b_inter = Some(dav1d_recon_b_inter_16bpc); + f.bd_fn.recon_b_intra = Some(dav1d_recon_b_intra_16bpc); + f.bd_fn.filter_sbrow = Some(dav1d_filter_sbrow_16bpc); + f.bd_fn.filter_sbrow_deblock_cols = Some(dav1d_filter_sbrow_deblock_cols_16bpc); + f.bd_fn.filter_sbrow_deblock_rows = Some(dav1d_filter_sbrow_deblock_rows_16bpc); + f.bd_fn.filter_sbrow_cdef = Some(dav1d_filter_sbrow_cdef_16bpc); + f.bd_fn.filter_sbrow_resize = Some(dav1d_filter_sbrow_resize_16bpc); + f.bd_fn.filter_sbrow_lr = Some(dav1d_filter_sbrow_lr_16bpc); + f.bd_fn.backup_ipred_edge = Some(dav1d_backup_ipred_edge_16bpc); + f.bd_fn.read_coef_blocks = Some(dav1d_read_coef_blocks_16bpc); } } let mut ref_coded_width: [libc::c_int; 7] = [0; 7]; - if (*(*f).frame_hdr).frame_type & 1 != 0 { - if (*(*f).frame_hdr).primary_ref_frame != 7 { + if (*f.frame_hdr).frame_type & 1 != 0 { + if (*f.frame_hdr).primary_ref_frame != 7 { let pri_ref: libc::c_int = - (*(*f).frame_hdr).refidx[(*(*f).frame_hdr).primary_ref_frame as usize]; + (*f.frame_hdr).refidx[(*f.frame_hdr).primary_ref_frame as usize]; if (c.refs[pri_ref as usize].p.p.data[0]).is_null() { res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); @@ -6088,275 +6087,264 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } let mut i = 0; while i < 7 { - let refidx: libc::c_int = (*(*f).frame_hdr).refidx[i as usize]; + let refidx: libc::c_int = (*f.frame_hdr).refidx[i as usize]; if (c.refs[refidx as usize].p.p.data[0]).is_null() - || ((*(*f).frame_hdr).width[0] * 2) < c.refs[refidx as usize].p.p.p.w - || ((*(*f).frame_hdr).height * 2) < c.refs[refidx as usize].p.p.p.h - || (*(*f).frame_hdr).width[0] > c.refs[refidx as usize].p.p.p.w * 16 - || (*(*f).frame_hdr).height > c.refs[refidx as usize].p.p.p.h * 16 - || (*(*f).seq_hdr).layout != c.refs[refidx as usize].p.p.p.layout + || ((*f.frame_hdr).width[0] * 2) < c.refs[refidx as usize].p.p.p.w + || ((*f.frame_hdr).height * 2) < c.refs[refidx as usize].p.p.p.h + || (*f.frame_hdr).width[0] > c.refs[refidx as usize].p.p.p.w * 16 + || (*f.frame_hdr).height > c.refs[refidx as usize].p.p.p.h * 16 + || (*f.seq_hdr).layout != c.refs[refidx as usize].p.p.p.layout || bpc != c.refs[refidx as usize].p.p.p.bpc { let mut j = 0; while j < i { - dav1d_thread_picture_unref(&mut (*f).refp[j as usize]); + dav1d_thread_picture_unref(&mut f.refp[j as usize]); j += 1; } res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); } - dav1d_thread_picture_ref(&mut (*f).refp[i as usize], &mut (c.refs[refidx as usize]).p); + dav1d_thread_picture_ref(&mut f.refp[i as usize], &mut (c.refs[refidx as usize]).p); ref_coded_width[i as usize] = (*c.refs[refidx as usize].p.p.frame_hdr).width[0]; - if (*(*f).frame_hdr).width[0] != c.refs[refidx as usize].p.p.p.w - || (*(*f).frame_hdr).height != c.refs[refidx as usize].p.p.p.h + if (*f.frame_hdr).width[0] != c.refs[refidx as usize].p.p.p.w + || (*f.frame_hdr).height != c.refs[refidx as usize].p.p.p.h { - (*f).svc[i as usize][0].scale = ((c.refs[refidx as usize].p.p.p.w << 14) - + ((*(*f).frame_hdr).width[0] >> 1)) - / (*(*f).frame_hdr).width[0]; - (*f).svc[i as usize][1].scale = ((c.refs[refidx as usize].p.p.p.h << 14) - + ((*(*f).frame_hdr).height >> 1)) - / (*(*f).frame_hdr).height; - (*f).svc[i as usize][0].step = (*f).svc[i as usize][0].scale + 8 >> 4; - (*f).svc[i as usize][1].step = (*f).svc[i as usize][1].scale + 8 >> 4; + f.svc[i as usize][0].scale = ((c.refs[refidx as usize].p.p.p.w << 14) + + ((*f.frame_hdr).width[0] >> 1)) + / (*f.frame_hdr).width[0]; + f.svc[i as usize][1].scale = ((c.refs[refidx as usize].p.p.p.h << 14) + + ((*f.frame_hdr).height >> 1)) + / (*f.frame_hdr).height; + f.svc[i as usize][0].step = f.svc[i as usize][0].scale + 8 >> 4; + f.svc[i as usize][1].step = f.svc[i as usize][1].scale + 8 >> 4; } else { - (*f).svc[i as usize][1].scale = 0; - (*f).svc[i as usize][0].scale = (*f).svc[i as usize][1].scale; - } - (*f).gmv_warp_allowed[i as usize] = - ((*(*f).frame_hdr).gmv[i as usize].type_0 > DAV1D_WM_TYPE_TRANSLATION - && (*(*f).frame_hdr).force_integer_mv == 0 - && !dav1d_get_shear_params(&mut (*(*f).frame_hdr).gmv[i as usize]) - && (*f).svc[i as usize][0].scale == 0) as uint8_t; + f.svc[i as usize][1].scale = 0; + f.svc[i as usize][0].scale = f.svc[i as usize][1].scale; + } + f.gmv_warp_allowed[i as usize] = + ((*f.frame_hdr).gmv[i as usize].type_0 > DAV1D_WM_TYPE_TRANSLATION + && (*f.frame_hdr).force_integer_mv == 0 + && !dav1d_get_shear_params(&mut (*f.frame_hdr).gmv[i as usize]) + && f.svc[i as usize][0].scale == 0) as uint8_t; i += 1; } } - if (*(*f).frame_hdr).primary_ref_frame == 7 { - dav1d_cdf_thread_init_static(&mut (*f).in_cdf, (*(*f).frame_hdr).quant.yac); + if (*f.frame_hdr).primary_ref_frame == 7 { + dav1d_cdf_thread_init_static(&mut f.in_cdf, (*f.frame_hdr).quant.yac); } else { - let pri_ref: libc::c_int = - (*(*f).frame_hdr).refidx[(*(*f).frame_hdr).primary_ref_frame as usize]; - dav1d_cdf_thread_ref(&mut (*f).in_cdf, &mut c.cdf[pri_ref as usize]); + let pri_ref: libc::c_int = (*f.frame_hdr).refidx[(*f.frame_hdr).primary_ref_frame as usize]; + dav1d_cdf_thread_ref(&mut f.in_cdf, &mut c.cdf[pri_ref as usize]); } - if (*(*f).frame_hdr).refresh_context != 0 { - res = dav1d_cdf_thread_alloc(c, &mut (*f).out_cdf, (c.n_fc > 1) as libc::c_int); + if (*f.frame_hdr).refresh_context != 0 { + res = dav1d_cdf_thread_alloc(c, &mut f.out_cdf, (c.n_fc > 1) as libc::c_int); if res < 0 { return dav1d_submit_frame_error(res, f, c, out_delayed); } } - if (*f).n_tile_data_alloc < c.n_tile_data { - freep(&mut (*f).tile as *mut *mut Dav1dTileGroup as *mut libc::c_void); + if f.n_tile_data_alloc < c.n_tile_data { + freep(&mut f.tile as *mut *mut Dav1dTileGroup as *mut libc::c_void); if !(c.n_tile_data < 2147483647 / ::core::mem::size_of::() as libc::c_int) { unreachable!(); } - (*f).tile = malloc( + f.tile = malloc( (c.n_tile_data as libc::c_ulong) .wrapping_mul(::core::mem::size_of::() as libc::c_ulong), ) as *mut Dav1dTileGroup; - if ((*f).tile).is_null() { - (*f).n_tile_data = 0; - (*f).n_tile_data_alloc = (*f).n_tile_data; + if (f.tile).is_null() { + f.n_tile_data = 0; + f.n_tile_data_alloc = f.n_tile_data; res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } - (*f).n_tile_data_alloc = c.n_tile_data; + f.n_tile_data_alloc = c.n_tile_data; } let num_tiles = c.n_tile_data.try_into().unwrap(); - let f_tiles = slice::from_raw_parts_mut((*f).tile, num_tiles); + let f_tiles = slice::from_raw_parts_mut(f.tile, num_tiles); let c_tiles = slice::from_raw_parts_mut(c.tile, num_tiles); f_tiles.clone_from_slice(c_tiles); c_tiles.fill_with(Default::default); - (*f).n_tile_data = c.n_tile_data; + f.n_tile_data = c.n_tile_data; c.n_tile_data = 0; res = dav1d_thread_picture_alloc(c, f, bpc); if res < 0 { return dav1d_submit_frame_error(res, f, c, out_delayed); } - if (*(*f).frame_hdr).width[0] != (*(*f).frame_hdr).width[1] { - res = dav1d_picture_alloc_copy( - c, - &mut (*f).cur, - (*(*f).frame_hdr).width[0], - &mut (*f).sr_cur.p, - ); + if (*f.frame_hdr).width[0] != (*f.frame_hdr).width[1] { + res = dav1d_picture_alloc_copy(c, &mut f.cur, (*f.frame_hdr).width[0], &mut f.sr_cur.p); if res < 0 { return dav1d_submit_frame_error(res, f, c, out_delayed); } } else { - dav1d_picture_ref(&mut (*f).cur, &mut (*f).sr_cur.p); + dav1d_picture_ref(&mut f.cur, &mut f.sr_cur.p); } - if (*(*f).frame_hdr).width[0] != (*(*f).frame_hdr).width[1] { - (*f).resize_step[0] = (((*f).cur.p.w << 14) + ((*f).sr_cur.p.p.w >> 1)) / (*f).sr_cur.p.p.w; - let ss_hor: libc::c_int = ((*f).cur.p.layout != DAV1D_PIXEL_LAYOUT_I444) as libc::c_int; - let in_cw: libc::c_int = (*f).cur.p.w + ss_hor >> ss_hor; - let out_cw: libc::c_int = (*f).sr_cur.p.p.w + ss_hor >> ss_hor; - (*f).resize_step[1] = ((in_cw << 14) + (out_cw >> 1)) / out_cw; - (*f).resize_start[0] = get_upscale_x0((*f).cur.p.w, (*f).sr_cur.p.p.w, (*f).resize_step[0]); - (*f).resize_start[1] = get_upscale_x0(in_cw, out_cw, (*f).resize_step[1]); + if (*f.frame_hdr).width[0] != (*f.frame_hdr).width[1] { + f.resize_step[0] = ((f.cur.p.w << 14) + (f.sr_cur.p.p.w >> 1)) / f.sr_cur.p.p.w; + let ss_hor: libc::c_int = (f.cur.p.layout != DAV1D_PIXEL_LAYOUT_I444) as libc::c_int; + let in_cw: libc::c_int = f.cur.p.w + ss_hor >> ss_hor; + let out_cw: libc::c_int = f.sr_cur.p.p.w + ss_hor >> ss_hor; + f.resize_step[1] = ((in_cw << 14) + (out_cw >> 1)) / out_cw; + f.resize_start[0] = get_upscale_x0(f.cur.p.w, f.sr_cur.p.p.w, f.resize_step[0]); + f.resize_start[1] = get_upscale_x0(in_cw, out_cw, f.resize_step[1]); } if c.n_fc == 1 { - if (*(*f).frame_hdr).show_frame != 0 || c.output_invisible_frames != 0 { - dav1d_thread_picture_ref(&mut c.out, &mut (*f).sr_cur); + if (*f.frame_hdr).show_frame != 0 || c.output_invisible_frames != 0 { + dav1d_thread_picture_ref(&mut c.out, &mut f.sr_cur); c.event_flags = ::core::mem::transmute::( - c.event_flags | dav1d_picture_get_event_flags(&mut (*f).sr_cur), + c.event_flags | dav1d_picture_get_event_flags(&mut f.sr_cur), ); } } else { - dav1d_thread_picture_ref(out_delayed, &mut (*f).sr_cur); + dav1d_thread_picture_ref(out_delayed, &mut f.sr_cur); } - (*f).w4 = (*(*f).frame_hdr).width[0] + 3 >> 2; - (*f).h4 = (*(*f).frame_hdr).height + 3 >> 2; - (*f).bw = ((*(*f).frame_hdr).width[0] + 7 >> 3) << 1; - (*f).bh = ((*(*f).frame_hdr).height + 7 >> 3) << 1; - (*f).sb128w = (*f).bw + 31 >> 5; - (*f).sb128h = (*f).bh + 31 >> 5; - (*f).sb_shift = 4 + (*(*f).seq_hdr).sb128; - (*f).sb_step = 16 << (*(*f).seq_hdr).sb128; - (*f).sbh = (*f).bh + (*f).sb_step - 1 >> (*f).sb_shift; - (*f).b4_stride = ((*f).bw + 31 & !31) as ptrdiff_t; - (*f).bitdepth_max = (1 << (*f).cur.p.bpc) - 1; - *&mut (*f).task_thread.error = 0; + f.w4 = (*f.frame_hdr).width[0] + 3 >> 2; + f.h4 = (*f.frame_hdr).height + 3 >> 2; + f.bw = ((*f.frame_hdr).width[0] + 7 >> 3) << 1; + f.bh = ((*f.frame_hdr).height + 7 >> 3) << 1; + f.sb128w = f.bw + 31 >> 5; + f.sb128h = f.bh + 31 >> 5; + f.sb_shift = 4 + (*f.seq_hdr).sb128; + f.sb_step = 16 << (*f.seq_hdr).sb128; + f.sbh = f.bh + f.sb_step - 1 >> f.sb_shift; + f.b4_stride = (f.bw + 31 & !31) as ptrdiff_t; + f.bitdepth_max = (1 << f.cur.p.bpc) - 1; + *&mut f.task_thread.error = 0; let uses_2pass: libc::c_int = (c.n_fc > 1) as libc::c_int; - let cols: libc::c_int = (*(*f).frame_hdr).tiling.cols; - let rows: libc::c_int = (*(*f).frame_hdr).tiling.rows; + let cols: libc::c_int = (*f.frame_hdr).tiling.cols; + let rows: libc::c_int = (*f.frame_hdr).tiling.rows; ::core::intrinsics::atomic_store_seqcst( - &mut (*f).task_thread.task_counter, - cols * rows + (*f).sbh << uses_2pass, + &mut f.task_thread.task_counter, + cols * rows + f.sbh << uses_2pass, ); - if (*(*f).frame_hdr).frame_type & 1 != 0 || (*(*f).frame_hdr).allow_intrabc != 0 { - (*f).mvs_ref = dav1d_ref_create_using_pool( + if (*f.frame_hdr).frame_type & 1 != 0 || (*f.frame_hdr).allow_intrabc != 0 { + f.mvs_ref = dav1d_ref_create_using_pool( c.refmvs_pool, (::core::mem::size_of::()) - .wrapping_mul((*f).sb128h as size_t) + .wrapping_mul(f.sb128h as size_t) .wrapping_mul(16) - .wrapping_mul(((*f).b4_stride >> 1) as size_t), + .wrapping_mul((f.b4_stride >> 1) as size_t), ); - if ((*f).mvs_ref).is_null() { + if (f.mvs_ref).is_null() { res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } - (*f).mvs = (*(*f).mvs_ref).data as *mut refmvs_temporal_block; - if (*(*f).frame_hdr).allow_intrabc == 0 { + f.mvs = (*f.mvs_ref).data as *mut refmvs_temporal_block; + if (*f.frame_hdr).allow_intrabc == 0 { let mut i = 0; while i < 7 { - (*f).refpoc[i as usize] = - (*(*f).refp[i as usize].p.frame_hdr).frame_offset as libc::c_uint; + f.refpoc[i as usize] = + (*f.refp[i as usize].p.frame_hdr).frame_offset as libc::c_uint; i += 1; } } else { - (*f).refpoc.fill(0); + f.refpoc.fill(0); } - if (*(*f).frame_hdr).use_ref_frame_mvs != 0 { + if (*f.frame_hdr).use_ref_frame_mvs != 0 { let mut i = 0; while i < 7 { - let refidx: libc::c_int = (*(*f).frame_hdr).refidx[i as usize]; + let refidx: libc::c_int = (*f.frame_hdr).refidx[i as usize]; let ref_w: libc::c_int = (ref_coded_width[i as usize] + 7 >> 3) << 1; - let ref_h: libc::c_int = ((*f).refp[i as usize].p.p.h + 7 >> 3) << 1; - if !(c.refs[refidx as usize].refmvs).is_null() - && ref_w == (*f).bw - && ref_h == (*f).bh - { - (*f).ref_mvs_ref[i as usize] = c.refs[refidx as usize].refmvs; - dav1d_ref_inc((*f).ref_mvs_ref[i as usize]); - (*f).ref_mvs[i as usize] = + let ref_h: libc::c_int = (f.refp[i as usize].p.p.h + 7 >> 3) << 1; + if !(c.refs[refidx as usize].refmvs).is_null() && ref_w == f.bw && ref_h == f.bh { + f.ref_mvs_ref[i as usize] = c.refs[refidx as usize].refmvs; + dav1d_ref_inc(f.ref_mvs_ref[i as usize]); + f.ref_mvs[i as usize] = (*c.refs[refidx as usize].refmvs).data as *mut refmvs_temporal_block; } else { - (*f).ref_mvs[i as usize] = 0 as *mut refmvs_temporal_block; - (*f).ref_mvs_ref[i as usize] = 0 as *mut Dav1dRef; + f.ref_mvs[i as usize] = 0 as *mut refmvs_temporal_block; + f.ref_mvs_ref[i as usize] = 0 as *mut Dav1dRef; } - (*f).refrefpoc[i as usize] = c.refs[refidx as usize].refpoc; + f.refrefpoc[i as usize] = c.refs[refidx as usize].refpoc; i += 1; } } else { - (*f).ref_mvs_ref.fill_with(ptr::null_mut); + f.ref_mvs_ref.fill_with(ptr::null_mut); } } else { - (*f).mvs_ref = 0 as *mut Dav1dRef; - (*f).ref_mvs_ref.fill_with(ptr::null_mut); + f.mvs_ref = 0 as *mut Dav1dRef; + f.ref_mvs_ref.fill_with(ptr::null_mut); } - if (*(*f).frame_hdr).segmentation.enabled != 0 { - (*f).prev_segmap_ref = 0 as *mut Dav1dRef; - (*f).prev_segmap = 0 as *const uint8_t; - if (*(*f).frame_hdr).segmentation.temporal != 0 - || (*(*f).frame_hdr).segmentation.update_map == 0 + if (*f.frame_hdr).segmentation.enabled != 0 { + f.prev_segmap_ref = 0 as *mut Dav1dRef; + f.prev_segmap = 0 as *const uint8_t; + if (*f.frame_hdr).segmentation.temporal != 0 || (*f.frame_hdr).segmentation.update_map == 0 { - let pri_ref: libc::c_int = (*(*f).frame_hdr).primary_ref_frame; + let pri_ref: libc::c_int = (*f.frame_hdr).primary_ref_frame; if !(pri_ref != 7) { unreachable!(); } let ref_w: libc::c_int = (ref_coded_width[pri_ref as usize] + 7 >> 3) << 1; - let ref_h: libc::c_int = ((*f).refp[pri_ref as usize].p.p.h + 7 >> 3) << 1; - if ref_w == (*f).bw && ref_h == (*f).bh { - (*f).prev_segmap_ref = - c.refs[(*(*f).frame_hdr).refidx[pri_ref as usize] as usize].segmap; - if !((*f).prev_segmap_ref).is_null() { - dav1d_ref_inc((*f).prev_segmap_ref); - (*f).prev_segmap = (*(*f).prev_segmap_ref).data as *const uint8_t; + let ref_h: libc::c_int = (f.refp[pri_ref as usize].p.p.h + 7 >> 3) << 1; + if ref_w == f.bw && ref_h == f.bh { + f.prev_segmap_ref = c.refs[(*f.frame_hdr).refidx[pri_ref as usize] as usize].segmap; + if !(f.prev_segmap_ref).is_null() { + dav1d_ref_inc(f.prev_segmap_ref); + f.prev_segmap = (*f.prev_segmap_ref).data as *const uint8_t; } } } - if (*(*f).frame_hdr).segmentation.update_map != 0 { - (*f).cur_segmap_ref = dav1d_ref_create_using_pool( + if (*f.frame_hdr).segmentation.update_map != 0 { + f.cur_segmap_ref = dav1d_ref_create_using_pool( c.segmap_pool, (::core::mem::size_of::()) - .wrapping_mul((*f).b4_stride as size_t) + .wrapping_mul(f.b4_stride as size_t) .wrapping_mul(32) - .wrapping_mul((*f).sb128h as size_t), + .wrapping_mul(f.sb128h as size_t), ); - if ((*f).cur_segmap_ref).is_null() { - dav1d_ref_dec(&mut (*f).prev_segmap_ref); + if (f.cur_segmap_ref).is_null() { + dav1d_ref_dec(&mut f.prev_segmap_ref); res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } - (*f).cur_segmap = (*(*f).cur_segmap_ref).data as *mut uint8_t; - } else if !((*f).prev_segmap_ref).is_null() { - (*f).cur_segmap_ref = (*f).prev_segmap_ref; - dav1d_ref_inc((*f).cur_segmap_ref); - (*f).cur_segmap = (*(*f).prev_segmap_ref).data as *mut uint8_t; + f.cur_segmap = (*f.cur_segmap_ref).data as *mut uint8_t; + } else if !(f.prev_segmap_ref).is_null() { + f.cur_segmap_ref = f.prev_segmap_ref; + dav1d_ref_inc(f.cur_segmap_ref); + f.cur_segmap = (*f.prev_segmap_ref).data as *mut uint8_t; } else { let segmap_size: size_t = (::core::mem::size_of::()) - .wrapping_mul((*f).b4_stride as size_t) + .wrapping_mul(f.b4_stride as size_t) .wrapping_mul(32) - .wrapping_mul((*f).sb128h as size_t); - (*f).cur_segmap_ref = dav1d_ref_create_using_pool(c.segmap_pool, segmap_size); - if ((*f).cur_segmap_ref).is_null() { + .wrapping_mul(f.sb128h as size_t); + f.cur_segmap_ref = dav1d_ref_create_using_pool(c.segmap_pool, segmap_size); + if (f.cur_segmap_ref).is_null() { res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } - (*f).cur_segmap = (*(*f).cur_segmap_ref).data as *mut uint8_t; - slice::from_raw_parts_mut((*f).cur_segmap, segmap_size).fill(0); + f.cur_segmap = (*f.cur_segmap_ref).data as *mut uint8_t; + slice::from_raw_parts_mut(f.cur_segmap, segmap_size).fill(0); } } else { - (*f).cur_segmap = 0 as *mut uint8_t; - (*f).cur_segmap_ref = 0 as *mut Dav1dRef; - (*f).prev_segmap_ref = 0 as *mut Dav1dRef; + f.cur_segmap = 0 as *mut uint8_t; + f.cur_segmap_ref = 0 as *mut Dav1dRef; + f.prev_segmap_ref = 0 as *mut Dav1dRef; } - let refresh_frame_flags: libc::c_uint = (*(*f).frame_hdr).refresh_frame_flags as libc::c_uint; + let refresh_frame_flags: libc::c_uint = (*f.frame_hdr).refresh_frame_flags as libc::c_uint; let mut i = 0; while i < 8 { if refresh_frame_flags & (1 << i) != 0 { if !(c.refs[i as usize].p.p.frame_hdr).is_null() { dav1d_thread_picture_unref(&mut (c.refs[i as usize]).p); } - dav1d_thread_picture_ref(&mut (c.refs[i as usize]).p, &mut (*f).sr_cur); + dav1d_thread_picture_ref(&mut (c.refs[i as usize]).p, &mut f.sr_cur); dav1d_cdf_thread_unref(&mut c.cdf[i as usize]); - if (*(*f).frame_hdr).refresh_context != 0 { - dav1d_cdf_thread_ref(&mut c.cdf[i as usize], &mut (*f).out_cdf); + if (*f.frame_hdr).refresh_context != 0 { + dav1d_cdf_thread_ref(&mut c.cdf[i as usize], &mut f.out_cdf); } else { - dav1d_cdf_thread_ref(&mut c.cdf[i as usize], &mut (*f).in_cdf); + dav1d_cdf_thread_ref(&mut c.cdf[i as usize], &mut f.in_cdf); } dav1d_ref_dec(&mut (c.refs[i as usize]).segmap); - c.refs[i as usize].segmap = (*f).cur_segmap_ref; - if !((*f).cur_segmap_ref).is_null() { - dav1d_ref_inc((*f).cur_segmap_ref); + c.refs[i as usize].segmap = f.cur_segmap_ref; + if !(f.cur_segmap_ref).is_null() { + dav1d_ref_inc(f.cur_segmap_ref); } dav1d_ref_dec(&mut (c.refs[i as usize]).refmvs); - if (*(*f).frame_hdr).allow_intrabc == 0 { - c.refs[i as usize].refmvs = (*f).mvs_ref; - if !((*f).mvs_ref).is_null() { - dav1d_ref_inc((*f).mvs_ref); + if (*f.frame_hdr).allow_intrabc == 0 { + c.refs[i as usize].refmvs = f.mvs_ref; + if !(f.mvs_ref).is_null() { + dav1d_ref_inc(f.mvs_ref); } } - c.refs[i as usize].refpoc = (*f).refpoc; + c.refs[i as usize].refpoc = f.refpoc; } i += 1; } From fa6cbef694ebbbd9fa9e4732e526d6b05b2d9c43 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:29:16 -0700 Subject: [PATCH 11/46] `fn dav1d_submit_frame`: Make `dsp` var a ref. --- src/decode.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index c4b10fd4a..0826f7161 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6016,23 +6016,23 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int match bpc { #[cfg(feature = "bitdepth_8")] 8 => { - dav1d_cdef_dsp_init_8bpc(&mut (*dsp).cdef); - dav1d_intra_pred_dsp_init_8bpc(&mut (*dsp).ipred); - dav1d_itx_dsp_init_8bpc(&mut (*dsp).itx, bpc); - dav1d_loop_filter_dsp_init_8bpc(&mut (*dsp).lf); - dav1d_loop_restoration_dsp_init::(&mut (*dsp).lr, bpc); - dav1d_mc_dsp_init_8bpc(&mut (*dsp).mc); - dav1d_film_grain_dsp_init_8bpc(&mut (*dsp).fg); + dav1d_cdef_dsp_init_8bpc(&mut dsp.cdef); + dav1d_intra_pred_dsp_init_8bpc(&mut dsp.ipred); + dav1d_itx_dsp_init_8bpc(&mut dsp.itx, bpc); + dav1d_loop_filter_dsp_init_8bpc(&mut dsp.lf); + dav1d_loop_restoration_dsp_init::(&mut dsp.lr, bpc); + dav1d_mc_dsp_init_8bpc(&mut dsp.mc); + dav1d_film_grain_dsp_init_8bpc(&mut dsp.fg); } #[cfg(feature = "bitdepth_16")] 10 | 12 => { - dav1d_cdef_dsp_init_16bpc(&mut (*dsp).cdef); - dav1d_intra_pred_dsp_init_16bpc(&mut (*dsp).ipred); - dav1d_itx_dsp_init_16bpc(&mut (*dsp).itx, bpc); - dav1d_loop_filter_dsp_init_16bpc(&mut (*dsp).lf); - dav1d_loop_restoration_dsp_init::(&mut (*dsp).lr, bpc); - dav1d_mc_dsp_init_16bpc(&mut (*dsp).mc); - dav1d_film_grain_dsp_init_16bpc(&mut (*dsp).fg); + dav1d_cdef_dsp_init_16bpc(&mut dsp.cdef); + dav1d_intra_pred_dsp_init_16bpc(&mut dsp.ipred); + dav1d_itx_dsp_init_16bpc(&mut dsp.itx, bpc); + dav1d_loop_filter_dsp_init_16bpc(&mut dsp.lf); + dav1d_loop_restoration_dsp_init::(&mut dsp.lr, bpc); + dav1d_mc_dsp_init_16bpc(&mut dsp.mc); + dav1d_film_grain_dsp_init_16bpc(&mut dsp.fg); } _ => { dav1d_log( From a17584e28469e8dbd4005a7d8481244749e1c6c3 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:33:40 -0700 Subject: [PATCH 12/46] `fn dav1d_submit_frame`: Translate `for` loops. --- src/decode.rs | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 0826f7161..d5ab89a61 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6085,8 +6085,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int return dav1d_submit_frame_error(res, f, c, out_delayed); } } - let mut i = 0; - while i < 7 { + for i in 0..7 { let refidx: libc::c_int = (*f.frame_hdr).refidx[i as usize]; if (c.refs[refidx as usize].p.p.data[0]).is_null() || ((*f.frame_hdr).width[0] * 2) < c.refs[refidx as usize].p.p.p.w @@ -6096,10 +6095,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int || (*f.seq_hdr).layout != c.refs[refidx as usize].p.p.p.layout || bpc != c.refs[refidx as usize].p.p.p.bpc { - let mut j = 0; - while j < i { + for j in 0..i { dav1d_thread_picture_unref(&mut f.refp[j as usize]); - j += 1; } res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); @@ -6126,7 +6123,6 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int && (*f.frame_hdr).force_integer_mv == 0 && !dav1d_get_shear_params(&mut (*f.frame_hdr).gmv[i as usize]) && f.svc[i as usize][0].scale == 0) as uint8_t; - i += 1; } } if (*f.frame_hdr).primary_ref_frame == 7 { @@ -6229,18 +6225,15 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } f.mvs = (*f.mvs_ref).data as *mut refmvs_temporal_block; if (*f.frame_hdr).allow_intrabc == 0 { - let mut i = 0; - while i < 7 { + for i in 0..7 { f.refpoc[i as usize] = (*f.refp[i as usize].p.frame_hdr).frame_offset as libc::c_uint; - i += 1; } } else { f.refpoc.fill(0); } if (*f.frame_hdr).use_ref_frame_mvs != 0 { - let mut i = 0; - while i < 7 { + for i in 0..7 { let refidx: libc::c_int = (*f.frame_hdr).refidx[i as usize]; let ref_w: libc::c_int = (ref_coded_width[i as usize] + 7 >> 3) << 1; let ref_h: libc::c_int = (f.refp[i as usize].p.p.h + 7 >> 3) << 1; @@ -6254,7 +6247,6 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.ref_mvs_ref[i as usize] = 0 as *mut Dav1dRef; } f.refrefpoc[i as usize] = c.refs[refidx as usize].refpoc; - i += 1; } } else { f.ref_mvs_ref.fill_with(ptr::null_mut); @@ -6319,8 +6311,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.prev_segmap_ref = 0 as *mut Dav1dRef; } let refresh_frame_flags: libc::c_uint = (*f.frame_hdr).refresh_frame_flags as libc::c_uint; - let mut i = 0; - while i < 8 { + for i in 0..8 { if refresh_frame_flags & (1 << i) != 0 { if !(c.refs[i as usize].p.p.frame_hdr).is_null() { dav1d_thread_picture_unref(&mut (c.refs[i as usize]).p); @@ -6346,14 +6337,12 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } c.refs[i as usize].refpoc = f.refpoc; } - i += 1; } if c.n_fc == 1 { res = dav1d_decode_frame(&mut *f); if res < 0 { dav1d_thread_picture_unref(&mut c.out); - let mut i = 0; - while i < 8 { + for i in 0..8 { if refresh_frame_flags & (1 << i) != 0 { if !(c.refs[i as usize].p.p.frame_hdr).is_null() { dav1d_thread_picture_unref(&mut (c.refs[i as usize]).p); @@ -6362,7 +6351,6 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_ref_dec(&mut (c.refs[i as usize]).segmap); dav1d_ref_dec(&mut (c.refs[i as usize]).refmvs); } - i += 1; } return dav1d_submit_frame_error(res, f, c, out_delayed); } From 237b1f127481f91e75a58ec1610274bc663af5dc Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:34:49 -0700 Subject: [PATCH 13/46] `fn dav1d_submit_frame`: Make `i`, `j` index vars `usize`s. --- src/decode.rs | 82 +++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index d5ab89a61..79b210aef 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6086,7 +6086,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } } for i in 0..7 { - let refidx: libc::c_int = (*f.frame_hdr).refidx[i as usize]; + let refidx: libc::c_int = (*f.frame_hdr).refidx[i]; if (c.refs[refidx as usize].p.p.data[0]).is_null() || ((*f.frame_hdr).width[0] * 2) < c.refs[refidx as usize].p.p.p.w || ((*f.frame_hdr).height * 2) < c.refs[refidx as usize].p.p.p.h @@ -6096,33 +6096,32 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int || bpc != c.refs[refidx as usize].p.p.p.bpc { for j in 0..i { - dav1d_thread_picture_unref(&mut f.refp[j as usize]); + dav1d_thread_picture_unref(&mut f.refp[j]); } res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); } - dav1d_thread_picture_ref(&mut f.refp[i as usize], &mut (c.refs[refidx as usize]).p); - ref_coded_width[i as usize] = (*c.refs[refidx as usize].p.p.frame_hdr).width[0]; + dav1d_thread_picture_ref(&mut f.refp[i], &mut (c.refs[refidx as usize]).p); + ref_coded_width[i] = (*c.refs[refidx as usize].p.p.frame_hdr).width[0]; if (*f.frame_hdr).width[0] != c.refs[refidx as usize].p.p.p.w || (*f.frame_hdr).height != c.refs[refidx as usize].p.p.p.h { - f.svc[i as usize][0].scale = ((c.refs[refidx as usize].p.p.p.w << 14) + f.svc[i][0].scale = ((c.refs[refidx as usize].p.p.p.w << 14) + ((*f.frame_hdr).width[0] >> 1)) / (*f.frame_hdr).width[0]; - f.svc[i as usize][1].scale = ((c.refs[refidx as usize].p.p.p.h << 14) + f.svc[i][1].scale = ((c.refs[refidx as usize].p.p.p.h << 14) + ((*f.frame_hdr).height >> 1)) / (*f.frame_hdr).height; - f.svc[i as usize][0].step = f.svc[i as usize][0].scale + 8 >> 4; - f.svc[i as usize][1].step = f.svc[i as usize][1].scale + 8 >> 4; + f.svc[i][0].step = f.svc[i][0].scale + 8 >> 4; + f.svc[i][1].step = f.svc[i][1].scale + 8 >> 4; } else { - f.svc[i as usize][1].scale = 0; - f.svc[i as usize][0].scale = f.svc[i as usize][1].scale; + f.svc[i][1].scale = 0; + f.svc[i][0].scale = f.svc[i][1].scale; } - f.gmv_warp_allowed[i as usize] = - ((*f.frame_hdr).gmv[i as usize].type_0 > DAV1D_WM_TYPE_TRANSLATION - && (*f.frame_hdr).force_integer_mv == 0 - && !dav1d_get_shear_params(&mut (*f.frame_hdr).gmv[i as usize]) - && f.svc[i as usize][0].scale == 0) as uint8_t; + f.gmv_warp_allowed[i] = ((*f.frame_hdr).gmv[i].type_0 > DAV1D_WM_TYPE_TRANSLATION + && (*f.frame_hdr).force_integer_mv == 0 + && !dav1d_get_shear_params(&mut (*f.frame_hdr).gmv[i]) + && f.svc[i][0].scale == 0) as uint8_t; } } if (*f.frame_hdr).primary_ref_frame == 7 { @@ -6226,27 +6225,26 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.mvs = (*f.mvs_ref).data as *mut refmvs_temporal_block; if (*f.frame_hdr).allow_intrabc == 0 { for i in 0..7 { - f.refpoc[i as usize] = - (*f.refp[i as usize].p.frame_hdr).frame_offset as libc::c_uint; + f.refpoc[i] = (*f.refp[i].p.frame_hdr).frame_offset as libc::c_uint; } } else { f.refpoc.fill(0); } if (*f.frame_hdr).use_ref_frame_mvs != 0 { for i in 0..7 { - let refidx: libc::c_int = (*f.frame_hdr).refidx[i as usize]; - let ref_w: libc::c_int = (ref_coded_width[i as usize] + 7 >> 3) << 1; - let ref_h: libc::c_int = (f.refp[i as usize].p.p.h + 7 >> 3) << 1; + let refidx: libc::c_int = (*f.frame_hdr).refidx[i]; + let ref_w: libc::c_int = (ref_coded_width[i] + 7 >> 3) << 1; + let ref_h: libc::c_int = (f.refp[i].p.p.h + 7 >> 3) << 1; if !(c.refs[refidx as usize].refmvs).is_null() && ref_w == f.bw && ref_h == f.bh { - f.ref_mvs_ref[i as usize] = c.refs[refidx as usize].refmvs; - dav1d_ref_inc(f.ref_mvs_ref[i as usize]); - f.ref_mvs[i as usize] = + f.ref_mvs_ref[i] = c.refs[refidx as usize].refmvs; + dav1d_ref_inc(f.ref_mvs_ref[i]); + f.ref_mvs[i] = (*c.refs[refidx as usize].refmvs).data as *mut refmvs_temporal_block; } else { - f.ref_mvs[i as usize] = 0 as *mut refmvs_temporal_block; - f.ref_mvs_ref[i as usize] = 0 as *mut Dav1dRef; + f.ref_mvs[i] = 0 as *mut refmvs_temporal_block; + f.ref_mvs_ref[i] = 0 as *mut Dav1dRef; } - f.refrefpoc[i as usize] = c.refs[refidx as usize].refpoc; + f.refrefpoc[i] = c.refs[refidx as usize].refpoc; } } else { f.ref_mvs_ref.fill_with(ptr::null_mut); @@ -6313,29 +6311,29 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let refresh_frame_flags: libc::c_uint = (*f.frame_hdr).refresh_frame_flags as libc::c_uint; for i in 0..8 { if refresh_frame_flags & (1 << i) != 0 { - if !(c.refs[i as usize].p.p.frame_hdr).is_null() { - dav1d_thread_picture_unref(&mut (c.refs[i as usize]).p); + if !(c.refs[i].p.p.frame_hdr).is_null() { + dav1d_thread_picture_unref(&mut (c.refs[i]).p); } - dav1d_thread_picture_ref(&mut (c.refs[i as usize]).p, &mut f.sr_cur); - dav1d_cdf_thread_unref(&mut c.cdf[i as usize]); + dav1d_thread_picture_ref(&mut (c.refs[i]).p, &mut f.sr_cur); + dav1d_cdf_thread_unref(&mut c.cdf[i]); if (*f.frame_hdr).refresh_context != 0 { - dav1d_cdf_thread_ref(&mut c.cdf[i as usize], &mut f.out_cdf); + dav1d_cdf_thread_ref(&mut c.cdf[i], &mut f.out_cdf); } else { - dav1d_cdf_thread_ref(&mut c.cdf[i as usize], &mut f.in_cdf); + dav1d_cdf_thread_ref(&mut c.cdf[i], &mut f.in_cdf); } - dav1d_ref_dec(&mut (c.refs[i as usize]).segmap); - c.refs[i as usize].segmap = f.cur_segmap_ref; + dav1d_ref_dec(&mut (c.refs[i]).segmap); + c.refs[i].segmap = f.cur_segmap_ref; if !(f.cur_segmap_ref).is_null() { dav1d_ref_inc(f.cur_segmap_ref); } - dav1d_ref_dec(&mut (c.refs[i as usize]).refmvs); + dav1d_ref_dec(&mut (c.refs[i]).refmvs); if (*f.frame_hdr).allow_intrabc == 0 { - c.refs[i as usize].refmvs = f.mvs_ref; + c.refs[i].refmvs = f.mvs_ref; if !(f.mvs_ref).is_null() { dav1d_ref_inc(f.mvs_ref); } } - c.refs[i as usize].refpoc = f.refpoc; + c.refs[i].refpoc = f.refpoc; } } if c.n_fc == 1 { @@ -6344,12 +6342,12 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_thread_picture_unref(&mut c.out); for i in 0..8 { if refresh_frame_flags & (1 << i) != 0 { - if !(c.refs[i as usize].p.p.frame_hdr).is_null() { - dav1d_thread_picture_unref(&mut (c.refs[i as usize]).p); + if !(c.refs[i].p.p.frame_hdr).is_null() { + dav1d_thread_picture_unref(&mut (c.refs[i]).p); } - dav1d_cdf_thread_unref(&mut c.cdf[i as usize]); - dav1d_ref_dec(&mut (c.refs[i as usize]).segmap); - dav1d_ref_dec(&mut (c.refs[i as usize]).refmvs); + dav1d_cdf_thread_unref(&mut c.cdf[i]); + dav1d_ref_dec(&mut (c.refs[i]).segmap); + dav1d_ref_dec(&mut (c.refs[i]).refmvs); } } return dav1d_submit_frame_error(res, f, c, out_delayed); From 7907adaac9efeddb385abfacb462fa34ec3664cd Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:36:29 -0700 Subject: [PATCH 14/46] `fn dav1d_submit_frame`: Make `refidx` vars `usize`s. --- src/decode.rs | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 79b210aef..49d5be2e9 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6086,14 +6086,14 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } } for i in 0..7 { - let refidx: libc::c_int = (*f.frame_hdr).refidx[i]; - if (c.refs[refidx as usize].p.p.data[0]).is_null() - || ((*f.frame_hdr).width[0] * 2) < c.refs[refidx as usize].p.p.p.w - || ((*f.frame_hdr).height * 2) < c.refs[refidx as usize].p.p.p.h - || (*f.frame_hdr).width[0] > c.refs[refidx as usize].p.p.p.w * 16 - || (*f.frame_hdr).height > c.refs[refidx as usize].p.p.p.h * 16 - || (*f.seq_hdr).layout != c.refs[refidx as usize].p.p.p.layout - || bpc != c.refs[refidx as usize].p.p.p.bpc + let refidx = (*f.frame_hdr).refidx[i] as usize; + if (c.refs[refidx].p.p.data[0]).is_null() + || ((*f.frame_hdr).width[0] * 2) < c.refs[refidx].p.p.p.w + || ((*f.frame_hdr).height * 2) < c.refs[refidx].p.p.p.h + || (*f.frame_hdr).width[0] > c.refs[refidx].p.p.p.w * 16 + || (*f.frame_hdr).height > c.refs[refidx].p.p.p.h * 16 + || (*f.seq_hdr).layout != c.refs[refidx].p.p.p.layout + || bpc != c.refs[refidx].p.p.p.bpc { for j in 0..i { dav1d_thread_picture_unref(&mut f.refp[j]); @@ -6101,16 +6101,15 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); } - dav1d_thread_picture_ref(&mut f.refp[i], &mut (c.refs[refidx as usize]).p); - ref_coded_width[i] = (*c.refs[refidx as usize].p.p.frame_hdr).width[0]; - if (*f.frame_hdr).width[0] != c.refs[refidx as usize].p.p.p.w - || (*f.frame_hdr).height != c.refs[refidx as usize].p.p.p.h + dav1d_thread_picture_ref(&mut f.refp[i], &mut (c.refs[refidx]).p); + ref_coded_width[i] = (*c.refs[refidx].p.p.frame_hdr).width[0]; + if (*f.frame_hdr).width[0] != c.refs[refidx].p.p.p.w + || (*f.frame_hdr).height != c.refs[refidx].p.p.p.h { - f.svc[i][0].scale = ((c.refs[refidx as usize].p.p.p.w << 14) + f.svc[i][0].scale = ((c.refs[refidx].p.p.p.w << 14) + ((*f.frame_hdr).width[0] >> 1)) / (*f.frame_hdr).width[0]; - f.svc[i][1].scale = ((c.refs[refidx as usize].p.p.p.h << 14) - + ((*f.frame_hdr).height >> 1)) + f.svc[i][1].scale = ((c.refs[refidx].p.p.p.h << 14) + ((*f.frame_hdr).height >> 1)) / (*f.frame_hdr).height; f.svc[i][0].step = f.svc[i][0].scale + 8 >> 4; f.svc[i][1].step = f.svc[i][1].scale + 8 >> 4; @@ -6232,19 +6231,18 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } if (*f.frame_hdr).use_ref_frame_mvs != 0 { for i in 0..7 { - let refidx: libc::c_int = (*f.frame_hdr).refidx[i]; + let refidx = (*f.frame_hdr).refidx[i] as usize; let ref_w: libc::c_int = (ref_coded_width[i] + 7 >> 3) << 1; let ref_h: libc::c_int = (f.refp[i].p.p.h + 7 >> 3) << 1; - if !(c.refs[refidx as usize].refmvs).is_null() && ref_w == f.bw && ref_h == f.bh { - f.ref_mvs_ref[i] = c.refs[refidx as usize].refmvs; + if !(c.refs[refidx].refmvs).is_null() && ref_w == f.bw && ref_h == f.bh { + f.ref_mvs_ref[i] = c.refs[refidx].refmvs; dav1d_ref_inc(f.ref_mvs_ref[i]); - f.ref_mvs[i] = - (*c.refs[refidx as usize].refmvs).data as *mut refmvs_temporal_block; + f.ref_mvs[i] = (*c.refs[refidx].refmvs).data as *mut refmvs_temporal_block; } else { f.ref_mvs[i] = 0 as *mut refmvs_temporal_block; f.ref_mvs_ref[i] = 0 as *mut Dav1dRef; } - f.refrefpoc[i] = c.refs[refidx as usize].refpoc; + f.refrefpoc[i] = c.refs[refidx].refpoc; } } else { f.ref_mvs_ref.fill_with(ptr::null_mut); From 0713b4d3059bf8a1a3e3e8e049720ab423a176bb Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:38:24 -0700 Subject: [PATCH 15/46] `fn dav1d_submit_frame`: Make `pri_ref` vars `usize`s. --- src/decode.rs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 49d5be2e9..56927c509 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6078,9 +6078,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let mut ref_coded_width: [libc::c_int; 7] = [0; 7]; if (*f.frame_hdr).frame_type & 1 != 0 { if (*f.frame_hdr).primary_ref_frame != 7 { - let pri_ref: libc::c_int = - (*f.frame_hdr).refidx[(*f.frame_hdr).primary_ref_frame as usize]; - if (c.refs[pri_ref as usize].p.p.data[0]).is_null() { + let pri_ref = (*f.frame_hdr).refidx[(*f.frame_hdr).primary_ref_frame as usize] as usize; + if (c.refs[pri_ref].p.p.data[0]).is_null() { res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); } @@ -6126,8 +6125,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*f.frame_hdr).primary_ref_frame == 7 { dav1d_cdf_thread_init_static(&mut f.in_cdf, (*f.frame_hdr).quant.yac); } else { - let pri_ref: libc::c_int = (*f.frame_hdr).refidx[(*f.frame_hdr).primary_ref_frame as usize]; - dav1d_cdf_thread_ref(&mut f.in_cdf, &mut c.cdf[pri_ref as usize]); + let pri_ref = (*f.frame_hdr).refidx[(*f.frame_hdr).primary_ref_frame as usize] as usize; + dav1d_cdf_thread_ref(&mut f.in_cdf, &mut c.cdf[pri_ref]); } if (*f.frame_hdr).refresh_context != 0 { res = dav1d_cdf_thread_alloc(c, &mut f.out_cdf, (c.n_fc > 1) as libc::c_int); @@ -6256,14 +6255,14 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.prev_segmap = 0 as *const uint8_t; if (*f.frame_hdr).segmentation.temporal != 0 || (*f.frame_hdr).segmentation.update_map == 0 { - let pri_ref: libc::c_int = (*f.frame_hdr).primary_ref_frame; + let pri_ref = (*f.frame_hdr).primary_ref_frame as usize; if !(pri_ref != 7) { unreachable!(); } - let ref_w: libc::c_int = (ref_coded_width[pri_ref as usize] + 7 >> 3) << 1; - let ref_h: libc::c_int = (f.refp[pri_ref as usize].p.p.h + 7 >> 3) << 1; + let ref_w: libc::c_int = (ref_coded_width[pri_ref] + 7 >> 3) << 1; + let ref_h: libc::c_int = (f.refp[pri_ref].p.p.h + 7 >> 3) << 1; if ref_w == f.bw && ref_h == f.bh { - f.prev_segmap_ref = c.refs[(*f.frame_hdr).refidx[pri_ref as usize] as usize].segmap; + f.prev_segmap_ref = c.refs[(*f.frame_hdr).refidx[pri_ref] as usize].segmap; if !(f.prev_segmap_ref).is_null() { dav1d_ref_inc(f.prev_segmap_ref); f.prev_segmap = (*f.prev_segmap_ref).data as *const uint8_t; From 2d444988fc6cad15678ae13aabd816a92fa6fcae Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:41:49 -0700 Subject: [PATCH 16/46] `fn dav1d_submit_frame`: Translate `assert!`s. --- src/decode.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 56927c509..e7bb2911b 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6136,9 +6136,9 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } if f.n_tile_data_alloc < c.n_tile_data { freep(&mut f.tile as *mut *mut Dav1dTileGroup as *mut libc::c_void); - if !(c.n_tile_data < 2147483647 / ::core::mem::size_of::() as libc::c_int) { - unreachable!(); - } + assert!( + c.n_tile_data < 2147483647 / ::core::mem::size_of::() as libc::c_int + ); f.tile = malloc( (c.n_tile_data as libc::c_ulong) .wrapping_mul(::core::mem::size_of::() as libc::c_ulong), @@ -6256,9 +6256,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*f.frame_hdr).segmentation.temporal != 0 || (*f.frame_hdr).segmentation.update_map == 0 { let pri_ref = (*f.frame_hdr).primary_ref_frame as usize; - if !(pri_ref != 7) { - unreachable!(); - } + assert!(pri_ref != 7); let ref_w: libc::c_int = (ref_coded_width[pri_ref] + 7 >> 3) << 1; let ref_h: libc::c_int = (f.refp[pri_ref].p.p.h + 7 >> 3) << 1; if ref_w == f.bw && ref_h == f.bh { From ed7ee7a92145c8f607b82e0201f8fb47566d8c73 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:42:39 -0700 Subject: [PATCH 17/46] `fn dav1d_submit_frame`: Return redundant `return`s. --- src/decode.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decode.rs b/src/decode.rs index e7bb2911b..cabe4e4c3 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6351,5 +6351,5 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_task_frame_init(f); pthread_mutex_unlock(&mut c.task_thread.lock); } - return 0; + 0 } From 7198f64036aeaa2b0f6ffd81421a5570e20d89d5 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Thu, 31 Aug 2023 13:50:26 -0700 Subject: [PATCH 18/46] `fn dav1d_submit_frame`: Remove redundant parentheses and `*&mut`s. --- src/decode.rs | 64 +++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index cabe4e4c3..f830cb31e 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5943,34 +5943,32 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if c.n_fc > 1 { pthread_mutex_lock(&mut c.task_thread.lock); let fresh39 = c.frame_thread.next; - c.frame_thread.next = (c.frame_thread.next).wrapping_add(1); + c.frame_thread.next = c.frame_thread.next.wrapping_add(1); let next: libc::c_uint = fresh39; if c.frame_thread.next == c.n_fc { c.frame_thread.next = 0; } - f = &mut *(c.fc).offset(next as isize); + f = &mut *c.fc.offset(next as isize); while f.n_tile_data > 0 { pthread_cond_wait(&mut f.task_thread.cond, &mut c.task_thread.lock); } - out_delayed = &mut *(c.frame_thread.out_delayed).offset(next as isize); - if !((*out_delayed).p.data[0]).is_null() + out_delayed = &mut *c.frame_thread.out_delayed.offset(next as isize); + if !(*out_delayed).p.data[0].is_null() || ::core::intrinsics::atomic_load_seqcst(&mut f.task_thread.error as *mut atomic_int) != 0 { - let mut first: libc::c_uint = + let first: libc::c_uint = ::core::intrinsics::atomic_load_seqcst(&mut c.task_thread.first); if first.wrapping_add(1) < c.n_fc { ::core::intrinsics::atomic_xadd_seqcst(&mut c.task_thread.first, 1); } else { ::core::intrinsics::atomic_store_seqcst(&mut c.task_thread.first, 0); } - let fresh40 = ::core::intrinsics::atomic_cxchg_seqcst_seqcst( + ::core::intrinsics::atomic_cxchg_seqcst_seqcst( &mut c.task_thread.reset_task_cur, - *&mut first, + first, (2147483647 as libc::c_uint).wrapping_mul(2).wrapping_add(1), ); - *&mut first = fresh40.0; - fresh40.1; if c.task_thread.cur != 0 && c.task_thread.cur < c.n_fc { c.task_thread.cur = (c.task_thread.cur).wrapping_sub(1); } @@ -5981,7 +5979,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int c.cached_error = error; dav1d_data_props_copy(&mut c.cached_error_props, &mut (*out_delayed).p.m); dav1d_thread_picture_unref(out_delayed); - } else if !((*out_delayed).p.data[0]).is_null() { + } else if !(*out_delayed).p.data[0].is_null() { let progress: libc::c_uint = ::core::intrinsics::atomic_load_relaxed( &mut *((*out_delayed).progress).offset(1) as *mut atomic_uint, ); @@ -6011,7 +6009,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int c.frame_hdr_ref = 0 as *mut Dav1dRef; f.dsp = &mut c.dsp[(*f.seq_hdr).hbd as usize]; let bpc = 8 + 2 * (*f.seq_hdr).hbd; - if ((*f.dsp).ipred.intra_pred[DC_PRED as usize]).is_none() { + if (*f.dsp).ipred.intra_pred[DC_PRED as usize].is_none() { let dsp = &mut c.dsp[(*f.seq_hdr).hbd as usize]; match bpc { #[cfg(feature = "bitdepth_8")] @@ -6079,14 +6077,14 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*f.frame_hdr).frame_type & 1 != 0 { if (*f.frame_hdr).primary_ref_frame != 7 { let pri_ref = (*f.frame_hdr).refidx[(*f.frame_hdr).primary_ref_frame as usize] as usize; - if (c.refs[pri_ref].p.p.data[0]).is_null() { + if c.refs[pri_ref].p.p.data[0].is_null() { res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); } } for i in 0..7 { let refidx = (*f.frame_hdr).refidx[i] as usize; - if (c.refs[refidx].p.p.data[0]).is_null() + if c.refs[refidx].p.p.data[0].is_null() || ((*f.frame_hdr).width[0] * 2) < c.refs[refidx].p.p.p.w || ((*f.frame_hdr).height * 2) < c.refs[refidx].p.p.p.h || (*f.frame_hdr).width[0] > c.refs[refidx].p.p.p.w * 16 @@ -6100,7 +6098,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int res = -22; return dav1d_submit_frame_error(res, f, c, out_delayed); } - dav1d_thread_picture_ref(&mut f.refp[i], &mut (c.refs[refidx]).p); + dav1d_thread_picture_ref(&mut f.refp[i], &mut c.refs[refidx].p); ref_coded_width[i] = (*c.refs[refidx].p.p.frame_hdr).width[0]; if (*f.frame_hdr).width[0] != c.refs[refidx].p.p.p.w || (*f.frame_hdr).height != c.refs[refidx].p.p.p.h @@ -6143,7 +6141,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int (c.n_tile_data as libc::c_ulong) .wrapping_mul(::core::mem::size_of::() as libc::c_ulong), ) as *mut Dav1dTileGroup; - if (f.tile).is_null() { + if f.tile.is_null() { f.n_tile_data = 0; f.n_tile_data_alloc = f.n_tile_data; res = -12; @@ -6216,7 +6214,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int .wrapping_mul(16) .wrapping_mul((f.b4_stride >> 1) as size_t), ); - if (f.mvs_ref).is_null() { + if f.mvs_ref.is_null() { res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } @@ -6233,7 +6231,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let refidx = (*f.frame_hdr).refidx[i] as usize; let ref_w: libc::c_int = (ref_coded_width[i] + 7 >> 3) << 1; let ref_h: libc::c_int = (f.refp[i].p.p.h + 7 >> 3) << 1; - if !(c.refs[refidx].refmvs).is_null() && ref_w == f.bw && ref_h == f.bh { + if !c.refs[refidx].refmvs.is_null() && ref_w == f.bw && ref_h == f.bh { f.ref_mvs_ref[i] = c.refs[refidx].refmvs; dav1d_ref_inc(f.ref_mvs_ref[i]); f.ref_mvs[i] = (*c.refs[refidx].refmvs).data as *mut refmvs_temporal_block; @@ -6261,7 +6259,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let ref_h: libc::c_int = (f.refp[pri_ref].p.p.h + 7 >> 3) << 1; if ref_w == f.bw && ref_h == f.bh { f.prev_segmap_ref = c.refs[(*f.frame_hdr).refidx[pri_ref] as usize].segmap; - if !(f.prev_segmap_ref).is_null() { + if !f.prev_segmap_ref.is_null() { dav1d_ref_inc(f.prev_segmap_ref); f.prev_segmap = (*f.prev_segmap_ref).data as *const uint8_t; } @@ -6275,13 +6273,13 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int .wrapping_mul(32) .wrapping_mul(f.sb128h as size_t), ); - if (f.cur_segmap_ref).is_null() { + if f.cur_segmap_ref.is_null() { dav1d_ref_dec(&mut f.prev_segmap_ref); res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } f.cur_segmap = (*f.cur_segmap_ref).data as *mut uint8_t; - } else if !(f.prev_segmap_ref).is_null() { + } else if !f.prev_segmap_ref.is_null() { f.cur_segmap_ref = f.prev_segmap_ref; dav1d_ref_inc(f.cur_segmap_ref); f.cur_segmap = (*f.prev_segmap_ref).data as *mut uint8_t; @@ -6291,7 +6289,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int .wrapping_mul(32) .wrapping_mul(f.sb128h as size_t); f.cur_segmap_ref = dav1d_ref_create_using_pool(c.segmap_pool, segmap_size); - if (f.cur_segmap_ref).is_null() { + if f.cur_segmap_ref.is_null() { res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } @@ -6306,25 +6304,25 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let refresh_frame_flags: libc::c_uint = (*f.frame_hdr).refresh_frame_flags as libc::c_uint; for i in 0..8 { if refresh_frame_flags & (1 << i) != 0 { - if !(c.refs[i].p.p.frame_hdr).is_null() { - dav1d_thread_picture_unref(&mut (c.refs[i]).p); + if !c.refs[i].p.p.frame_hdr.is_null() { + dav1d_thread_picture_unref(&mut c.refs[i].p); } - dav1d_thread_picture_ref(&mut (c.refs[i]).p, &mut f.sr_cur); + dav1d_thread_picture_ref(&mut c.refs[i].p, &mut f.sr_cur); dav1d_cdf_thread_unref(&mut c.cdf[i]); if (*f.frame_hdr).refresh_context != 0 { dav1d_cdf_thread_ref(&mut c.cdf[i], &mut f.out_cdf); } else { dav1d_cdf_thread_ref(&mut c.cdf[i], &mut f.in_cdf); } - dav1d_ref_dec(&mut (c.refs[i]).segmap); + dav1d_ref_dec(&mut c.refs[i].segmap); c.refs[i].segmap = f.cur_segmap_ref; - if !(f.cur_segmap_ref).is_null() { + if !f.cur_segmap_ref.is_null() { dav1d_ref_inc(f.cur_segmap_ref); } - dav1d_ref_dec(&mut (c.refs[i]).refmvs); + dav1d_ref_dec(&mut c.refs[i].refmvs); if (*f.frame_hdr).allow_intrabc == 0 { c.refs[i].refmvs = f.mvs_ref; - if !(f.mvs_ref).is_null() { + if !f.mvs_ref.is_null() { dav1d_ref_inc(f.mvs_ref); } } @@ -6332,17 +6330,17 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } } if c.n_fc == 1 { - res = dav1d_decode_frame(&mut *f); + res = dav1d_decode_frame(f); if res < 0 { dav1d_thread_picture_unref(&mut c.out); for i in 0..8 { if refresh_frame_flags & (1 << i) != 0 { - if !(c.refs[i].p.p.frame_hdr).is_null() { - dav1d_thread_picture_unref(&mut (c.refs[i]).p); + if !c.refs[i].p.p.frame_hdr.is_null() { + dav1d_thread_picture_unref(&mut c.refs[i].p); } dav1d_cdf_thread_unref(&mut c.cdf[i]); - dav1d_ref_dec(&mut (c.refs[i]).segmap); - dav1d_ref_dec(&mut (c.refs[i]).refmvs); + dav1d_ref_dec(&mut c.refs[i].segmap); + dav1d_ref_dec(&mut c.refs[i].refmvs); } } return dav1d_submit_frame_error(res, f, c, out_delayed); From d9c3c5e50a7f22c8d999fa4032b0f6c61c2bd482 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 03:06:57 -0700 Subject: [PATCH 19/46] `fn dav1d_submit_frame`: Remove `transmute`s that are just primitive casts. --- src/decode.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index f830cb31e..df5aa1ff6 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5991,9 +5991,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int .wrapping_sub(1) { dav1d_thread_picture_ref(&mut c.out, out_delayed); - c.event_flags = ::core::mem::transmute::( - c.event_flags | dav1d_picture_get_event_flags(out_delayed), - ); + c.event_flags |= dav1d_picture_get_event_flags(out_delayed); } dav1d_thread_picture_unref(out_delayed); } @@ -6180,9 +6178,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if c.n_fc == 1 { if (*f.frame_hdr).show_frame != 0 || c.output_invisible_frames != 0 { dav1d_thread_picture_ref(&mut c.out, &mut f.sr_cur); - c.event_flags = ::core::mem::transmute::( - c.event_flags | dav1d_picture_get_event_flags(&mut f.sr_cur), - ); + c.event_flags |= dav1d_picture_get_event_flags(&mut f.sr_cur); } } else { dav1d_thread_picture_ref(out_delayed, &mut f.sr_cur); From 387c3dc3259a88af8bc9c33a67e3187881b1b4fa Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 03:17:23 -0700 Subject: [PATCH 20/46] `fn dav1d_submit_frame`: Make `out_delayed` var a ref in its inner scope. --- src/decode.rs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index df5aa1ff6..25ecb86a8 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5939,8 +5939,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let f; let mut res: libc::c_int; - let mut out_delayed: *mut Dav1dThreadPicture = 0 as *mut Dav1dThreadPicture; - if c.n_fc > 1 { + let out_delayed = if c.n_fc > 1 { pthread_mutex_lock(&mut c.task_thread.lock); let fresh39 = c.frame_thread.next; c.frame_thread.next = c.frame_thread.next.wrapping_add(1); @@ -5952,8 +5951,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int while f.n_tile_data > 0 { pthread_cond_wait(&mut f.task_thread.cond, &mut c.task_thread.lock); } - out_delayed = &mut *c.frame_thread.out_delayed.offset(next as isize); - if !(*out_delayed).p.data[0].is_null() + let out_delayed = &mut *c.frame_thread.out_delayed.offset(next as isize); + if !out_delayed.p.data[0].is_null() || ::core::intrinsics::atomic_load_seqcst(&mut f.task_thread.error as *mut atomic_int) != 0 { @@ -5977,13 +5976,13 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if error != 0 { f.task_thread.retval = 0; c.cached_error = error; - dav1d_data_props_copy(&mut c.cached_error_props, &mut (*out_delayed).p.m); + dav1d_data_props_copy(&mut c.cached_error_props, &mut out_delayed.p.m); dav1d_thread_picture_unref(out_delayed); - } else if !(*out_delayed).p.data[0].is_null() { + } else if !out_delayed.p.data[0].is_null() { let progress: libc::c_uint = ::core::intrinsics::atomic_load_relaxed( - &mut *((*out_delayed).progress).offset(1) as *mut atomic_uint, + &mut *(out_delayed.progress).offset(1) as *mut atomic_uint, ); - if ((*out_delayed).visible != 0 || c.output_invisible_frames != 0) + if (out_delayed.visible != 0 || c.output_invisible_frames != 0) && progress != (2147483647 as libc::c_uint) .wrapping_mul(2) @@ -5995,9 +5994,11 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } dav1d_thread_picture_unref(out_delayed); } + out_delayed } else { f = &mut *c.fc; - } + ptr::null_mut() + }; f.seq_hdr = c.seq_hdr; f.seq_hdr_ref = c.seq_hdr_ref; dav1d_ref_inc(f.seq_hdr_ref); From 65ec4f193327a4bd7d0f287174d0cdb429abd572 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 13:13:41 -0700 Subject: [PATCH 21/46] `fn dav1d_submit_frame`: Initialize `f` var with an `if` `else` expr. --- src/decode.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 25ecb86a8..d474c82d6 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5937,9 +5937,8 @@ unsafe extern "C" fn dav1d_submit_frame_error( pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int { let c = &mut *c; // TODO(kkysen) propagate to arg once we deduplicate the fn decl - let f; let mut res: libc::c_int; - let out_delayed = if c.n_fc > 1 { + let (f, out_delayed) = if c.n_fc > 1 { pthread_mutex_lock(&mut c.task_thread.lock); let fresh39 = c.frame_thread.next; c.frame_thread.next = c.frame_thread.next.wrapping_add(1); @@ -5947,7 +5946,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if c.frame_thread.next == c.n_fc { c.frame_thread.next = 0; } - f = &mut *c.fc.offset(next as isize); + let f = &mut *c.fc.offset(next as isize); while f.n_tile_data > 0 { pthread_cond_wait(&mut f.task_thread.cond, &mut c.task_thread.lock); } @@ -5994,10 +5993,9 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } dav1d_thread_picture_unref(out_delayed); } - out_delayed + (f, out_delayed as *mut _) } else { - f = &mut *c.fc; - ptr::null_mut() + (&mut *c.fc, ptr::null_mut()) }; f.seq_hdr = c.seq_hdr; f.seq_hdr_ref = c.seq_hdr_ref; From 659a8a0ff734dc18cf7b11f2be055941f503c8f2 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 13:16:56 -0700 Subject: [PATCH 22/46] `fn dav1d_submit_frame`: Remove `fresh[0-9]+` vars. --- src/decode.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index d474c82d6..28dc3e3d5 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5940,9 +5940,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let mut res: libc::c_int; let (f, out_delayed) = if c.n_fc > 1 { pthread_mutex_lock(&mut c.task_thread.lock); - let fresh39 = c.frame_thread.next; + let next = c.frame_thread.next; c.frame_thread.next = c.frame_thread.next.wrapping_add(1); - let next: libc::c_uint = fresh39; if c.frame_thread.next == c.n_fc { c.frame_thread.next = 0; } From 5d3ea8cd09eb7a081124a44e2130a109108322c7 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 14:00:47 -0700 Subject: [PATCH 23/46] `fn dav1d_submit_frame`: Replace `.wrapping_*` calls with normal arithmetic. --- src/decode.rs | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 28dc3e3d5..73831afc8 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5941,7 +5941,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let (f, out_delayed) = if c.n_fc > 1 { pthread_mutex_lock(&mut c.task_thread.lock); let next = c.frame_thread.next; - c.frame_thread.next = c.frame_thread.next.wrapping_add(1); + c.frame_thread.next += 1; if c.frame_thread.next == c.n_fc { c.frame_thread.next = 0; } @@ -5956,7 +5956,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int { let first: libc::c_uint = ::core::intrinsics::atomic_load_seqcst(&mut c.task_thread.first); - if first.wrapping_add(1) < c.n_fc { + if first + 1 < c.n_fc { ::core::intrinsics::atomic_xadd_seqcst(&mut c.task_thread.first, 1); } else { ::core::intrinsics::atomic_store_seqcst(&mut c.task_thread.first, 0); @@ -5964,10 +5964,10 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int ::core::intrinsics::atomic_cxchg_seqcst_seqcst( &mut c.task_thread.reset_task_cur, first, - (2147483647 as libc::c_uint).wrapping_mul(2).wrapping_add(1), + 2147483647 * 2 + 1, ); if c.task_thread.cur != 0 && c.task_thread.cur < c.n_fc { - c.task_thread.cur = (c.task_thread.cur).wrapping_sub(1); + c.task_thread.cur -= 1; } } let error: libc::c_int = f.task_thread.retval; @@ -5981,11 +5981,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int &mut *(out_delayed.progress).offset(1) as *mut atomic_uint, ); if (out_delayed.visible != 0 || c.output_invisible_frames != 0) - && progress - != (2147483647 as libc::c_uint) - .wrapping_mul(2) - .wrapping_add(1) - .wrapping_sub(1) + && progress != 2147483647 * 2 + 1 - 1 { dav1d_thread_picture_ref(&mut c.out, out_delayed); c.event_flags |= dav1d_picture_get_event_flags(out_delayed); @@ -6134,8 +6130,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int c.n_tile_data < 2147483647 / ::core::mem::size_of::() as libc::c_int ); f.tile = malloc( - (c.n_tile_data as libc::c_ulong) - .wrapping_mul(::core::mem::size_of::() as libc::c_ulong), + c.n_tile_data as libc::c_ulong + * ::core::mem::size_of::() as libc::c_ulong, ) as *mut Dav1dTileGroup; if f.tile.is_null() { f.n_tile_data = 0; @@ -6203,10 +6199,10 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*f.frame_hdr).frame_type & 1 != 0 || (*f.frame_hdr).allow_intrabc != 0 { f.mvs_ref = dav1d_ref_create_using_pool( c.refmvs_pool, - (::core::mem::size_of::()) - .wrapping_mul(f.sb128h as size_t) - .wrapping_mul(16) - .wrapping_mul((f.b4_stride >> 1) as size_t), + ::core::mem::size_of::() + * f.sb128h as size_t + * 16 + * (f.b4_stride >> 1) as size_t, ); if f.mvs_ref.is_null() { res = -12; @@ -6262,10 +6258,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*f.frame_hdr).segmentation.update_map != 0 { f.cur_segmap_ref = dav1d_ref_create_using_pool( c.segmap_pool, - (::core::mem::size_of::()) - .wrapping_mul(f.b4_stride as size_t) - .wrapping_mul(32) - .wrapping_mul(f.sb128h as size_t), + ::core::mem::size_of::() * f.b4_stride as size_t * 32 * f.sb128h as size_t, ); if f.cur_segmap_ref.is_null() { dav1d_ref_dec(&mut f.prev_segmap_ref); @@ -6278,10 +6271,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_ref_inc(f.cur_segmap_ref); f.cur_segmap = (*f.prev_segmap_ref).data as *mut uint8_t; } else { - let segmap_size: size_t = (::core::mem::size_of::()) - .wrapping_mul(f.b4_stride as size_t) - .wrapping_mul(32) - .wrapping_mul(f.sb128h as size_t); + let segmap_size: size_t = + ::core::mem::size_of::() * f.b4_stride as size_t * 32 * f.sb128h as size_t; f.cur_segmap_ref = dav1d_ref_create_using_pool(c.segmap_pool, segmap_size); if f.cur_segmap_ref.is_null() { res = -12; From bff4ffef3703a4b6dec974e8349e579b39cba9ba Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 14:08:31 -0700 Subject: [PATCH 24/46] `fn dav1d_submit_frame_error`: Remove redundant type annotations. --- src/decode.rs | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 73831afc8..9f4ba64ec 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5937,7 +5937,7 @@ unsafe extern "C" fn dav1d_submit_frame_error( pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int { let c = &mut *c; // TODO(kkysen) propagate to arg once we deduplicate the fn decl - let mut res: libc::c_int; + let mut res; let (f, out_delayed) = if c.n_fc > 1 { pthread_mutex_lock(&mut c.task_thread.lock); let next = c.frame_thread.next; @@ -5954,8 +5954,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int || ::core::intrinsics::atomic_load_seqcst(&mut f.task_thread.error as *mut atomic_int) != 0 { - let first: libc::c_uint = - ::core::intrinsics::atomic_load_seqcst(&mut c.task_thread.first); + let first = ::core::intrinsics::atomic_load_seqcst(&mut c.task_thread.first); if first + 1 < c.n_fc { ::core::intrinsics::atomic_xadd_seqcst(&mut c.task_thread.first, 1); } else { @@ -5970,14 +5969,14 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int c.task_thread.cur -= 1; } } - let error: libc::c_int = f.task_thread.retval; + let error = f.task_thread.retval; if error != 0 { f.task_thread.retval = 0; c.cached_error = error; dav1d_data_props_copy(&mut c.cached_error_props, &mut out_delayed.p.m); dav1d_thread_picture_unref(out_delayed); } else if !out_delayed.p.data[0].is_null() { - let progress: libc::c_uint = ::core::intrinsics::atomic_load_relaxed( + let progress = ::core::intrinsics::atomic_load_relaxed( &mut *(out_delayed.progress).offset(1) as *mut atomic_uint, ); if (out_delayed.visible != 0 || c.output_invisible_frames != 0) @@ -6162,9 +6161,9 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } if (*f.frame_hdr).width[0] != (*f.frame_hdr).width[1] { f.resize_step[0] = ((f.cur.p.w << 14) + (f.sr_cur.p.p.w >> 1)) / f.sr_cur.p.p.w; - let ss_hor: libc::c_int = (f.cur.p.layout != DAV1D_PIXEL_LAYOUT_I444) as libc::c_int; - let in_cw: libc::c_int = f.cur.p.w + ss_hor >> ss_hor; - let out_cw: libc::c_int = f.sr_cur.p.p.w + ss_hor >> ss_hor; + let ss_hor = (f.cur.p.layout != DAV1D_PIXEL_LAYOUT_I444) as libc::c_int; + let in_cw = f.cur.p.w + ss_hor >> ss_hor; + let out_cw = f.sr_cur.p.p.w + ss_hor >> ss_hor; f.resize_step[1] = ((in_cw << 14) + (out_cw >> 1)) / out_cw; f.resize_start[0] = get_upscale_x0(f.cur.p.w, f.sr_cur.p.p.w, f.resize_step[0]); f.resize_start[1] = get_upscale_x0(in_cw, out_cw, f.resize_step[1]); @@ -6189,9 +6188,9 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.b4_stride = (f.bw + 31 & !31) as ptrdiff_t; f.bitdepth_max = (1 << f.cur.p.bpc) - 1; *&mut f.task_thread.error = 0; - let uses_2pass: libc::c_int = (c.n_fc > 1) as libc::c_int; - let cols: libc::c_int = (*f.frame_hdr).tiling.cols; - let rows: libc::c_int = (*f.frame_hdr).tiling.rows; + let uses_2pass = (c.n_fc > 1) as libc::c_int; + let cols = (*f.frame_hdr).tiling.cols; + let rows = (*f.frame_hdr).tiling.rows; ::core::intrinsics::atomic_store_seqcst( &mut f.task_thread.task_counter, cols * rows + f.sbh << uses_2pass, @@ -6219,8 +6218,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*f.frame_hdr).use_ref_frame_mvs != 0 { for i in 0..7 { let refidx = (*f.frame_hdr).refidx[i] as usize; - let ref_w: libc::c_int = (ref_coded_width[i] + 7 >> 3) << 1; - let ref_h: libc::c_int = (f.refp[i].p.p.h + 7 >> 3) << 1; + let ref_w = (ref_coded_width[i] + 7 >> 3) << 1; + let ref_h = (f.refp[i].p.p.h + 7 >> 3) << 1; if !c.refs[refidx].refmvs.is_null() && ref_w == f.bw && ref_h == f.bh { f.ref_mvs_ref[i] = c.refs[refidx].refmvs; dav1d_ref_inc(f.ref_mvs_ref[i]); @@ -6245,8 +6244,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int { let pri_ref = (*f.frame_hdr).primary_ref_frame as usize; assert!(pri_ref != 7); - let ref_w: libc::c_int = (ref_coded_width[pri_ref] + 7 >> 3) << 1; - let ref_h: libc::c_int = (f.refp[pri_ref].p.p.h + 7 >> 3) << 1; + let ref_w = (ref_coded_width[pri_ref] + 7 >> 3) << 1; + let ref_h = (f.refp[pri_ref].p.p.h + 7 >> 3) << 1; if ref_w == f.bw && ref_h == f.bh { f.prev_segmap_ref = c.refs[(*f.frame_hdr).refidx[pri_ref] as usize].segmap; if !f.prev_segmap_ref.is_null() { @@ -6271,7 +6270,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_ref_inc(f.cur_segmap_ref); f.cur_segmap = (*f.prev_segmap_ref).data as *mut uint8_t; } else { - let segmap_size: size_t = + let segmap_size = ::core::mem::size_of::() * f.b4_stride as size_t * 32 * f.sb128h as size_t; f.cur_segmap_ref = dav1d_ref_create_using_pool(c.segmap_pool, segmap_size); if f.cur_segmap_ref.is_null() { @@ -6286,7 +6285,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.cur_segmap_ref = 0 as *mut Dav1dRef; f.prev_segmap_ref = 0 as *mut Dav1dRef; } - let refresh_frame_flags: libc::c_uint = (*f.frame_hdr).refresh_frame_flags as libc::c_uint; + let refresh_frame_flags = (*f.frame_hdr).refresh_frame_flags as libc::c_uint; for i in 0..8 { if refresh_frame_flags & (1 << i) != 0 { if !c.refs[i].p.p.frame_hdr.is_null() { From 45c2d42d6f9a1465a9163c73c74ed14362fbd92e Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 14:11:15 -0700 Subject: [PATCH 25/46] `fn dav1d_submit_frame`: Replace `0` literals for ptrs with `ptr::null(_mut)()`. --- src/decode.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 9f4ba64ec..bef970635 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5996,8 +5996,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_ref_inc(f.seq_hdr_ref); f.frame_hdr = c.frame_hdr; f.frame_hdr_ref = c.frame_hdr_ref; - c.frame_hdr = 0 as *mut Dav1dFrameHeader; - c.frame_hdr_ref = 0 as *mut Dav1dRef; + c.frame_hdr = ptr::null_mut(); + c.frame_hdr_ref = ptr::null_mut(); f.dsp = &mut c.dsp[(*f.seq_hdr).hbd as usize]; let bpc = 8 + 2 * (*f.seq_hdr).hbd; if (*f.dsp).ipred.intra_pred[DC_PRED as usize].is_none() { @@ -6225,8 +6225,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_ref_inc(f.ref_mvs_ref[i]); f.ref_mvs[i] = (*c.refs[refidx].refmvs).data as *mut refmvs_temporal_block; } else { - f.ref_mvs[i] = 0 as *mut refmvs_temporal_block; - f.ref_mvs_ref[i] = 0 as *mut Dav1dRef; + f.ref_mvs[i] = ptr::null_mut(); + f.ref_mvs_ref[i] = ptr::null_mut(); } f.refrefpoc[i] = c.refs[refidx].refpoc; } @@ -6234,12 +6234,12 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.ref_mvs_ref.fill_with(ptr::null_mut); } } else { - f.mvs_ref = 0 as *mut Dav1dRef; + f.mvs_ref = ptr::null_mut(); f.ref_mvs_ref.fill_with(ptr::null_mut); } if (*f.frame_hdr).segmentation.enabled != 0 { - f.prev_segmap_ref = 0 as *mut Dav1dRef; - f.prev_segmap = 0 as *const uint8_t; + f.prev_segmap_ref = ptr::null_mut(); + f.prev_segmap = ptr::null(); if (*f.frame_hdr).segmentation.temporal != 0 || (*f.frame_hdr).segmentation.update_map == 0 { let pri_ref = (*f.frame_hdr).primary_ref_frame as usize; @@ -6281,9 +6281,9 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int slice::from_raw_parts_mut(f.cur_segmap, segmap_size).fill(0); } } else { - f.cur_segmap = 0 as *mut uint8_t; - f.cur_segmap_ref = 0 as *mut Dav1dRef; - f.prev_segmap_ref = 0 as *mut Dav1dRef; + f.cur_segmap = ptr::null_mut(); + f.cur_segmap_ref = ptr::null_mut(); + f.prev_segmap_ref = ptr::null_mut(); } let refresh_frame_flags = (*f.frame_hdr).refresh_frame_flags as libc::c_uint; for i in 0..8 { From a79f0742a42d877dc58587ca1031f56476916e76 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 14:12:34 -0700 Subject: [PATCH 26/46] `fn dav1d_submit_frame`: Initialize `ref_coded_width` var with `Default::default()`. --- src/decode.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decode.rs b/src/decode.rs index bef970635..490fa30ef 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6064,7 +6064,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.bd_fn.read_coef_blocks = Some(dav1d_read_coef_blocks_16bpc); } } - let mut ref_coded_width: [libc::c_int; 7] = [0; 7]; + let mut ref_coded_width = <[i32; 7]>::default(); if (*f.frame_hdr).frame_type & 1 != 0 { if (*f.frame_hdr).primary_ref_frame != 7 { let pri_ref = (*f.frame_hdr).refidx[(*f.frame_hdr).primary_ref_frame as usize] as usize; From 02098f5557fadef677df8f371541b67c087e50e6 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:32:04 -0700 Subject: [PATCH 27/46] `fn dav1d_submit_frame`: Use `.cast::` instead of `as *{const,mut} T` for `Dav1dRef::data`. --- src/decode.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 490fa30ef..df2df433a 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6207,7 +6207,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } - f.mvs = (*f.mvs_ref).data as *mut refmvs_temporal_block; + f.mvs = (*f.mvs_ref).data.cast::(); if (*f.frame_hdr).allow_intrabc == 0 { for i in 0..7 { f.refpoc[i] = (*f.refp[i].p.frame_hdr).frame_offset as libc::c_uint; @@ -6223,7 +6223,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if !c.refs[refidx].refmvs.is_null() && ref_w == f.bw && ref_h == f.bh { f.ref_mvs_ref[i] = c.refs[refidx].refmvs; dav1d_ref_inc(f.ref_mvs_ref[i]); - f.ref_mvs[i] = (*c.refs[refidx].refmvs).data as *mut refmvs_temporal_block; + f.ref_mvs[i] = (*c.refs[refidx].refmvs).data.cast::(); } else { f.ref_mvs[i] = ptr::null_mut(); f.ref_mvs_ref[i] = ptr::null_mut(); @@ -6250,7 +6250,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.prev_segmap_ref = c.refs[(*f.frame_hdr).refidx[pri_ref] as usize].segmap; if !f.prev_segmap_ref.is_null() { dav1d_ref_inc(f.prev_segmap_ref); - f.prev_segmap = (*f.prev_segmap_ref).data as *const uint8_t; + f.prev_segmap = (*f.prev_segmap_ref).data.cast::(); } } } @@ -6264,11 +6264,11 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } - f.cur_segmap = (*f.cur_segmap_ref).data as *mut uint8_t; + f.cur_segmap = (*f.cur_segmap_ref).data.cast::(); } else if !f.prev_segmap_ref.is_null() { f.cur_segmap_ref = f.prev_segmap_ref; dav1d_ref_inc(f.cur_segmap_ref); - f.cur_segmap = (*f.prev_segmap_ref).data as *mut uint8_t; + f.cur_segmap = (*f.prev_segmap_ref).data.cast::(); } else { let segmap_size = ::core::mem::size_of::() * f.b4_stride as size_t * 32 * f.sb128h as size_t; @@ -6277,7 +6277,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } - f.cur_segmap = (*f.cur_segmap_ref).data as *mut uint8_t; + f.cur_segmap = (*f.cur_segmap_ref).data.cast::(); slice::from_raw_parts_mut(f.cur_segmap, segmap_size).fill(0); } } else { From 6a3ae32993d61fe97a1833e7522cb4f58c3d3f3e Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:33:52 -0700 Subject: [PATCH 28/46] `fn dav1d_submit_frame`: Replace `uint8_t` with `u8`. --- src/decode.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index df2df433a..d42c582bb 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6108,7 +6108,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.gmv_warp_allowed[i] = ((*f.frame_hdr).gmv[i].type_0 > DAV1D_WM_TYPE_TRANSLATION && (*f.frame_hdr).force_integer_mv == 0 && !dav1d_get_shear_params(&mut (*f.frame_hdr).gmv[i]) - && f.svc[i][0].scale == 0) as uint8_t; + && f.svc[i][0].scale == 0) as u8; } } if (*f.frame_hdr).primary_ref_frame == 7 { @@ -6250,34 +6250,34 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.prev_segmap_ref = c.refs[(*f.frame_hdr).refidx[pri_ref] as usize].segmap; if !f.prev_segmap_ref.is_null() { dav1d_ref_inc(f.prev_segmap_ref); - f.prev_segmap = (*f.prev_segmap_ref).data.cast::(); + f.prev_segmap = (*f.prev_segmap_ref).data.cast::(); } } } if (*f.frame_hdr).segmentation.update_map != 0 { f.cur_segmap_ref = dav1d_ref_create_using_pool( c.segmap_pool, - ::core::mem::size_of::() * f.b4_stride as size_t * 32 * f.sb128h as size_t, + ::core::mem::size_of::() * f.b4_stride as size_t * 32 * f.sb128h as size_t, ); if f.cur_segmap_ref.is_null() { dav1d_ref_dec(&mut f.prev_segmap_ref); res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } - f.cur_segmap = (*f.cur_segmap_ref).data.cast::(); + f.cur_segmap = (*f.cur_segmap_ref).data.cast::(); } else if !f.prev_segmap_ref.is_null() { f.cur_segmap_ref = f.prev_segmap_ref; dav1d_ref_inc(f.cur_segmap_ref); f.cur_segmap = (*f.prev_segmap_ref).data.cast::(); } else { let segmap_size = - ::core::mem::size_of::() * f.b4_stride as size_t * 32 * f.sb128h as size_t; + ::core::mem::size_of::() * f.b4_stride as size_t * 32 * f.sb128h as size_t; f.cur_segmap_ref = dav1d_ref_create_using_pool(c.segmap_pool, segmap_size); if f.cur_segmap_ref.is_null() { res = -12; return dav1d_submit_frame_error(res, f, c, out_delayed); } - f.cur_segmap = (*f.cur_segmap_ref).data.cast::(); + f.cur_segmap = (*f.cur_segmap_ref).data.cast::(); slice::from_raw_parts_mut(f.cur_segmap, segmap_size).fill(0); } } else { From 122c21499fc38e593caa5c0964b7da33eb959498 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:34:41 -0700 Subject: [PATCH 29/46] `fn dav1d_submit_frame_error`: Remove redundant `as` casts. --- src/decode.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index d42c582bb..91b685383 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5897,7 +5897,7 @@ unsafe extern "C" fn dav1d_submit_frame_error( c: *mut Dav1dContext, out_delayed: *mut Dav1dThreadPicture, ) -> libc::c_int { - *&mut (*f).task_thread.error = 1 as libc::c_int; + *&mut (*f).task_thread.error = 1; dav1d_cdf_thread_unref(&mut (*f).in_cdf); if (*(*f).frame_hdr).refresh_context != 0 { dav1d_cdf_thread_unref(&mut (*f).out_cdf); @@ -5910,7 +5910,7 @@ unsafe extern "C" fn dav1d_submit_frame_error( dav1d_ref_dec(&mut *((*f).ref_mvs_ref).as_mut_ptr().offset(i as isize)); i += 1; } - if (*c).n_fc == 1 as libc::c_uint { + if (*c).n_fc == 1 { dav1d_thread_picture_unref(&mut (*c).out); } else { dav1d_thread_picture_unref(out_delayed); @@ -5926,8 +5926,8 @@ unsafe extern "C" fn dav1d_submit_frame_error( dav1d_data_unref_internal(&mut (*((*f).tile).offset(i_0 as isize)).data); i_0 += 1; } - (*f).n_tile_data = 0 as libc::c_int; - if (*c).n_fc > 1 as libc::c_uint { + (*f).n_tile_data = 0; + if (*c).n_fc > 1 { pthread_mutex_unlock(&mut (*c).task_thread.lock); } return res; @@ -6223,7 +6223,9 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if !c.refs[refidx].refmvs.is_null() && ref_w == f.bw && ref_h == f.bh { f.ref_mvs_ref[i] = c.refs[refidx].refmvs; dav1d_ref_inc(f.ref_mvs_ref[i]); - f.ref_mvs[i] = (*c.refs[refidx].refmvs).data.cast::(); + f.ref_mvs[i] = (*c.refs[refidx].refmvs) + .data + .cast::(); } else { f.ref_mvs[i] = ptr::null_mut(); f.ref_mvs_ref[i] = ptr::null_mut(); From bb551fb18d44f73d96e3ec11609dbaec03ce76e9 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:35:18 -0700 Subject: [PATCH 30/46] `fn dav1d_submit_frame_error`: Remove `_[0-9]+` var suffixes. --- src/decode.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 91b685383..8d0c91a8f 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5921,10 +5921,10 @@ unsafe extern "C" fn dav1d_submit_frame_error( dav1d_ref_dec(&mut (*f).seq_hdr_ref); dav1d_ref_dec(&mut (*f).frame_hdr_ref); dav1d_data_props_copy(&mut (*c).cached_error_props, &mut (*c).in_0.m); - let mut i_0 = 0; - while i_0 < (*f).n_tile_data { - dav1d_data_unref_internal(&mut (*((*f).tile).offset(i_0 as isize)).data); - i_0 += 1; + let mut i = 0; + while i < (*f).n_tile_data { + dav1d_data_unref_internal(&mut (*((*f).tile).offset(i as isize)).data); + i += 1; } (*f).n_tile_data = 0; if (*c).n_fc > 1 { From 168f6fab6fde91423f0b2f47a74e09c9ba3ab4f1 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:36:02 -0700 Subject: [PATCH 31/46] `fn dav1d_submit_frame_error`: Make `f` arg a ref. --- src/decode.rs | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 8d0c91a8f..aab9c01ba 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5893,21 +5893,21 @@ fn get_upscale_x0(in_w: libc::c_int, out_w: libc::c_int, step: libc::c_int) -> l unsafe extern "C" fn dav1d_submit_frame_error( res: libc::c_int, - f: *mut Dav1dFrameContext, + f: &mut Dav1dFrameContext, c: *mut Dav1dContext, out_delayed: *mut Dav1dThreadPicture, ) -> libc::c_int { - *&mut (*f).task_thread.error = 1; - dav1d_cdf_thread_unref(&mut (*f).in_cdf); - if (*(*f).frame_hdr).refresh_context != 0 { - dav1d_cdf_thread_unref(&mut (*f).out_cdf); + *&mut f.task_thread.error = 1; + dav1d_cdf_thread_unref(&mut f.in_cdf); + if (*f.frame_hdr).refresh_context != 0 { + dav1d_cdf_thread_unref(&mut f.out_cdf); } let mut i = 0; while i < 7 { - if !((*f).refp[i as usize].p.frame_hdr).is_null() { - dav1d_thread_picture_unref(&mut *((*f).refp).as_mut_ptr().offset(i as isize)); + if !(f.refp[i as usize].p.frame_hdr).is_null() { + dav1d_thread_picture_unref(&mut *(f.refp).as_mut_ptr().offset(i as isize)); } - dav1d_ref_dec(&mut *((*f).ref_mvs_ref).as_mut_ptr().offset(i as isize)); + dav1d_ref_dec(&mut *(f.ref_mvs_ref).as_mut_ptr().offset(i as isize)); i += 1; } if (*c).n_fc == 1 { @@ -5915,18 +5915,18 @@ unsafe extern "C" fn dav1d_submit_frame_error( } else { dav1d_thread_picture_unref(out_delayed); } - dav1d_picture_unref_internal(&mut (*f).cur); - dav1d_thread_picture_unref(&mut (*f).sr_cur); - dav1d_ref_dec(&mut (*f).mvs_ref); - dav1d_ref_dec(&mut (*f).seq_hdr_ref); - dav1d_ref_dec(&mut (*f).frame_hdr_ref); + dav1d_picture_unref_internal(&mut f.cur); + dav1d_thread_picture_unref(&mut f.sr_cur); + dav1d_ref_dec(&mut f.mvs_ref); + dav1d_ref_dec(&mut f.seq_hdr_ref); + dav1d_ref_dec(&mut f.frame_hdr_ref); dav1d_data_props_copy(&mut (*c).cached_error_props, &mut (*c).in_0.m); let mut i = 0; - while i < (*f).n_tile_data { - dav1d_data_unref_internal(&mut (*((*f).tile).offset(i as isize)).data); + while i < f.n_tile_data { + dav1d_data_unref_internal(&mut (*(f.tile).offset(i as isize)).data); i += 1; } - (*f).n_tile_data = 0; + f.n_tile_data = 0; if (*c).n_fc > 1 { pthread_mutex_unlock(&mut (*c).task_thread.lock); } From 9d80d97f5365a133208a12c14f2f44fac9d13f7d Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:37:40 -0700 Subject: [PATCH 32/46] `fn dav1d_submit_frame_error`: Make `c` arg a ref. --- src/decode.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index aab9c01ba..40c548e0f 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5894,7 +5894,7 @@ fn get_upscale_x0(in_w: libc::c_int, out_w: libc::c_int, step: libc::c_int) -> l unsafe extern "C" fn dav1d_submit_frame_error( res: libc::c_int, f: &mut Dav1dFrameContext, - c: *mut Dav1dContext, + c: &mut Dav1dContext, out_delayed: *mut Dav1dThreadPicture, ) -> libc::c_int { *&mut f.task_thread.error = 1; @@ -5910,8 +5910,8 @@ unsafe extern "C" fn dav1d_submit_frame_error( dav1d_ref_dec(&mut *(f.ref_mvs_ref).as_mut_ptr().offset(i as isize)); i += 1; } - if (*c).n_fc == 1 { - dav1d_thread_picture_unref(&mut (*c).out); + if c.n_fc == 1 { + dav1d_thread_picture_unref(&mut c.out); } else { dav1d_thread_picture_unref(out_delayed); } @@ -5920,15 +5920,15 @@ unsafe extern "C" fn dav1d_submit_frame_error( dav1d_ref_dec(&mut f.mvs_ref); dav1d_ref_dec(&mut f.seq_hdr_ref); dav1d_ref_dec(&mut f.frame_hdr_ref); - dav1d_data_props_copy(&mut (*c).cached_error_props, &mut (*c).in_0.m); + dav1d_data_props_copy(&mut c.cached_error_props, &mut c.in_0.m); let mut i = 0; while i < f.n_tile_data { dav1d_data_unref_internal(&mut (*(f.tile).offset(i as isize)).data); i += 1; } f.n_tile_data = 0; - if (*c).n_fc > 1 { - pthread_mutex_unlock(&mut (*c).task_thread.lock); + if c.n_fc > 1 { + pthread_mutex_unlock(&mut c.task_thread.lock); } return res; } From 8e1d49c6ce85fccf4c8326446220c9b6fedeafba Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:37:59 -0700 Subject: [PATCH 33/46] `fn dav1d_submit_frame_error`: Translate `for` loops. --- src/decode.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 40c548e0f..afb5cdabc 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5902,13 +5902,11 @@ unsafe extern "C" fn dav1d_submit_frame_error( if (*f.frame_hdr).refresh_context != 0 { dav1d_cdf_thread_unref(&mut f.out_cdf); } - let mut i = 0; - while i < 7 { + for i in 0..7 { if !(f.refp[i as usize].p.frame_hdr).is_null() { dav1d_thread_picture_unref(&mut *(f.refp).as_mut_ptr().offset(i as isize)); } dav1d_ref_dec(&mut *(f.ref_mvs_ref).as_mut_ptr().offset(i as isize)); - i += 1; } if c.n_fc == 1 { dav1d_thread_picture_unref(&mut c.out); @@ -5921,10 +5919,8 @@ unsafe extern "C" fn dav1d_submit_frame_error( dav1d_ref_dec(&mut f.seq_hdr_ref); dav1d_ref_dec(&mut f.frame_hdr_ref); dav1d_data_props_copy(&mut c.cached_error_props, &mut c.in_0.m); - let mut i = 0; - while i < f.n_tile_data { + for i in 0..f.n_tile_data { dav1d_data_unref_internal(&mut (*(f.tile).offset(i as isize)).data); - i += 1; } f.n_tile_data = 0; if c.n_fc > 1 { From b3f36e097fcc3b35cd93fe70d16b9fe2c4776f28 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:39:42 -0700 Subject: [PATCH 34/46] `fn dav1d_submit_frame_error`: Replace `.as_mut_ptr().offset(i as usize)` with `[i as usize]`. --- src/decode.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index afb5cdabc..563ba54f1 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5904,9 +5904,9 @@ unsafe extern "C" fn dav1d_submit_frame_error( } for i in 0..7 { if !(f.refp[i as usize].p.frame_hdr).is_null() { - dav1d_thread_picture_unref(&mut *(f.refp).as_mut_ptr().offset(i as isize)); + dav1d_thread_picture_unref(&mut f.refp[i as usize]); } - dav1d_ref_dec(&mut *(f.ref_mvs_ref).as_mut_ptr().offset(i as isize)); + dav1d_ref_dec(&mut f.ref_mvs_ref[i as usize]); } if c.n_fc == 1 { dav1d_thread_picture_unref(&mut c.out); From f3e7135aa43dc09119e52005db1ce0978d025ac3 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:40:25 -0700 Subject: [PATCH 35/46] `fn dav1d_submit_frame_error`: Make `i` a `usize`. --- src/decode.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 563ba54f1..9d559fad7 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5903,10 +5903,10 @@ unsafe extern "C" fn dav1d_submit_frame_error( dav1d_cdf_thread_unref(&mut f.out_cdf); } for i in 0..7 { - if !(f.refp[i as usize].p.frame_hdr).is_null() { - dav1d_thread_picture_unref(&mut f.refp[i as usize]); + if !(f.refp[i].p.frame_hdr).is_null() { + dav1d_thread_picture_unref(&mut f.refp[i]); } - dav1d_ref_dec(&mut f.ref_mvs_ref[i as usize]); + dav1d_ref_dec(&mut f.ref_mvs_ref[i]); } if c.n_fc == 1 { dav1d_thread_picture_unref(&mut c.out); From 99d7bd1259650ab4b541249a464fb75299b797e2 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:43:14 -0700 Subject: [PATCH 36/46] `fn dav1d_submit_frame_error`: Make `f.tile` a slice before iterating over it. --- src/decode.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 9d559fad7..4de098b83 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5919,8 +5919,8 @@ unsafe extern "C" fn dav1d_submit_frame_error( dav1d_ref_dec(&mut f.seq_hdr_ref); dav1d_ref_dec(&mut f.frame_hdr_ref); dav1d_data_props_copy(&mut c.cached_error_props, &mut c.in_0.m); - for i in 0..f.n_tile_data { - dav1d_data_unref_internal(&mut (*(f.tile).offset(i as isize)).data); + for tile in slice::from_raw_parts_mut(f.tile, f.n_tile_data.try_into().unwrap()) { + dav1d_data_unref_internal(&mut tile.data); } f.n_tile_data = 0; if c.n_fc > 1 { From 21a0801e757ddc37248febc034d9d003ab65719b Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:44:03 -0700 Subject: [PATCH 37/46] `fn dav1d_submit_frame_error`: Remove redundant `return`. --- src/decode.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decode.rs b/src/decode.rs index 4de098b83..7e7aa50cd 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5926,7 +5926,7 @@ unsafe extern "C" fn dav1d_submit_frame_error( if c.n_fc > 1 { pthread_mutex_unlock(&mut c.task_thread.lock); } - return res; + res } #[no_mangle] From 65afbcc34c945e4ab05d80b94a271ec5e3a77eef Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:45:02 -0700 Subject: [PATCH 38/46] `fn dav1d_submit_frame_error`: Remove redundant parentheses and `*&mut`s. --- src/decode.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 7e7aa50cd..ae4cdaf35 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5897,13 +5897,13 @@ unsafe extern "C" fn dav1d_submit_frame_error( c: &mut Dav1dContext, out_delayed: *mut Dav1dThreadPicture, ) -> libc::c_int { - *&mut f.task_thread.error = 1; + f.task_thread.error = 1; dav1d_cdf_thread_unref(&mut f.in_cdf); if (*f.frame_hdr).refresh_context != 0 { dav1d_cdf_thread_unref(&mut f.out_cdf); } for i in 0..7 { - if !(f.refp[i].p.frame_hdr).is_null() { + if !f.refp[i].p.frame_hdr.is_null() { dav1d_thread_picture_unref(&mut f.refp[i]); } dav1d_ref_dec(&mut f.ref_mvs_ref[i]); From 910af6c13d723139967177e87ffcf3e6f3318ec9 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:52:08 -0700 Subject: [PATCH 39/46] `fn dav1d_submit_frame_error`: Make local `fn` non-`extern "C"`. --- src/decode.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decode.rs b/src/decode.rs index ae4cdaf35..8ce5da080 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5891,7 +5891,7 @@ fn get_upscale_x0(in_w: libc::c_int, out_w: libc::c_int, step: libc::c_int) -> l x0 & 0x3fff } -unsafe extern "C" fn dav1d_submit_frame_error( +unsafe fn dav1d_submit_frame_error( res: libc::c_int, f: &mut Dav1dFrameContext, c: &mut Dav1dContext, From 4adfe0686c32cb323c46d7b2c549a67b5a8bb68c Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:53:25 -0700 Subject: [PATCH 40/46] `fn dav1d_submit_frame_error`: Move to an inner `fn` in `fn dav1d_submit_frame` and rename to `fn error` (originally was a `goto error` block). --- src/decode.rs | 99 ++++++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 8ce5da080..67422bd58 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5891,44 +5891,6 @@ fn get_upscale_x0(in_w: libc::c_int, out_w: libc::c_int, step: libc::c_int) -> l x0 & 0x3fff } -unsafe fn dav1d_submit_frame_error( - res: libc::c_int, - f: &mut Dav1dFrameContext, - c: &mut Dav1dContext, - out_delayed: *mut Dav1dThreadPicture, -) -> libc::c_int { - f.task_thread.error = 1; - dav1d_cdf_thread_unref(&mut f.in_cdf); - if (*f.frame_hdr).refresh_context != 0 { - dav1d_cdf_thread_unref(&mut f.out_cdf); - } - for i in 0..7 { - if !f.refp[i].p.frame_hdr.is_null() { - dav1d_thread_picture_unref(&mut f.refp[i]); - } - dav1d_ref_dec(&mut f.ref_mvs_ref[i]); - } - if c.n_fc == 1 { - dav1d_thread_picture_unref(&mut c.out); - } else { - dav1d_thread_picture_unref(out_delayed); - } - dav1d_picture_unref_internal(&mut f.cur); - dav1d_thread_picture_unref(&mut f.sr_cur); - dav1d_ref_dec(&mut f.mvs_ref); - dav1d_ref_dec(&mut f.seq_hdr_ref); - dav1d_ref_dec(&mut f.frame_hdr_ref); - dav1d_data_props_copy(&mut c.cached_error_props, &mut c.in_0.m); - for tile in slice::from_raw_parts_mut(f.tile, f.n_tile_data.try_into().unwrap()) { - dav1d_data_unref_internal(&mut tile.data); - } - f.n_tile_data = 0; - if c.n_fc > 1 { - pthread_mutex_unlock(&mut c.task_thread.lock); - } - res -} - #[no_mangle] pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int { let c = &mut *c; // TODO(kkysen) propagate to arg once we deduplicate the fn decl @@ -5996,6 +5958,45 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int c.frame_hdr_ref = ptr::null_mut(); f.dsp = &mut c.dsp[(*f.seq_hdr).hbd as usize]; let bpc = 8 + 2 * (*f.seq_hdr).hbd; + + unsafe fn error( + res: libc::c_int, + f: &mut Dav1dFrameContext, + c: &mut Dav1dContext, + out_delayed: *mut Dav1dThreadPicture, + ) -> libc::c_int { + f.task_thread.error = 1; + dav1d_cdf_thread_unref(&mut f.in_cdf); + if (*f.frame_hdr).refresh_context != 0 { + dav1d_cdf_thread_unref(&mut f.out_cdf); + } + for i in 0..7 { + if !f.refp[i].p.frame_hdr.is_null() { + dav1d_thread_picture_unref(&mut f.refp[i]); + } + dav1d_ref_dec(&mut f.ref_mvs_ref[i]); + } + if c.n_fc == 1 { + dav1d_thread_picture_unref(&mut c.out); + } else { + dav1d_thread_picture_unref(out_delayed); + } + dav1d_picture_unref_internal(&mut f.cur); + dav1d_thread_picture_unref(&mut f.sr_cur); + dav1d_ref_dec(&mut f.mvs_ref); + dav1d_ref_dec(&mut f.seq_hdr_ref); + dav1d_ref_dec(&mut f.frame_hdr_ref); + dav1d_data_props_copy(&mut c.cached_error_props, &mut c.in_0.m); + for tile in slice::from_raw_parts_mut(f.tile, f.n_tile_data.try_into().unwrap()) { + dav1d_data_unref_internal(&mut tile.data); + } + f.n_tile_data = 0; + if c.n_fc > 1 { + pthread_mutex_unlock(&mut c.task_thread.lock); + } + res + } + if (*f.dsp).ipred.intra_pred[DC_PRED as usize].is_none() { let dsp = &mut c.dsp[(*f.seq_hdr).hbd as usize]; match bpc { @@ -6027,7 +6028,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int 8 + 2 * (*f.seq_hdr).hbd, ); res = -92; - return dav1d_submit_frame_error(res, f, c, out_delayed); + return error(res, f, c, out_delayed); } } } @@ -6066,7 +6067,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int let pri_ref = (*f.frame_hdr).refidx[(*f.frame_hdr).primary_ref_frame as usize] as usize; if c.refs[pri_ref].p.p.data[0].is_null() { res = -22; - return dav1d_submit_frame_error(res, f, c, out_delayed); + return error(res, f, c, out_delayed); } } for i in 0..7 { @@ -6083,7 +6084,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_thread_picture_unref(&mut f.refp[j]); } res = -22; - return dav1d_submit_frame_error(res, f, c, out_delayed); + return error(res, f, c, out_delayed); } dav1d_thread_picture_ref(&mut f.refp[i], &mut c.refs[refidx].p); ref_coded_width[i] = (*c.refs[refidx].p.p.frame_hdr).width[0]; @@ -6116,7 +6117,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*f.frame_hdr).refresh_context != 0 { res = dav1d_cdf_thread_alloc(c, &mut f.out_cdf, (c.n_fc > 1) as libc::c_int); if res < 0 { - return dav1d_submit_frame_error(res, f, c, out_delayed); + return error(res, f, c, out_delayed); } } if f.n_tile_data_alloc < c.n_tile_data { @@ -6132,7 +6133,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.n_tile_data = 0; f.n_tile_data_alloc = f.n_tile_data; res = -12; - return dav1d_submit_frame_error(res, f, c, out_delayed); + return error(res, f, c, out_delayed); } f.n_tile_data_alloc = c.n_tile_data; } @@ -6145,12 +6146,12 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int c.n_tile_data = 0; res = dav1d_thread_picture_alloc(c, f, bpc); if res < 0 { - return dav1d_submit_frame_error(res, f, c, out_delayed); + return error(res, f, c, out_delayed); } if (*f.frame_hdr).width[0] != (*f.frame_hdr).width[1] { res = dav1d_picture_alloc_copy(c, &mut f.cur, (*f.frame_hdr).width[0], &mut f.sr_cur.p); if res < 0 { - return dav1d_submit_frame_error(res, f, c, out_delayed); + return error(res, f, c, out_delayed); } } else { dav1d_picture_ref(&mut f.cur, &mut f.sr_cur.p); @@ -6201,7 +6202,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int ); if f.mvs_ref.is_null() { res = -12; - return dav1d_submit_frame_error(res, f, c, out_delayed); + return error(res, f, c, out_delayed); } f.mvs = (*f.mvs_ref).data.cast::(); if (*f.frame_hdr).allow_intrabc == 0 { @@ -6260,7 +6261,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if f.cur_segmap_ref.is_null() { dav1d_ref_dec(&mut f.prev_segmap_ref); res = -12; - return dav1d_submit_frame_error(res, f, c, out_delayed); + return error(res, f, c, out_delayed); } f.cur_segmap = (*f.cur_segmap_ref).data.cast::(); } else if !f.prev_segmap_ref.is_null() { @@ -6273,7 +6274,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.cur_segmap_ref = dav1d_ref_create_using_pool(c.segmap_pool, segmap_size); if f.cur_segmap_ref.is_null() { res = -12; - return dav1d_submit_frame_error(res, f, c, out_delayed); + return error(res, f, c, out_delayed); } f.cur_segmap = (*f.cur_segmap_ref).data.cast::(); slice::from_raw_parts_mut(f.cur_segmap, segmap_size).fill(0); @@ -6325,7 +6326,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_ref_dec(&mut c.refs[i].refmvs); } } - return dav1d_submit_frame_error(res, f, c, out_delayed); + return error(res, f, c, out_delayed); } } else { dav1d_task_frame_init(f); From 12fe81787843b260e3b192b9ad6403ce20c93d67 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Fri, 1 Sep 2023 15:58:22 -0700 Subject: [PATCH 41/46] `fn dav1d_submit_frame`: Hoist `res` out of `fn {error => on_error}`. --- src/decode.rs | 55 ++++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 67422bd58..c9c4508f1 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5895,7 +5895,6 @@ fn get_upscale_x0(in_w: libc::c_int, out_w: libc::c_int, step: libc::c_int) -> l pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int { let c = &mut *c; // TODO(kkysen) propagate to arg once we deduplicate the fn decl - let mut res; let (f, out_delayed) = if c.n_fc > 1 { pthread_mutex_lock(&mut c.task_thread.lock); let next = c.frame_thread.next; @@ -5959,12 +5958,11 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.dsp = &mut c.dsp[(*f.seq_hdr).hbd as usize]; let bpc = 8 + 2 * (*f.seq_hdr).hbd; - unsafe fn error( - res: libc::c_int, + unsafe fn on_error( f: &mut Dav1dFrameContext, c: &mut Dav1dContext, out_delayed: *mut Dav1dThreadPicture, - ) -> libc::c_int { + ) { f.task_thread.error = 1; dav1d_cdf_thread_unref(&mut f.in_cdf); if (*f.frame_hdr).refresh_context != 0 { @@ -5994,7 +5992,6 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if c.n_fc > 1 { pthread_mutex_unlock(&mut c.task_thread.lock); } - res } if (*f.dsp).ipred.intra_pred[DC_PRED as usize].is_none() { @@ -6027,8 +6024,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int as *const libc::c_char, 8 + 2 * (*f.seq_hdr).hbd, ); - res = -92; - return error(res, f, c, out_delayed); + on_error(f, c, out_delayed); + return -92; } } } @@ -6066,8 +6063,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*f.frame_hdr).primary_ref_frame != 7 { let pri_ref = (*f.frame_hdr).refidx[(*f.frame_hdr).primary_ref_frame as usize] as usize; if c.refs[pri_ref].p.p.data[0].is_null() { - res = -22; - return error(res, f, c, out_delayed); + on_error(f, c, out_delayed); + return -22; } } for i in 0..7 { @@ -6083,8 +6080,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int for j in 0..i { dav1d_thread_picture_unref(&mut f.refp[j]); } - res = -22; - return error(res, f, c, out_delayed); + on_error(f, c, out_delayed); + return -22; } dav1d_thread_picture_ref(&mut f.refp[i], &mut c.refs[refidx].p); ref_coded_width[i] = (*c.refs[refidx].p.p.frame_hdr).width[0]; @@ -6115,9 +6112,10 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_cdf_thread_ref(&mut f.in_cdf, &mut c.cdf[pri_ref]); } if (*f.frame_hdr).refresh_context != 0 { - res = dav1d_cdf_thread_alloc(c, &mut f.out_cdf, (c.n_fc > 1) as libc::c_int); + let res = dav1d_cdf_thread_alloc(c, &mut f.out_cdf, (c.n_fc > 1) as libc::c_int); if res < 0 { - return error(res, f, c, out_delayed); + on_error(f, c, out_delayed); + return res; } } if f.n_tile_data_alloc < c.n_tile_data { @@ -6132,8 +6130,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if f.tile.is_null() { f.n_tile_data = 0; f.n_tile_data_alloc = f.n_tile_data; - res = -12; - return error(res, f, c, out_delayed); + on_error(f, c, out_delayed); + return -12; } f.n_tile_data_alloc = c.n_tile_data; } @@ -6144,14 +6142,16 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int c_tiles.fill_with(Default::default); f.n_tile_data = c.n_tile_data; c.n_tile_data = 0; - res = dav1d_thread_picture_alloc(c, f, bpc); + let res = dav1d_thread_picture_alloc(c, f, bpc); if res < 0 { - return error(res, f, c, out_delayed); + on_error(f, c, out_delayed); + return res; } if (*f.frame_hdr).width[0] != (*f.frame_hdr).width[1] { - res = dav1d_picture_alloc_copy(c, &mut f.cur, (*f.frame_hdr).width[0], &mut f.sr_cur.p); + let res = dav1d_picture_alloc_copy(c, &mut f.cur, (*f.frame_hdr).width[0], &mut f.sr_cur.p); if res < 0 { - return error(res, f, c, out_delayed); + on_error(f, c, out_delayed); + return res; } } else { dav1d_picture_ref(&mut f.cur, &mut f.sr_cur.p); @@ -6201,8 +6201,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int * (f.b4_stride >> 1) as size_t, ); if f.mvs_ref.is_null() { - res = -12; - return error(res, f, c, out_delayed); + on_error(f, c, out_delayed); + return -12; } f.mvs = (*f.mvs_ref).data.cast::(); if (*f.frame_hdr).allow_intrabc == 0 { @@ -6260,8 +6260,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int ); if f.cur_segmap_ref.is_null() { dav1d_ref_dec(&mut f.prev_segmap_ref); - res = -12; - return error(res, f, c, out_delayed); + on_error(f, c, out_delayed); + return -12; } f.cur_segmap = (*f.cur_segmap_ref).data.cast::(); } else if !f.prev_segmap_ref.is_null() { @@ -6273,8 +6273,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int ::core::mem::size_of::() * f.b4_stride as size_t * 32 * f.sb128h as size_t; f.cur_segmap_ref = dav1d_ref_create_using_pool(c.segmap_pool, segmap_size); if f.cur_segmap_ref.is_null() { - res = -12; - return error(res, f, c, out_delayed); + on_error(f, c, out_delayed); + return -12; } f.cur_segmap = (*f.cur_segmap_ref).data.cast::(); slice::from_raw_parts_mut(f.cur_segmap, segmap_size).fill(0); @@ -6313,7 +6313,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } } if c.n_fc == 1 { - res = dav1d_decode_frame(f); + let res = dav1d_decode_frame(f); if res < 0 { dav1d_thread_picture_unref(&mut c.out); for i in 0..8 { @@ -6326,7 +6326,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_ref_dec(&mut c.refs[i].refmvs); } } - return error(res, f, c, out_delayed); + on_error(f, c, out_delayed); + return res; } } else { dav1d_task_frame_init(f); From d41b9faff9330b7cb636c292f4655363345a07c0 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Tue, 5 Sep 2023 15:30:09 -0700 Subject: [PATCH 42/46] `fn dav1d_submit_frame`: Add back comments and line-breaks from C. --- src/decode.rs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/decode.rs b/src/decode.rs index c9c4508f1..782ead51f 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -5895,6 +5895,7 @@ fn get_upscale_x0(in_w: libc::c_int, out_w: libc::c_int, step: libc::c_int) -> l pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int { let c = &mut *c; // TODO(kkysen) propagate to arg once we deduplicate the fn decl + // wait for c->out_delayed[next] and move into c->out if visible let (f, out_delayed) = if c.n_fc > 1 { pthread_mutex_lock(&mut c.task_thread.lock); let next = c.frame_thread.next; @@ -5902,6 +5903,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if c.frame_thread.next == c.n_fc { c.frame_thread.next = 0; } + let f = &mut *c.fc.offset(next as isize); while f.n_tile_data > 0 { pthread_cond_wait(&mut f.task_thread.cond, &mut c.task_thread.lock); @@ -5948,6 +5950,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } else { (&mut *c.fc, ptr::null_mut()) }; + f.seq_hdr = c.seq_hdr; f.seq_hdr_ref = c.seq_hdr_ref; dav1d_ref_inc(f.seq_hdr_ref); @@ -5956,6 +5959,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int c.frame_hdr = ptr::null_mut(); c.frame_hdr_ref = ptr::null_mut(); f.dsp = &mut c.dsp[(*f.seq_hdr).hbd as usize]; + let bpc = 8 + 2 * (*f.seq_hdr).hbd; unsafe fn on_error( @@ -5985,10 +5989,12 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_ref_dec(&mut f.seq_hdr_ref); dav1d_ref_dec(&mut f.frame_hdr_ref); dav1d_data_props_copy(&mut c.cached_error_props, &mut c.in_0.m); + for tile in slice::from_raw_parts_mut(f.tile, f.n_tile_data.try_into().unwrap()) { dav1d_data_unref_internal(&mut tile.data); } f.n_tile_data = 0; + if c.n_fc > 1 { pthread_mutex_unlock(&mut c.task_thread.lock); } @@ -5996,6 +6002,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*f.dsp).ipred.intra_pred[DC_PRED as usize].is_none() { let dsp = &mut c.dsp[(*f.seq_hdr).hbd as usize]; + match bpc { #[cfg(feature = "bitdepth_8")] 8 => { @@ -6058,6 +6065,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.bd_fn.read_coef_blocks = Some(dav1d_read_coef_blocks_16bpc); } } + let mut ref_coded_width = <[i32; 7]>::default(); if (*f.frame_hdr).frame_type & 1 != 0 { if (*f.frame_hdr).primary_ref_frame != 7 { @@ -6105,6 +6113,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int && f.svc[i][0].scale == 0) as u8; } } + + // setup entropy if (*f.frame_hdr).primary_ref_frame == 7 { dav1d_cdf_thread_init_static(&mut f.in_cdf, (*f.frame_hdr).quant.yac); } else { @@ -6118,6 +6128,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int return res; } } + + // FIXME qsort so tiles are in order (for frame threading) if f.n_tile_data_alloc < c.n_tile_data { freep(&mut f.tile as *mut *mut Dav1dTileGroup as *mut libc::c_void); assert!( @@ -6142,11 +6154,14 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int c_tiles.fill_with(Default::default); f.n_tile_data = c.n_tile_data; c.n_tile_data = 0; + + // allocate frame let res = dav1d_thread_picture_alloc(c, f, bpc); if res < 0 { on_error(f, c, out_delayed); return res; } + if (*f.frame_hdr).width[0] != (*f.frame_hdr).width[1] { let res = dav1d_picture_alloc_copy(c, &mut f.cur, (*f.frame_hdr).width[0], &mut f.sr_cur.p); if res < 0 { @@ -6165,6 +6180,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.resize_start[0] = get_upscale_x0(f.cur.p.w, f.sr_cur.p.p.w, f.resize_step[0]); f.resize_start[1] = get_upscale_x0(in_cw, out_cw, f.resize_step[1]); } + + // move f->cur into output queue if c.n_fc == 1 { if (*f.frame_hdr).show_frame != 0 || c.output_invisible_frames != 0 { dav1d_thread_picture_ref(&mut c.out, &mut f.sr_cur); @@ -6173,6 +6190,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } else { dav1d_thread_picture_ref(out_delayed, &mut f.sr_cur); } + f.w4 = (*f.frame_hdr).width[0] + 3 >> 2; f.h4 = (*f.frame_hdr).height + 3 >> 2; f.bw = ((*f.frame_hdr).width[0] + 7 >> 3) << 1; @@ -6192,6 +6210,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int &mut f.task_thread.task_counter, cols * rows + f.sbh << uses_2pass, ); + + // ref_mvs if (*f.frame_hdr).frame_type & 1 != 0 || (*f.frame_hdr).allow_intrabc != 0 { f.mvs_ref = dav1d_ref_create_using_pool( c.refmvs_pool, @@ -6236,9 +6256,15 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.mvs_ref = ptr::null_mut(); f.ref_mvs_ref.fill_with(ptr::null_mut); } + + // segmap if (*f.frame_hdr).segmentation.enabled != 0 { + // By default, the previous segmentation map is not initialised. f.prev_segmap_ref = ptr::null_mut(); f.prev_segmap = ptr::null(); + + // We might need a previous frame's segmentation map. + // This happens if there is either no update or a temporal update. if (*f.frame_hdr).segmentation.temporal != 0 || (*f.frame_hdr).segmentation.update_map == 0 { let pri_ref = (*f.frame_hdr).primary_ref_frame as usize; @@ -6253,7 +6279,11 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } } } + if (*f.frame_hdr).segmentation.update_map != 0 { + // We're updating an existing map, + // but need somewhere to put the new values. + // Allocate them here (the data actually gets set elsewhere). f.cur_segmap_ref = dav1d_ref_create_using_pool( c.segmap_pool, ::core::mem::size_of::() * f.b4_stride as size_t * 32 * f.sb128h as size_t, @@ -6265,10 +6295,13 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } f.cur_segmap = (*f.cur_segmap_ref).data.cast::(); } else if !f.prev_segmap_ref.is_null() { + // We're not updating an existing map, + // and we have a valid reference. Use that. f.cur_segmap_ref = f.prev_segmap_ref; dav1d_ref_inc(f.cur_segmap_ref); f.cur_segmap = (*f.prev_segmap_ref).data.cast::(); } else { + // We need to make a new map. Allocate one here and zero it out. let segmap_size = ::core::mem::size_of::() * f.b4_stride as size_t * 32 * f.sb128h as size_t; f.cur_segmap_ref = dav1d_ref_create_using_pool(c.segmap_pool, segmap_size); @@ -6284,6 +6317,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int f.cur_segmap_ref = ptr::null_mut(); f.prev_segmap_ref = ptr::null_mut(); } + + // update references etc. let refresh_frame_flags = (*f.frame_hdr).refresh_frame_flags as libc::c_uint; for i in 0..8 { if refresh_frame_flags & (1 << i) != 0 { @@ -6291,12 +6326,14 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_thread_picture_unref(&mut c.refs[i].p); } dav1d_thread_picture_ref(&mut c.refs[i].p, &mut f.sr_cur); + dav1d_cdf_thread_unref(&mut c.cdf[i]); if (*f.frame_hdr).refresh_context != 0 { dav1d_cdf_thread_ref(&mut c.cdf[i], &mut f.out_cdf); } else { dav1d_cdf_thread_ref(&mut c.cdf[i], &mut f.in_cdf); } + dav1d_ref_dec(&mut c.refs[i].segmap); c.refs[i].segmap = f.cur_segmap_ref; if !f.cur_segmap_ref.is_null() { @@ -6312,6 +6349,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int c.refs[i].refpoc = f.refpoc; } } + if c.n_fc == 1 { let res = dav1d_decode_frame(f); if res < 0 { @@ -6333,5 +6371,6 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_task_frame_init(f); pthread_mutex_unlock(&mut c.task_thread.lock); } + 0 } From 233549368a6a52f8ff8d171357ea4b9d3489eca9 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Tue, 5 Sep 2023 15:33:33 -0700 Subject: [PATCH 43/46] `fn dav1d_submit_frame`: Deduplicate `is_inter_or_switch` macro calls. --- src/decode.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 782ead51f..1d47b42a8 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6067,7 +6067,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } let mut ref_coded_width = <[i32; 7]>::default(); - if (*f.frame_hdr).frame_type & 1 != 0 { + if is_inter_or_switch(&*f.frame_hdr) { if (*f.frame_hdr).primary_ref_frame != 7 { let pri_ref = (*f.frame_hdr).refidx[(*f.frame_hdr).primary_ref_frame as usize] as usize; if c.refs[pri_ref].p.p.data[0].is_null() { @@ -6212,7 +6212,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int ); // ref_mvs - if (*f.frame_hdr).frame_type & 1 != 0 || (*f.frame_hdr).allow_intrabc != 0 { + if is_inter_or_switch(&*f.frame_hdr) || (*f.frame_hdr).allow_intrabc != 0 { f.mvs_ref = dav1d_ref_create_using_pool( c.refmvs_pool, ::core::mem::size_of::() From 50f021573324fe6d39de88e953235bfa1c487694 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Tue, 5 Sep 2023 15:38:47 -0700 Subject: [PATCH 44/46] `fn dav1d_submit_frame`: Deduplicate `scale_fac` macro as an inner `fn`. --- src/decode.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index 1d47b42a8..f5b8bbc4f 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6066,6 +6066,10 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int } } + fn scale_fac(ref_sz: i32, this_sz: i32) -> i32 { + ((ref_sz << 14) + (this_sz >> 1)) / this_sz + } + let mut ref_coded_width = <[i32; 7]>::default(); if is_inter_or_switch(&*f.frame_hdr) { if (*f.frame_hdr).primary_ref_frame != 7 { @@ -6096,11 +6100,8 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int if (*f.frame_hdr).width[0] != c.refs[refidx].p.p.p.w || (*f.frame_hdr).height != c.refs[refidx].p.p.p.h { - f.svc[i][0].scale = ((c.refs[refidx].p.p.p.w << 14) - + ((*f.frame_hdr).width[0] >> 1)) - / (*f.frame_hdr).width[0]; - f.svc[i][1].scale = ((c.refs[refidx].p.p.p.h << 14) + ((*f.frame_hdr).height >> 1)) - / (*f.frame_hdr).height; + f.svc[i][0].scale = scale_fac(c.refs[refidx].p.p.p.w, (*f.frame_hdr).width[0]); + f.svc[i][1].scale = scale_fac(c.refs[refidx].p.p.p.h, (*f.frame_hdr).height); f.svc[i][0].step = f.svc[i][0].scale + 8 >> 4; f.svc[i][1].step = f.svc[i][1].scale + 8 >> 4; } else { @@ -6172,11 +6173,11 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int dav1d_picture_ref(&mut f.cur, &mut f.sr_cur.p); } if (*f.frame_hdr).width[0] != (*f.frame_hdr).width[1] { - f.resize_step[0] = ((f.cur.p.w << 14) + (f.sr_cur.p.p.w >> 1)) / f.sr_cur.p.p.w; + f.resize_step[0] = scale_fac(f.cur.p.w, f.sr_cur.p.p.w); let ss_hor = (f.cur.p.layout != DAV1D_PIXEL_LAYOUT_I444) as libc::c_int; let in_cw = f.cur.p.w + ss_hor >> ss_hor; let out_cw = f.sr_cur.p.p.w + ss_hor >> ss_hor; - f.resize_step[1] = ((in_cw << 14) + (out_cw >> 1)) / out_cw; + f.resize_step[1] = scale_fac(in_cw, out_cw); f.resize_start[0] = get_upscale_x0(f.cur.p.w, f.sr_cur.p.p.w, f.resize_step[0]); f.resize_start[1] = get_upscale_x0(in_cw, out_cw, f.resize_step[1]); } From 0667f672a04519d2c9b79d4367053e3c8c95eeaa Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Tue, 5 Sep 2023 15:40:33 -0700 Subject: [PATCH 45/46] `fn dav1d_submit_frame`: Symbolicate `i32::MAX`. --- src/decode.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/decode.rs b/src/decode.rs index f5b8bbc4f..9254126af 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -6133,9 +6133,7 @@ pub unsafe extern "C" fn dav1d_submit_frame(c: *mut Dav1dContext) -> libc::c_int // FIXME qsort so tiles are in order (for frame threading) if f.n_tile_data_alloc < c.n_tile_data { freep(&mut f.tile as *mut *mut Dav1dTileGroup as *mut libc::c_void); - assert!( - c.n_tile_data < 2147483647 / ::core::mem::size_of::() as libc::c_int - ); + assert!(c.n_tile_data < i32::MAX / ::core::mem::size_of::() as libc::c_int); f.tile = malloc( c.n_tile_data as libc::c_ulong * ::core::mem::size_of::() as libc::c_ulong, From a40485045db23090e84f81f3ea7b911425fd8af1 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Tue, 5 Sep 2023 22:59:35 -0700 Subject: [PATCH 46/46] `fn decode_b`: Add back inline comment that was missed. --- src/decode.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decode.rs b/src/decode.rs index 9254126af..4666fa034 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -2175,7 +2175,7 @@ unsafe fn decode_b( ); } } else { - if is_inter_or_switch(frame_hdr) + if is_inter_or_switch(frame_hdr) /* not intrabc */ && b.comp_type() == COMP_INTER_NONE && b.motion_mode() as MotionMode == MM_WARP {