Refactoring deringed block list code
Using a struct named dlist rather than an array named bskip. Simplified some
code.
No change in output
Change-Id: Id40d40b19b5d8f2ebafe347590fa1bb8cb80e6e1
diff --git a/av1/common/dering.c b/av1/common/dering.c
index 96fa5b6..cadb73b 100644
--- a/av1/common/dering.c
+++ b/av1/common/dering.c
@@ -47,13 +47,12 @@
return skip;
}
-int sb_all_skip_out(const AV1_COMMON *const cm, int mi_row, int mi_col,
- unsigned char (*bskip)[2], int *count_ptr) {
+int sb_compute_dering_list(const AV1_COMMON *const cm, int mi_row, int mi_col,
+ dering_list *dlist) {
int r, c;
int maxc, maxr;
- int skip = 1;
MODE_INFO **grid;
- int count=0;
+ int count = 0;
grid = cm->mi_grid_visible;
maxc = cm->mi_cols - mi_col;
maxr = cm->mi_rows - mi_row;
@@ -64,15 +63,13 @@
grid_row = &grid[(mi_row + r) * cm->mi_stride + mi_col];
for (c = 0; c < maxc; c++) {
if (!grid_row[c]->mbmi.skip) {
- skip = 0;
- bskip[count][0] = r;
- bskip[count][1] = c;
+ dlist[count].by = r;
+ dlist[count].bx = c;
count++;
}
}
}
- *count_ptr = count;
- return skip;
+ return count;
}
static INLINE void copy_8x8_16_8bit(uint8_t *dst, int dstride, int16_t *src, int sstride) {
@@ -91,21 +88,21 @@
/* TODO: Optimize this function for SSE. */
void copy_blocks_16_8bit(uint8_t *dst, int dstride, int16_t *src,
- unsigned char (*bskip)[2], int dering_count, int bsize)
+ dering_list *dlist, int dering_count, int bsize)
{
int bi, bx, by;
if (bsize == 3) {
for (bi = 0; bi < dering_count; bi++) {
- by = bskip[bi][0];
- bx = bskip[bi][1];
+ by = dlist[bi].by;
+ bx = dlist[bi].bx;
copy_8x8_16_8bit(&dst[(by << 3) * dstride + (bx << 3)],
dstride,
&src[bi << 2*bsize], 1 << bsize);
}
} else {
for (bi = 0; bi < dering_count; bi++) {
- by = bskip[bi][0];
- bx = bskip[bi][1];
+ by = dlist[bi].by;
+ bx = dlist[bi].bx;
copy_4x4_16_8bit(&dst[(by << 2) * dstride + (bx << 2)],
dstride,
&src[bi << 2*bsize], 1 << bsize);
@@ -149,7 +146,7 @@
od_dering_in src[OD_DERING_INBUF_SIZE];
int16_t *linebuf[3];
int16_t colbuf[3][OD_BSIZE_MAX + 2*OD_FILT_VBORDER][OD_FILT_HBORDER];
- unsigned char bskip[MAX_MIB_SIZE*MAX_MIB_SIZE][2];
+ dering_list dlist[MAX_MIB_SIZE*MAX_MIB_SIZE];
unsigned char *row_dering, *prev_row_dering, *curr_row_dering;
int dering_count;
int dir[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS] = { { 0 } };
@@ -203,7 +200,8 @@
->mbmi.dering_gain);
curr_row_dering[sbc] = 0;
if (level == 0 ||
- sb_all_skip_out(cm, sbr * MAX_MIB_SIZE, sbc * MAX_MIB_SIZE, bskip, &dering_count))
+ (dering_count = sb_compute_dering_list(cm, sbr * MAX_MIB_SIZE,
+ sbc * MAX_MIB_SIZE, dlist)) == 0)
continue;
curr_row_dering[sbc] = 1;
for (pli = 0; pli < nplanes; pli++) {
@@ -341,7 +339,7 @@
if (threshold == 0) continue;
od_dering(dst, &src[OD_FILT_VBORDER * OD_FILT_BSTRIDE
+ OD_FILT_HBORDER],
- dec[pli], dir, pli, bskip, dering_count, threshold, coeff_shift);
+ dec[pli], dir, pli, dlist, dering_count, threshold, coeff_shift);
#if CONFIG_AOM_HIGHBITDEPTH
if (cm->use_highbitdepth) {
copy_blocks_16bit(
@@ -349,7 +347,7 @@
xd->plane[pli].dst.buf)[xd->plane[pli].dst.stride *
(MAX_MIB_SIZE * sbr << bsize[pli]) +
(sbc * MAX_MIB_SIZE << bsize[pli])],
- xd->plane[pli].dst.stride, dst, bskip,
+ xd->plane[pli].dst.stride, dst, dlist,
dering_count, 3 - dec[pli]);
} else {
#endif
@@ -357,7 +355,7 @@
&xd->plane[pli].dst.buf[xd->plane[pli].dst.stride *
(MAX_MIB_SIZE * sbr << bsize[pli]) +
(sbc * MAX_MIB_SIZE << bsize[pli])],
- xd->plane[pli].dst.stride, dst, bskip,
+ xd->plane[pli].dst.stride, dst, dlist,
dering_count, 3 - dec[pli]);
#if CONFIG_AOM_HIGHBITDEPTH
}
diff --git a/av1/common/dering.h b/av1/common/dering.h
index c906994..2318fb8 100644
--- a/av1/common/dering.h
+++ b/av1/common/dering.h
@@ -18,6 +18,7 @@
#include "aom/aom_integer.h"
#include "./aom_config.h"
#include "aom_ports/mem.h"
+#include "od_dering.h"
#ifdef __cplusplus
extern "C" {
@@ -31,8 +32,8 @@
int compute_level_from_index(int global_level, int gi);
int sb_all_skip(const AV1_COMMON *const cm, int mi_row, int mi_col);
-int sb_all_skip_out(const AV1_COMMON *const cm, int mi_row, int mi_col,
- unsigned char (*bskip)[2], int *count_ptr);
+int sb_compute_dering_list(const AV1_COMMON *const cm, int mi_row, int mi_col,
+ dering_list *dlist);
void av1_dering_frame(YV12_BUFFER_CONFIG *frame, AV1_COMMON *cm,
MACROBLOCKD *xd, int global_level);
diff --git a/av1/common/od_dering.c b/av1/common/od_dering.c
index 168bab1..02c385c 100644
--- a/av1/common/od_dering.c
+++ b/av1/common/od_dering.c
@@ -274,21 +274,21 @@
/* TODO: Optimize this function for SSE. */
void copy_blocks_16bit(int16_t *dst, int dstride, int16_t *src,
- unsigned char (*bskip)[2], int dering_count, int bsize)
+ dering_list *dlist, int dering_count, int bsize)
{
int bi, bx, by;
if (bsize == 3) {
for (bi = 0; bi < dering_count; bi++) {
- by = bskip[bi][0];
- bx = bskip[bi][1];
+ by = dlist[bi].by;
+ bx = dlist[bi].bx;
copy_8x8_16bit(&dst[(by << 3) * dstride + (bx << 3)],
dstride,
&src[bi << 2*bsize], 1 << bsize);
}
} else {
for (bi = 0; bi < dering_count; bi++) {
- by = bskip[bi][0];
- bx = bskip[bi][1];
+ by = dlist[bi].by;
+ bx = dlist[bi].bx;
copy_4x4_16bit(&dst[(by << 2) * dstride + (bx << 2)],
dstride,
&src[bi << 2*bsize], 1 << bsize);
@@ -298,7 +298,7 @@
void od_dering(int16_t *y, int16_t *in, int xdec,
int dir[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS], int pli,
- unsigned char (*bskip)[2], int dering_count, int threshold,
+ dering_list *dlist, int dering_count, int threshold,
int coeff_shift) {
int bi;
int bx;
@@ -315,8 +315,8 @@
if (pli == 0) {
for (bi = 0; bi < dering_count; bi++) {
int32_t var;
- by = bskip[bi][0];
- bx = bskip[bi][1];
+ 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, coeff_shift);
/* Deringing orthogonal to the direction uses a tighter threshold
@@ -334,19 +334,19 @@
}
} else {
for (bi = 0; bi < dering_count; bi++) {
- by = bskip[bi][0];
- bx = bskip[bi][1];
+ by = dlist[bi].by;
+ bx = dlist[bi].bx;
filter2_thresh[by][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]);
}
}
- copy_blocks_16bit(in, OD_FILT_BSTRIDE, y, bskip, dering_count,
+ copy_blocks_16bit(in, OD_FILT_BSTRIDE, y, dlist, dering_count,
bsize);
for (bi = 0; bi < dering_count; bi++) {
- by = bskip[bi][0];
- bx = bskip[bi][1];
+ by = dlist[bi].by;
+ bx = dlist[bi].bx;
if (filter2_thresh[by][bx] == 0) continue;
(filter_dering_orthogonal[bsize - OD_LOG_BSIZE0])(
&y[bi << 2*bsize], 1 << bsize,
diff --git a/av1/common/od_dering.h b/av1/common/od_dering.h
index e10871e..8d9919e 100644
--- a/av1/common/od_dering.h
+++ b/av1/common/od_dering.h
@@ -38,6 +38,11 @@
extern const int OD_DIRECTION_OFFSETS_TABLE[8][3];
+typedef struct {
+ unsigned char by;
+ unsigned char bx;
+} dering_list;
+
typedef int (*od_filter_dering_direction_func)(int16_t *y, int ystride,
const int16_t *in, int threshold,
int dir);
@@ -45,11 +50,11 @@
const int16_t *in,
int threshold, int dir);
void copy_blocks_16bit(int16_t *dst, int dstride, int16_t *src,
- unsigned char (*bskip)[2], int dering_count, int bsize);
+ dering_list *dlist, int dering_count, int bsize);
void od_dering(int16_t *y, int16_t *in, int xdec,
int dir[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS], int pli,
- unsigned char (*bskip)[2], int skip_stride, int threshold,
+ dering_list *dlist, int skip_stride, int threshold,
int coeff_shift);
int od_filter_dering_direction_4x4_c(int16_t *y, int ystride, const int16_t *in,
int threshold, int dir);
diff --git a/av1/encoder/pickdering.c b/av1/encoder/pickdering.c
index 0b65740..7399086 100644
--- a/av1/encoder/pickdering.c
+++ b/av1/encoder/pickdering.c
@@ -43,7 +43,7 @@
int nhsb, nvsb;
od_dering_in *src;
int16_t *ref_coeff;
- unsigned char bskip[MAX_MIB_SIZE*MAX_MIB_SIZE][2];
+ dering_list dlist[MAX_MIB_SIZE*MAX_MIB_SIZE];
int dir[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS] = { { 0 } };
int stride;
int bsize[3];
@@ -101,7 +101,9 @@
int16_t tmp_dst[MAX_MIB_SIZE * MAX_MIB_SIZE * 8 * 8];
nhb = AOMMIN(MAX_MIB_SIZE, cm->mi_cols - MAX_MIB_SIZE * sbc);
nvb = AOMMIN(MAX_MIB_SIZE, cm->mi_rows - MAX_MIB_SIZE * sbr);
- if (sb_all_skip_out(cm, sbr * MAX_MIB_SIZE, sbc * MAX_MIB_SIZE, bskip, &dering_count))
+ dering_count = sb_compute_dering_list(cm, sbr * MAX_MIB_SIZE, sbc * MAX_MIB_SIZE,
+ dlist);
+ if (dering_count == 0)
continue;
best_gi = 0;
for (gi = 0; gi < DERING_REFINEMENT_LEVELS; gi++) {
@@ -134,9 +136,9 @@
in[i * OD_FILT_BSTRIDE + j] = x[i * stride + j];
}
}
- od_dering(tmp_dst, in, 0, dir, 0, bskip, dering_count, threshold,
+ od_dering(tmp_dst, in, 0, dir, 0, dlist, dering_count, threshold,
coeff_shift);
- copy_blocks_16bit(dst, MAX_MIB_SIZE << bsize[0], tmp_dst, bskip,
+ copy_blocks_16bit(dst, MAX_MIB_SIZE << bsize[0], tmp_dst, dlist,
dering_count, 3);
cur_mse = (int)compute_dist(
dst, MAX_MIB_SIZE << bsize[0],