Commit bc732efc authored by Debargha Mukherjee's avatar Debargha Mukherjee

Use cdfs for loop-restoration types

BUG=aomedia:907

Change-Id: I30a0290e499d338250343b5f9092bdcabe7d867a
parent fc0eeb33
......@@ -2492,15 +2492,20 @@ static const aom_cdf_prob default_quarter_tx_size_cdf[CDF_SIZE(2)] = {
#endif
#if CONFIG_LOOP_RESTORATION
const aom_tree_index
av1_switchable_restore_tree[TREE_SIZE(RESTORE_SWITCHABLE_TYPES)] = {
-RESTORE_NONE, 2, -RESTORE_WIENER, -RESTORE_SGRPROJ,
static const aom_cdf_prob
default_switchable_restore_cdf[CDF_SIZE(RESTORE_SWITCHABLE_TYPES)] = {
AOM_ICDF(32 * 128), AOM_ICDF(144 * 128), AOM_ICDF(32768), 0,
};
static const aom_prob
default_switchable_restore_prob[RESTORE_SWITCHABLE_TYPES - 1] = {
32, 128,
};
#if CONFIG_NEW_MULTISYMBOL
static const aom_cdf_prob default_wiener_restore_cdf[CDF_SIZE(2)] = {
AOM_ICDF(64 * 128), AOM_ICDF(32768), 0,
};
static const aom_cdf_prob default_sgrproj_restore_cdf[CDF_SIZE(2)] = {
AOM_ICDF(64 * 128), AOM_ICDF(32768), 0,
};
#endif // CONFIG_NEW_MULTISYMBOL
#endif // CONFIG_LOOP_RESTORATION
#define NUM_PALETTE_NEIGHBORS 3 // left, top-left and top.
......@@ -6644,7 +6649,11 @@ static void init_mode_probs(FRAME_CONTEXT *fc) {
av1_copy(fc->inter_lgt_prob, default_inter_lgt_prob);
#endif // CONFIG_LGT_FROM_PRED
#if CONFIG_LOOP_RESTORATION
av1_copy(fc->switchable_restore_prob, default_switchable_restore_prob);
av1_copy(fc->switchable_restore_cdf, default_switchable_restore_cdf);
#if CONFIG_NEW_MULTISYMBOL
av1_copy(fc->wiener_restore_cdf, default_wiener_restore_cdf);
av1_copy(fc->sgrproj_restore_cdf, default_sgrproj_restore_cdf);
#endif // CONFIG_NEW_MULTISYMBOL
#endif // CONFIG_LOOP_RESTORATION
av1_copy(fc->y_mode_cdf, default_if_y_mode_cdf);
av1_copy(fc->uv_mode_cdf, default_uv_mode_cdf);
......
......@@ -348,7 +348,11 @@ typedef struct frame_contexts {
aom_cdf_prob filter_intra_mode_cdf[PLANE_TYPES][CDF_SIZE(FILTER_INTRA_MODES)];
#endif // CONFIG_FILTER_INTRA
#if CONFIG_LOOP_RESTORATION
aom_prob switchable_restore_prob[RESTORE_SWITCHABLE_TYPES - 1];
aom_cdf_prob switchable_restore_cdf[CDF_SIZE(RESTORE_SWITCHABLE_TYPES)];
#if CONFIG_NEW_MULTISYMBOL
aom_cdf_prob wiener_restore_cdf[CDF_SIZE(2)];
aom_cdf_prob sgrproj_restore_cdf[CDF_SIZE(2)];
#endif // CONFIG_NEW_MULTISYMBOL
#endif // CONFIG_LOOP_RESTORATION
aom_cdf_prob y_mode_cdf[BLOCK_SIZE_GROUPS][CDF_SIZE(INTRA_MODES)];
aom_cdf_prob uv_mode_cdf[INTRA_MODES][CDF_SIZE(UV_INTRA_MODES)];
......@@ -706,9 +710,7 @@ extern const aom_tree_index av1_ncobmc_tree[TREE_SIZE(OBMC_FAMILY_MODES)];
#endif // CONFIG_NCOBMC_ADAPT_WEIGHT
#if CONFIG_LOOP_RESTORATION
#define RESTORE_NONE_SGRPROJ_PROB 64
#define RESTORE_NONE_BILATERAL_PROB 16
#define RESTORE_NONE_WIENER_PROB 64
#define RESTORE_NONE_DOMAINTXFMRF_PROB 64
extern const aom_tree_index
av1_switchable_restore_tree[TREE_SIZE(RESTORE_SWITCHABLE_TYPES)];
#endif // CONFIG_LOOP_RESTORATION
......
......@@ -2887,9 +2887,8 @@ static void loop_restoration_read_sb_coeffs(const AV1_COMMON *const cm,
if (rsi->frame_restoration_type == RESTORE_SWITCHABLE) {
assert(plane == 0);
rsi->restoration_type[rtile_idx] =
aom_read_tree(r, av1_switchable_restore_tree,
cm->fc->switchable_restore_prob, ACCT_STR);
aom_read_symbol(r, xd->tile_ctx->switchable_restore_cdf,
RESTORE_SWITCHABLE_TYPES, ACCT_STR);
if (rsi->restoration_type[rtile_idx] == RESTORE_WIENER) {
read_wiener_filter(wiener_win, &rsi->wiener_info[rtile_idx], wiener_info,
r);
......@@ -2897,7 +2896,11 @@ static void loop_restoration_read_sb_coeffs(const AV1_COMMON *const cm,
read_sgrproj_filter(&rsi->sgrproj_info[rtile_idx], sgrproj_info, r);
}
} else if (rsi->frame_restoration_type == RESTORE_WIENER) {
#if CONFIG_NEW_MULTISYMBOL
if (aom_read_symbol(r, xd->tile_ctx->wiener_restore_cdf, 2, ACCT_STR)) {
#else
if (aom_read(r, RESTORE_NONE_WIENER_PROB, ACCT_STR)) {
#endif // CONFIG_NEW_MULTISYMBOL
rsi->restoration_type[rtile_idx] = RESTORE_WIENER;
read_wiener_filter(wiener_win, &rsi->wiener_info[rtile_idx], wiener_info,
r);
......@@ -2905,7 +2908,11 @@ static void loop_restoration_read_sb_coeffs(const AV1_COMMON *const cm,
rsi->restoration_type[rtile_idx] = RESTORE_NONE;
}
} else if (rsi->frame_restoration_type == RESTORE_SGRPROJ) {
#if CONFIG_NEW_MULTISYMBOL
if (aom_read_symbol(r, xd->tile_ctx->sgrproj_restore_cdf, 2, ACCT_STR)) {
#else
if (aom_read(r, RESTORE_NONE_SGRPROJ_PROB, ACCT_STR)) {
#endif // CONFIG_NEW_MULTISYMBOL
rsi->restoration_type[rtile_idx] = RESTORE_SGRPROJ;
read_sgrproj_filter(&rsi->sgrproj_info[rtile_idx], sgrproj_info, r);
} else {
......
......@@ -91,7 +91,6 @@ static struct av1_token interintra_mode_encodings[INTERINTRA_MODES];
static struct av1_token compound_type_encodings[COMPOUND_TYPES];
#endif // CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE
#if CONFIG_LOOP_RESTORATION
static struct av1_token switchable_restore_encodings[RESTORE_SWITCHABLE_TYPES];
static void loop_restoration_write_sb_coeffs(const AV1_COMMON *const cm,
MACROBLOCKD *xd,
aom_writer *const w, int plane,
......@@ -128,10 +127,6 @@ void av1_encode_token_init(void) {
#if CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE
av1_tokens_from_tree(compound_type_encodings, av1_compound_type_tree);
#endif // CONFIG_COMPOUND_SEGMENT || CONFIG_WEDGE
#if CONFIG_LOOP_RESTORATION
av1_tokens_from_tree(switchable_restore_encodings,
av1_switchable_restore_tree);
#endif // CONFIG_LOOP_RESTORATION
}
static void write_intra_mode_kf(const AV1_COMMON *cm, FRAME_CONTEXT *frame_ctx,
......@@ -3471,9 +3466,9 @@ static void loop_restoration_write_sb_coeffs(const AV1_COMMON *const cm,
if (rsi->frame_restoration_type == RESTORE_SWITCHABLE) {
assert(plane == 0);
av1_write_token(
w, av1_switchable_restore_tree, cm->fc->switchable_restore_prob,
&switchable_restore_encodings[rsi->restoration_type[rtile_idx]]);
aom_write_symbol(w, rsi->restoration_type[rtile_idx],
xd->tile_ctx->switchable_restore_cdf,
RESTORE_SWITCHABLE_TYPES);
if (rsi->restoration_type[rtile_idx] == RESTORE_WIENER) {
write_wiener_filter(wiener_win, &rsi->wiener_info[rtile_idx], wiener_info,
w);
......@@ -3481,21 +3476,30 @@ static void loop_restoration_write_sb_coeffs(const AV1_COMMON *const cm,
write_sgrproj_filter(&rsi->sgrproj_info[rtile_idx], sgrproj_info, w);
}
} else if (rsi->frame_restoration_type == RESTORE_WIENER) {
#if CONFIG_NEW_MULTISYMBOL
aom_write_symbol(w, rsi->restoration_type[rtile_idx] != RESTORE_NONE,
xd->tile_ctx->wiener_restore_cdf, 2);
#else
aom_write(w, rsi->restoration_type[rtile_idx] != RESTORE_NONE,
RESTORE_NONE_WIENER_PROB);
#endif // CONFIG_NEW_MULTISYMBOL
if (rsi->restoration_type[rtile_idx] != RESTORE_NONE) {
write_wiener_filter(wiener_win, &rsi->wiener_info[rtile_idx], wiener_info,
w);
}
} else if (rsi->frame_restoration_type == RESTORE_SGRPROJ) {
#if CONFIG_NEW_MULTISYMBOL
aom_write_symbol(w, rsi->restoration_type[rtile_idx] != RESTORE_NONE,
xd->tile_ctx->sgrproj_restore_cdf, 2);
#else
aom_write(w, rsi->restoration_type[rtile_idx] != RESTORE_NONE,
RESTORE_NONE_SGRPROJ_PROB);
#endif // CONFIG_NEW_MULTISYMBOL
if (rsi->restoration_type[rtile_idx] != RESTORE_NONE) {
write_sgrproj_filter(&rsi->sgrproj_info[rtile_idx], sgrproj_info, w);
}
}
}
#endif // CONFIG_LOOP_RESTORATION
static void encode_loopfilter(AV1_COMMON *cm, struct aom_write_bit_buffer *wb) {
......
......@@ -304,6 +304,8 @@ struct macroblock {
#endif // CONFIG_EXT_INTRA
#if CONFIG_LOOP_RESTORATION
int switchable_restore_cost[RESTORE_SWITCHABLE_TYPES];
int wiener_restore_cost[2];
int sgrproj_restore_cost[2];
#endif // CONFIG_LOOP_RESTORATION
#if CONFIG_INTRABC
int intrabc_cost[2];
......
......@@ -598,7 +598,7 @@ static void search_sgrproj_for_rtile(const struct rest_search_ctxt *ctxt,
limits->h_end - limits->h_start, limits->v_start,
limits->v_end - limits->v_start, (1 << ctxt->plane));
// #bits when a tile is not restored
int bits = av1_cost_bit(RESTORE_NONE_SGRPROJ_PROB, 0);
int bits = x->sgrproj_restore_cost[0];
double cost_norestore = RDCOST_DBL(x->rdmult, (bits >> 4), err);
ctxt->best_tile_cost[rtile_idx] = INT64_MAX;
......@@ -627,7 +627,7 @@ static void search_sgrproj_for_rtile(const struct rest_search_ctxt *ctxt,
bits =
count_sgrproj_bits(&plane_rsi->sgrproj_info[rtile_idx], ref_sgrproj_info)
<< AV1_PROB_COST_SHIFT;
bits += av1_cost_bit(RESTORE_NONE_SGRPROJ_PROB, 1);
bits += x->sgrproj_restore_cost[1];
double cost_sgrproj = RDCOST_DBL(x->rdmult, (bits >> 4), err);
if (cost_sgrproj >= cost_norestore) {
ctxt->type[rtile_idx] = RESTORE_NONE;
......@@ -645,6 +645,7 @@ static double search_sgrproj(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi,
RestorationInfo *info, RestorationType *type,
int64_t *best_tile_cost,
YV12_BUFFER_CONFIG *dst_frame) {
const MACROBLOCK *const x = &cpi->td.mb;
struct rest_search_ctxt ctxt;
const int nrtiles =
init_rest_search_ctxt(src, cpi, partial_frame, plane, info, type,
......@@ -686,8 +687,7 @@ static double search_sgrproj(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi,
int bits = frame_level_restore_bits[plane_rsi->frame_restoration_type]
<< AV1_PROB_COST_SHIFT;
for (int rtile_idx = 0; rtile_idx < nrtiles; ++rtile_idx) {
bits += av1_cost_bit(RESTORE_NONE_SGRPROJ_PROB,
type[rtile_idx] != RESTORE_NONE);
bits += x->sgrproj_restore_cost[type[rtile_idx] != RESTORE_NONE];
plane_rsi->sgrproj_info[rtile_idx] = sgrproj_info[rtile_idx];
if (type[rtile_idx] == RESTORE_SGRPROJ) {
bits += count_sgrproj_bits(&plane_rsi->sgrproj_info[rtile_idx],
......@@ -1191,7 +1191,7 @@ static void search_wiener_for_rtile(const struct rest_search_ctxt *ctxt,
limits->h_end - limits->h_start, limits->v_start,
limits->v_end - limits->v_start, (1 << ctxt->plane));
// #bits when a tile is not restored
int bits = av1_cost_bit(RESTORE_NONE_WIENER_PROB, 0);
int bits = x->wiener_restore_cost[0];
double cost_norestore = RDCOST_DBL(x->rdmult, (bits >> 4), err);
ctxt->best_tile_cost[rtile_idx] = INT64_MAX;
......@@ -1242,7 +1242,7 @@ static void search_wiener_for_rtile(const struct rest_search_ctxt *ctxt,
}
bits = count_wiener_bits(wiener_win, rtile_wiener_info, ref_wiener_info)
<< AV1_PROB_COST_SHIFT;
bits += av1_cost_bit(RESTORE_NONE_WIENER_PROB, 1);
bits += x->wiener_restore_cost[1];
double cost_wiener = RDCOST_DBL(x->rdmult, (bits >> 4), err);
if (cost_wiener >= cost_norestore) {
ctxt->type[rtile_idx] = RESTORE_NONE;
......@@ -1258,6 +1258,7 @@ static double search_wiener(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi,
int partial_frame, int plane, RestorationInfo *info,
RestorationType *type, int64_t *best_tile_cost,
YV12_BUFFER_CONFIG *dst_frame) {
const MACROBLOCK *const x = &cpi->td.mb;
struct rest_search_ctxt ctxt;
const int nrtiles =
init_rest_search_ctxt(src, cpi, partial_frame, plane, info, type,
......@@ -1305,8 +1306,7 @@ static double search_wiener(const YV12_BUFFER_CONFIG *src, AV1_COMP *cpi,
(plane == AOM_PLANE_Y) ? WIENER_WIN : WIENER_WIN_CHROMA;
for (int tile_idx = 0; tile_idx < nrtiles; ++tile_idx) {
bits +=
av1_cost_bit(RESTORE_NONE_WIENER_PROB, type[tile_idx] != RESTORE_NONE);
bits += x->wiener_restore_cost[type[tile_idx] != RESTORE_NONE];
plane_rsi->wiener_info[tile_idx] = wiener_info[tile_idx];
if (type[tile_idx] == RESTORE_WIENER) {
......
......@@ -271,8 +271,19 @@ void av1_fill_mode_rates(AV1_COMMON *const cm, MACROBLOCK *x,
#endif // CONFIG_INTRA_INTERP
#endif // CONFIG_EXT_INTRA
#if CONFIG_LOOP_RESTORATION
av1_cost_tokens(x->switchable_restore_cost, fc->switchable_restore_prob,
av1_switchable_restore_tree);
av1_cost_tokens_from_cdf(x->switchable_restore_cost,
fc->switchable_restore_cdf, NULL);
#if CONFIG_NEW_MULTISYMBOL
av1_cost_tokens_from_cdf(x->wiener_restore_cost, fc->wiener_restore_cdf,
NULL);
av1_cost_tokens_from_cdf(x->sgrproj_restore_cost, fc->sgrproj_restore_cdf,
NULL);
#else
x->wiener_restore_cost[0] = av1_cost_bit(RESTORE_NONE_WIENER_PROB, 0);
x->wiener_restore_cost[1] = av1_cost_bit(RESTORE_NONE_WIENER_PROB, 1);
x->sgrproj_restore_cost[0] = av1_cost_bit(RESTORE_NONE_SGRPROJ_PROB, 0);
x->sgrproj_restore_cost[1] = av1_cost_bit(RESTORE_NONE_SGRPROJ_PROB, 1);
#endif // CONFIG_NEW_MULTISYMBOL
#endif // CONFIG_LOOP_RESTORATION
#if CONFIG_INTRABC
av1_cost_tokens_from_cdf(x->intrabc_cost, fc->intrabc_cdf, NULL);
......
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