Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 51 additions & 46 deletions src/cdef_apply.rs
Original file line number Diff line number Diff line change
Expand Up @@ -142,11 +142,11 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(
sbrow_start: bool,
sby: c_int,
) {
let bd = BD::from_c(f.bitdepth_max);
let bd = BD::from_c(f.content.bitdepth_max);

let bitdepth_min_8 = match BD::BPC {
BPC::BPC8 => 0,
BPC::BPC16 => f.cur.p.bpc - 8,
BPC::BPC16 => f.content.cur.p.bpc - 8,
};
let mut edges: CdefEdgeFlags = if by_start > 0 {
CdefEdgeFlags::HAVE_BOTTOM | CdefEdgeFlags::HAVE_TOP
Expand All @@ -155,10 +155,10 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(
};
let mut ptrs = p;
let sbsz = 16;
let sb64w = f.sb128w << 1;
let frame_hdr = &***f.frame_hdr.as_ref().unwrap();
let sb64w = f.content.sb128w << 1;
let frame_hdr = &f.frame_hdr;
let damping = frame_hdr.cdef.damping + bitdepth_min_8;
let layout: Rav1dPixelLayout = f.cur.p.layout;
let layout: Rav1dPixelLayout = f.content.cur.p.layout;
let uv_idx = (Rav1dPixelLayout::I444 as c_uint).wrapping_sub(layout as c_uint) as c_int;
let ss_ver = (layout == Rav1dPixelLayout::I420) as c_int;
let ss_hor = (layout != Rav1dPixelLayout::I444) as c_int;
Expand All @@ -167,16 +167,16 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(
let uv_dir: &[u8; 8] = &UV_DIRS[(layout == Rav1dPixelLayout::I422) as usize];

let have_tt = c.tc.len() > 1;
let sb128 = f.seq_hdr.as_ref().unwrap().sb128;
let sb128 = f.seq_hdr.sb128;
let resize = frame_hdr.size.width[0] != frame_hdr.size.width[1];
let y_stride: ptrdiff_t = BD::pxstride(f.cur.stride[0]);
let uv_stride: ptrdiff_t = BD::pxstride(f.cur.stride[1]);
let y_stride: ptrdiff_t = BD::pxstride(f.content.cur.stride[0]);
let uv_stride: ptrdiff_t = BD::pxstride(f.content.cur.stride[1]);

let mut bit = false;
for by in (by_start..by_end).step_by(2) {
let tf = tc.top_pre_cdef_toggle != 0;
let by_idx = (by & 30) >> 1;
if by + 2 >= f.bh {
if by + 2 >= f.content.bh {
edges.remove(CdefEdgeFlags::HAVE_BOTTOM);
}

Expand All @@ -185,14 +185,14 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(
{
// backup pre-filter data for next iteration
let cdef_top_bak = [
f.lf.cdef_line[!tf as usize][0]
f.content.lf.cdef_line[!tf as usize][0]
.wrapping_add_signed(have_tt as isize * sby as isize * 4 * y_stride),
f.lf.cdef_line[!tf as usize][1]
f.content.lf.cdef_line[!tf as usize][1]
.wrapping_add_signed(have_tt as isize * sby as isize * 8 * uv_stride),
f.lf.cdef_line[!tf as usize][2]
f.content.lf.cdef_line[!tf as usize][2]
.wrapping_add_signed(have_tt as isize * sby as isize * 8 * uv_stride),
];
backup2lines::<BD>(&f.lf.cdef_line_buf, cdef_top_bak, ptrs, layout);
backup2lines::<BD>(&f.content.lf.cdef_line_buf, cdef_top_bak, ptrs, layout);
}

let mut lr_bak =
Expand All @@ -205,7 +205,8 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(
for sbx in 0..sb64w {
let sb128x = sbx >> 1;
let sb64_idx = ((by & sbsz) >> 3) + (sbx & 1);
let cdef_idx = f.lf.mask[(lflvl_offset + sb128x) as usize].cdef_idx[sb64_idx as usize]
let cdef_idx = f.content.lf.mask[(lflvl_offset + sb128x) as usize].cdef_idx
[sb64_idx as usize]
.get() as c_int;
if cdef_idx == -1
|| frame_hdr.cdef.y_strength[cdef_idx as usize] == 0
Expand All @@ -214,8 +215,8 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(
last_skip = true;
} else {
// Create a complete 32-bit mask for the sb row ahead of time.
let noskip_row =
&f.lf.mask[(lflvl_offset + sb128x) as usize].noskip_mask[by_idx as usize];
let noskip_row = &f.content.lf.mask[(lflvl_offset + sb128x) as usize].noskip_mask
[by_idx as usize];
let noskip_mask = (noskip_row[1].get() as u32) << 16 | noskip_row[0].get() as u32;

let y_lvl = frame_hdr.cdef.y_strength[cdef_idx as usize];
Expand All @@ -234,8 +235,8 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(
uv_sec_lvl <<= bitdepth_min_8;

let mut bptrs = iptrs;
for bx in (sbx * sbsz..cmp::min((sbx + 1) * sbsz, f.bw)).step_by(2) {
if bx + 2 >= f.bw {
for bx in (sbx * sbsz..cmp::min((sbx + 1) * sbsz, f.content.bw)).step_by(2) {
if bx + 2 >= f.content.bw {
edges.remove(CdefEdgeFlags::HAVE_RIGHT);
}

Expand All @@ -262,7 +263,11 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(

let mut variance = 0;
let dir = if y_pri_lvl != 0 || uv_pri_lvl != 0 {
f.dsp.cdef.dir.call::<BD>(bptrs[0], &mut variance, bd)
f.content
.dsp
.cdef
.dir
.call::<BD>(bptrs[0], &mut variance, bd)
} else {
0
};
Expand All @@ -272,36 +277,36 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(
} else if sbrow_start && by == by_start {
let top = if resize {
WithOffset {
data: &f.lf.cdef_line_buf,
offset: f.lf.cdef_lpf_line[0],
data: &f.content.lf.cdef_line_buf,
offset: f.content.lf.cdef_lpf_line[0],
} + ((sby - 1) * 4) as isize * y_stride
+ (bx * 4) as isize
} else {
WithOffset {
data: &f.lf.lr_line_buf,
offset: f.lf.lr_lpf_line[0],
data: &f.content.lf.lr_line_buf,
offset: f.content.lf.lr_lpf_line[0],
} + (sby * (4 << sb128) - 4) as isize * y_stride
+ (bx * 4) as isize
};
let bottom = bptrs[0] + (8 * y_stride);
Some((top, WithOffset::pic(bottom)))
} else if !sbrow_start && by + 2 >= by_end {
let top = WithOffset {
data: &f.lf.cdef_line_buf,
offset: f.lf.cdef_line[tf as usize][0],
data: &f.content.lf.cdef_line_buf,
offset: f.content.lf.cdef_line[tf as usize][0],
} + (sby * 4) as isize * y_stride
+ (bx * 4) as isize;
let buf = if resize {
WithOffset {
data: &f.lf.cdef_line_buf,
offset: f.lf.cdef_lpf_line[0],
data: &f.content.lf.cdef_line_buf,
offset: f.content.lf.cdef_lpf_line[0],
} + (sby * 4 + 2) as isize * y_stride
+ (bx * 4) as isize
} else {
let line = sby * (4 << sb128) + 4 * sb128 as c_int + 2;
WithOffset {
data: &f.lf.lr_line_buf,
offset: f.lf.lr_lpf_line[0],
data: &f.content.lf.lr_line_buf,
offset: f.content.lf.lr_lpf_line[0],
} + line as isize * y_stride
+ (bx * 4) as isize
};
Expand All @@ -321,8 +326,8 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(

let (top, bot) = top_bot.unwrap_or_else(|| {
let top = WithOffset {
data: &f.lf.cdef_line_buf,
offset: f.lf.cdef_line[tf as usize][0],
data: &f.content.lf.cdef_line_buf,
offset: f.content.lf.cdef_line[tf as usize][0],
} + have_tt as isize * (sby * 4) as isize * y_stride
+ (bx * 4) as isize;
let bottom = bptrs[0] + (8 * y_stride);
Expand All @@ -332,7 +337,7 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(
if y_pri_lvl != 0 {
let adj_y_pri_lvl = adjust_strength(y_pri_lvl, variance);
if adj_y_pri_lvl != 0 || y_sec_lvl != 0 {
f.dsp.cdef.fb[0].call::<BD>(
f.content.dsp.cdef.fb[0].call::<BD>(
bptrs[0],
&lr_bak[bit as usize][0],
top,
Expand All @@ -346,7 +351,7 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(
);
}
} else if y_sec_lvl != 0 {
f.dsp.cdef.fb[0].call::<BD>(
f.content.dsp.cdef.fb[0].call::<BD>(
bptrs[0],
&lr_bak[bit as usize][0],
top,
Expand Down Expand Up @@ -374,37 +379,37 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(
} else if sbrow_start && by == by_start {
let top = if resize {
WithOffset {
data: &f.lf.cdef_line_buf,
offset: f.lf.cdef_lpf_line[pl],
data: &f.content.lf.cdef_line_buf,
offset: f.content.lf.cdef_lpf_line[pl],
} + ((sby - 1) * 4) as isize * uv_stride
+ (bx * 4 >> ss_hor) as isize
} else {
let line = sby * (4 << sb128) - 4;
WithOffset {
data: &f.lf.lr_line_buf,
offset: f.lf.lr_lpf_line[pl],
data: &f.content.lf.lr_line_buf,
offset: f.content.lf.lr_lpf_line[pl],
} + line as isize * uv_stride
+ (bx * 4 >> ss_hor) as isize
};
let bottom = bptrs[pl] + ((8 >> ss_ver) * uv_stride);
Some((top, WithOffset::pic(bottom)))
} else if !sbrow_start && by + 2 >= by_end {
let top = WithOffset {
data: &f.lf.cdef_line_buf,
offset: f.lf.cdef_line[tf as usize][pl],
data: &f.content.lf.cdef_line_buf,
offset: f.content.lf.cdef_line[tf as usize][pl],
} + (sby * 8) as isize * uv_stride
+ (bx * 4 >> ss_hor) as isize;
let buf = if resize {
WithOffset {
data: &f.lf.cdef_line_buf,
offset: f.lf.cdef_lpf_line[pl],
data: &f.content.lf.cdef_line_buf,
offset: f.content.lf.cdef_lpf_line[pl],
} + (sby * 4 + 2) as isize * uv_stride
+ (bx * 4 >> ss_hor) as isize
} else {
let line = sby * (4 << sb128) + 4 * sb128 as c_int + 2;
WithOffset {
data: &f.lf.lr_line_buf,
offset: f.lf.lr_lpf_line[pl],
data: &f.content.lf.lr_line_buf,
offset: f.content.lf.lr_lpf_line[pl],
} + line as isize * uv_stride
+ (bx * 4 >> ss_hor) as isize
};
Expand All @@ -424,15 +429,15 @@ pub(crate) fn rav1d_cdef_brow<BD: BitDepth>(

let (top, bot) = top_bot.unwrap_or_else(|| {
let top = WithOffset {
data: &f.lf.cdef_line_buf,
offset: f.lf.cdef_line[tf as usize][pl],
data: &f.content.lf.cdef_line_buf,
offset: f.content.lf.cdef_line[tf as usize][pl],
} + have_tt as isize * (sby * 8) as isize * uv_stride
+ (bx * 4 >> ss_hor) as isize;
let bottom = bptrs[pl] + ((8 >> ss_ver) * uv_stride);
(top, WithOffset::pic(bottom))
});

f.dsp.cdef.fb[uv_idx as usize].call::<BD>(
f.content.dsp.cdef.fb[uv_idx as usize].call::<BD>(
bptrs[pl],
&lr_bak[bit as usize][pl],
top,
Expand Down
Loading
Loading