Fix a bug for loop filter level assignment
To apply loop filter for a block, its filter level is decided as:
level = (current_level != 0) ? current_level : previous_level.
Previous logic assign level = current_level. This CL fixes it.
Change-Id: Ie41d83ea322e83bb5f686d24f37fef192c32eb9e
diff --git a/av1/common/av1_loopfilter.c b/av1/common/av1_loopfilter.c
index 6de130d..d1659bc 100644
--- a/av1/common/av1_loopfilter.c
+++ b/av1/common/av1_loopfilter.c
@@ -1512,6 +1512,14 @@
case 2: lfm->left_v[min_tx_size].bits[index] |= mask_1; break;
default: assert(plane >= 0 && plane <= 2); return;
}
+ if (level == 0 && prev_level != 0) {
+ switch (plane) {
+ case 0: lfm->lfl_y_ver[tmp_row][tmp_col] = prev_level; break;
+ case 1: lfm->lfl_u[tmp_row][tmp_col] = prev_level; break;
+ case 2: lfm->lfl_v[tmp_row][tmp_col] = prev_level; break;
+ default: assert(plane >= 0 && plane <= 2); return;
+ }
+ }
}
// update prev info
@@ -1584,6 +1592,14 @@
case 2: lfm->above_v[min_tx_size].bits[index] |= mask_1; break;
default: assert(plane >= 0 && plane <= 2); return;
}
+ if (level == 0 && prev_level != 0) {
+ switch (plane) {
+ case 0: lfm->lfl_y_ver[tmp_row][tmp_col] = prev_level; break;
+ case 1: lfm->lfl_u[tmp_row][tmp_col] = prev_level; break;
+ case 2: lfm->lfl_v[tmp_row][tmp_col] = prev_level; break;
+ default: assert(plane >= 0 && plane <= 2); return;
+ }
+ }
}
// update prev info
@@ -1756,10 +1772,10 @@
uint8_t *lfl2;
// filter two rows at a time
- for (r = 0; r < cm->seq_params.mib_size &&
+ for (r = 0; r < cm->seq_params.sb_size &&
((mi_row + r) << MI_SIZE_LOG2 < cm->height);
r += r_step) {
- for (c = 0; c < cm->seq_params.mib_size &&
+ for (c = 0; c < cm->seq_params.sb_size &&
((mi_col + c) << MI_SIZE_LOG2 < cm->width);
c += MI_SIZE_64X64) {
dst->buf += ((c << MI_SIZE_LOG2) >> ssx);
@@ -1835,10 +1851,10 @@
uint64_t mask_4x4 = 0;
uint8_t *lfl;
- for (r = 0; r < cm->seq_params.mib_size &&
+ for (r = 0; r < cm->seq_params.sb_size &&
((mi_row + r) << MI_SIZE_LOG2 < cm->height);
r += r_step) {
- for (c = 0; c < cm->seq_params.mib_size &&
+ for (c = 0; c < cm->seq_params.sb_size &&
((mi_col + c) << MI_SIZE_LOG2 < cm->width);
c += MI_SIZE_64X64) {
if (mi_row + r == 0) continue;