Remove redundant dering passes in CDEF search Change-Id: I3b932544426cb9aeb63ab4e1f516a4d8195d0702
diff --git a/av1/common/cdef.c b/av1/common/cdef.c index 71ce202..c578eb9 100644 --- a/av1/common/cdef.c +++ b/av1/common/cdef.c
@@ -382,7 +382,7 @@ od_dering(dst, &src[OD_FILT_VBORDER * OD_FILT_BSTRIDE + OD_FILT_HBORDER], dec[pli], dir, NULL, var, pli, dlist, dering_count, threshold, - clpf_strength, clpf_damping, coeff_shift); + clpf_strength, clpf_damping, coeff_shift, 0); #if CONFIG_AOM_HIGHBITDEPTH if (cm->use_highbitdepth) { copy_dering_16bit_to_16bit(
diff --git a/av1/common/od_dering.c b/av1/common/od_dering.c index 849c9b1..65ea4f2 100644 --- a/av1/common/od_dering.c +++ b/av1/common/od_dering.c
@@ -243,7 +243,8 @@ int dir[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS], int *dirinit, int var[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS], int pli, dering_list *dlist, int dering_count, int threshold, - int clpf_strength, int clpf_damping, int coeff_shift) { + int clpf_strength, int clpf_damping, int coeff_shift, + int skip_dering) { int bi; int bx; int by; @@ -252,45 +253,49 @@ od_filter_dering_direction_4x4, od_filter_dering_direction_8x8 }; bsize = OD_DERING_SIZE_LOG2 - xdec; - if (pli == 0) { - if (!dirinit || !*dirinit) { + if (!skip_dering) { + if (pli == 0) { + if (!dirinit || !*dirinit) { + for (bi = 0; bi < dering_count; bi++) { + by = dlist[bi].by; + bx = dlist[bi].bx; + dir[by][bx] = + od_dir_find8(&in[8 * by * OD_FILT_BSTRIDE + 8 * bx], + OD_FILT_BSTRIDE, &var[by][bx], coeff_shift); + } + if (dirinit) *dirinit = 1; + } for (bi = 0; bi < dering_count; bi++) { by = dlist[bi].by; bx = dlist[bi].bx; - dir[by][bx] = od_dir_find8(&in[8 * by * OD_FILT_BSTRIDE + 8 * bx], - OD_FILT_BSTRIDE, &var[by][bx], coeff_shift); + /* Deringing orthogonal to the direction uses a tighter threshold + because we want to be conservative. We've presumably already + achieved some deringing, so the amount of change is expected + to be low. Also, since we might be filtering across an edge, we + want to make sure not to blur it. That being said, we might want + to be a little bit more aggressive on pure horizontal/vertical + since the ringing there tends to be directional, so it doesn't + get removed by the directional filtering. */ + (filter_dering_direction[bsize - OD_LOG_BSIZE0])( + &y[bi << 2 * bsize], 1 << bsize, + &in[(by * OD_FILT_BSTRIDE << bsize) + (bx << bsize)], + od_adjust_thresh(threshold, var[by][bx]), dir[by][bx]); } - if (dirinit) *dirinit = 1; - } - for (bi = 0; bi < dering_count; bi++) { - by = dlist[bi].by; - bx = dlist[bi].bx; - /* Deringing orthogonal to the direction uses a tighter threshold - because we want to be conservative. We've presumably already - achieved some deringing, so the amount of change is expected - to be low. Also, since we might be filtering across an edge, we - want to make sure not to blur it. That being said, we might want - to be a little bit more aggressive on pure horizontal/vertical - since the ringing there tends to be directional, so it doesn't - get removed by the directional filtering. */ - (filter_dering_direction[bsize - OD_LOG_BSIZE0])( - &y[bi << 2 * bsize], 1 << bsize, - &in[(by * OD_FILT_BSTRIDE << bsize) + (bx << bsize)], - od_adjust_thresh(threshold, var[by][bx]), dir[by][bx]); - } - } else { - for (bi = 0; bi < dering_count; bi++) { - by = dlist[bi].by; - bx = dlist[bi].bx; - (filter_dering_direction[bsize - OD_LOG_BSIZE0])( - &y[bi << 2 * bsize], 1 << bsize, - &in[(by * OD_FILT_BSTRIDE << bsize) + (bx << bsize)], threshold, - dir[by][bx]); + } else { + for (bi = 0; bi < dering_count; bi++) { + by = dlist[bi].by; + bx = dlist[bi].bx; + (filter_dering_direction[bsize - OD_LOG_BSIZE0])( + &y[bi << 2 * bsize], 1 << bsize, + &in[(by * OD_FILT_BSTRIDE << bsize) + (bx << bsize)], threshold, + dir[by][bx]); + } } } if (!clpf_strength) return; - copy_dering_16bit_to_16bit(in, OD_FILT_BSTRIDE, y, dlist, dering_count, - bsize); + if (threshold && !skip_dering) + copy_dering_16bit_to_16bit(in, OD_FILT_BSTRIDE, y, dlist, dering_count, + bsize); for (bi = 0; bi < dering_count; bi++) { by = dlist[bi].by; bx = dlist[bi].bx;
diff --git a/av1/common/od_dering.h b/av1/common/od_dering.h index 60d17bc..a3efec2 100644 --- a/av1/common/od_dering.h +++ b/av1/common/od_dering.h
@@ -50,7 +50,8 @@ int dir[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS], int *dirinit, int var[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS], int pli, dering_list *dlist, int dering_count, int threshold, - int clpf_strength, int clpf_damping, int coeff_shift); + int clpf_strength, int clpf_damping, int coeff_shift, + int skip_dering); int od_filter_dering_direction_4x4_c(uint16_t *y, int ystride, const uint16_t *in, int threshold, int dir);
diff --git a/av1/encoder/pickcdef.c b/av1/encoder/pickcdef.c index 9a9813c..bcb82b7 100644 --- a/av1/encoder/pickcdef.c +++ b/av1/encoder/pickcdef.c
@@ -257,15 +257,20 @@ (nvb << bsize[pli]) + OD_FILT_VBORDER * (sbr != nvsb - 1) + yoff; int xsize = (nhb << bsize[pli]) + OD_FILT_HBORDER * (sbc != nhsb - 1) + xoff; - copy_sb16_16(&in[(-yoff * OD_FILT_BSTRIDE - xoff)], OD_FILT_BSTRIDE, - src[pli], (sbr * MAX_MIB_SIZE << bsize[pli]) - yoff, - (sbc * MAX_MIB_SIZE << bsize[pli]) - xoff, stride[pli], - ysize, xsize); clpf_strength = gi % CLPF_STRENGTHS; + if (clpf_strength == 0) + copy_sb16_16(&in[(-yoff * OD_FILT_BSTRIDE - xoff)], OD_FILT_BSTRIDE, + src[pli], (sbr * MAX_MIB_SIZE << bsize[pli]) - yoff, + (sbc * MAX_MIB_SIZE << bsize[pli]) - xoff, stride[pli], + ysize, xsize); od_dering(tmp_dst, in, dec[pli], dir, &dirinit, var, pli, dlist, dering_count, threshold, clpf_strength + (clpf_strength == 3), clpf_damping, - coeff_shift); + coeff_shift, clpf_strength != 0); + if (clpf_strength == 0) { + copy_dering_16bit_to_16bit(in, OD_FILT_BSTRIDE, tmp_dst, dlist, + dering_count, bsize[pli]); + } mse[pli][sb_count][gi] = compute_dering_mse( ref_coeff[pli] + (sbr * MAX_MIB_SIZE << bsize[pli]) * stride[pli] +