Commit f91f3ca1 authored by Linfeng Zhang's avatar Linfeng Zhang Committed by James Zern

Update get_nz_map_ctx()

Extract the shared 2 neighbors { 0, 1 } and { 1, 0 }.

Change-Id: Ie1b52cb62519b53bfb5388af71ea637eab3fccc7
parent db41d1e0
......@@ -168,7 +168,7 @@ static INLINE uint8_t *set_levels(uint8_t *const levels_buf, const int width) {
}
static INLINE int get_paded_idx(const int idx, const int bwl) {
return idx + TX_PAD_HOR * (idx >> bwl);
return idx + ((idx >> bwl) << TX_PAD_HOR_LOG2);
}
static INLINE int get_level_count(const uint8_t *const levels, const int stride,
......@@ -426,50 +426,68 @@ static const int sig_ref_offset_horiz[SIG_REF_OFFSET_NUM][2] = {
// , { 1, 1 }, { 1, 2 },
};
#define SIG_REF_DIFF_OFFSET_NUM 3
static const int sig_ref_diff_offset[SIG_REF_DIFF_OFFSET_NUM][2] = {
{ 1, 1 }, { 0, 2 }, { 2, 0 }
};
static const int sig_ref_diff_offset_vert[SIG_REF_DIFF_OFFSET_NUM][2] = {
{ 2, 0 }, { 3, 0 }, { 4, 0 }
};
static const int sig_ref_diff_offset_horiz[SIG_REF_DIFF_OFFSET_NUM][2] = {
{ 0, 2 }, { 0, 3 }, { 0, 4 }
};
#if USE_CAUSAL_BASE_CTX
static INLINE int get_nz_mag(const uint8_t *const levels, const int bwl,
const int row, const int col,
const TX_CLASS tx_class) {
int mag = 0;
for (int idx = 0; idx < SIG_REF_OFFSET_NUM; ++idx) {
int mag;
// Note: AOMMIN(level, 3) is useless for decoder since level < 3.
mag = AOMMIN(levels[1], 3); // { 0, 1 }
mag += AOMMIN(levels[(1 << bwl) + TX_PAD_HOR], 3); // { 1, 0 }
for (int idx = 0; idx < SIG_REF_DIFF_OFFSET_NUM; ++idx) {
const int row_offset =
((tx_class == TX_CLASS_2D)
? sig_ref_offset[idx][0]
: ((tx_class == TX_CLASS_VERT) ? sig_ref_offset_vert[idx][0]
: sig_ref_offset_horiz[idx][0]));
((tx_class == TX_CLASS_2D) ? sig_ref_diff_offset[idx][0]
: ((tx_class == TX_CLASS_VERT)
? sig_ref_diff_offset_vert[idx][0]
: sig_ref_diff_offset_horiz[idx][0]));
const int col_offset =
((tx_class == TX_CLASS_2D)
? sig_ref_offset[idx][1]
: ((tx_class == TX_CLASS_VERT) ? sig_ref_offset_vert[idx][1]
: sig_ref_offset_horiz[idx][1]));
const int ref_row = row + row_offset;
const int ref_col = col + col_offset;
((tx_class == TX_CLASS_2D) ? sig_ref_diff_offset[idx][1]
: ((tx_class == TX_CLASS_VERT)
? sig_ref_diff_offset_vert[idx][1]
: sig_ref_diff_offset_horiz[idx][1]));
const int nb_pos =
(ref_row << bwl) + (ref_row << TX_PAD_HOR_LOG2) + ref_col;
const int level = levels[nb_pos];
mag += AOMMIN(level, 3);
(row_offset << bwl) + (row_offset << TX_PAD_HOR_LOG2) + col_offset;
mag += AOMMIN(levels[nb_pos], 3);
}
return mag;
}
#endif
static INLINE int get_nz_count(const uint8_t *const levels, const int bwl,
const int row, const int col,
const TX_CLASS tx_class) {
const int stride = (1 << bwl) + TX_PAD_HOR;
int count = 0;
for (int idx = 0; idx < SIG_REF_OFFSET_NUM; ++idx) {
const int ref_row = row + ((tx_class == TX_CLASS_2D)
? sig_ref_offset[idx][0]
int count;
count = (levels[1] != 0); // { 0, 1 }
count += (levels[(1 << bwl) + TX_PAD_HOR] != 0); // { 1, 0 }
for (int idx = 0; idx < SIG_REF_DIFF_OFFSET_NUM; ++idx) {
const int row_offset =
((tx_class == TX_CLASS_2D) ? sig_ref_diff_offset[idx][0]
: ((tx_class == TX_CLASS_VERT)
? sig_ref_offset_vert[idx][0]
: sig_ref_offset_horiz[idx][0]));
const int ref_col = col + ((tx_class == TX_CLASS_2D)
? sig_ref_offset[idx][1]
? sig_ref_diff_offset_vert[idx][0]
: sig_ref_diff_offset_horiz[idx][0]));
const int col_offset =
((tx_class == TX_CLASS_2D) ? sig_ref_diff_offset[idx][1]
: ((tx_class == TX_CLASS_VERT)
? sig_ref_offset_vert[idx][1]
: sig_ref_offset_horiz[idx][1]));
const int nb_pos = ref_row * stride + ref_col;
? sig_ref_diff_offset_vert[idx][1]
: sig_ref_diff_offset_horiz[idx][1]));
const int nb_pos =
(row_offset << bwl) + (row_offset << TX_PAD_HOR_LOG2) + col_offset;
count += (levels[nb_pos] != 0);
}
return count;
......@@ -522,10 +540,10 @@ static INLINE int get_nz_map_ctx_from_stats(
}
static INLINE int get_nz_map_ctx(const uint8_t *const levels,
const int scan_idx, const int16_t *const scan,
const int bwl, const int height,
const int coeff_idx, const int bwl,
const int height,
#if CONFIG_LV_MAP_MULTI
const int is_eob,
const int scan_idx, const int is_eob,
#endif
const TX_TYPE tx_type) {
#if CONFIG_LV_MAP_MULTI
......@@ -536,15 +554,12 @@ static INLINE int get_nz_map_ctx(const uint8_t *const levels,
return SIG_COEF_CONTEXTS - 1;
}
#endif
const int coeff_idx = scan[scan_idx];
const int row = coeff_idx >> bwl;
const int col = coeff_idx - (row << bwl);
const TX_CLASS tx_class = tx_type_to_class[tx_type];
const int stats =
#if USE_CAUSAL_BASE_CTX
get_nz_mag(levels, bwl, row, col, tx_class);
get_nz_mag(levels + get_paded_idx(coeff_idx, bwl), bwl, tx_class);
#else
get_nz_count(levels, bwl, row, col, tx_class);
get_nz_count(levels + get_paded_idx(coeff_idx, bwl), bwl, tx_class);
#endif
return get_nz_map_ctx_from_stats(stats, coeff_idx, bwl, height, tx_class);
}
......
......@@ -164,7 +164,7 @@ uint8_t av1_read_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *const xd,
const int pos = scan[c];
#if CONFIG_LV_MAP_MULTI
const int coeff_ctx =
get_nz_map_ctx(levels, c, scan, bwl, height, c == *eob - 1, tx_type);
get_nz_map_ctx(levels, pos, bwl, height, c, c == *eob - 1, tx_type);
#if USE_BASE_EOB_ALPHABET
aom_cdf_prob *cdf;
int nsymbs;
......@@ -214,7 +214,7 @@ uint8_t av1_read_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *const xd,
}
#else
int is_nz;
const int coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, tx_type);
const int coeff_ctx = get_nz_map_ctx(levels, pos, bwl, height, tx_type);
if (c < *eob - 1) {
is_nz = av1_read_record_bin(
......
......@@ -269,8 +269,8 @@ static void get_dist_cost_stats(LevelDownStats *const stats, const int scan_idx,
}
}
#else
int coeff_ctx = get_nz_map_ctx(levels, scan_idx, scan, txb_info->bwl,
txb_info->height, txb_info->tx_type);
const int coeff_ctx = get_nz_map_ctx(levels, coeff_idx, txb_info->bwl,
txb_info->height, txb_info->tx_type);
if ((stats->rd_low < stats->rd) && (stats->low_qc == 0)) {
stats->nz_rate = txb_costs->nz_map_cost[coeff_ctx][0];
} else {
......@@ -387,7 +387,7 @@ void av1_write_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *xd,
#if CONFIG_LV_MAP_MULTI
coeff_ctx =
get_nz_map_ctx(levels, c, scan, bwl, height, c == eob - 1, tx_type);
get_nz_map_ctx(levels, pos, bwl, height, c, c == eob - 1, tx_type);
const tran_low_t v = tcoeff[pos];
#if USE_BASE_EOB_ALPHABET
if (c == eob - 1) {
......@@ -407,7 +407,7 @@ void av1_write_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *xd,
ec_ctx->coeff_base_cdf[txs_ctx][plane_type][coeff_ctx], 4);
#endif
#else
coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, tx_type);
coeff_ctx = get_nz_map_ctx(levels, pos, bwl, height, tx_type);
const tran_low_t v = tcoeff[pos];
const int is_nz = (v != 0);
......@@ -433,7 +433,7 @@ void av1_write_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *xd,
for (int i = 1; i < eob; ++i) {
c = eob - 1 - i;
const int pos = scan[c];
const int coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, tx_type);
const int coeff_ctx = get_nz_map_ctx(levels, pos, bwl, height, tx_type);
const tran_low_t v = tcoeff[pos];
const int is_nz = (v != 0);
......@@ -715,7 +715,7 @@ int av1_cost_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCK *x, int plane,
const int level = abs(v);
#if CONFIG_LV_MAP_MULTI
coeff_ctx =
get_nz_map_ctx(levels, c, scan, bwl, height, c == eob - 1, tx_type);
get_nz_map_ctx(levels, pos, bwl, height, c, c == eob - 1, tx_type);
#if USE_BASE_EOB_ALPHABET
if (c == eob - 1) {
cost += coeff_costs
......@@ -729,12 +729,12 @@ int av1_cost_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCK *x, int plane,
#endif
#else // CONFIG_LV_MAP_MULTI
#if USE_CAUSAL_BASE_CTX
coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, tx_type);
coeff_ctx = get_nz_map_ctx(levels, pos, bwl, height, tx_type);
#endif
if (c < eob - 1) {
#if !USE_CAUSAL_BASE_CTX
int coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, tx_type);
const int coeff_ctx = get_nz_map_ctx(levels, pos, bwl, height, tx_type);
#endif
cost += coeff_costs->nz_map_cost[coeff_ctx][is_nz];
}
......@@ -866,8 +866,9 @@ void gen_txb_cache(TxbCache *txb_cache, TxbInfo *txb_info) {
const int row = coeff_idx >> bwl;
const int col = coeff_idx - (row << bwl);
txb_cache->nz_count_arr[coeff_idx] = get_nz_count(
levels, bwl, row, col, tx_type_to_class[txb_info->tx_type]);
txb_cache->nz_count_arr[coeff_idx] =
get_nz_count(levels + get_paded_idx(coeff_idx, bwl), bwl,
tx_type_to_class[txb_info->tx_type]);
txb_cache->nz_ctx_arr[coeff_idx] = get_nz_map_ctx_from_stats(
#if USE_CAUSAL_BASE_CTX
......@@ -1494,11 +1495,6 @@ void update_level_down(const int coeff_idx, TxbCache *const txb_cache,
txb_cache->nz_count_arr[nb_coeff_idx],
#endif
nb_coeff_idx, txb_info->bwl, txb_info->height, txb_info->tx_type);
// int ref_ctx = get_nz_map_ctx(txb_info->levels, nb_coeff_idx,
// txb_info->bwl, tx_type);
// if (ref_ctx != txb_cache->nz_ctx_arr[nb_coeff_idx])
// printf("nz ctx %d ref_ctx %d\n",
// txb_cache->nz_ctx_arr[nb_coeff_idx], ref_ctx);
}
}
}
......@@ -1590,9 +1586,9 @@ static int get_coeff_cost(const tran_low_t qc, const int scan_idx,
const int pos = scan[scan_idx];
#if CONFIG_LV_MAP_MULTI
int coeff_ctx =
get_nz_map_ctx(txb_info->levels, scan_idx, scan, txb_info->bwl,
txb_info->height, is_eob, txb_info->tx_type);
const int coeff_ctx =
get_nz_map_ctx(txb_info->levels, pos, txb_info->bwl, txb_info->height,
scan_idx, is_eob, txb_info->tx_type);
#if USE_BASE_EOB_ALPHABET
if (is_eob) {
cost +=
......@@ -1607,15 +1603,13 @@ static int get_coeff_cost(const tran_low_t qc, const int scan_idx,
#endif
#else
#if USE_CAUSAL_BASE_CTX
int coeff_ctx =
get_nz_map_ctx(txb_info->levels, scan_idx, scan, txb_info->bwl,
txb_info->height, txb_info->tx_type);
const int coeff_ctx = get_nz_map_ctx(txb_info->levels, pos, txb_info->bwl,
txb_info->height, txb_info->tx_type);
#endif
if (scan_idx < txb_info->eob - 1) {
#if !USE_CAUSAL_BASE_CTX
int coeff_ctx =
get_nz_map_ctx(txb_info->levels, scan_idx, scan, txb_info->bwl,
txb_info->height, txb_info->tx_type);
const int coeff_ctx = get_nz_map_ctx(txb_info->levels, pos, txb_info->bwl,
txb_info->height, txb_info->tx_type);
#endif
cost += txb_costs->nz_map_cost[coeff_ctx][is_nz];
}
......@@ -2292,7 +2286,7 @@ void av1_update_and_record_txb_context(int plane, int block, int blk_row,
(void)is_nz;
(void)nz_map_count;
coeff_ctx =
get_nz_map_ctx(levels, c, scan, bwl, height, c == eob - 1, tx_type);
get_nz_map_ctx(levels, pos, bwl, height, c, c == eob - 1, tx_type);
#if USE_BASE_EOB_ALPHABET
if (c == eob - 1) {
update_cdf(ec_ctx->coeff_base_eob_cdf[txsize_ctx][plane_type]
......@@ -2321,7 +2315,7 @@ void av1_update_and_record_txb_context(int plane, int block, int blk_row,
AOMMIN(abs(v), 3), 4);
#endif
#elif USE_CAUSAL_BASE_CTX
coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, tx_type);
coeff_ctx = get_nz_map_ctx(levels, pos, bwl, height, tx_type);
if (c < eob - 1) {
++(*nz_map_count)[coeff_ctx][is_nz];
......@@ -2344,7 +2338,7 @@ void av1_update_and_record_txb_context(int plane, int block, int blk_row,
}
}
#else
int coeff_ctx = get_nz_map_ctx(levels, c, scan, bwl, height, tx_type);
const int coeff_ctx = get_nz_map_ctx(levels, pos, bwl, height, tx_type);
if (c == eob - 1) continue;
......
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