From eb6131e246cac474818c5d49b7b22cf9ebd1d39a Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Sun, 10 Dec 2023 02:05:50 -0800 Subject: [PATCH 1/5] `struct Rav1dFrameSize`: Extract from `struct Rav1dFrameHeader`. --- include/dav1d/headers.rs | 47 ++++++++++++++--------- src/cdef_apply_tmpl_16.rs | 2 +- src/cdef_apply_tmpl_8.rs | 2 +- src/decode.rs | 43 +++++++++++---------- src/lf_apply.rs | 8 ++-- src/obu.rs | 81 ++++++++++++++++++++------------------- src/picture.rs | 4 +- src/recon.rs | 4 +- src/refmvs.rs | 7 ++-- src/thread_task.rs | 6 ++- 10 files changed, 110 insertions(+), 94 deletions(-) diff --git a/include/dav1d/headers.rs b/include/dav1d/headers.rs index c7a2c60fe..1029f6970 100644 --- a/include/dav1d/headers.rs +++ b/include/dav1d/headers.rs @@ -2122,13 +2122,23 @@ pub struct Dav1dFrameHeader { pub gmv: [Dav1dWarpedMotionParams; DAV1D_REFS_PER_FRAME], } +#[derive(Clone)] +#[repr(C)] +pub(crate) struct Rav1dFrameSize { + pub width: [c_int; 2], + pub height: c_int, + pub render_width: c_int, + pub render_height: c_int, + pub super_res: Rav1dFrameHeader_super_res, + pub have_render_size: c_int, +} + #[derive(Clone)] #[repr(C)] pub(crate) struct Rav1dFrameHeader { + pub size: Rav1dFrameSize, pub film_grain: Rav1dFrameHeader_film_grain, pub frame_type: Rav1dFrameType, - pub width: [c_int; 2], - pub height: c_int, pub frame_offset: c_int, pub temporal_id: c_int, pub spatial_id: c_int, @@ -2147,10 +2157,6 @@ pub(crate) struct Rav1dFrameHeader { pub buffer_removal_time_present: c_int, pub operating_points: [Rav1dFrameHeaderOperatingPoint; RAV1D_MAX_OPERATING_POINTS], pub refresh_frame_flags: c_int, - pub render_width: c_int, - pub render_height: c_int, - pub super_res: Rav1dFrameHeader_super_res, - pub have_render_size: c_int, pub allow_intrabc: c_int, pub frame_ref_short_signaling: c_int, pub refidx: [c_int; RAV1D_REFS_PER_FRAME], @@ -2232,10 +2238,16 @@ impl From for Rav1dFrameHeader { gmv, } = value; Self { + size: Rav1dFrameSize { + width, + height, + render_width, + render_height, + super_res: super_res.into(), + have_render_size, + }, film_grain: film_grain.into(), frame_type, - width, - height, frame_offset, temporal_id, spatial_id, @@ -2254,10 +2266,6 @@ impl From for Rav1dFrameHeader { buffer_removal_time_present, operating_points: operating_points.map(|c| c.into()), refresh_frame_flags, - render_width, - render_height, - super_res: super_res.into(), - have_render_size, allow_intrabc, frame_ref_short_signaling, refidx, @@ -2289,10 +2297,17 @@ impl From for Rav1dFrameHeader { impl From for Dav1dFrameHeader { fn from(value: Rav1dFrameHeader) -> Self { let Rav1dFrameHeader { + size: + Rav1dFrameSize { + width, + height, + render_width, + render_height, + super_res, + have_render_size, + }, film_grain, frame_type, - width, - height, frame_offset, temporal_id, spatial_id, @@ -2311,10 +2326,6 @@ impl From for Dav1dFrameHeader { buffer_removal_time_present, operating_points, refresh_frame_flags, - render_width, - render_height, - super_res, - have_render_size, allow_intrabc, frame_ref_short_signaling, refidx, diff --git a/src/cdef_apply_tmpl_16.rs b/src/cdef_apply_tmpl_16.rs index 6a6e67804..e2f1e8a16 100644 --- a/src/cdef_apply_tmpl_16.rs +++ b/src/cdef_apply_tmpl_16.rs @@ -188,7 +188,7 @@ pub(crate) unsafe fn rav1d_cdef_brow_16bpc( .as_ptr(); let have_tt = ((*(*f).c).n_tc > 1 as c_uint) as c_int; let sb128 = (*(*f).seq_hdr).sb128; - let resize = ((*(*f).frame_hdr).width[0] != (*(*f).frame_hdr).width[1]) as c_int; + let resize = ((*(*f).frame_hdr).size.width[0] != (*(*f).frame_hdr).size.width[1]) as c_int; let y_stride: ptrdiff_t = PXSTRIDE((*f).cur.stride[0]); let uv_stride: ptrdiff_t = PXSTRIDE((*f).cur.stride[1]); let mut bit = 0; diff --git a/src/cdef_apply_tmpl_8.rs b/src/cdef_apply_tmpl_8.rs index ca2961df2..8a9cdfe45 100644 --- a/src/cdef_apply_tmpl_8.rs +++ b/src/cdef_apply_tmpl_8.rs @@ -180,7 +180,7 @@ pub(crate) unsafe fn rav1d_cdef_brow_8bpc( .as_ptr(); let have_tt = ((*(*f).c).n_tc > 1 as c_uint) as c_int; let sb128 = (*(*f).seq_hdr).sb128; - let resize = ((*(*f).frame_hdr).width[0] != (*(*f).frame_hdr).width[1]) as c_int; + let resize = ((*(*f).frame_hdr).size.width[0] != (*(*f).frame_hdr).size.width[1]) as c_int; let y_stride: ptrdiff_t = (*f).cur.stride[0]; let uv_stride: ptrdiff_t = (*f).cur.stride[1]; let mut bit = 0; diff --git a/src/decode.rs b/src/decode.rs index 3b252e8d9..cb8104df4 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -3878,7 +3878,7 @@ unsafe fn setup_tile( ts.tiling.col_end = cmp::min(col_sb_end << sb_shift, f.bw); ts.tiling.row_start = row_sb_start << sb_shift; ts.tiling.row_end = cmp::min(row_sb_end << sb_shift, f.bh); - let diff_width = (*f.frame_hdr).width[0] != (*f.frame_hdr).width[1]; + let diff_width = (*f.frame_hdr).size.width[0] != (*f.frame_hdr).size.width[1]; // Reference Restoration Unit (used for exp coding) let (sb_idx, unit_idx) = if diff_width { @@ -3900,7 +3900,7 @@ unsafe fn setup_tile( let lr_ref = if diff_width { let ss_hor = (p != 0 && f.cur.p.layout != Rav1dPixelLayout::I444) as c_int; - let d = (*f.frame_hdr).super_res.width_scale_denominator; + let d = (*f.frame_hdr).size.super_res.width_scale_denominator; let unit_size_log2 = (*f.frame_hdr).restoration.unit_size[(p != 0) as usize]; let rnd = (8 << unit_size_log2) - 1; let shift = unit_size_log2 + 3; @@ -4155,11 +4155,11 @@ pub(crate) unsafe fn rav1d_decode_tile_sbrow(t: &mut Rav1dTaskContext) -> Result let frame_type = (*f.frame_hdr).restoration.r#type[p as usize]; - if (*f.frame_hdr).width[0] != (*f.frame_hdr).width[1] { + if (*f.frame_hdr).size.width[0] != (*f.frame_hdr).size.width[1] { let w = f.sr_cur.p.p.w + ss_hor >> ss_hor; let n_units = cmp::max(1, w + half_unit >> unit_size_log2); - let d = (*f.frame_hdr).super_res.width_scale_denominator; + let d = (*f.frame_hdr).size.super_res.width_scale_denominator; let rnd = unit_size * 8 - 1; let shift = unit_size_log2 + 3; let x0 = (4 * t.bx * d >> ss_hor) + rnd >> shift; @@ -4400,7 +4400,7 @@ pub(crate) unsafe fn rav1d_decode_frame_init(f: &mut Rav1dFrameContext) -> Rav1d // update allocation of block contexts for above let mut y_stride = f.cur.stride[0]; let mut uv_stride = f.cur.stride[1]; - let has_resize = ((*f.frame_hdr).width[0] != (*f.frame_hdr).width[1]) as c_int; + let has_resize = ((*f.frame_hdr).size.width[0] != (*f.frame_hdr).size.width[1]) as c_int; let need_cdef_lpf_copy = (c.n_tc > 1 && has_resize != 0) as c_int; if y_stride * f.sbh as isize * 4 != f.lf.cdef_buf_plane_sz[0] as isize || uv_stride * f.sbh as isize * 8 != f.lf.cdef_buf_plane_sz[1] as isize @@ -5108,10 +5108,10 @@ pub unsafe fn rav1d_submit_frame(c: &mut Rav1dContext) -> Rav1dResult { for i in 0..7 { 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.frame_hdr).size.width[0] * 2) < c.refs[refidx].p.p.p.w + || ((*f.frame_hdr).size.height * 2) < c.refs[refidx].p.p.p.h + || (*f.frame_hdr).size.width[0] > c.refs[refidx].p.p.p.w * 16 + || (*f.frame_hdr).size.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 { @@ -5122,12 +5122,12 @@ pub unsafe fn rav1d_submit_frame(c: &mut Rav1dContext) -> Rav1dResult { return Err(EINVAL); } rav1d_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 + ref_coded_width[i] = (*c.refs[refidx].p.p.frame_hdr).size.width[0]; + if (*f.frame_hdr).size.width[0] != c.refs[refidx].p.p.p.w + || (*f.frame_hdr).size.height != c.refs[refidx].p.p.p.h { - 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].scale = scale_fac(c.refs[refidx].p.p.p.w, (*f.frame_hdr).size.width[0]); + f.svc[i][1].scale = scale_fac(c.refs[refidx].p.p.p.h, (*f.frame_hdr).size.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 { @@ -5167,8 +5167,9 @@ pub unsafe fn rav1d_submit_frame(c: &mut Rav1dContext) -> Rav1dResult { return res; } - if (*f.frame_hdr).width[0] != (*f.frame_hdr).width[1] { - let res = rav1d_picture_alloc_copy(c, &mut f.cur, (*f.frame_hdr).width[0], &mut f.sr_cur.p); + if (*f.frame_hdr).size.width[0] != (*f.frame_hdr).size.width[1] { + let res = + rav1d_picture_alloc_copy(c, &mut f.cur, (*f.frame_hdr).size.width[0], &mut f.sr_cur.p); if res.is_err() { on_error(f, c, out_delayed); return res; @@ -5176,7 +5177,7 @@ pub unsafe fn rav1d_submit_frame(c: &mut Rav1dContext) -> Rav1dResult { } else { rav1d_picture_ref(&mut f.cur, &mut f.sr_cur.p); } - if (*f.frame_hdr).width[0] != (*f.frame_hdr).width[1] { + if (*f.frame_hdr).size.width[0] != (*f.frame_hdr).size.width[1] { f.resize_step[0] = scale_fac(f.cur.p.w, f.sr_cur.p.p.w); let ss_hor = (f.cur.p.layout != Rav1dPixelLayout::I444) as c_int; let in_cw = f.cur.p.w + ss_hor >> ss_hor; @@ -5196,10 +5197,10 @@ pub unsafe fn rav1d_submit_frame(c: &mut Rav1dContext) -> Rav1dResult { rav1d_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.w4 = (*f.frame_hdr).size.width[0] + 3 >> 2; + f.h4 = (*f.frame_hdr).size.height + 3 >> 2; + f.bw = ((*f.frame_hdr).size.width[0] + 7 >> 3) << 1; + f.bh = ((*f.frame_hdr).size.height + 7 >> 3) << 1; f.sb128w = f.bw + 31 >> 5; f.sb128h = f.bh + 31 >> 5; f.sb_shift = 4 + (*f.seq_hdr).sb128; diff --git a/src/lf_apply.rs b/src/lf_apply.rs index 3f06b914c..4b765be5f 100644 --- a/src/lf_apply.rs +++ b/src/lf_apply.rs @@ -33,8 +33,8 @@ unsafe fn backup_lpf( lr_backup: c_int, ) { let cdef_backup = (lr_backup == 0) as c_int; - let dst_w = if (*(*f).frame_hdr).super_res.enabled != 0 { - (*(*f).frame_hdr).width[1] + ss_hor >> ss_hor + let dst_w = if (*(*f).frame_hdr).size.super_res.enabled != 0 { + (*(*f).frame_hdr).size.width[1] + ss_hor >> ss_hor } else { src_w }; @@ -104,7 +104,7 @@ unsafe fn backup_lpf( } dst = dst.offset(4 * BD::pxstride(dst_stride as usize) as isize); } - if lr_backup != 0 && (*(*f).frame_hdr).width[0] != (*(*f).frame_hdr).width[1] { + if lr_backup != 0 && (*(*f).frame_hdr).size.width[0] != (*(*f).frame_hdr).size.width[1] { while row + stripe_h <= row_h { let n_lines = 4 - (row + stripe_h + 1 == h) as c_int; ((*(*f).dsp).mc.resize)( @@ -171,7 +171,7 @@ pub(crate) unsafe fn rav1d_copy_lpf( sby: c_int, ) { let have_tt = ((*(*f).c).n_tc > 1 as c_uint) as c_int; - let resize = ((*(*f).frame_hdr).width[0] != (*(*f).frame_hdr).width[1]) as c_int; + let resize = ((*(*f).frame_hdr).size.width[0] != (*(*f).frame_hdr).size.width[1]) as c_int; let offset = 8 * (sby != 0) as c_int; let src_stride: *const ptrdiff_t = ((*f).cur.stride).as_mut_ptr(); let lr_stride: *const ptrdiff_t = ((*f).sr_cur.p.stride).as_mut_ptr(); diff --git a/src/obu.rs b/src/obu.rs index d7fe6dc31..93e750db5 100644 --- a/src/obu.rs +++ b/src/obu.rs @@ -612,21 +612,22 @@ unsafe fn read_frame_size(c: &mut Rav1dContext, gb: &mut GetBits, use_ref: c_int if (*r#ref).p.frame_hdr.is_null() { return -1; } - hdr.width[1] = (*(*r#ref).p.frame_hdr).width[1]; - hdr.height = (*(*r#ref).p.frame_hdr).height; - hdr.render_width = (*(*r#ref).p.frame_hdr).render_width; - hdr.render_height = (*(*r#ref).p.frame_hdr).render_height; - hdr.super_res.enabled = (seqhdr.super_res != 0 && rav1d_get_bit(gb) != 0) as c_int; - if hdr.super_res.enabled != 0 { - hdr.super_res.width_scale_denominator = 9 + rav1d_get_bits(gb, 3) as c_int; - let d = hdr.super_res.width_scale_denominator; - hdr.width[0] = cmp::max( - (hdr.width[1] * 8 + (d >> 1)) / d, - cmp::min(16, hdr.width[1]), + hdr.size.width[1] = (*(*r#ref).p.frame_hdr).size.width[1]; + hdr.size.height = (*(*r#ref).p.frame_hdr).size.height; + hdr.size.render_width = (*(*r#ref).p.frame_hdr).size.render_width; + hdr.size.render_height = (*(*r#ref).p.frame_hdr).size.render_height; + hdr.size.super_res.enabled = + (seqhdr.super_res != 0 && rav1d_get_bit(gb) != 0) as c_int; + if hdr.size.super_res.enabled != 0 { + hdr.size.super_res.width_scale_denominator = 9 + rav1d_get_bits(gb, 3) as c_int; + let d = hdr.size.super_res.width_scale_denominator; + hdr.size.width[0] = cmp::max( + (hdr.size.width[1] * 8 + (d >> 1)) / d, + cmp::min(16, hdr.size.width[1]), ); } else { - hdr.super_res.width_scale_denominator = 8; - hdr.width[0] = hdr.width[1]; + hdr.size.super_res.width_scale_denominator = 8; + hdr.size.width[0] = hdr.size.width[1]; } return 0; } @@ -634,31 +635,31 @@ unsafe fn read_frame_size(c: &mut Rav1dContext, gb: &mut GetBits, use_ref: c_int } if hdr.frame_size_override != 0 { - hdr.width[1] = rav1d_get_bits(gb, seqhdr.width_n_bits) as c_int + 1; - hdr.height = rav1d_get_bits(gb, seqhdr.height_n_bits) as c_int + 1; + hdr.size.width[1] = rav1d_get_bits(gb, seqhdr.width_n_bits) as c_int + 1; + hdr.size.height = rav1d_get_bits(gb, seqhdr.height_n_bits) as c_int + 1; } else { - hdr.width[1] = seqhdr.max_width; - hdr.height = seqhdr.max_height; - } - hdr.super_res.enabled = (seqhdr.super_res != 0 && rav1d_get_bit(gb) != 0) as c_int; - if hdr.super_res.enabled != 0 { - hdr.super_res.width_scale_denominator = 9 + rav1d_get_bits(gb, 3) as c_int; - let d = hdr.super_res.width_scale_denominator; - hdr.width[0] = cmp::max( - (hdr.width[1] * 8 + (d >> 1)) / d, - cmp::min(16, hdr.width[1]), + hdr.size.width[1] = seqhdr.max_width; + hdr.size.height = seqhdr.max_height; + } + hdr.size.super_res.enabled = (seqhdr.super_res != 0 && rav1d_get_bit(gb) != 0) as c_int; + if hdr.size.super_res.enabled != 0 { + hdr.size.super_res.width_scale_denominator = 9 + rav1d_get_bits(gb, 3) as c_int; + let d = hdr.size.super_res.width_scale_denominator; + hdr.size.width[0] = cmp::max( + (hdr.size.width[1] * 8 + (d >> 1)) / d, + cmp::min(16, hdr.size.width[1]), ); } else { - hdr.super_res.width_scale_denominator = 8; - hdr.width[0] = hdr.width[1]; + hdr.size.super_res.width_scale_denominator = 8; + hdr.size.width[0] = hdr.size.width[1]; } - hdr.have_render_size = rav1d_get_bit(gb) as c_int; - if hdr.have_render_size != 0 { - hdr.render_width = rav1d_get_bits(gb, 16) as c_int + 1; - hdr.render_height = rav1d_get_bits(gb, 16) as c_int + 1; + hdr.size.have_render_size = rav1d_get_bit(gb) as c_int; + if hdr.size.have_render_size != 0 { + hdr.size.render_width = rav1d_get_bits(gb, 16) as c_int + 1; + hdr.size.render_height = rav1d_get_bits(gb, 16) as c_int + 1; } else { - hdr.render_width = hdr.width[1]; - hdr.render_height = hdr.height; + hdr.size.render_width = hdr.size.width[1]; + hdr.size.render_height = hdr.size.height; } 0 } @@ -822,7 +823,7 @@ unsafe fn parse_frame_hdr(c: &mut Rav1dContext, gb: &mut GetBits) -> Rav1dResult return Err(EINVAL); } hdr.allow_intrabc = (hdr.allow_screen_content_tools != 0 - && hdr.super_res.enabled == 0 + && hdr.size.super_res.enabled == 0 && rav1d_get_bit(gb) != 0) as c_int; hdr.use_ref_frame_mvs = 0; } else { @@ -999,8 +1000,8 @@ unsafe fn parse_frame_hdr(c: &mut Rav1dContext, gb: &mut GetBits) -> Rav1dResult hdr.tiling.uniform = rav1d_get_bit(gb) as c_int; let sbsz_min1 = ((64) << seqhdr.sb128) - 1; let sbsz_log2 = 6 + seqhdr.sb128; - let sbw = hdr.width[0] + sbsz_min1 >> sbsz_log2; - let sbh = hdr.height + sbsz_min1 >> sbsz_log2; + let sbw = hdr.size.width[0] + sbsz_min1 >> sbsz_log2; + let sbh = hdr.size.height + sbsz_min1 >> sbsz_log2; let max_tile_width_sb = 4096 >> sbsz_log2; let max_tile_area_sb = 4096 * 2304 >> 2 * sbsz_log2; hdr.tiling.min_log2_cols = tile_log2(max_tile_width_sb, sbw); @@ -1390,7 +1391,7 @@ unsafe fn parse_frame_hdr(c: &mut Rav1dContext, gb: &mut GetBits) -> Rav1dResult } // restoration - if (hdr.all_lossless == 0 || hdr.super_res.enabled != 0) + if (hdr.all_lossless == 0 || hdr.size.super_res.enabled != 0) && seqhdr.restoration != 0 && hdr.allow_intrabc == 0 { @@ -2059,14 +2060,14 @@ unsafe fn parse_obus( } if c.frame_size_limit != 0 - && (*c.frame_hdr).width[1] as i64 * (*c.frame_hdr).height as i64 + && (*c.frame_hdr).size.width[1] as i64 * (*c.frame_hdr).size.height as i64 > c.frame_size_limit as i64 { writeln!( c.logger, "Frame size {}x{} exceeds limit {}", - (*c.frame_hdr).width[1], - (*c.frame_hdr).height, + (*c.frame_hdr).size.width[1], + (*c.frame_hdr).size.height, c.frame_size_limit, ); c.frame_hdr = 0 as *mut Rav1dFrameHeader; diff --git a/src/picture.rs b/src/picture.rs index 09b44e90c..507c17d71 100644 --- a/src/picture.rs +++ b/src/picture.rs @@ -276,8 +276,8 @@ pub(crate) unsafe fn rav1d_thread_picture_alloc( let res = picture_alloc_with_edges( c, &mut (*p).p, - (*(*f).frame_hdr).width[1], - (*(*f).frame_hdr).height, + (*(*f).frame_hdr).size.width[1], + (*(*f).frame_hdr).size.height, (*f).seq_hdr, (*f).seq_hdr_ref, (*f).frame_hdr, diff --git a/src/recon.rs b/src/recon.rs index 7b5387822..5ea5afdc9 100644 --- a/src/recon.rs +++ b/src/recon.rs @@ -3289,7 +3289,7 @@ pub(crate) unsafe fn rav1d_recon_b_inter( * ((t.bx >> ss_hor) as isize + (t.by >> ss_ver) as isize * BD::pxstride((*f).cur.stride[1] as usize) as isize); if (*(*f).frame_hdr).frame_type as c_uint & 1 as c_uint == 0 { - if (*(*f).frame_hdr).super_res.enabled != 0 { + if (*(*f).frame_hdr).size.super_res.enabled != 0 { unreachable!(); } res = mc::( @@ -4679,7 +4679,7 @@ pub(crate) unsafe fn rav1d_filter_sbrow(f: &mut Rav1dFrameContext, if (*f.seq_hdr).cdef != 0 { rav1d_filter_sbrow_cdef::(&mut *(*f.c).tc, sby); } - if (*f.frame_hdr).width[0] != (*f.frame_hdr).width[1] { + if (*f.frame_hdr).size.width[0] != (*f.frame_hdr).size.width[1] { rav1d_filter_sbrow_resize::(f, sby); } if f.lf.restore_planes != 0 { diff --git a/src/refmvs.rs b/src/refmvs.rs index 4f4dd078d..bcaf0c8b0 100644 --- a/src/refmvs.rs +++ b/src/refmvs.rs @@ -1389,11 +1389,12 @@ pub(crate) unsafe fn rav1d_refmvs_init_frame( ) -> Rav1dResult { (*rf).sbsz = (16 as c_int) << (*seq_hdr).sb128; (*rf).frm_hdr = frm_hdr; - (*rf).iw8 = (*frm_hdr).width[0] + 7 >> 3; - (*rf).ih8 = (*frm_hdr).height + 7 >> 3; + (*rf).iw8 = (*frm_hdr).size.width[0] + 7 >> 3; + (*rf).ih8 = (*frm_hdr).size.height + 7 >> 3; (*rf).iw4 = (*rf).iw8 << 1; (*rf).ih4 = (*rf).ih8 << 1; - let r_stride: ptrdiff_t = (((*frm_hdr).width[0] + 127 & !(127 as c_int)) >> 2) as ptrdiff_t; + let r_stride: ptrdiff_t = + (((*frm_hdr).size.width[0] + 127 & !(127 as c_int)) >> 2) as ptrdiff_t; let n_tile_rows = if n_tile_threads > 1 { (*frm_hdr).tiling.rows } else { diff --git a/src/thread_task.rs b/src/thread_task.rs index 9bea178df..8d1c91bdd 100644 --- a/src/thread_task.rs +++ b/src/thread_task.rs @@ -360,7 +360,7 @@ unsafe fn create_filter_sbrow( let has_deblock = ((*(*f).frame_hdr).loopfilter.level_y[0] != 0 || (*(*f).frame_hdr).loopfilter.level_y[1] != 0) as c_int; let has_cdef = (*(*f).seq_hdr).cdef; - let has_resize = ((*(*f).frame_hdr).width[0] != (*(*f).frame_hdr).width[1]) as c_int; + let has_resize = ((*(*f).frame_hdr).size.width[0] != (*(*f).frame_hdr).size.width[1]) as c_int; let has_lr = (*f).lf.restore_planes; let mut tasks: *mut Rav1dTask = (*f).task_thread.tasks; let uses_2pass = ((*(*f).c).n_fc > 1 as c_uint) as c_int; @@ -1529,7 +1529,9 @@ pub unsafe extern "C" fn rav1d_worker_task(data: *mut c_void) -> *mut c_void { } match current_block { 12196494833634779273 => { - if (*(*f).frame_hdr).width[0] != (*(*f).frame_hdr).width[1] { + if (*(*f).frame_hdr).size.width[0] + != (*(*f).frame_hdr).size.width[1] + { if ::core::intrinsics::atomic_load_seqcst( &mut (*f).task_thread.error as *mut atomic_int, ) == 0 From bf6601619976372e5e70c87b54d86dbfb5eb0db2 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Sun, 10 Dec 2023 02:08:31 -0800 Subject: [PATCH 2/5] `fn read_frame_size`: Change return type to `Result`. --- src/obu.rs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/obu.rs b/src/obu.rs index 93e750db5..ed5a18212 100644 --- a/src/obu.rs +++ b/src/obu.rs @@ -601,7 +601,11 @@ unsafe fn parse_seq_hdr( }) } -unsafe fn read_frame_size(c: &mut Rav1dContext, gb: &mut GetBits, use_ref: c_int) -> c_int { +unsafe fn read_frame_size( + c: &mut Rav1dContext, + gb: &mut GetBits, + use_ref: c_int, +) -> Result<(), ()> { let seqhdr = &*c.seq_hdr; let hdr = &mut *c.frame_hdr; @@ -610,7 +614,7 @@ unsafe fn read_frame_size(c: &mut Rav1dContext, gb: &mut GetBits, use_ref: c_int if rav1d_get_bit(gb) != 0 { let r#ref = &mut c.refs[(*c.frame_hdr).refidx[i as usize] as usize].p; if (*r#ref).p.frame_hdr.is_null() { - return -1; + return Err(()); } hdr.size.width[1] = (*(*r#ref).p.frame_hdr).size.width[1]; hdr.size.height = (*(*r#ref).p.frame_hdr).size.height; @@ -629,7 +633,7 @@ unsafe fn read_frame_size(c: &mut Rav1dContext, gb: &mut GetBits, use_ref: c_int hdr.size.super_res.width_scale_denominator = 8; hdr.size.width[0] = hdr.size.width[1]; } - return 0; + return Ok(()); } } } @@ -661,7 +665,8 @@ unsafe fn read_frame_size(c: &mut Rav1dContext, gb: &mut GetBits, use_ref: c_int hdr.size.render_width = hdr.size.width[1]; hdr.size.render_height = hdr.size.height; } - 0 + + Ok(()) } #[inline] @@ -819,9 +824,7 @@ unsafe fn parse_frame_hdr(c: &mut Rav1dContext, gb: &mut GetBits) -> Rav1dResult { return Err(EINVAL); } - if read_frame_size(c, gb, 0) < 0 { - return Err(EINVAL); - } + read_frame_size(c, gb, 0).map_err(|()| EINVAL)?; hdr.allow_intrabc = (hdr.allow_screen_content_tools != 0 && hdr.size.super_res.enabled == 0 && rav1d_get_bit(gb) != 0) as c_int; @@ -963,9 +966,7 @@ unsafe fn parse_frame_hdr(c: &mut Rav1dContext, gb: &mut GetBits) -> Rav1dResult } } let use_ref = (hdr.error_resilient_mode == 0 && hdr.frame_size_override != 0) as c_int; - if read_frame_size(c, gb, use_ref) < 0 { - return Err(EINVAL); - } + read_frame_size(c, gb, use_ref).map_err(|()| EINVAL)?; hdr.hp = (hdr.force_integer_mv == 0 && rav1d_get_bit(gb) != 0) as c_int; hdr.subpel_filter_mode = if rav1d_get_bit(gb) != 0 { RAV1D_FILTER_SWITCHABLE From b5434b35d8842da3a9605c39c6859a4d958ed0cd Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Sun, 10 Dec 2023 02:29:09 -0800 Subject: [PATCH 3/5] `fn read_frame_size`: Initialize and return `Rav1dFrameSize` directly. --- src/obu.rs | 112 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 68 insertions(+), 44 deletions(-) diff --git a/src/obu.rs b/src/obu.rs index ed5a18212..636ce7025 100644 --- a/src/obu.rs +++ b/src/obu.rs @@ -16,7 +16,9 @@ use crate::include::dav1d::headers::Rav1dContentLightLevel; use crate::include::dav1d::headers::Rav1dFilmGrainData; use crate::include::dav1d::headers::Rav1dFilterMode; use crate::include::dav1d::headers::Rav1dFrameHeader; +use crate::include::dav1d::headers::Rav1dFrameHeader_super_res; use crate::include::dav1d::headers::Rav1dFrameHeader_tiling; +use crate::include::dav1d::headers::Rav1dFrameSize; use crate::include::dav1d::headers::Rav1dFrameType; use crate::include::dav1d::headers::Rav1dITUTT35; use crate::include::dav1d::headers::Rav1dLoopfilterModeRefDeltas; @@ -605,7 +607,7 @@ unsafe fn read_frame_size( c: &mut Rav1dContext, gb: &mut GetBits, use_ref: c_int, -) -> Result<(), ()> { +) -> Result { let seqhdr = &*c.seq_hdr; let hdr = &mut *c.frame_hdr; @@ -616,57 +618,79 @@ unsafe fn read_frame_size( if (*r#ref).p.frame_hdr.is_null() { return Err(()); } - hdr.size.width[1] = (*(*r#ref).p.frame_hdr).size.width[1]; - hdr.size.height = (*(*r#ref).p.frame_hdr).size.height; - hdr.size.render_width = (*(*r#ref).p.frame_hdr).size.render_width; - hdr.size.render_height = (*(*r#ref).p.frame_hdr).size.render_height; - hdr.size.super_res.enabled = - (seqhdr.super_res != 0 && rav1d_get_bit(gb) != 0) as c_int; - if hdr.size.super_res.enabled != 0 { - hdr.size.super_res.width_scale_denominator = 9 + rav1d_get_bits(gb, 3) as c_int; - let d = hdr.size.super_res.width_scale_denominator; - hdr.size.width[0] = cmp::max( - (hdr.size.width[1] * 8 + (d >> 1)) / d, - cmp::min(16, hdr.size.width[1]), - ); + let width1 = (*(*r#ref).p.frame_hdr).size.width[1]; + let height = (*(*r#ref).p.frame_hdr).size.height; + let render_width = (*(*r#ref).p.frame_hdr).size.render_width; + let render_height = (*(*r#ref).p.frame_hdr).size.render_height; + let enabled = (seqhdr.super_res != 0 && rav1d_get_bit(gb) != 0) as c_int; + let width_scale_denominator; + let width0; + if enabled != 0 { + width_scale_denominator = 9 + rav1d_get_bits(gb, 3) as c_int; + let d = width_scale_denominator; + width0 = cmp::max((width1 * 8 + (d >> 1)) / d, cmp::min(16, width1)); } else { - hdr.size.super_res.width_scale_denominator = 8; - hdr.size.width[0] = hdr.size.width[1]; + width_scale_denominator = 8; + width0 = width1; } - return Ok(()); + let width = [width0, width1]; + return Ok(Rav1dFrameSize { + width, + height, + render_width, + render_height, + super_res: Rav1dFrameHeader_super_res { + enabled, + width_scale_denominator, + }, + have_render_size: 0, + }); } } } + let width1; + let height; if hdr.frame_size_override != 0 { - hdr.size.width[1] = rav1d_get_bits(gb, seqhdr.width_n_bits) as c_int + 1; - hdr.size.height = rav1d_get_bits(gb, seqhdr.height_n_bits) as c_int + 1; + width1 = rav1d_get_bits(gb, seqhdr.width_n_bits) as c_int + 1; + height = rav1d_get_bits(gb, seqhdr.height_n_bits) as c_int + 1; } else { - hdr.size.width[1] = seqhdr.max_width; - hdr.size.height = seqhdr.max_height; - } - hdr.size.super_res.enabled = (seqhdr.super_res != 0 && rav1d_get_bit(gb) != 0) as c_int; - if hdr.size.super_res.enabled != 0 { - hdr.size.super_res.width_scale_denominator = 9 + rav1d_get_bits(gb, 3) as c_int; - let d = hdr.size.super_res.width_scale_denominator; - hdr.size.width[0] = cmp::max( - (hdr.size.width[1] * 8 + (d >> 1)) / d, - cmp::min(16, hdr.size.width[1]), - ); + width1 = seqhdr.max_width; + height = seqhdr.max_height; + } + let enabled = (seqhdr.super_res != 0 && rav1d_get_bit(gb) != 0) as c_int; + let width_scale_denominator; + let width0; + if enabled != 0 { + width_scale_denominator = 9 + rav1d_get_bits(gb, 3) as c_int; + let d = width_scale_denominator; + width0 = cmp::max((width1 * 8 + (d >> 1)) / d, cmp::min(16, width1)); } else { - hdr.size.super_res.width_scale_denominator = 8; - hdr.size.width[0] = hdr.size.width[1]; - } - hdr.size.have_render_size = rav1d_get_bit(gb) as c_int; - if hdr.size.have_render_size != 0 { - hdr.size.render_width = rav1d_get_bits(gb, 16) as c_int + 1; - hdr.size.render_height = rav1d_get_bits(gb, 16) as c_int + 1; + width_scale_denominator = 8; + width0 = width1; + } + let have_render_size = rav1d_get_bit(gb) as c_int; + let render_width; + let render_height; + if have_render_size != 0 { + render_width = rav1d_get_bits(gb, 16) as c_int + 1; + render_height = rav1d_get_bits(gb, 16) as c_int + 1; } else { - hdr.size.render_width = hdr.size.width[1]; - hdr.size.render_height = hdr.size.height; - } - - Ok(()) + render_width = width1; + render_height = height; + } + let width = [width0, width1]; + Ok(Rav1dFrameSize { + width, + height, + render_width, + render_height, + super_res: Rav1dFrameHeader_super_res { + enabled, + width_scale_denominator, + }, + have_render_size, + }) } #[inline] @@ -824,7 +848,7 @@ unsafe fn parse_frame_hdr(c: &mut Rav1dContext, gb: &mut GetBits) -> Rav1dResult { return Err(EINVAL); } - read_frame_size(c, gb, 0).map_err(|()| EINVAL)?; + (*c.frame_hdr).size = read_frame_size(c, gb, 0).map_err(|()| EINVAL)?; hdr.allow_intrabc = (hdr.allow_screen_content_tools != 0 && hdr.size.super_res.enabled == 0 && rav1d_get_bit(gb) != 0) as c_int; @@ -966,7 +990,7 @@ unsafe fn parse_frame_hdr(c: &mut Rav1dContext, gb: &mut GetBits) -> Rav1dResult } } let use_ref = (hdr.error_resilient_mode == 0 && hdr.frame_size_override != 0) as c_int; - read_frame_size(c, gb, use_ref).map_err(|()| EINVAL)?; + (*c.frame_hdr).size = read_frame_size(c, gb, use_ref).map_err(|()| EINVAL)?; hdr.hp = (hdr.force_integer_mv == 0 && rav1d_get_bit(gb) != 0) as c_int; hdr.subpel_filter_mode = if rav1d_get_bit(gb) != 0 { RAV1D_FILTER_SWITCHABLE From 6e619337526960efe0a6a979138832e04b1e2ddb Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Sun, 10 Dec 2023 02:29:58 -0800 Subject: [PATCH 4/5] `fn parse_frame_size`: Rename from `fn read_frame_size` so it's more similar to the other `fn parse_*`s in `mod obu`. --- src/obu.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/obu.rs b/src/obu.rs index 636ce7025..9439524b7 100644 --- a/src/obu.rs +++ b/src/obu.rs @@ -603,7 +603,7 @@ unsafe fn parse_seq_hdr( }) } -unsafe fn read_frame_size( +unsafe fn parse_frame_size( c: &mut Rav1dContext, gb: &mut GetBits, use_ref: c_int, @@ -848,7 +848,7 @@ unsafe fn parse_frame_hdr(c: &mut Rav1dContext, gb: &mut GetBits) -> Rav1dResult { return Err(EINVAL); } - (*c.frame_hdr).size = read_frame_size(c, gb, 0).map_err(|()| EINVAL)?; + (*c.frame_hdr).size = parse_frame_size(c, gb, 0).map_err(|()| EINVAL)?; hdr.allow_intrabc = (hdr.allow_screen_content_tools != 0 && hdr.size.super_res.enabled == 0 && rav1d_get_bit(gb) != 0) as c_int; @@ -990,7 +990,7 @@ unsafe fn parse_frame_hdr(c: &mut Rav1dContext, gb: &mut GetBits) -> Rav1dResult } } let use_ref = (hdr.error_resilient_mode == 0 && hdr.frame_size_override != 0) as c_int; - (*c.frame_hdr).size = read_frame_size(c, gb, use_ref).map_err(|()| EINVAL)?; + (*c.frame_hdr).size = parse_frame_size(c, gb, use_ref).map_err(|()| EINVAL)?; hdr.hp = (hdr.force_integer_mv == 0 && rav1d_get_bit(gb) != 0) as c_int; hdr.subpel_filter_mode = if rav1d_get_bit(gb) != 0 { RAV1D_FILTER_SWITCHABLE From 97bab3ab2f90fb856756816fb6b9ef209035c266 Mon Sep 17 00:00:00 2001 From: Khyber Sen Date: Sun, 10 Dec 2023 02:31:21 -0800 Subject: [PATCH 5/5] `fn parse_frame_size`: Move the `Err` to `EINVAL` conversion into the `fn`. --- src/obu.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/obu.rs b/src/obu.rs index 9439524b7..b2c1337c5 100644 --- a/src/obu.rs +++ b/src/obu.rs @@ -607,7 +607,7 @@ unsafe fn parse_frame_size( c: &mut Rav1dContext, gb: &mut GetBits, use_ref: c_int, -) -> Result { +) -> Rav1dResult { let seqhdr = &*c.seq_hdr; let hdr = &mut *c.frame_hdr; @@ -616,7 +616,7 @@ unsafe fn parse_frame_size( if rav1d_get_bit(gb) != 0 { let r#ref = &mut c.refs[(*c.frame_hdr).refidx[i as usize] as usize].p; if (*r#ref).p.frame_hdr.is_null() { - return Err(()); + return Err(EINVAL); } let width1 = (*(*r#ref).p.frame_hdr).size.width[1]; let height = (*(*r#ref).p.frame_hdr).size.height; @@ -848,7 +848,7 @@ unsafe fn parse_frame_hdr(c: &mut Rav1dContext, gb: &mut GetBits) -> Rav1dResult { return Err(EINVAL); } - (*c.frame_hdr).size = parse_frame_size(c, gb, 0).map_err(|()| EINVAL)?; + (*c.frame_hdr).size = parse_frame_size(c, gb, 0)?; hdr.allow_intrabc = (hdr.allow_screen_content_tools != 0 && hdr.size.super_res.enabled == 0 && rav1d_get_bit(gb) != 0) as c_int; @@ -990,7 +990,7 @@ unsafe fn parse_frame_hdr(c: &mut Rav1dContext, gb: &mut GetBits) -> Rav1dResult } } let use_ref = (hdr.error_resilient_mode == 0 && hdr.frame_size_override != 0) as c_int; - (*c.frame_hdr).size = parse_frame_size(c, gb, use_ref).map_err(|()| EINVAL)?; + (*c.frame_hdr).size = parse_frame_size(c, gb, use_ref)?; hdr.hp = (hdr.force_integer_mv == 0 && rav1d_get_bit(gb) != 0) as c_int; hdr.subpel_filter_mode = if rav1d_get_bit(gb) != 0 { RAV1D_FILTER_SWITCHABLE