Index: source/libvpx/vp9/encoder/vp9_encodemb.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_encodemb.c (revision 278778) |
+++ source/libvpx/vp9/encoder/vp9_encodemb.c (working copy) |
@@ -301,6 +301,52 @@ |
vp9_fdct32x32(src, dst, src_stride); |
} |
+void vp9_xform_quant_fp(MACROBLOCK *x, int plane, int block, |
+ BLOCK_SIZE plane_bsize, TX_SIZE tx_size) { |
+ MACROBLOCKD *const xd = &x->e_mbd; |
+ const struct macroblock_plane *const p = &x->plane[plane]; |
+ const struct macroblockd_plane *const pd = &xd->plane[plane]; |
+ int16_t *const coeff = BLOCK_OFFSET(p->coeff, block); |
+ int16_t *const qcoeff = BLOCK_OFFSET(p->qcoeff, block); |
+ int16_t *const dqcoeff = BLOCK_OFFSET(pd->dqcoeff, block); |
+ uint16_t *const eob = &p->eobs[block]; |
+ const int diff_stride = 4 * num_4x4_blocks_wide_lookup[plane_bsize]; |
+ int i, j; |
+ const int16_t *src_diff; |
+ |
+ txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j); |
+ src_diff = &p->src_diff[4 * (j * diff_stride + i)]; |
+ |
+ switch (tx_size) { |
+ case TX_32X32: |
+ vp9_fdct32x32_1(src_diff, coeff, diff_stride); |
+ vp9_quantize_dc_32x32(coeff, x->skip_block, p->round, |
+ p->quant_fp[0], qcoeff, dqcoeff, |
+ pd->dequant[0], eob); |
+ break; |
+ case TX_16X16: |
+ vp9_fdct16x16_1(src_diff, coeff, diff_stride); |
+ vp9_quantize_dc(coeff, x->skip_block, p->round, |
+ p->quant_fp[0], qcoeff, dqcoeff, |
+ pd->dequant[0], eob); |
+ break; |
+ case TX_8X8: |
+ vp9_fdct8x8_1(src_diff, coeff, diff_stride); |
+ vp9_quantize_dc(coeff, x->skip_block, p->round, |
+ p->quant_fp[0], qcoeff, dqcoeff, |
+ pd->dequant[0], eob); |
+ break; |
+ case TX_4X4: |
+ x->fwd_txm4x4(src_diff, coeff, diff_stride); |
+ vp9_quantize_dc(coeff, x->skip_block, p->round, |
+ p->quant_fp[0], qcoeff, dqcoeff, |
+ pd->dequant[0], eob); |
+ break; |
+ default: |
+ assert(0); |
+ } |
+} |
+ |
void vp9_xform_quant(MACROBLOCK *x, int plane, int block, |
BLOCK_SIZE plane_bsize, TX_SIZE tx_size) { |
MACROBLOCKD *const xd = &x->e_mbd; |
@@ -376,8 +422,19 @@ |
return; |
} |
- if (!x->skip_recode) |
- vp9_xform_quant(x, plane, block, plane_bsize, tx_size); |
+ if (x->skip_txfm == 0) { |
+ // full forward transform and quantization |
+ if (!x->skip_recode) |
+ vp9_xform_quant(x, plane, block, plane_bsize, tx_size); |
+ } else if (x->skip_txfm == 2) { |
+ // fast path forward transform and quantization |
+ vp9_xform_quant_fp(x, plane, block, plane_bsize, tx_size); |
+ } else { |
+ // skip forward transform |
+ p->eobs[block] = 0; |
+ *a = *l = 0; |
+ return; |
+ } |
if (x->optimize && (!x->skip_recode || !x->skip_optimize)) { |
const int ctx = combine_entropy_contexts(*a, *l); |
@@ -406,7 +463,7 @@ |
// this is like vp9_short_idct4x4 but has a special case around eob<=1 |
// which is significant (not just an optimization) for the lossless |
// case. |
- xd->itxm_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); |
+ x->itxm_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); |
break; |
default: |
assert(0 && "Invalid transform size"); |
@@ -428,7 +485,7 @@ |
vp9_xform_quant(x, plane, block, plane_bsize, tx_size); |
if (p->eobs[block] > 0) |
- xd->itxm_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); |
+ x->itxm_add(dqcoeff, dst, pd->dst.stride, p->eobs[block]); |
} |
void vp9_encode_sby_pass1(MACROBLOCK *x, BLOCK_SIZE bsize) { |
@@ -574,7 +631,7 @@ |
// this is like vp9_short_idct4x4 but has a special case around eob<=1 |
// which is significant (not just an optimization) for the lossless |
// case. |
- xd->itxm_add(dqcoeff, dst, dst_stride, *eob); |
+ x->itxm_add(dqcoeff, dst, dst_stride, *eob); |
else |
vp9_iht4x4_16_add(dqcoeff, dst, dst_stride, tx_type); |
} |