summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorPaul Wilkins <paulwilkins@google.com>2013-02-11 20:44:53 +0000
committerPaul Wilkins <paulwilkins@google.com>2013-02-13 19:01:25 +0000
commit9255ad107f2e17685090c15555c0a80b6cd06854 (patch)
tree6096c9acc269e6bfc941fc008b184454f6516393 /vp9/encoder
parent56049d9488af78bf29a45eaa4625b75d4def865e (diff)
downloadlibvpx-9255ad107f2e17685090c15555c0a80b6cd06854.tar
libvpx-9255ad107f2e17685090c15555c0a80b6cd06854.tar.gz
libvpx-9255ad107f2e17685090c15555c0a80b6cd06854.tar.bz2
libvpx-9255ad107f2e17685090c15555c0a80b6cd06854.zip
Abstract selection of coef band.
This patch abstracts the selection of the coefficient band context into a function as a precursor to further experiments with the coefficient context. It also removes the large per TX size coefficient band structures and uses a single matrix for all block sizes within the test function. This may have an impact on quality (results to follow) but is only an intermediate step in the process of redefining the context. Also the quality impact will be larger initially because the default tables will be out of step with the new banding. In particular the 4x4 will in this case only use 7 bands. If needed we can add back block size dependency localized within the function, but this can follow on after the other changes to the definition of the context. Change-Id: Id7009c2f4f9bb1d02b861af85fd8223d4285bde5
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/vp9_encodemb.c13
-rw-r--r--vp9/encoder/vp9_rdopt.c15
-rw-r--r--vp9/encoder/vp9_tokenize.c16
3 files changed, 13 insertions, 31 deletions
diff --git a/vp9/encoder/vp9_encodemb.c b/vp9/encoder/vp9_encodemb.c
index 12082a88d..459010a40 100644
--- a/vp9/encoder/vp9_encodemb.c
+++ b/vp9/encoder/vp9_encodemb.c
@@ -386,13 +386,12 @@ static void optimize_b(MACROBLOCK *mb, int i, PLANE_TYPE type,
int best, band, pt;
int err_mult = plane_rd_mult[type];
int default_eob;
- int const *scan, *bands;
+ int const *scan;
switch (tx_size) {
default:
case TX_4X4:
scan = vp9_default_zig_zag1d_4x4;
- bands = vp9_coef_bands_4x4;
default_eob = 16;
// TODO: this isn't called (for intra4x4 modes), but will be left in
// since it could be used later
@@ -419,12 +418,10 @@ static void optimize_b(MACROBLOCK *mb, int i, PLANE_TYPE type,
break;
case TX_8X8:
scan = vp9_default_zig_zag1d_8x8;
- bands = vp9_coef_bands_8x8;
default_eob = 64;
break;
case TX_16X16:
scan = vp9_default_zig_zag1d_16x16;
- bands = vp9_coef_bands_16x16;
default_eob = 256;
break;
}
@@ -459,7 +456,7 @@ static void optimize_b(MACROBLOCK *mb, int i, PLANE_TYPE type,
t0 = (vp9_dct_value_tokens_ptr + x)->Token;
/* Consider both possible successor states. */
if (next < default_eob) {
- band = bands[i + 1];
+ band = vp9_get_coef_band(i + 1);
pt = trellis_get_coeff_context(t0);
rate0 +=
mb->token_costs[tx_size][type][band][pt][tokens[next][0].token];
@@ -506,7 +503,7 @@ static void optimize_b(MACROBLOCK *mb, int i, PLANE_TYPE type,
t0 = t1 = (vp9_dct_value_tokens_ptr + x)->Token;
}
if (next < default_eob) {
- band = bands[i + 1];
+ band = vp9_get_coef_band(i + 1);
if (t0 != DCT_EOB_TOKEN) {
pt = trellis_get_coeff_context(t0);
rate0 += mb->token_costs[tx_size][type][band][pt][
@@ -541,7 +538,7 @@ static void optimize_b(MACROBLOCK *mb, int i, PLANE_TYPE type,
* add a new trellis node, but we do need to update the costs.
*/
else {
- band = bands[i + 1];
+ band = vp9_get_coef_band(i + 1);
t0 = tokens[next][0].token;
t1 = tokens[next][1].token;
/* Update the cost of each path if we're past the EOB token. */
@@ -558,7 +555,7 @@ static void optimize_b(MACROBLOCK *mb, int i, PLANE_TYPE type,
}
/* Now pick the best path through the whole trellis. */
- band = bands[i + 1];
+ band = vp9_get_coef_band(i + 1);
VP9_COMBINEENTROPYCONTEXTS(pt, *a, *l);
rate0 = tokens[next][0].rate;
rate1 = tokens[next][1].rate;
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c
index 8385a1872..3864b891e 100644
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -431,7 +431,7 @@ static INLINE int cost_coeffs(MACROBLOCK *mb,
int c = (type == PLANE_TYPE_Y_NO_DC) ? 1 : 0;
int cost = 0, seg_eob;
const int segment_id = xd->mode_info_context->mbmi.segment_id;
- const int *scan, *band;
+ const int *scan;
int16_t *qcoeff_ptr = b->qcoeff;
const TX_TYPE tx_type = (type == PLANE_TYPE_Y_WITH_DC) ?
get_tx_type(xd, b) : DCT_DCT;
@@ -443,7 +443,6 @@ static INLINE int cost_coeffs(MACROBLOCK *mb,
switch (tx_size) {
case TX_4X4:
scan = vp9_default_zig_zag1d_4x4;
- band = vp9_coef_bands_4x4;
seg_eob = 16;
if (type == PLANE_TYPE_Y_WITH_DC) {
if (tx_type == ADST_DCT) {
@@ -456,17 +455,14 @@ static INLINE int cost_coeffs(MACROBLOCK *mb,
case TX_8X8:
if (type == PLANE_TYPE_Y2) {
scan = vp9_default_zig_zag1d_4x4;
- band = vp9_coef_bands_4x4;
seg_eob = 4;
} else {
scan = vp9_default_zig_zag1d_8x8;
- band = vp9_coef_bands_8x8;
seg_eob = 64;
}
break;
case TX_16X16:
scan = vp9_default_zig_zag1d_16x16;
- band = vp9_coef_bands_16x16;
seg_eob = 256;
if (type == PLANE_TYPE_UV) {
const int uv_idx = ib - 16;
@@ -475,7 +471,6 @@ static INLINE int cost_coeffs(MACROBLOCK *mb,
break;
case TX_32X32:
scan = vp9_default_zig_zag1d_32x32;
- band = vp9_coef_bands_32x32;
seg_eob = 1024;
qcoeff_ptr = xd->sb_coeff_data.qcoeff;
break;
@@ -494,24 +489,24 @@ static INLINE int cost_coeffs(MACROBLOCK *mb,
for (; c < eob; c++) {
int v = qcoeff_ptr[scan[c]];
int t = vp9_dct_value_tokens_ptr[v].Token;
- cost += token_costs[band[c]][pt][t];
+ cost += token_costs[vp9_get_coef_band(c)][pt][t];
cost += vp9_dct_value_cost_ptr[v];
pt = vp9_get_coef_context(&recent_energy, t);
}
if (c < seg_eob)
- cost += mb->hybrid_token_costs[tx_size][type][band[c]]
+ cost += mb->hybrid_token_costs[tx_size][type][vp9_get_coef_band(c)]
[pt][DCT_EOB_TOKEN];
} else {
int recent_energy = 0;
for (; c < eob; c++) {
int v = qcoeff_ptr[scan[c]];
int t = vp9_dct_value_tokens_ptr[v].Token;
- cost += token_costs[band[c]][pt][t];
+ cost += token_costs[vp9_get_coef_band(c)][pt][t];
cost += vp9_dct_value_cost_ptr[v];
pt = vp9_get_coef_context(&recent_energy, t);
}
if (c < seg_eob)
- cost += mb->token_costs[tx_size][type][band[c]]
+ cost += mb->token_costs[tx_size][type][vp9_get_coef_band(c)]
[pt][DCT_EOB_TOKEN];
}
diff --git a/vp9/encoder/vp9_tokenize.c b/vp9/encoder/vp9_tokenize.c
index 12fee9037..d612eb0fc 100644
--- a/vp9/encoder/vp9_tokenize.c
+++ b/vp9/encoder/vp9_tokenize.c
@@ -116,7 +116,7 @@ static void tokenize_b(VP9_COMP *cpi,
int16_t *qcoeff_ptr = b->qcoeff;
int seg_eob;
const int segment_id = xd->mode_info_context->mbmi.segment_id;
- const int *bands, *scan;
+ const int *scan;
vp9_coeff_count *counts;
vp9_coeff_probs *probs;
const TX_TYPE tx_type = (type == PLANE_TYPE_Y_WITH_DC) ?
@@ -138,7 +138,6 @@ static void tokenize_b(VP9_COMP *cpi,
default:
case TX_4X4:
seg_eob = 16;
- bands = vp9_coef_bands_4x4;
scan = vp9_default_zig_zag1d_4x4;
if (tx_type != DCT_DCT) {
counts = cpi->hybrid_coef_counts_4x4;
@@ -156,7 +155,6 @@ static void tokenize_b(VP9_COMP *cpi,
case TX_8X8:
if (type == PLANE_TYPE_Y2) {
seg_eob = 4;
- bands = vp9_coef_bands_4x4;
scan = vp9_default_zig_zag1d_4x4;
} else {
#if CONFIG_CNVCONTEXT
@@ -164,7 +162,6 @@ static void tokenize_b(VP9_COMP *cpi,
l_ec = (l[0] + l[1]) != 0;
#endif
seg_eob = 64;
- bands = vp9_coef_bands_8x8;
scan = vp9_default_zig_zag1d_8x8;
}
if (tx_type != DCT_DCT) {
@@ -186,7 +183,6 @@ static void tokenize_b(VP9_COMP *cpi,
}
#endif
seg_eob = 256;
- bands = vp9_coef_bands_16x16;
scan = vp9_default_zig_zag1d_16x16;
if (tx_type != DCT_DCT) {
counts = cpi->hybrid_coef_counts_16x16;
@@ -210,7 +206,6 @@ static void tokenize_b(VP9_COMP *cpi,
l_ec = l_ec != 0;
#endif
seg_eob = 1024;
- bands = vp9_coef_bands_32x32;
scan = vp9_default_zig_zag1d_32x32;
counts = cpi->coef_counts_32x32;
probs = cpi->common.fc.coef_probs_32x32;
@@ -224,7 +219,7 @@ static void tokenize_b(VP9_COMP *cpi,
seg_eob = 0;
do {
- const int band = bands[c];
+ const int band = vp9_get_coef_band(c);
int token;
if (c < eob) {
@@ -703,7 +698,6 @@ static INLINE void stuff_b(VP9_COMP *cpi,
TX_SIZE tx_size,
int dry_run) {
const BLOCKD * const b = xd->block + ib;
- const int *bands;
vp9_coeff_count *counts;
vp9_coeff_probs *probs;
int pt, band;
@@ -723,7 +717,6 @@ static INLINE void stuff_b(VP9_COMP *cpi,
switch (tx_size) {
default:
case TX_4X4:
- bands = vp9_coef_bands_4x4;
if (tx_type != DCT_DCT) {
counts = cpi->hybrid_coef_counts_4x4;
probs = cpi->common.fc.hybrid_coef_probs_4x4;
@@ -739,7 +732,6 @@ static INLINE void stuff_b(VP9_COMP *cpi,
l_ec = (l[0] + l[1]) != 0;
}
#endif
- bands = vp9_coef_bands_8x8;
if (tx_type != DCT_DCT) {
counts = cpi->hybrid_coef_counts_8x8;
probs = cpi->common.fc.hybrid_coef_probs_8x8;
@@ -758,7 +750,6 @@ static INLINE void stuff_b(VP9_COMP *cpi,
l_ec = (l[0] + l[1] + l1[0] + l1[1]) != 0;
}
#endif
- bands = vp9_coef_bands_16x16;
if (tx_type != DCT_DCT) {
counts = cpi->hybrid_coef_counts_16x16;
probs = cpi->common.fc.hybrid_coef_probs_16x16;
@@ -776,7 +767,6 @@ static INLINE void stuff_b(VP9_COMP *cpi,
a_ec = a_ec != 0;
l_ec = l_ec != 0;
#endif
- bands = vp9_coef_bands_32x32;
counts = cpi->coef_counts_32x32;
probs = cpi->common.fc.coef_probs_32x32;
break;
@@ -784,7 +774,7 @@ static INLINE void stuff_b(VP9_COMP *cpi,
VP9_COMBINEENTROPYCONTEXTS(pt, a_ec, l_ec);
- band = bands[(type == PLANE_TYPE_Y_NO_DC) ? 1 : 0];
+ band = vp9_get_coef_band((type == PLANE_TYPE_Y_NO_DC) ? 1 : 0);
t->Token = DCT_EOB_TOKEN;
t->context_tree = probs[type][band][pt];
t->skip_eob_node = 0;