Commit 7d01ab54 authored by Dake He's avatar Dake He
Browse files

[lv_map_multi] Simplified multisymbol BR coding

Multisymbol BR coding is simplified as follows.
1. Remove computation of level counts by using a template of size 8;
2. Context is derived by using a template of size 3.
3. lps and eob probabilities are trained.
4. Share contexts between TX_16X16 and above.

The number of probability values used in BR coding are reduced from 1152 to 378.

Change-Id: I0419127e871f9e566c2489aa4b1825c5364aec5a
parent 8a5d3437
......@@ -68,6 +68,7 @@ extern "C" {
#define SIG_COEF_CONTEXTS_2D 26
#define SIG_COEF_CONTEXTS_1D 16
#if CONFIG_LV_MAP_MULTI
#define USE_CAUSAL_BR_CTX 1
#define USE_BASE_EOB_ALPHABET 1
#define SIG_COEF_CONTEXTS_EOB 4
#define SIG_COEF_CONTEXTS \
......@@ -95,7 +96,11 @@ extern "C" {
#define BR_TMP_OFFSET 12
#define BR_REF_CAT 4
#if CONFIG_LV_MAP_MULTI && USE_CAUSAL_BR_CTX
#define LEVEL_CONTEXTS 21
#else
#define LEVEL_CONTEXTS (BR_TMP_OFFSET * BR_REF_CAT)
#endif
#define NUM_BASE_LEVELS 2
......
......@@ -436,76 +436,123 @@ static const aom_prob default_nz_map[TX_SIZES][PLANE_TYPES][SIG_COEF_CONTEXTS] =
static const aom_prob
default_eob_flag[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS] = {
{ { 225, 240, 225, 200, 128, 128, 128, 128, 128, 128, 128,
245, 246, 238, 203, 128, 128, 128, 128, 128, 128, 128 },
{ 181, 219, 192, 144, 128, 128, 128, 128, 128, 128, 128,
218, 231, 199, 152, 128, 128, 128, 128, 128, 128, 128 } },
{ { 233, 247, 240, 234, 211, 194, 128, 128, 128, 128, 128,
252, 252, 249, 242, 221, 208, 128, 128, 128, 128, 128 },
{ 154, 222, 204, 180, 132, 128, 128, 128, 128, 128, 128,
216, 235, 206, 181, 121, 112, 128, 128, 128, 128, 128 } },
{ { 233, 246, 241, 238, 231, 216, 186, 171, 128, 128, 128,
251, 252, 251, 244, 233, 218, 192, 191, 128, 128, 128 },
{ 117, 221, 214, 223, 215, 202, 176, 116, 128, 128, 128,
205, 234, 219, 183, 195, 126, 76, 128, 128, 128, 128 } },
{ { 194, 231, 213, 215, 207, 200, 183, 169, 135, 168, 128,
240, 246, 243, 238, 210, 201, 172, 133, 107, 128, 128 },
{ 122, 232, 230, 244, 250, 247, 252, 253, 254, 52, 128,
{ { 177, 226, 194, 146, 128, 128, 128, 128, 128, 128, 128,
231, 239, 225, 162, 128, 128, 128, 128, 128, 128, 128 },
{ 123, 211, 166, 117, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } },
#if CONFIG_TX64X64
{ { 194, 231, 213, 215, 207, 200, 183, 169, 135, 168, 128,
240, 246, 243, 238, 210, 201, 172, 133, 107, 128, 128 },
{ 122, 232, 230, 244, 250, 247, 252, 253, 254, 52, 128,
{ { 197, 242, 229, 219, 187, 151, 128, 128, 128, 128, 128,
236, 246, 239, 230, 203, 141, 128, 128, 128, 128, 128 },
{ 124, 225, 204, 179, 116, 98, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } },
{ { 210, 244, 236, 229, 217, 201, 177, 154, 128, 128, 128,
251, 252, 247, 215, 201, 194, 164, 128, 128, 128, 128 },
{ 86, 222, 202, 192, 172, 154, 132, 109, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } },
{ { 204, 242, 224, 223, 213, 202, 187, 176, 152, 132, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 72, 227, 200, 212, 190, 150, 136, 173, 183, 82, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } },
#if CONFIG_TX64X64
{ { 204, 242, 224, 223, 213, 202, 187, 176, 152, 132, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 72, 227, 200, 212, 190, 150, 136, 173, 183, 82, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } }
#endif
};
static const aom_prob
default_eob_extra[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS] = {
{ {
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
},
{
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
} },
{ {
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
},
{
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
} },
{ {
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
},
{
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
} },
{ {
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
},
{
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
} },
{ { 128, 128, 128, 138, 138, 148, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 156, 156, 152, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } },
{ { 128, 128, 128, 134, 148, 143, 144, 140, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 165, 164, 160, 161, 157, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } },
{ { 128, 128, 128, 142, 145, 146, 153, 144, 139, 136, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 175, 168, 162, 162, 156, 157, 163, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } },
{ { 128, 128, 128, 180, 161, 149, 151, 158, 153, 142, 141,
141, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 204, 172, 156, 139, 170, 170, 154, 166,
157, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } },
#if CONFIG_TX64X64
{ {
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
},
{
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145,
} },
{ { 128, 128, 128, 177, 160, 150, 147, 157, 151, 142, 139,
133, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 200, 173, 159, 135, 158, 174, 160, 172,
163, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } }
#endif
};
#if CONFIG_LV_MAP_MULTI
const aom_prob default_coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE -
1][LEVEL_CONTEXTS] = {
{ { { 87, 128, 170, 197, 212, 221, 233, 73, 90, 128, 162,
184, 196, 212, 64, 81, 115, 149, 173, 183, 207 },
{ 105, 132, 168, 194, 208, 219, 232, 93, 100, 129, 159,
178, 193, 210, 78, 94, 118, 146, 165, 182, 197 },
{ 118, 136, 167, 190, 206, 216, 231, 112, 111, 130, 155,
175, 188, 207, 103, 104, 122, 144, 163, 176, 195 } },
{ { 69, 108, 160, 197, 216, 222, 233, 50, 71, 119, 154,
181, 196, 207, 35, 58, 98, 135, 158, 184, 182 },
{ 91, 120, 163, 197, 211, 222, 232, 67, 82, 124, 157,
177, 189, 204, 57, 77, 104, 134, 154, 181, 219 },
{ 112, 130, 166, 194, 212, 219, 231, 97, 100, 128, 153,
181, 186, 199, 96, 90, 109, 119, 161, 148, 174 } } },
{ { { 101, 145, 185, 207, 218, 226, 237, 112, 112, 142, 170,
188, 200, 218, 63, 83, 116, 148, 170, 184, 205 },
{ 119, 149, 184, 205, 216, 224, 236, 139, 123, 144, 168,
185, 197, 217, 83, 95, 119, 147, 166, 181, 204 },
{ 133, 154, 182, 202, 214, 222, 236, 155, 134, 148, 168,
184, 195, 215, 97, 105, 124, 147, 164, 178, 201 } },
{ { 93, 125, 164, 191, 206, 216, 236, 70, 81, 116, 153,
175, 193, 216, 39, 62, 100, 138, 162, 182, 207 },
{ 105, 130, 162, 188, 202, 216, 232, 85, 92, 118, 149,
175, 191, 214, 55, 74, 103, 145, 163, 177, 205 },
{ 115, 136, 161, 185, 202, 213, 233, 99, 105, 128, 148,
168, 180, 209, 79, 83, 113, 140, 165, 175, 191 } } },
{ { { 111, 151, 188, 209, 220, 227, 241, 145, 145, 165, 186,
201, 210, 228, 73, 93, 123, 153, 174, 188, 211 },
{ 134, 155, 188, 208, 219, 226, 241, 173, 165, 171, 187,
200, 209, 227, 95, 108, 130, 154, 173, 187, 210 },
{ 154, 162, 189, 207, 217, 225, 240, 188, 181, 178, 188,
199, 208, 227, 112, 121, 137, 157, 173, 186, 209 } },
{ { 126, 155, 188, 208, 218, 220, 243, 142, 142, 157, 168,
189, 201, 224, 53, 65, 97, 117, 145, 169, 186 },
{ 144, 163, 188, 206, 217, 224, 239, 173, 165, 172, 175,
187, 211, 224, 88, 85, 97, 124, 145, 169, 194 },
{ 158, 170, 188, 203, 212, 220, 238, 179, 182, 183, 182,
193, 200, 226, 100, 108, 111, 128, 140, 163, 206 } } },
{ { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } },
{ { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } } },
#if CONFIG_TX64X64
{ { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } },
{ { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } } }
#endif
};
#else
const aom_prob default_coeff_lps[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS] = {
{ { 115, 128, 87, 119, 128, 128, 128, 128, 62, 94, 125, 128,
151, 164, 113, 140, 147, 128, 128, 128, 80, 111, 137, 142,
......@@ -550,6 +597,7 @@ const aom_prob default_coeff_lps[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS] = {
185, 187, 146, 181, 185, 128, 128, 128, 101, 129, 157, 170 } }
#endif
};
#endif
#if !CONFIG_LV_MAP_MULTI
const aom_prob
......
......@@ -158,9 +158,11 @@ typedef struct frame_contexts {
aom_prob dc_sign[PLANE_TYPES][DC_SIGN_CONTEXTS];
aom_prob coeff_base[TX_SIZES][PLANE_TYPES][NUM_BASE_LEVELS]
[COEFF_BASE_CONTEXTS];
aom_prob coeff_lps[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS];
#if !CONFIG_LV_MAP_MULTI
aom_prob coeff_lps[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS];
aom_prob coeff_br[TX_SIZES][PLANE_TYPES][BASE_RANGE_SETS][LEVEL_CONTEXTS];
#else
aom_prob coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE - 1][LEVEL_CONTEXTS];
#endif
aom_cdf_prob txb_skip_cdf[TX_SIZES][TXB_SKIP_CONTEXTS][CDF_SIZE(2)];
......@@ -338,10 +340,13 @@ typedef struct FRAME_COUNTS {
unsigned int dc_sign[PLANE_TYPES][DC_SIGN_CONTEXTS][2];
unsigned int coeff_base[TX_SIZES][PLANE_TYPES][NUM_BASE_LEVELS]
[COEFF_BASE_CONTEXTS][2];
unsigned int coeff_lps[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS][2];
#if !CONFIG_LV_MAP_MULTI
unsigned int coeff_br[TX_SIZES][PLANE_TYPES][BASE_RANGE_SETS][LEVEL_CONTEXTS]
[2];
unsigned int coeff_lps[TX_SIZES][PLANE_TYPES][LEVEL_CONTEXTS][2];
#else
unsigned int coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE - 1][LEVEL_CONTEXTS]
[2];
#endif
#endif // CONFIG_LV_MAP
......
......@@ -195,15 +195,17 @@ void av1_init_txb_probs(FRAME_CONTEXT *fc) {
for (plane = 0; plane < PLANE_TYPES; ++plane) {
#if CONFIG_LV_MAP_MULTI
for (ctx = 0; ctx < LEVEL_CONTEXTS; ++ctx) {
int p = 32768 - fc->coeff_lps[tx_size][plane][ctx] * 128;
int p = 32768 - fc->coeff_lps[tx_size][plane][0][ctx] * 128;
int sum = p;
fc->coeff_br_cdf[tx_size][plane][ctx][0] = AOM_ICDF(sum);
p = 32768 - fc->coeff_lps[tx_size][plane][1][ctx] * 128;
sum += ((32768 - sum) * p) >> 15;
fc->coeff_br_cdf[tx_size][plane][ctx][1] = AOM_ICDF(sum);
p = 32768 - fc->coeff_lps[tx_size][plane][2][ctx] * 128;
sum += ((32768 - sum) * p) >> 15;
fc->coeff_br_cdf[tx_size][plane][ctx][2] = AOM_ICDF(sum);
fc->coeff_br_cdf[tx_size][plane][ctx][3] = AOM_ICDF(32768);
fc->coeff_br_cdf[tx_size][plane][ctx][4] = AOM_ICDF(32768);
fc->coeff_br_cdf[tx_size][plane][ctx][4] = 0;
// printf("br_cdf: %d %d %2d : %3d %3d %3d\n", tx_size, plane, ctx,
// fc->coeff_br_cdf[tx_size][plane][ctx][0] >> 7,
// fc->coeff_br_cdf[tx_size][plane][ctx][1] >> 7,
......
......@@ -43,10 +43,29 @@ static const int base_ref_offset[BASE_CONTEXT_POSITION_NUM][2] = {
};
#define CONTEXT_MAG_POSITION_NUM 3
#if CONFIG_LV_MAP_MULTI && USE_CAUSAL_BR_CTX
static const int mag_ref_offset_with_txclass[3][CONTEXT_MAG_POSITION_NUM][2] = {
{ { 0, 1 }, { 1, 0 }, { 1, 1 } },
{ { 0, 1 }, { 1, 0 }, { 0, 2 } },
{ { 0, 1 }, { 1, 0 }, { 2, 0 } }
};
#endif
static const int mag_ref_offset[CONTEXT_MAG_POSITION_NUM][2] = {
{ 0, 1 }, { 1, 0 }, { 1, 1 }
};
static INLINE TX_CLASS get_tx_class(TX_TYPE tx_type) {
switch (tx_type) {
case V_DCT:
case V_ADST:
case V_FLIPADST: return TX_CLASS_VERT;
case H_DCT:
case H_ADST:
case H_FLIPADST: return TX_CLASS_HORIZ;
default: return TX_CLASS_2D;
}
}
static INLINE void get_base_count_mag(int *mag, int *count,
const tran_low_t *tcoeffs, int bwl,
int height, int row, int col) {
......@@ -99,6 +118,20 @@ static INLINE int get_level_count(const uint8_t *const levels, const int stride,
return count;
}
#if CONFIG_LV_MAP_MULTI && USE_CAUSAL_BR_CTX
static INLINE void get_level_mag_with_txclass(const uint8_t *const levels,
const int stride, const int row,
const int col, int *const mag,
const TX_CLASS tx_class) {
for (int idx = 0; idx < CONTEXT_MAG_POSITION_NUM; ++idx) {
const int ref_row = row + mag_ref_offset_with_txclass[tx_class][idx][0];
const int ref_col = col + mag_ref_offset_with_txclass[tx_class][idx][1];
const int pos = ref_row * stride + ref_col;
mag[idx] = levels[pos];
}
}
#endif
static INLINE void get_level_mag(const uint8_t *const levels, const int stride,
const int row, const int col, int *const mag) {
for (int idx = 0; idx < CONTEXT_MAG_POSITION_NUM; ++idx) {
......@@ -267,16 +300,45 @@ static INLINE int get_br_ctx_from_count_mag(const int row, const int col,
static INLINE int get_br_ctx(const uint8_t *const levels,
const int c, // raster order
const int bwl, const int count) {
const int bwl, const int count
#if CONFIG_LV_MAP_MULTI && USE_CAUSAL_BR_CTX
,
const TX_TYPE tx_type
#endif
) {
const int row = c >> bwl;
const int col = c - (row << bwl);
const int stride = (1 << bwl) + TX_PAD_HOR;
int mag = 0;
int nb_mag[3] = { 0 };
#if CONFIG_LV_MAP_MULTI && USE_CAUSAL_BR_CTX
(void)count;
const TX_CLASS tx_class = get_tx_class(tx_type);
get_level_mag_with_txclass(levels, stride, row, col, nb_mag, tx_class);
mag = AOMMIN(nb_mag[0], COEFF_BASE_RANGE + NUM_BASE_LEVELS + 1) +
AOMMIN(nb_mag[1], COEFF_BASE_RANGE + NUM_BASE_LEVELS + 1) +
AOMMIN(nb_mag[2], COEFF_BASE_RANGE + NUM_BASE_LEVELS + 1);
mag = AOMMIN((mag + 1) >> 1, 6);
if (c == 0) return mag;
if (tx_class == 0) {
if ((row < 2) && (col < 2)) return mag + 7;
} else {
if (tx_class == 1) {
if (col == 0) return mag + 7;
} else {
if (tx_class == 2) {
if (row == 0) return mag + 7;
}
}
}
return mag + 14;
#else
get_level_mag(levels, stride, row, col, nb_mag);
for (int idx = 0; idx < 3; ++idx) mag = AOMMAX(mag, nb_mag[idx]);
const int ctx = get_br_ctx_from_count_mag(row, col, count, mag);
return ctx;
#endif
}
#define SIG_REF_OFFSET_NUM 5
......@@ -347,18 +409,6 @@ static INLINE int get_nz_count(const uint8_t *const levels, const int bwl,
return count;
}
static INLINE TX_CLASS get_tx_class(TX_TYPE tx_type) {
switch (tx_type) {
case V_DCT:
case V_ADST:
case V_FLIPADST: return TX_CLASS_VERT;
case H_DCT:
case H_ADST:
case H_FLIPADST: return TX_CLASS_HORIZ;
default: return TX_CLASS_2D;
}
}
// TODO(angiebird): optimize this function by generate a table that maps from
// count to ctx
static INLINE int get_nz_map_ctx_from_count(int count,
......
......@@ -317,7 +317,9 @@ uint8_t av1_read_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *const xd,
}
if (num_updates) {
#if !CONFIG_LV_MAP_MULTI
av1_get_br_level_counts(levels, width, height, level_counts);
#endif
for (c = 0; c < num_updates; ++c) {
const int pos = update_pos[c];
uint8_t *const level = &levels[get_paded_idx(pos, bwl)];
......@@ -330,17 +332,26 @@ uint8_t av1_read_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *const xd,
if (*level <= NUM_BASE_LEVELS) continue;
#endif
#if !CONFIG_LV_MAP_MULTI
ctx = get_br_ctx(levels, pos, bwl, level_counts[pos]);
#endif
#if CONFIG_LV_MAP_MULTI
#if USE_CAUSAL_BR_CTX
ctx = get_br_ctx(levels, pos, bwl, level_counts[pos], tx_type);
#else
ctx = get_br_ctx(levels, pos, bwl, level_counts[pos]);
#endif
for (idx = 0; idx < COEFF_BASE_RANGE / (BR_CDF_SIZE - 1); ++idx) {
int k = av1_read_record_symbol(
counts, r, ec_ctx->coeff_br_cdf[txs_ctx][plane_type][ctx],
counts, r,
ec_ctx->coeff_br_cdf[AOMMIN(txs_ctx, TX_16X16)][plane_type][ctx],
BR_CDF_SIZE, ACCT_STR);
*level += k;
if (counts) {
for (int lps = 0; lps < BR_CDF_SIZE; lps++) {
++counts->coeff_lps[txs_ctx][plane_type][ctx][lps == k];
for (int lps = 0; lps < BR_CDF_SIZE - 1; lps++) {
++counts->coeff_lps[AOMMIN(txs_ctx, TX_16X16)][plane_type][lps][ctx]
[lps == k];
if (lps == k) break;
}
}
......
......@@ -487,7 +487,9 @@ void av1_write_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *xd,
}
if (update_eob >= 0) {
#if !CONFIG_LV_MAP_MULTI
av1_get_br_level_counts(levels, width, height, level_counts);
#endif
for (c = update_eob; c >= 0; --c) {
const tran_low_t level = abs(tcoeff[scan[c]]);
int idx;
......@@ -495,15 +497,24 @@ void av1_write_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCKD *xd,
if (level <= NUM_BASE_LEVELS) continue;
// level is above 1.
// level is above 1.
#if !CONFIG_LV_MAP_MULTI
ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]]);
#endif
int base_range = level - 1 - NUM_BASE_LEVELS;
#if CONFIG_LV_MAP_MULTI
#if USE_CAUSAL_BR_CTX
ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]], tx_type);
#else
ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]]);
#endif
for (idx = 0; idx < COEFF_BASE_RANGE; idx += BR_CDF_SIZE - 1) {
int k = AOMMIN(base_range - idx, BR_CDF_SIZE - 1);
aom_write_symbol(w, k, ec_ctx->coeff_br_cdf[txs_ctx][plane_type][ctx],
BR_CDF_SIZE);
aom_write_symbol(
w, k,
ec_ctx->coeff_br_cdf[AOMMIN(txs_ctx, TX_16X16)][plane_type][ctx],
BR_CDF_SIZE);
if (k < BR_CDF_SIZE - 1) break;
}
if (base_range < COEFF_BASE_RANGE) continue;
......@@ -690,8 +701,9 @@ int av1_cost_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCK *x, int plane,
const int seg_eob = av1_get_max_eob(tx_size);
int eob_cost = get_eob_cost(eob, seg_eob, coeff_costs, tx_type);
#if !CONFIG_LV_MAP_MULTI
av1_get_br_level_counts(levels, width, height, level_counts);
#endif
cost += eob_cost;
#if USE_CAUSAL_BASE_CTX
int coeff_ctx = 0;
......@@ -767,7 +779,11 @@ int av1_cost_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCK *x, int plane,
#endif // CONFIG_LV_MAP_MULTI
if (level > NUM_BASE_LEVELS) {
int ctx;
#if CONFIG_LV_MAP_MULTI && USE_CAUSAL_BR_CTX
ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]], tx_type);
#else
ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]]);
#endif
int base_range = level - 1 - NUM_BASE_LEVELS;
if (base_range < COEFF_BASE_RANGE) {
cost += coeff_costs->lps_cost[ctx][base_range];
......@@ -1612,11 +1628,19 @@ static int get_coeff_cost(const tran_low_t qc, const int scan_idx,
if (abs_qc > NUM_BASE_LEVELS) {
const int row = scan[scan_idx] >> txb_info->bwl;
const int col = scan[scan_idx] - (row << txb_info->bwl);
#if CONFIG_LV_MAP_MULTI && USE_CAUSAL_BR_CTX
(void)col;
const int count = 0;
const int ctx = get_br_ctx(txb_info->levels, scan[scan_idx],
txb_info->bwl, count, txb_info->tx_type);
#else
const int count = get_level_count(
txb_info->levels, (1 << txb_info->bwl) + TX_PAD_HOR, row, col,
NUM_BASE_LEVELS, br_ref_offset, BR_CONTEXT_POSITION_NUM);
const int ctx =
get_br_ctx(txb_info->levels, scan[scan_idx], txb_info->bwl, count);
#endif
cost += get_br_cost(abs_qc, ctx, txb_costs->lps_cost[ctx]);
cost += get_golomb_cost(abs_qc);
}
......@@ -2352,7 +2376,9 @@ void av1_update_and_record_txb_context(int plane, int block, int blk_row,
}
if (update_eob >= 0) {
#if !CONFIG_LV_MAP_MULTI
av1_get_br_level_counts(levels, width, height, level_counts);
#endif
for (c = update_eob; c >= 0; --c) {
const tran_low_t level = abs(tcoeff[scan[c]]);
int idx;
......@@ -2360,19 +2386,28 @@ void av1_update_and_record_txb_context(int plane, int block, int blk_row,
if (level <= NUM_BASE_LEVELS) continue;
// level is above 1.
// level is above 1.
#if !CONFIG_LV_MAP_MULTI
ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]]);
#endif
int base_range = level - 1 - NUM_BASE_LEVELS;
#if CONFIG_LV_MAP_MULTI
#if USE_CAUSAL_BR_CTX
ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]], tx_type);
#else
ctx = get_br_ctx(levels, scan[c], bwl, level_counts[scan[c]]);
#endif
for (idx = 0; idx < COEFF_BASE_RANGE; idx += BR_CDF_SIZE - 1) {
int k = AOMMIN(base_range - idx, BR_CDF_SIZE - 1);
// printf("br_update: %d %d %2d : %2d %d\n", txsize_ctx, plane, ctx,
// base_range, k);
update_cdf(ec_ctx->coeff_br_cdf[txsize_ctx][plane_type][ctx], k,
BR_CDF_SIZE);
for (int lps = 0; lps < BR_CDF_SIZE; lps++) {
++td->counts->coeff_lps[txsize_ctx][plane_type][ctx][lps == k];
update_cdf(
ec_ctx->coeff_br_cdf[AOMMIN(txsize_ctx, TX_16X16)][plane_type][ctx],
k, BR_CDF_SIZE);
for (int lps = 0; lps < BR_CDF_SIZE - 1; lps++) {
++td->counts->coeff_lps[AOMMIN(txsize_ctx, TX_16X16)][plane_type][lps]
[ctx][lps == k];
if (lps == k) break;
}
......
......@@ -674,6 +674,27 @@ int main(int argc, const char **argv) {
"default_eob_flag_cdf[TX_SIZES][PLANE_TYPES][EOB_COEF_"
"CONTEXTS][CDF_SIZE(2)]");
cts_each_dim[0] = TX_SIZES;
cts_each_dim[1] = PLANE_TYPES;
cts_each_dim[2] = EOB_COEF_CONTEXTS;
cts_each_dim[3] = 2;
optimize_entropy_table(
&fc.eob_extra[0][0][0][0], probsfile, 4, cts_each_dim, NULL, 1,
"static const aom_prob "
"default_eob_extra[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS]");
#if CONFIG_LV_MAP_MULTI
cts_each_dim[0] = TX_SIZES;
cts_each_dim[1] = PLANE_TYPES;
cts_each_dim[2] = BR_CDF_SIZE - 1;
cts_each_dim[3] = LEVEL_CONTEXTS;
cts_each_dim[4] = 2;
optimize_entropy_table(&fc.coeff_lps[0][0][0][0][0], probsfile, 5,
cts_each_dim, NULL, 1,
"static const aom_prob "
"default_coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE-"
"1][LEVEL_CONTEXTS]");
#else
cts_each_dim[0] = TX_SIZES;