Commit 9d1fcef3 authored by David Michael Barr's avatar David Michael Barr

Loop filter: mask with exact image width in MI

This resolves a mismatch for libaom test vectors:
av1-1-b8-01-size-$SIZE.ivf
Where SIZE is in:
 18x64  196x196 196x198 196x200 196x202 196x210 196x224 196x226 202x196
202x198 202x200 202x208 202x210 202x224 202x226 210x196 210x198 210x200
210x202 210x208 210x210 210x224 210x226 226x196 226x198 226x200 226x202
226x210 226x224 226x226  66x18   66x32
Helped-by: Ronald S. Bultje's avatarRonald S. Bultje <rsbultje@gmail.com>
parent aec3d25c
......@@ -1099,7 +1099,8 @@ static void decode_b(Dav1dTileContext *const t,
dav1d_create_lf_mask_intra(t->lf_mask, f->lf.level, f->b4_stride,
&f->frame_hdr, (const uint8_t (*)[8][2])
&ts->lflvl[b->seg_id][0][0][0],
t->bx, t->by, f->bw, f->bh, bs,
t->bx, t->by, (f->cur.p.p.w + 3) >> 2,
(f->cur.p.p.h + 3) >> 2, bs,
b->tx, b->uvtx, f->cur.p.p.layout,
&t->a->tx_lpf_y[bx4], &t->l.tx_lpf_y[by4],
has_chroma ? &t->a->tx_lpf_uv[cbx4] : NULL,
......@@ -1694,7 +1695,9 @@ static void decode_b(Dav1dTileContext *const t,
&ts->lflvl[b->seg_id][0][b->ref[0] + 1][!is_globalmv];
dav1d_create_lf_mask_inter(t->lf_mask, f->lf.level, f->b4_stride,
&f->frame_hdr, lf_lvls, t->bx, t->by,
f->bw, f->bh, b->skip, bs, b->tx_split,
(f->cur.p.p.w + 3) >> 2,
(f->cur.p.p.h + 3) >> 2,
b->skip, bs, b->tx_split,
b->uvtx, f->cur.p.p.layout,
&t->a->tx_lpf_y[bx4], &t->l.tx_lpf_y[by4],
has_chroma ? &t->a->tx_lpf_uv[cbx4] : NULL,
......
......@@ -245,27 +245,32 @@ void dav1d_create_lf_mask_intra(Av1Filter *const lflvl,
const int bx4 = bx & 31;
const int by4 = by & 31;
uint8_t (*level_cache_ptr)[4] = level_cache + by * b4_stride + bx;
for (int y = 0; y < bh4; y++) {
for (int x = 0; x < bw4; x++) {
level_cache_ptr[x][0] = filter_level[0][0][0];
level_cache_ptr[x][1] = filter_level[1][0][0];
if (bw4 && bh4) {
uint8_t (*level_cache_ptr)[4] = level_cache + by * b4_stride + bx;
for (int y = 0; y < bh4; y++) {
for (int x = 0; x < bw4; x++) {
level_cache_ptr[x][0] = filter_level[0][0][0];
level_cache_ptr[x][1] = filter_level[1][0][0];
}
level_cache_ptr += b4_stride;
}
level_cache_ptr += b4_stride;
}
mask_edges_intra(lflvl->filter_y, by4, bx4, bw4, bh4, ytx, ay, ly);
mask_edges_intra(lflvl->filter_y, by4, bx4, bw4, bh4, ytx, ay, ly);
}
if (!auv) return;
const int ss_ver = layout == DAV1D_PIXEL_LAYOUT_I420;
const int ss_hor = layout != DAV1D_PIXEL_LAYOUT_I444;
const int cbw4 = (bw4 + ss_hor) >> ss_hor;
const int cbh4 = (bh4 + ss_ver) >> ss_ver;
const int cbw4 = imin(((iw + ss_hor) >> ss_hor) - (bx >> ss_hor),
(b_dim[0] + ss_hor) >> ss_hor);
const int cbh4 = imin(((ih + ss_ver) >> ss_ver) - (by >> ss_ver),
(b_dim[1] + ss_ver) >> ss_ver);
const int cbx4 = bx4 >> ss_hor;
const int cby4 = by4 >> ss_ver;
level_cache_ptr = level_cache + (by >> ss_ver) * b4_stride + (bx >> ss_hor);
uint8_t (*level_cache_ptr)[4] =
level_cache + (by >> ss_ver) * b4_stride + (bx >> ss_hor);
for (int y = 0; y < cbh4; y++) {
for (int x = 0; x < cbw4; x++) {
level_cache_ptr[x][2] = filter_level[2][0][0];
......@@ -300,28 +305,33 @@ void dav1d_create_lf_mask_inter(Av1Filter *const lflvl,
const int bx4 = bx & 31;
const int by4 = by & 31;
uint8_t (*level_cache_ptr)[4] = level_cache + by * b4_stride + bx;
for (int y = 0; y < bh4; y++) {
for (int x = 0; x < bw4; x++) {
level_cache_ptr[x][0] = filter_level[0][0][0];
level_cache_ptr[x][1] = filter_level[1][0][0];
if (bw4 && bh4) {
uint8_t (*level_cache_ptr)[4] = level_cache + by * b4_stride + bx;
for (int y = 0; y < bh4; y++) {
for (int x = 0; x < bw4; x++) {
level_cache_ptr[x][0] = filter_level[0][0][0];
level_cache_ptr[x][1] = filter_level[1][0][0];
}
level_cache_ptr += b4_stride;
}
level_cache_ptr += b4_stride;
}
mask_edges_inter(lflvl->filter_y, by4, bx4, bw4, bh4, skip,
dav1d_max_txfm_size_for_bs[bs][0], tx_masks, ay, ly);
mask_edges_inter(lflvl->filter_y, by4, bx4, bw4, bh4, skip,
dav1d_max_txfm_size_for_bs[bs][0], tx_masks, ay, ly);
}
if (!auv) return;
const int ss_ver = layout == DAV1D_PIXEL_LAYOUT_I420;
const int ss_hor = layout != DAV1D_PIXEL_LAYOUT_I444;
const int cbw4 = (bw4 + ss_hor) >> ss_hor;
const int cbh4 = (bh4 + ss_ver) >> ss_ver;
const int cbw4 = imin(((iw + ss_hor) >> ss_hor) - (bx >> ss_hor),
(b_dim[0] + ss_hor) >> ss_hor);
const int cbh4 = imin(((ih + ss_ver) >> ss_ver) - (by >> ss_ver),
(b_dim[1] + ss_ver) >> ss_ver);
const int cbx4 = bx4 >> ss_hor;
const int cby4 = by4 >> ss_ver;
level_cache_ptr = level_cache + (by >> ss_ver) * b4_stride + (bx >> ss_hor);
uint8_t (*level_cache_ptr)[4] =
level_cache + (by >> ss_ver) * b4_stride + (bx >> ss_hor);
for (int y = 0; y < cbh4; y++) {
for (int x = 0; x < cbw4; x++) {
level_cache_ptr[x][2] = filter_level[2][0][0];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment