Skip to content

Commit f776605

Browse files
committed
struct refmvs_block: Align by aligning a wrapper struct around an inner packed struct, as Rust doesn't allow packed and aligned types (see rust-lang/rust#59154).
1 parent be04d3d commit f776605

File tree

4 files changed

+162
-115
lines changed

4 files changed

+162
-115
lines changed

src/decode.rs

Lines changed: 63 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@ use crate::src::levels::mv;
438438

439439
use crate::src::env::BlockContext;
440440
use crate::src::refmvs::refmvs_block;
441+
use crate::src::refmvs::refmvs_block_unaligned;
441442
use crate::src::refmvs::refmvs_frame;
442443
use crate::src::refmvs::refmvs_mvpair;
443444
use crate::src::refmvs::refmvs_refpair;
@@ -1459,14 +1460,14 @@ unsafe extern "C" fn find_matching_ref(
14591460
let mut r2: *const refmvs_block = &mut *(*r.offset(-(1 as libc::c_int) as isize))
14601461
.offset((*t).bx as isize)
14611462
as *mut refmvs_block;
1462-
if (*r2).r#ref.r#ref[0] as libc::c_int == r#ref + 1
1463-
&& (*r2).r#ref.r#ref[1] as libc::c_int == -(1 as libc::c_int)
1463+
if (*r2).0.r#ref.r#ref[0] as libc::c_int == r#ref + 1
1464+
&& (*r2).0.r#ref.r#ref[1] as libc::c_int == -(1 as libc::c_int)
14641465
{
14651466
let ref mut fresh2 = *masks.offset(0);
14661467
*fresh2 |= 1;
14671468
count = 1 as libc::c_int;
14681469
}
1469-
let mut aw4 = dav1d_block_dimensions[(*r2).bs as usize][0] as libc::c_int;
1470+
let mut aw4 = dav1d_block_dimensions[(*r2).0.bs as usize][0] as libc::c_int;
14701471
if aw4 >= bw4 {
14711472
let off = (*t).bx & aw4 - 1;
14721473
if off != 0 {
@@ -1480,8 +1481,8 @@ unsafe extern "C" fn find_matching_ref(
14801481
let mut x = aw4;
14811482
while x < w4 {
14821483
r2 = r2.offset(aw4 as isize);
1483-
if (*r2).r#ref.r#ref[0] as libc::c_int == r#ref + 1
1484-
&& (*r2).r#ref.r#ref[1] as libc::c_int == -(1 as libc::c_int)
1484+
if (*r2).0.r#ref.r#ref[0] as libc::c_int == r#ref + 1
1485+
&& (*r2).0.r#ref.r#ref[1] as libc::c_int == -(1 as libc::c_int)
14851486
{
14861487
let ref mut fresh3 = *masks.offset(0);
14871488
*fresh3 |= mask as uint64_t;
@@ -1490,7 +1491,7 @@ unsafe extern "C" fn find_matching_ref(
14901491
return;
14911492
}
14921493
}
1493-
aw4 = dav1d_block_dimensions[(*r2).bs as usize][0] as libc::c_int;
1494+
aw4 = dav1d_block_dimensions[(*r2).0.bs as usize][0] as libc::c_int;
14941495
mask <<= aw4;
14951496
x += aw4;
14961497
}
@@ -1499,10 +1500,12 @@ unsafe extern "C" fn find_matching_ref(
14991500
if have_left {
15001501
let mut r2_0: *const *mut refmvs_block = r;
15011502
if (*(*r2_0.offset(0)).offset(((*t).bx - 1) as isize))
1503+
.0
15021504
.r#ref
15031505
.r#ref[0] as libc::c_int
15041506
== r#ref + 1
15051507
&& (*(*r2_0.offset(0)).offset(((*t).bx - 1) as isize))
1508+
.0
15061509
.r#ref
15071510
.r#ref[1] as libc::c_int
15081511
== -(1 as libc::c_int)
@@ -1515,7 +1518,7 @@ unsafe extern "C" fn find_matching_ref(
15151518
}
15161519
}
15171520
let mut lh4 = dav1d_block_dimensions
1518-
[(*(*r2_0.offset(0)).offset(((*t).bx - 1) as isize)).bs as usize][1]
1521+
[(*(*r2_0.offset(0)).offset(((*t).bx - 1) as isize)).0.bs as usize][1]
15191522
as libc::c_int;
15201523
if lh4 >= bh4 {
15211524
if (*t).by & lh4 - 1 != 0 {
@@ -1527,10 +1530,12 @@ unsafe extern "C" fn find_matching_ref(
15271530
while y < h4 {
15281531
r2_0 = r2_0.offset(lh4 as isize);
15291532
if (*(*r2_0.offset(0)).offset(((*t).bx - 1) as isize))
1533+
.0
15301534
.r#ref
15311535
.r#ref[0] as libc::c_int
15321536
== r#ref + 1
15331537
&& (*(*r2_0.offset(0)).offset(((*t).bx - 1) as isize))
1538+
.0
15341539
.r#ref
15351540
.r#ref[1] as libc::c_int
15361541
== -(1 as libc::c_int)
@@ -1543,7 +1548,7 @@ unsafe extern "C" fn find_matching_ref(
15431548
}
15441549
}
15451550
lh4 = dav1d_block_dimensions
1546-
[(*(*r2_0.offset(0)).offset(((*t).bx - 1) as isize)).bs as usize][1]
1551+
[(*(*r2_0.offset(0)).offset(((*t).bx - 1) as isize)).0.bs as usize][1]
15471552
as libc::c_int;
15481553
mask_0 <<= lh4;
15491554
y += lh4;
@@ -1552,10 +1557,12 @@ unsafe extern "C" fn find_matching_ref(
15521557
}
15531558
if have_topleft != 0
15541559
&& ((*(*r.offset(-(1 as libc::c_int) as isize)).offset(((*t).bx - 1) as isize))
1560+
.0
15551561
.r#ref
15561562
.r#ref[0] as libc::c_int
15571563
== r#ref + 1
15581564
&& (*(*r.offset(-(1 as libc::c_int) as isize)).offset(((*t).bx - 1) as isize))
1565+
.0
15591566
.r#ref
15601567
.r#ref[1] as libc::c_int
15611568
== -(1 as libc::c_int))
@@ -1569,10 +1576,12 @@ unsafe extern "C" fn find_matching_ref(
15691576
}
15701577
if have_topright != 0
15711578
&& ((*(*r.offset(-(1 as libc::c_int) as isize)).offset(((*t).bx + bw4) as isize))
1579+
.0
15721580
.r#ref
15731581
.r#ref[0] as libc::c_int
15741582
== r#ref + 1
15751583
&& (*(*r.offset(-(1 as libc::c_int) as isize)).offset(((*t).bx + bw4) as isize))
1584+
.0
15761585
.r#ref
15771586
.r#ref[1] as libc::c_int
15781587
== -(1 as libc::c_int))
@@ -1602,13 +1611,13 @@ unsafe fn derive_warpmv(
16021611

16031612
let rp = |i: i32, j: i32| &*r(i as isize).offset(j as isize);
16041613

1605-
let bs = |rp: &refmvs_block| dav1d_block_dimensions[(*rp).bs as usize];
1614+
let bs = |rp: &refmvs_block| dav1d_block_dimensions[(*rp).0.bs as usize];
16061615

16071616
let mut add_sample = |np: usize, dx: i32, dy: i32, sx: i32, sy: i32, rp: &refmvs_block| {
16081617
pts[np][0][0] = 16 * (2 * dx + sx * bs(rp)[0] as i32) - 8;
16091618
pts[np][0][1] = 16 * (2 * dy + sy * bs(rp)[1] as i32) - 8;
1610-
pts[np][1][0] = pts[np][0][0] + (*rp).mv.mv[0].x as i32;
1611-
pts[np][1][1] = pts[np][0][1] + (*rp).mv.mv[0].y as i32;
1619+
pts[np][1][0] = pts[np][0][0] + (*rp).0.mv.mv[0].x as i32;
1620+
pts[np][1][1] = pts[np][0][1] + (*rp).0.mv.mv[0].y as i32;
16121621
np + 1
16131622
};
16141623

@@ -2542,7 +2551,7 @@ unsafe extern "C" fn splat_oneref_mv(
25422551
) {
25432552
let mode: InterPredMode = (*b).c2rust_unnamed.c2rust_unnamed_0.inter_mode as InterPredMode;
25442553
let tmpl: Align16<refmvs_block> = {
2545-
let mut init = refmvs_block {
2554+
let mut init = refmvs_block(refmvs_block_unaligned {
25462555
mv: refmvs_mvpair {
25472556
mv: [
25482557
(*b).c2rust_unnamed
@@ -2568,7 +2577,7 @@ unsafe extern "C" fn splat_oneref_mv(
25682577
&& imin(bw4, bh4) >= 2) as libc::c_int
25692578
| (mode as libc::c_uint == NEWMV as libc::c_int as libc::c_uint) as libc::c_int * 2)
25702579
as uint8_t,
2571-
};
2580+
});
25722581
Align16(init)
25732582
};
25742583
((*c).refmvs_dsp.splat_mv).expect("non-null function pointer")(
@@ -2591,7 +2600,7 @@ unsafe extern "C" fn splat_intrabc_mv(
25912600
bh4: libc::c_int,
25922601
) {
25932602
let tmpl: Align16<refmvs_block> = {
2594-
let mut init = refmvs_block {
2603+
let mut init = refmvs_block(refmvs_block_unaligned {
25952604
mv: refmvs_mvpair {
25962605
mv: [
25972606
(*b).c2rust_unnamed
@@ -2607,7 +2616,7 @@ unsafe extern "C" fn splat_intrabc_mv(
26072616
},
26082617
bs: bs as uint8_t,
26092618
mf: 0 as libc::c_int as uint8_t,
2610-
};
2619+
});
26112620
Align16(init)
26122621
};
26132622
((*c).refmvs_dsp.splat_mv).expect("non-null function pointer")(
@@ -2635,7 +2644,7 @@ unsafe extern "C" fn splat_tworef_mv(
26352644
let mode: CompInterPredMode =
26362645
(*b).c2rust_unnamed.c2rust_unnamed_0.inter_mode as CompInterPredMode;
26372646
let tmpl: Align16<refmvs_block> = {
2638-
let mut init = refmvs_block {
2647+
let mut init = refmvs_block(refmvs_block_unaligned {
26392648
mv: refmvs_mvpair {
26402649
mv: [
26412650
(*b).c2rust_unnamed
@@ -2662,7 +2671,7 @@ unsafe extern "C" fn splat_tworef_mv(
26622671
| ((1 as libc::c_int) << mode as libc::c_uint & 0xbc as libc::c_int != 0)
26632672
as libc::c_int
26642673
* 2) as uint8_t,
2665-
};
2674+
});
26662675
Align16(init)
26672676
};
26682677
((*c).refmvs_dsp.splat_mv).expect("non-null function pointer")(
@@ -2684,7 +2693,7 @@ unsafe extern "C" fn splat_intraref(
26842693
bh4: libc::c_int,
26852694
) {
26862695
let tmpl: Align16<refmvs_block> = {
2687-
let mut init = refmvs_block {
2696+
let mut init = refmvs_block(refmvs_block_unaligned {
26882697
mv: refmvs_mvpair {
26892698
mv: [mv::INVALID, mv::ZERO],
26902699
},
@@ -2693,7 +2702,7 @@ unsafe extern "C" fn splat_intraref(
26932702
},
26942703
bs: bs as uint8_t,
26952704
mf: 0 as libc::c_int as uint8_t,
2696-
};
2705+
});
26972706
Align16(init)
26982707
};
26992708
((*c).refmvs_dsp.splat_mv).expect("non-null function pointer")(
@@ -2815,16 +2824,16 @@ unsafe fn obmc_lowest_px(
28152824
let mut x = 0;
28162825
while x < w4 && i < imin(b_dim[2] as libc::c_int, 4) {
28172826
let a_r = &*r[0].offset((t.bx + x + 1) as isize);
2818-
let a_b_dim = &dav1d_block_dimensions[a_r.bs as usize];
2819-
if a_r.r#ref.r#ref[0] as libc::c_int > 0 {
2827+
let a_b_dim = &dav1d_block_dimensions[a_r.0.bs as usize];
2828+
if a_r.0.r#ref.r#ref[0] as libc::c_int > 0 {
28202829
let oh4 = imin(b_dim[1] as libc::c_int, 16) >> 1;
28212830
mc_lowest_px(
2822-
&mut dst[a_r.r#ref.r#ref[0] as usize - 1][is_chroma as usize],
2831+
&mut dst[a_r.0.r#ref.r#ref[0] as usize - 1][is_chroma as usize],
28232832
t.by,
28242833
oh4 * 3 + 3 >> 2,
2825-
a_r.mv.mv[0].y as libc::c_int,
2834+
a_r.0.mv.mv[0].y as libc::c_int,
28262835
ss_ver,
2827-
&f.svc[a_r.r#ref.r#ref[0] as usize - 1][1],
2836+
&f.svc[a_r.0.r#ref.r#ref[0] as usize - 1][1],
28282837
);
28292838
i += 1;
28302839
}
@@ -2836,16 +2845,16 @@ unsafe fn obmc_lowest_px(
28362845
let mut y = 0;
28372846
while y < h4 && i < imin(b_dim[3] as libc::c_int, 4) {
28382847
let l_r = &*r[y as usize + 1 + 1].offset((t.bx - 1) as isize);
2839-
let l_b_dim = &dav1d_block_dimensions[l_r.bs as usize];
2840-
if l_r.r#ref.r#ref[0] as libc::c_int > 0 {
2848+
let l_b_dim = &dav1d_block_dimensions[l_r.0.bs as usize];
2849+
if l_r.0.r#ref.r#ref[0] as libc::c_int > 0 {
28412850
let oh4 = iclip(l_b_dim[1] as libc::c_int, 2, b_dim[1] as libc::c_int);
28422851
mc_lowest_px(
2843-
&mut dst[l_r.r#ref.r#ref[0] as usize - 1][is_chroma as usize],
2852+
&mut dst[l_r.0.r#ref.r#ref[0] as usize - 1][is_chroma as usize],
28442853
t.by + y,
28452854
oh4,
2846-
l_r.mv.mv[0].y as libc::c_int,
2855+
l_r.0.mv.mv[0].y as libc::c_int,
28472856
ss_ver,
2848-
&f.svc[l_r.r#ref.r#ref[0] as usize - 1][1],
2857+
&f.svc[l_r.0.r#ref.r#ref[0] as usize - 1][1],
28492858
);
28502859
i += 1;
28512860
}
@@ -2943,15 +2952,15 @@ unsafe fn decode_b(
29432952
t.rt.r[((t.by & 31) + 5 + bh4 - 1) as usize].offset(t.bx as isize);
29442953
for x in 0..bw4 {
29452954
let block = &mut *r.offset(x as isize);
2946-
block.r#ref.r#ref[0] = 0;
2947-
block.bs = bs as uint8_t;
2955+
block.0.r#ref.r#ref[0] = 0;
2956+
block.0.bs = bs as uint8_t;
29482957
}
29492958

29502959
let mut rr = &t.rt.r[((t.by & 31) + 5) as usize..];
29512960
for y in 0..bh4 - 1 {
29522961
let block = &mut *rr[y as usize].offset((t.bx + bw4 - 1) as isize);
2953-
block.r#ref.r#ref[0] = 0;
2954-
block.bs = bs as uint8_t;
2962+
block.0.r#ref.r#ref[0] = 0;
2963+
block.0.bs = bs as uint8_t;
29552964
}
29562965
}
29572966

@@ -3019,17 +3028,17 @@ unsafe fn decode_b(
30193028
let r: *mut refmvs_block =
30203029
t.rt.r[((t.by & 31) + 5 + bh4 - 1) as usize].offset(t.bx as isize);
30213030
for x in 0..bw4 as isize {
3022-
(*r.offset(x)).r#ref.r#ref[0] = b.r#ref()[0] + 1;
3023-
(*r.offset(x)).mv.mv[0] = b.mv()[0];
3024-
(*r.offset(x)).bs = bs as uint8_t;
3031+
(*r.offset(x)).0.r#ref.r#ref[0] = b.r#ref()[0] + 1;
3032+
(*r.offset(x)).0.mv.mv[0] = b.mv()[0];
3033+
(*r.offset(x)).0.bs = bs as uint8_t;
30253034
}
30263035

30273036
let mut rr: &[*mut refmvs_block] = &t.rt.r[((t.by & 31) + 5) as usize..];
30283037
for y in 0..bh4 as usize - 1 {
30293038
let r = &mut *rr[y].offset((t.bx + bw4 - 1) as isize);
3030-
r.r#ref.r#ref[0] = b.r#ref()[0] + 1;
3031-
r.mv.mv[0] = b.mv()[0];
3032-
r.bs = bs as uint8_t;
3039+
r.0.r#ref.r#ref[0] = b.r#ref()[0] + 1;
3040+
r.0.mv.mv[0] = b.mv()[0];
3041+
r.0.bs = bs as uint8_t;
30333042
}
30343043
}
30353044

@@ -6811,20 +6820,24 @@ unsafe fn decode_b(
68116820
r_1 = &mut *(t.rt.r).as_mut_ptr().offset(((t.by & 31) + 5) as isize)
68126821
as *mut *mut refmvs_block;
68136822
if bw4 == 1 {
6814-
is_sub8x8 &= ((*(*r_1.offset(0)).offset((t.bx - 1) as isize)).r#ref.r#ref[0]
6815-
as libc::c_int
6823+
is_sub8x8 &= ((*(*r_1.offset(0)).offset((t.bx - 1) as isize))
6824+
.0
6825+
.r#ref
6826+
.r#ref[0] as libc::c_int
68166827
> 0) as libc::c_int;
68176828
}
68186829
if bh4 == ss_ver {
68196830
is_sub8x8 &= ((*(*r_1.offset(-(1 as libc::c_int) as isize))
68206831
.offset(t.bx as isize))
6832+
.0
68216833
.r#ref
68226834
.r#ref[0] as libc::c_int
68236835
> 0) as libc::c_int;
68246836
}
68256837
if bw4 == 1 && bh4 == ss_ver {
68266838
is_sub8x8 &= ((*(*r_1.offset(-(1 as libc::c_int) as isize))
68276839
.offset((t.bx - 1) as isize))
6840+
.0
68286841
.r#ref
68296842
.r#ref[0] as libc::c_int
68306843
> 0) as libc::c_int;
@@ -6840,13 +6853,13 @@ unsafe fn decode_b(
68406853
.offset((t.bx - 1) as isize)
68416854
as *mut refmvs_block;
68426855
mc_lowest_px(
6843-
&mut lowest_px[(*rr_1).r#ref.r#ref[0] as usize - 1][1],
6856+
&mut lowest_px[(*rr_1).0.r#ref.r#ref[0] as usize - 1][1],
68446857
t.by - 1,
68456858
bh4,
6846-
(*rr_1).mv.mv[0].y as libc::c_int,
6859+
(*rr_1).0.mv.mv[0].y as libc::c_int,
68476860
ss_ver,
68486861
&*(*(f.svc).as_ptr().offset(
6849-
(*((*rr_1).r#ref.r#ref).as_ptr().offset(0) as libc::c_int - 1)
6862+
(*((*rr_1).0.r#ref.r#ref).as_ptr().offset(0) as libc::c_int - 1)
68506863
as isize,
68516864
))
68526865
.as_ptr()
@@ -6857,13 +6870,13 @@ unsafe fn decode_b(
68576870
let rr_2: *const refmvs_block =
68586871
&mut *(*r_1.offset(0)).offset((t.bx - 1) as isize) as *mut refmvs_block;
68596872
mc_lowest_px(
6860-
&mut lowest_px[(*rr_2).r#ref.r#ref[0] as usize - 1][1],
6873+
&mut lowest_px[(*rr_2).0.r#ref.r#ref[0] as usize - 1][1],
68616874
t.by,
68626875
bh4,
6863-
(*rr_2).mv.mv[0].y as libc::c_int,
6876+
(*rr_2).0.mv.mv[0].y as libc::c_int,
68646877
ss_ver,
68656878
&*(*(f.svc).as_ptr().offset(
6866-
(*((*rr_2).r#ref.r#ref).as_ptr().offset(0) as libc::c_int - 1)
6879+
(*((*rr_2).0.r#ref.r#ref).as_ptr().offset(0) as libc::c_int - 1)
68676880
as isize,
68686881
))
68696882
.as_ptr()
@@ -6875,13 +6888,13 @@ unsafe fn decode_b(
68756888
&mut *(*r_1.offset(-(1 as libc::c_int) as isize)).offset(t.bx as isize)
68766889
as *mut refmvs_block;
68776890
mc_lowest_px(
6878-
&mut lowest_px[(*rr_3).r#ref.r#ref[0] as usize - 1][1],
6891+
&mut lowest_px[(*rr_3).0.r#ref.r#ref[0] as usize - 1][1],
68796892
t.by - 1,
68806893
bh4,
6881-
(*rr_3).mv.mv[0].y as libc::c_int,
6894+
(*rr_3).0.mv.mv[0].y as libc::c_int,
68826895
ss_ver,
68836896
&*(*(f.svc).as_ptr().offset(
6884-
(*((*rr_3).r#ref.r#ref).as_ptr().offset(0) as libc::c_int - 1)
6897+
(*((*rr_3).0.r#ref.r#ref).as_ptr().offset(0) as libc::c_int - 1)
68856898
as isize,
68866899
))
68876900
.as_ptr()

0 commit comments

Comments
 (0)