Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(101)

Unified Diff: source/libvpx/vp9/encoder/vp9_encodemb.c

Issue 11974002: libvpx: Pull from upstream (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_encodemb.h ('k') | source/libvpx/vp9/encoder/vp9_encodemv.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: source/libvpx/vp9/encoder/vp9_encodemb.c
===================================================================
--- source/libvpx/vp9/encoder/vp9_encodemb.c (revision 177019)
+++ source/libvpx/vp9/encoder/vp9_encodemb.c (working copy)
@@ -8,7 +8,7 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#include "vpx_ports/config.h"
+#include "./vpx_config.h"
#include "vp9/encoder/vp9_encodemb.h"
#include "vp9/common/vp9_reconinter.h"
#include "vp9/encoder/vp9_quantize.h"
@@ -21,9 +21,9 @@
#include "vp9_rtcd.h"
void vp9_subtract_b_c(BLOCK *be, BLOCKD *bd, int pitch) {
- unsigned char *src_ptr = (*(be->base_src) + be->src);
- short *diff_ptr = be->src_diff;
- unsigned char *pred_ptr = bd->predictor;
+ uint8_t *src_ptr = (*(be->base_src) + be->src);
+ int16_t *diff_ptr = be->src_diff;
+ uint8_t *pred_ptr = bd->predictor;
int src_stride = be->src_stride;
int r, c;
@@ -40,9 +40,9 @@
}
void vp9_subtract_4b_c(BLOCK *be, BLOCKD *bd, int pitch) {
- unsigned char *src_ptr = (*(be->base_src) + be->src);
- short *diff_ptr = be->src_diff;
- unsigned char *pred_ptr = bd->predictor;
+ uint8_t *src_ptr = (*(be->base_src) + be->src);
+ int16_t *diff_ptr = be->src_diff;
+ uint8_t *pred_ptr = bd->predictor;
int src_stride = be->src_stride;
int r, c;
@@ -56,12 +56,12 @@
}
}
-void vp9_subtract_mbuv_s_c(short *diff, const unsigned char *usrc,
- const unsigned char *vsrc, int src_stride,
- const unsigned char *upred,
- const unsigned char *vpred, int dst_stride) {
- short *udiff = diff + 256;
- short *vdiff = diff + 320;
+void vp9_subtract_mbuv_s_c(int16_t *diff, const uint8_t *usrc,
+ const uint8_t *vsrc, int src_stride,
+ const uint8_t *upred,
+ const uint8_t *vpred, int dst_stride) {
+ int16_t *udiff = diff + 256;
+ int16_t *vdiff = diff + 320;
int r, c;
for (r = 0; r < 8; r++) {
@@ -85,16 +85,16 @@
}
}
-void vp9_subtract_mbuv_c(short *diff, unsigned char *usrc,
- unsigned char *vsrc, unsigned char *pred, int stride) {
- unsigned char *upred = pred + 256;
- unsigned char *vpred = pred + 320;
+void vp9_subtract_mbuv_c(int16_t *diff, uint8_t *usrc,
+ uint8_t *vsrc, uint8_t *pred, int stride) {
+ uint8_t *upred = pred + 256;
+ uint8_t *vpred = pred + 320;
vp9_subtract_mbuv_s_c(diff, usrc, vsrc, stride, upred, vpred, 8);
}
-void vp9_subtract_mby_s_c(short *diff, const unsigned char *src, int src_stride,
- const unsigned char *pred, int dst_stride) {
+void vp9_subtract_mby_s_c(int16_t *diff, const uint8_t *src, int src_stride,
+ const uint8_t *pred, int dst_stride) {
int r, c;
for (r = 0; r < 16; r++) {
@@ -108,8 +108,52 @@
}
}
-void vp9_subtract_mby_c(short *diff, unsigned char *src,
- unsigned char *pred, int stride) {
+void vp9_subtract_sby_s_c(int16_t *diff, const uint8_t *src, int src_stride,
+ const uint8_t *pred, int dst_stride) {
+ int r, c;
+
+ for (r = 0; r < 32; r++) {
+ for (c = 0; c < 32; c++) {
+ diff[c] = src[c] - pred[c];
+ }
+
+ diff += 32;
+ pred += dst_stride;
+ src += src_stride;
+ }
+}
+
+void vp9_subtract_sbuv_s_c(int16_t *diff, const uint8_t *usrc,
+ const uint8_t *vsrc, int src_stride,
+ const uint8_t *upred,
+ const uint8_t *vpred, int dst_stride) {
+ int16_t *udiff = diff + 1024;
+ int16_t *vdiff = diff + 1024 + 256;
+ int r, c;
+
+ for (r = 0; r < 16; r++) {
+ for (c = 0; c < 16; c++) {
+ udiff[c] = usrc[c] - upred[c];
+ }
+
+ udiff += 16;
+ upred += dst_stride;
+ usrc += src_stride;
+ }
+
+ for (r = 0; r < 16; r++) {
+ for (c = 0; c < 16; c++) {
+ vdiff[c] = vsrc[c] - vpred[c];
+ }
+
+ vdiff += 16;
+ vpred += dst_stride;
+ vsrc += src_stride;
+ }
+}
+
+void vp9_subtract_mby_c(int16_t *diff, uint8_t *src,
+ uint8_t *pred, int stride) {
vp9_subtract_mby_s_c(diff, src, stride, pred, 16);
}
@@ -123,7 +167,7 @@
}
static void build_dcblock_4x4(MACROBLOCK *x) {
- short *src_diff_ptr = &x->src_diff[384];
+ int16_t *src_diff_ptr = &x->src_diff[384];
int i;
for (i = 0; i < 16; i++) {
@@ -265,6 +309,20 @@
vp9_transform_mbuv_8x8(x);
}
+void vp9_transform_sby_32x32(MACROBLOCK *x) {
+ SUPERBLOCK * const x_sb = &x->sb_coeff_data;
+ vp9_short_fdct32x32(x_sb->src_diff, x_sb->coeff, 64);
+}
+
+void vp9_transform_sbuv_16x16(MACROBLOCK *x) {
+ SUPERBLOCK * const x_sb = &x->sb_coeff_data;
+ vp9_clear_system_state();
+ x->vp9_short_fdct16x16(x_sb->src_diff + 1024,
+ x_sb->coeff + 1024, 32);
+ x->vp9_short_fdct16x16(x_sb->src_diff + 1280,
+ x_sb->coeff + 1280, 32);
+}
+
#define RDTRUNC(RM,DM,R,D) ( (128+(R)*(RM)) & 0xFF )
#define RDTRUNC_8x8(RM,DM,R,D) ( (128+(R)*(RM)) & 0xFF )
typedef struct vp9_token_state vp9_token_state;
@@ -302,41 +360,31 @@
static void optimize_b(MACROBLOCK *mb, int i, PLANE_TYPE type,
ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l,
int tx_size) {
- BLOCK *b;
- BLOCKD *d;
- vp9_token_state tokens[65][2];
- uint64_t best_mask[2];
- const short *dequant_ptr;
- const short *coeff_ptr;
- short *qcoeff_ptr;
- short *dqcoeff_ptr;
- int eob;
- int i0;
- int rc;
- int x;
- int sz = 0;
- int next;
- int rdmult;
- int rddiv;
- int final_eob;
- int64_t rd_cost0, rd_cost1;
- int rate0, rate1;
- int error0, error1;
- int t0, t1;
- int best;
- int band;
- int pt;
+ BLOCK *b = &mb->block[i];
+ BLOCKD *d = &mb->e_mbd.block[i];
+ vp9_token_state tokens[257][2];
+ unsigned best_index[257][2];
+ const int16_t *dequant_ptr = d->dequant, *coeff_ptr = b->coeff;
+ int16_t *qcoeff_ptr = d->qcoeff;
+ int16_t *dqcoeff_ptr = d->dqcoeff;
+ int eob = d->eob, final_eob, sz = 0;
+ int i0 = (type == PLANE_TYPE_Y_NO_DC);
+ int rc, x, next;
+ int64_t rdmult, rddiv, rd_cost0, rd_cost1;
+ int rate0, rate1, error0, error1, t0, t1;
+ int best, band, pt;
int err_mult = plane_rd_mult[type];
int default_eob;
int const *scan, *bands;
+#if CONFIG_NEWCOEFCONTEXT
+ const int *neighbors;
+#endif
- b = &mb->block[i];
- d = &mb->e_mbd.block[i];
switch (tx_size) {
default:
case TX_4X4:
- scan = vp9_default_zig_zag1d;
- bands = vp9_coef_bands;
+ 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
@@ -345,19 +393,19 @@
if (tx_type != DCT_DCT) {
switch (tx_type) {
case ADST_DCT:
- scan = vp9_row_scan;
+ scan = vp9_row_scan_4x4;
break;
case DCT_ADST:
- scan = vp9_col_scan;
+ scan = vp9_col_scan_4x4;
break;
default:
- scan = vp9_default_zig_zag1d;
+ scan = vp9_default_zig_zag1d_4x4;
break;
}
} else {
- scan = vp9_default_zig_zag1d;
+ scan = vp9_default_zig_zag1d_4x4;
}
}
break;
@@ -366,21 +414,22 @@
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;
}
+#if CONFIG_NEWCOEFCONTEXT
+ neighbors = vp9_get_coef_neighbors_handle(scan);
+#endif
- dequant_ptr = d->dequant;
- coeff_ptr = b->coeff;
- qcoeff_ptr = d->qcoeff;
- dqcoeff_ptr = d->dqcoeff;
- i0 = (type == PLANE_TYPE_Y_NO_DC);
- eob = d->eob;
-
/* Now set up a Viterbi trellis to evaluate alternative roundings. */
rdmult = mb->rdmult * err_mult;
if (mb->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME)
rdmult = (rdmult * 9) >> 4;
rddiv = mb->rddiv;
- best_mask[0] = best_mask[1] = 0;
+ memset(best_index, 0, sizeof(best_index));
/* Initialize the sentinel node of the trellis. */
tokens[eob][0].rate = 0;
tokens[eob][0].error = 0;
@@ -390,9 +439,7 @@
*(tokens[eob] + 1) = *(tokens[eob] + 0);
next = eob;
for (i = eob; i-- > i0;) {
- int base_bits;
- int d2;
- int dx;
+ int base_bits, d2, dx;
rc = scan[i];
x = qcoeff_ptr[rc];
@@ -409,6 +456,11 @@
if (next < default_eob) {
band = bands[i + 1];
pt = vp9_prev_token_class[t0];
+#if CONFIG_NEWCOEFCONTEXT
+ if (NEWCOEFCONTEXT_BAND_COND(band))
+ pt = vp9_get_coef_neighbor_context(
+ qcoeff_ptr, i0, neighbors, scan[i + 1]);
+#endif
rate0 +=
mb->token_costs[tx_size][type][band][pt][tokens[next][0].token];
rate1 +=
@@ -425,7 +477,7 @@
tokens[i][0].next = next;
tokens[i][0].token = t0;
tokens[i][0].qc = x;
- best_mask[0] |= best << i;
+ best_index[i][0] = best;
/* Evaluate the second possibility for this state. */
rate0 = tokens[next][0].rate;
rate1 = tokens[next][1].rate;
@@ -456,12 +508,34 @@
if (next < default_eob) {
band = bands[i + 1];
if (t0 != DCT_EOB_TOKEN) {
+#if CONFIG_NEWCOEFCONTEXT
+ int tmp = qcoeff_ptr[scan[i]];
+ qcoeff_ptr[scan[i]] = x;
+ if (NEWCOEFCONTEXT_BAND_COND(band))
+ pt = vp9_get_coef_neighbor_context(
+ qcoeff_ptr, i0, neighbors, scan[i + 1]);
+ else
+ pt = vp9_prev_token_class[t0];
+ qcoeff_ptr[scan[i]] = tmp;
+#else
pt = vp9_prev_token_class[t0];
+#endif
rate0 += mb->token_costs[tx_size][type][band][pt][
tokens[next][0].token];
}
if (t1 != DCT_EOB_TOKEN) {
+#if CONFIG_NEWCOEFCONTEXT
+ int tmp = qcoeff_ptr[scan[i]];
+ qcoeff_ptr[scan[i]] = x;
+ if (NEWCOEFCONTEXT_BAND_COND(band))
+ pt = vp9_get_coef_neighbor_context(
+ qcoeff_ptr, i0, neighbors, scan[i + 1]);
+ else
+ pt = vp9_prev_token_class[t1];
+ qcoeff_ptr[scan[i]] = tmp;
+#else
pt = vp9_prev_token_class[t1];
+#endif
rate1 += mb->token_costs[tx_size][type][band][pt][
tokens[next][1].token];
}
@@ -481,7 +555,7 @@
tokens[i][1].next = next;
tokens[i][1].token = best ? t1 : t0;
tokens[i][1].qc = x;
- best_mask[1] |= best << i;
+ best_index[i][1] = best;
/* Finally, make this the new head of the trellis. */
next = i;
}
@@ -528,7 +602,7 @@
dqcoeff_ptr[rc] = (x * dequant_ptr[rc != 0]);
next = tokens[i][best].next;
- best = (best_mask[best] >> i) & 1;
+ best = best_index[i][best];
}
final_eob++;
@@ -556,7 +630,7 @@
return;
for (i = 0; i < bd->eob; i++) {
- int coef = bd->dqcoeff[vp9_default_zig_zag1d[i]];
+ int coef = bd->dqcoeff[vp9_default_zig_zag1d_4x4[i]];
sum += (coef >= 0) ? coef : -coef;
if (sum >= SUM_2ND_COEFF_THRESH)
return;
@@ -564,7 +638,7 @@
if (sum < SUM_2ND_COEFF_THRESH) {
for (i = 0; i < bd->eob; i++) {
- int rc = vp9_default_zig_zag1d[i];
+ int rc = vp9_default_zig_zag1d_4x4[i];
bd->qcoeff[rc] = 0;
bd->dqcoeff[rc] = 0;
}
@@ -626,15 +700,18 @@
for (b = 0; b < 16; b++) {
optimize_b(x, b, type,
- ta + vp9_block2above[b], tl + vp9_block2left[b], TX_4X4);
+ ta + vp9_block2above[TX_4X4][b],
+ tl + vp9_block2left[TX_4X4][b], TX_4X4);
}
if (has_2nd_order) {
b = 24;
optimize_b(x, b, PLANE_TYPE_Y2,
- ta + vp9_block2above[b], tl + vp9_block2left[b], TX_4X4);
+ ta + vp9_block2above[TX_4X4][b],
+ tl + vp9_block2left[TX_4X4][b], TX_4X4);
check_reset_2nd_coeffs(&x->e_mbd,
- ta + vp9_block2above[b], tl + vp9_block2left[b]);
+ ta + vp9_block2above[TX_4X4][b],
+ tl + vp9_block2left[TX_4X4][b]);
}
}
@@ -655,7 +732,8 @@
for (b = 16; b < 24; b++) {
optimize_b(x, b, PLANE_TYPE_UV,
- ta + vp9_block2above[b], tl + vp9_block2left[b], TX_4X4);
+ ta + vp9_block2above[TX_4X4][b],
+ tl + vp9_block2left[TX_4X4][b], TX_4X4);
}
}
@@ -682,42 +760,47 @@
tl = (ENTROPY_CONTEXT *)&t_left;
type = has_2nd_order ? PLANE_TYPE_Y_NO_DC : PLANE_TYPE_Y_WITH_DC;
for (b = 0; b < 16; b += 4) {
- optimize_b(x, b, type,
- ta + vp9_block2above_8x8[b], tl + vp9_block2left_8x8[b],
- TX_8X8);
- ta[vp9_block2above_8x8[b] + 1] = ta[vp9_block2above_8x8[b]];
- tl[vp9_block2left_8x8[b] + 1] = tl[vp9_block2left_8x8[b]];
+ ENTROPY_CONTEXT *const a = ta + vp9_block2above[TX_8X8][b];
+ ENTROPY_CONTEXT *const l = tl + vp9_block2left[TX_8X8][b];
+#if CONFIG_CNVCONTEXT
+ ENTROPY_CONTEXT above_ec = (a[0] + a[1]) != 0;
+ ENTROPY_CONTEXT left_ec = (l[0] + l[1]) != 0;
+#else
+ ENTROPY_CONTEXT above_ec = a[0];
+ ENTROPY_CONTEXT left_ec = l[0];
+#endif
+ optimize_b(x, b, type, &above_ec, &left_ec, TX_8X8);
+ a[1] = a[0] = above_ec;
+ l[1] = l[0] = left_ec;
}
- // 8x8 always have 2nd roder haar block
+ // 8x8 always have 2nd order block
if (has_2nd_order) {
check_reset_8x8_2nd_coeffs(&x->e_mbd,
- ta + vp9_block2above_8x8[24],
- tl + vp9_block2left_8x8[24]);
+ ta + vp9_block2above[TX_8X8][24],
+ tl + vp9_block2left[TX_8X8][24]);
}
}
void vp9_optimize_mbuv_8x8(MACROBLOCK *x) {
int b;
- ENTROPY_CONTEXT_PLANES t_above, t_left;
- ENTROPY_CONTEXT *ta;
- ENTROPY_CONTEXT *tl;
+ ENTROPY_CONTEXT *const ta = (ENTROPY_CONTEXT *)x->e_mbd.above_context;
+ ENTROPY_CONTEXT *const tl = (ENTROPY_CONTEXT *)x->e_mbd.left_context;
- if (!x->e_mbd.above_context || !x->e_mbd.left_context)
+ if (!ta || !tl)
return;
- vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
- vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
-
- ta = (ENTROPY_CONTEXT *)&t_above;
- tl = (ENTROPY_CONTEXT *)&t_left;
-
for (b = 16; b < 24; b += 4) {
- optimize_b(x, b, PLANE_TYPE_UV,
- ta + vp9_block2above_8x8[b], tl + vp9_block2left_8x8[b],
- TX_8X8);
- ta[vp9_block2above_8x8[b] + 1] = ta[vp9_block2above_8x8[b]];
- tl[vp9_block2left_8x8[b] + 1] = tl[vp9_block2left_8x8[b]];
+ ENTROPY_CONTEXT *const a = ta + vp9_block2above[TX_8X8][b];
+ ENTROPY_CONTEXT *const l = tl + vp9_block2left[TX_8X8][b];
+#if CONFIG_CNVCONTEXT
+ ENTROPY_CONTEXT above_ec = (a[0] + a[1]) != 0;
+ ENTROPY_CONTEXT left_ec = (l[0] + l[1]) != 0;
+#else
+ ENTROPY_CONTEXT above_ec = a[0];
+ ENTROPY_CONTEXT left_ec = l[0];
+#endif
+ optimize_b(x, b, PLANE_TYPE_UV, &above_ec, &left_ec, TX_8X8);
}
}
@@ -726,192 +809,22 @@
vp9_optimize_mbuv_8x8(x);
}
-static void optimize_b_16x16(MACROBLOCK *mb, int i, PLANE_TYPE type,
- ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l) {
- BLOCK *b = &mb->block[i];
- BLOCKD *d = &mb->e_mbd.block[i];
- vp9_token_state tokens[257][2];
- unsigned best_index[257][2];
- const short *dequant_ptr = d->dequant, *coeff_ptr = b->coeff;
- short *qcoeff_ptr = qcoeff_ptr = d->qcoeff;
- short *dqcoeff_ptr = dqcoeff_ptr = d->dqcoeff;
- int eob = d->eob, final_eob, sz = 0;
- int rc, x, next;
- int64_t rdmult, rddiv, rd_cost0, rd_cost1;
- int rate0, rate1, error0, error1, t0, t1;
- int best, band, pt;
- int err_mult = plane_rd_mult[type];
-
- /* Now set up a Viterbi trellis to evaluate alternative roundings. */
- rdmult = mb->rdmult * err_mult;
- if (mb->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME)
- rdmult = (rdmult * 9)>>4;
- rddiv = mb->rddiv;
- memset(best_index, 0, sizeof(best_index));
- /* Initialize the sentinel node of the trellis. */
- tokens[eob][0].rate = 0;
- tokens[eob][0].error = 0;
- tokens[eob][0].next = 256;
- tokens[eob][0].token = DCT_EOB_TOKEN;
- tokens[eob][0].qc = 0;
- *(tokens[eob] + 1) = *(tokens[eob] + 0);
- next = eob;
- for (i = eob; i-- > 0;) {
- int base_bits, d2, dx;
-
- rc = vp9_default_zig_zag1d_16x16[i];
- x = qcoeff_ptr[rc];
- /* Only add a trellis state for non-zero coefficients. */
- if (x) {
- int shortcut = 0;
- error0 = tokens[next][0].error;
- error1 = tokens[next][1].error;
- /* Evaluate the first possibility for this state. */
- rate0 = tokens[next][0].rate;
- rate1 = tokens[next][1].rate;
- t0 = (vp9_dct_value_tokens_ptr + x)->Token;
- /* Consider both possible successor states. */
- if (next < 256) {
- band = vp9_coef_bands_16x16[i + 1];
- pt = vp9_prev_token_class[t0];
- rate0 += mb->token_costs[TX_16X16][type][band][pt][tokens[next][0].token];
- rate1 += mb->token_costs[TX_16X16][type][band][pt][tokens[next][1].token];
- }
- UPDATE_RD_COST();
- /* And pick the best. */
- best = rd_cost1 < rd_cost0;
- base_bits = *(vp9_dct_value_cost_ptr + x);
- dx = dqcoeff_ptr[rc] - coeff_ptr[rc];
- d2 = dx*dx;
- tokens[i][0].rate = base_bits + (best ? rate1 : rate0);
- tokens[i][0].error = d2 + (best ? error1 : error0);
- tokens[i][0].next = next;
- tokens[i][0].token = t0;
- tokens[i][0].qc = x;
- best_index[i][0] = best;
- /* Evaluate the second possibility for this state. */
- rate0 = tokens[next][0].rate;
- rate1 = tokens[next][1].rate;
-
- if((abs(x)*dequant_ptr[rc!=0]>abs(coeff_ptr[rc])) &&
- (abs(x)*dequant_ptr[rc!=0]<abs(coeff_ptr[rc])+dequant_ptr[rc!=0]))
- shortcut = 1;
- else
- shortcut = 0;
-
- if (shortcut) {
- sz = -(x < 0);
- x -= 2*sz + 1;
- }
-
- /* Consider both possible successor states. */
- if (!x) {
- /* If we reduced this coefficient to zero, check to see if
- * we need to move the EOB back here.
- */
- t0 = tokens[next][0].token == DCT_EOB_TOKEN ?
- DCT_EOB_TOKEN : ZERO_TOKEN;
- t1 = tokens[next][1].token == DCT_EOB_TOKEN ?
- DCT_EOB_TOKEN : ZERO_TOKEN;
- }
- else
- t0=t1 = (vp9_dct_value_tokens_ptr + x)->Token;
- if (next < 256) {
- band = vp9_coef_bands_16x16[i + 1];
- if (t0 != DCT_EOB_TOKEN) {
- pt = vp9_prev_token_class[t0];
- rate0 += mb->token_costs[TX_16X16][type][band][pt]
- [tokens[next][0].token];
- }
- if (t1!=DCT_EOB_TOKEN) {
- pt = vp9_prev_token_class[t1];
- rate1 += mb->token_costs[TX_16X16][type][band][pt]
- [tokens[next][1].token];
- }
- }
- UPDATE_RD_COST();
- /* And pick the best. */
- best = rd_cost1 < rd_cost0;
- base_bits = *(vp9_dct_value_cost_ptr + x);
-
- if(shortcut) {
- dx -= (dequant_ptr[rc!=0] + sz) ^ sz;
- d2 = dx*dx;
- }
- tokens[i][1].rate = base_bits + (best ? rate1 : rate0);
- tokens[i][1].error = d2 + (best ? error1 : error0);
- tokens[i][1].next = next;
- tokens[i][1].token = best ? t1 : t0;
- tokens[i][1].qc = x;
- best_index[i][1] = best;
- /* Finally, make this the new head of the trellis. */
- next = i;
- }
- /* There's no choice to make for a zero coefficient, so we don't
- * add a new trellis node, but we do need to update the costs.
- */
- else {
- band = vp9_coef_bands_16x16[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. */
- if (t0 != DCT_EOB_TOKEN) {
- tokens[next][0].rate += mb->token_costs[TX_16X16][type][band][0][t0];
- tokens[next][0].token = ZERO_TOKEN;
- }
- if (t1 != DCT_EOB_TOKEN) {
- tokens[next][1].rate += mb->token_costs[TX_16X16][type][band][0][t1];
- tokens[next][1].token = ZERO_TOKEN;
- }
- /* Don't update next, because we didn't add a new node. */
- }
- }
-
- /* Now pick the best path through the whole trellis. */
- band = vp9_coef_bands_16x16[i + 1];
- VP9_COMBINEENTROPYCONTEXTS(pt, *a, *l);
- rate0 = tokens[next][0].rate;
- rate1 = tokens[next][1].rate;
- error0 = tokens[next][0].error;
- error1 = tokens[next][1].error;
- t0 = tokens[next][0].token;
- t1 = tokens[next][1].token;
- rate0 += mb->token_costs[TX_16X16][type][band][pt][t0];
- rate1 += mb->token_costs[TX_16X16][type][band][pt][t1];
- UPDATE_RD_COST();
- best = rd_cost1 < rd_cost0;
- final_eob = -1;
-
- for (i = next; i < eob; i = next) {
- x = tokens[i][best].qc;
- if (x)
- final_eob = i;
- rc = vp9_default_zig_zag1d_16x16[i];
- qcoeff_ptr[rc] = x;
- dqcoeff_ptr[rc] = (x * dequant_ptr[rc!=0]);
-
- next = tokens[i][best].next;
- best = best_index[i][best];
- }
- final_eob++;
-
- d->eob = final_eob;
- *a = *l = (d->eob > !type);
-}
-
void vp9_optimize_mby_16x16(MACROBLOCK *x) {
- ENTROPY_CONTEXT_PLANES t_above, t_left;
- ENTROPY_CONTEXT *ta, *tl;
+ ENTROPY_CONTEXT_PLANES *const t_above = x->e_mbd.above_context;
+ ENTROPY_CONTEXT_PLANES *const t_left = x->e_mbd.left_context;
+ ENTROPY_CONTEXT ta, tl;
- if (!x->e_mbd.above_context || !x->e_mbd.left_context)
+ if (!t_above || !t_left)
return;
- vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
- vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
-
- ta = (ENTROPY_CONTEXT *)&t_above;
- tl = (ENTROPY_CONTEXT *)&t_left;
- optimize_b_16x16(x, 0, PLANE_TYPE_Y_WITH_DC, ta, tl);
+#if CONFIG_CNVCONTEXT
+ ta = (t_above->y1[0] + t_above->y1[1] + t_above->y1[2] + t_above->y1[3]) != 0;
+ tl = (t_left->y1[0] + t_left->y1[1] + t_left->y1[2] + t_left->y1[3]) != 0;
+#else
+ ta = t_above->y1[0];
+ tl = t_left->y1[0];
+#endif
+ optimize_b(x, 0, PLANE_TYPE_Y_WITH_DC, &ta, &tl, TX_16X16);
}
static void optimize_mb_16x16(MACROBLOCK *x) {
@@ -972,11 +885,6 @@
MACROBLOCKD *xd = &x->e_mbd;
BLOCK *b = &x->block[0];
-#if CONFIG_PRED_FILTER
- // Disable the prediction filter for firstpass
- xd->mode_info_context->mbmi.pred_filter_enabled = 0;
-#endif
-
vp9_build_1st_inter16x16_predictors_mby(xd, xd->predictor, 16, 0);
vp9_subtract_mby(x->src_diff, *(b->base_src), xd->predictor, b->src_stride);
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_encodemb.h ('k') | source/libvpx/vp9/encoder/vp9_encodemv.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698