compute bskip as we go
Change-Id: I5681e3329ad3677296161de59f5ff1236a14f086
This commit is contained in:

committed by
Yaowu Xu

parent
3e90f84a34
commit
71466d2288
@@ -45,13 +45,37 @@ int sb_all_skip(const AV1_COMMON *const cm, int mi_row, int mi_col) {
|
||||
return skip;
|
||||
}
|
||||
|
||||
int sb_all_skip_out(const AV1_COMMON *const cm, int mi_row, int mi_col,
|
||||
unsigned char *bskip) {
|
||||
int r, c;
|
||||
int maxc, maxr;
|
||||
int skip = 1;
|
||||
MODE_INFO **grid;
|
||||
grid = cm->mi_grid_visible;
|
||||
maxc = cm->mi_cols - mi_col;
|
||||
maxr = cm->mi_rows - mi_row;
|
||||
if (maxr > MAX_MIB_SIZE) maxr = MAX_MIB_SIZE;
|
||||
if (maxc > MAX_MIB_SIZE) maxc = MAX_MIB_SIZE;
|
||||
for (r = 0; r < maxr; r++) {
|
||||
MODE_INFO **grid_row;
|
||||
grid_row = &grid[(mi_row + r) * cm->mi_stride + mi_col];
|
||||
for (c = 0; c < maxc; c++) {
|
||||
int tmp;
|
||||
tmp = grid_row[c]->mbmi.skip;
|
||||
bskip[r*MAX_MIB_SIZE + c] = tmp;
|
||||
skip = skip && tmp;
|
||||
}
|
||||
}
|
||||
return skip;
|
||||
}
|
||||
|
||||
void av1_dering_frame(YV12_BUFFER_CONFIG *frame, AV1_COMMON *cm,
|
||||
MACROBLOCKD *xd, int global_level) {
|
||||
int r, c;
|
||||
int sbr, sbc;
|
||||
int nhsb, nvsb;
|
||||
od_dering_in *src[3];
|
||||
unsigned char *bskip;
|
||||
unsigned char bskip[MAX_MIB_SIZE*MAX_MIB_SIZE];
|
||||
int dir[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS] = { { 0 } };
|
||||
int stride;
|
||||
int bsize[3];
|
||||
@@ -66,7 +90,6 @@ void av1_dering_frame(YV12_BUFFER_CONFIG *frame, AV1_COMMON *cm,
|
||||
nplanes = 1;
|
||||
nvsb = (cm->mi_rows + MAX_MIB_SIZE - 1) / MAX_MIB_SIZE;
|
||||
nhsb = (cm->mi_cols + MAX_MIB_SIZE - 1) / MAX_MIB_SIZE;
|
||||
bskip = aom_malloc(sizeof(*bskip) * cm->mi_rows * cm->mi_cols);
|
||||
av1_setup_dst_planes(xd->plane, frame, 0, 0);
|
||||
for (pli = 0; pli < 3; pli++) {
|
||||
dec[pli] = xd->plane[pli].subsampling_x;
|
||||
@@ -91,13 +114,6 @@ void av1_dering_frame(YV12_BUFFER_CONFIG *frame, AV1_COMMON *cm,
|
||||
}
|
||||
}
|
||||
}
|
||||
for (r = 0; r < cm->mi_rows; ++r) {
|
||||
for (c = 0; c < cm->mi_cols; ++c) {
|
||||
const MB_MODE_INFO *mbmi =
|
||||
&cm->mi_grid_visible[r * cm->mi_stride + c]->mbmi;
|
||||
bskip[r * cm->mi_cols + c] = mbmi->skip;
|
||||
}
|
||||
}
|
||||
for (sbr = 0; sbr < nvsb; sbr++) {
|
||||
for (sbc = 0; sbc < nhsb; sbc++) {
|
||||
int level;
|
||||
@@ -108,7 +124,8 @@ void av1_dering_frame(YV12_BUFFER_CONFIG *frame, AV1_COMMON *cm,
|
||||
global_level, cm->mi_grid_visible[MAX_MIB_SIZE * sbr * cm->mi_stride +
|
||||
MAX_MIB_SIZE * sbc]
|
||||
->mbmi.dering_gain);
|
||||
if (level == 0 || sb_all_skip(cm, sbr * MAX_MIB_SIZE, sbc * MAX_MIB_SIZE))
|
||||
if (level == 0 ||
|
||||
sb_all_skip_out(cm, sbr * MAX_MIB_SIZE, sbc * MAX_MIB_SIZE, bskip))
|
||||
continue;
|
||||
for (pli = 0; pli < nplanes; pli++) {
|
||||
int16_t dst[MAX_MIB_SIZE * MAX_MIB_SIZE * 8 * 8];
|
||||
@@ -124,8 +141,7 @@ void av1_dering_frame(YV12_BUFFER_CONFIG *frame, AV1_COMMON *cm,
|
||||
&src[pli][sbr * stride * bsize[pli] * MAX_MIB_SIZE +
|
||||
sbc * bsize[pli] * MAX_MIB_SIZE],
|
||||
stride, nhb, nvb, sbc, sbr, nhsb, nvsb, dec[pli], dir, pli,
|
||||
&bskip[MAX_MIB_SIZE * sbr * cm->mi_cols + MAX_MIB_SIZE * sbc],
|
||||
cm->mi_cols, threshold, coeff_shift);
|
||||
bskip, MAX_MIB_SIZE, threshold, coeff_shift);
|
||||
for (r = 0; r < bsize[pli] * nvb; ++r) {
|
||||
for (c = 0; c < bsize[pli] * nhb; ++c) {
|
||||
#if CONFIG_AOM_HIGHBITDEPTH
|
||||
@@ -152,5 +168,4 @@ void av1_dering_frame(YV12_BUFFER_CONFIG *frame, AV1_COMMON *cm,
|
||||
for (pli = 0; pli < nplanes; pli++) {
|
||||
aom_free(src[pli]);
|
||||
}
|
||||
aom_free(bskip);
|
||||
}
|
||||
|
@@ -11,6 +11,8 @@
|
||||
#ifndef AV1_COMMON_DERING_H_
|
||||
#define AV1_COMMON_DERING_H_
|
||||
|
||||
// clang-format off
|
||||
|
||||
#include "av1/common/od_dering.h"
|
||||
#include "av1/common/onyxc_int.h"
|
||||
#include "aom/aom_integer.h"
|
||||
@@ -29,6 +31,8 @@ extern "C" {
|
||||
|
||||
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);
|
||||
void av1_dering_frame(YV12_BUFFER_CONFIG *frame, AV1_COMMON *cm,
|
||||
MACROBLOCKD *xd, int global_level);
|
||||
|
||||
|
@@ -41,7 +41,7 @@ int av1_dering_search(YV12_BUFFER_CONFIG *frame, const YV12_BUFFER_CONFIG *ref,
|
||||
int nhsb, nvsb;
|
||||
od_dering_in *src;
|
||||
int16_t *ref_coeff;
|
||||
unsigned char *bskip;
|
||||
unsigned char bskip[MAX_MIB_SIZE*MAX_MIB_SIZE];
|
||||
int dir[OD_DERING_NBLOCKS][OD_DERING_NBLOCKS] = { { 0 } };
|
||||
int stride;
|
||||
int bsize[3];
|
||||
@@ -52,7 +52,6 @@ int av1_dering_search(YV12_BUFFER_CONFIG *frame, const YV12_BUFFER_CONFIG *ref,
|
||||
int coeff_shift = AOMMAX(cm->bit_depth - 8, 0);
|
||||
src = aom_malloc(sizeof(*src) * cm->mi_rows * cm->mi_cols * 64);
|
||||
ref_coeff = aom_malloc(sizeof(*ref_coeff) * cm->mi_rows * cm->mi_cols * 64);
|
||||
bskip = aom_malloc(sizeof(*bskip) * cm->mi_rows * cm->mi_cols);
|
||||
av1_setup_dst_planes(xd->plane, frame, 0, 0);
|
||||
for (pli = 0; pli < 3; pli++) {
|
||||
dec[pli] = xd->plane[pli].subsampling_x;
|
||||
@@ -77,13 +76,6 @@ int av1_dering_search(YV12_BUFFER_CONFIG *frame, const YV12_BUFFER_CONFIG *ref,
|
||||
#endif
|
||||
}
|
||||
}
|
||||
for (r = 0; r < cm->mi_rows; ++r) {
|
||||
for (c = 0; c < cm->mi_cols; ++c) {
|
||||
const MB_MODE_INFO *mbmi =
|
||||
&cm->mi_grid_visible[r * cm->mi_stride + c]->mbmi;
|
||||
bskip[r * cm->mi_cols + c] = mbmi->skip;
|
||||
}
|
||||
}
|
||||
nvsb = (cm->mi_rows + MAX_MIB_SIZE - 1) / MAX_MIB_SIZE;
|
||||
nhsb = (cm->mi_cols + MAX_MIB_SIZE - 1) / MAX_MIB_SIZE;
|
||||
/* Pick a base threshold based on the quantizer. The threshold will then be
|
||||
@@ -105,7 +97,8 @@ int av1_dering_search(YV12_BUFFER_CONFIG *frame, const YV12_BUFFER_CONFIG *ref,
|
||||
int16_t 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(cm, sbr * MAX_MIB_SIZE, sbc * MAX_MIB_SIZE)) continue;
|
||||
if (sb_all_skip_out(cm, sbr * MAX_MIB_SIZE, sbc * MAX_MIB_SIZE, bskip))
|
||||
continue;
|
||||
best_gi = 0;
|
||||
for (gi = 0; gi < DERING_REFINEMENT_LEVELS; gi++) {
|
||||
int cur_mse;
|
||||
@@ -117,8 +110,8 @@ int av1_dering_search(YV12_BUFFER_CONFIG *frame, const YV12_BUFFER_CONFIG *ref,
|
||||
sbc * bsize[0] * MAX_MIB_SIZE],
|
||||
cm->mi_cols * bsize[0], nhb, nvb, sbc, sbr, nhsb, nvsb, 0,
|
||||
dir, 0,
|
||||
&bskip[MAX_MIB_SIZE * sbr * cm->mi_cols + MAX_MIB_SIZE * sbc],
|
||||
cm->mi_cols, threshold, coeff_shift);
|
||||
bskip,
|
||||
MAX_MIB_SIZE, threshold, coeff_shift);
|
||||
cur_mse = (int)compute_dist(
|
||||
dst, MAX_MIB_SIZE * bsize[0],
|
||||
&ref_coeff[sbr * stride * bsize[0] * MAX_MIB_SIZE +
|
||||
@@ -136,6 +129,5 @@ int av1_dering_search(YV12_BUFFER_CONFIG *frame, const YV12_BUFFER_CONFIG *ref,
|
||||
}
|
||||
aom_free(src);
|
||||
aom_free(ref_coeff);
|
||||
aom_free(bskip);
|
||||
return best_level;
|
||||
}
|
||||
|
Reference in New Issue
Block a user