summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_rdopt.c
diff options
context:
space:
mode:
authorYunqing Wang <yunqingwang@google.com>2014-10-01 16:19:56 -0700
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2014-10-01 16:19:56 -0700
commite350e3fe68bef41d824aaef0f7fed4baa70c773b (patch)
tree45be95076f27d0d4a3edc2c44f854f1e98af889b /vp9/encoder/vp9_rdopt.c
parent28a1ee86b9df48925ea99657bb542a79dca44f17 (diff)
parente4aac6bb61cba7ab387a959c82b292ead6eba758 (diff)
downloadlibvpx-e350e3fe68bef41d824aaef0f7fed4baa70c773b.tar
libvpx-e350e3fe68bef41d824aaef0f7fed4baa70c773b.tar.gz
libvpx-e350e3fe68bef41d824aaef0f7fed4baa70c773b.tar.bz2
libvpx-e350e3fe68bef41d824aaef0f7fed4baa70c773b.zip
Merge "Modify block transform skipping check"
Diffstat (limited to 'vp9/encoder/vp9_rdopt.c')
-rw-r--r--vp9/encoder/vp9_rdopt.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c
index bd695cc71..cf1ebd50e 100644
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -180,7 +180,7 @@ static void model_rd_for_sb(VP9_COMP *cpi, BLOCK_SIZE bsize,
unsigned int sse;
unsigned int var = 0;
unsigned int sum_sse = 0;
- const int shift = 8;
+ const int shift = 6;
int rate;
int64_t dist;
@@ -212,12 +212,16 @@ static void model_rd_for_sb(VP9_COMP *cpi, BLOCK_SIZE bsize,
sum_sse += sse;
if (!x->select_tx_size) {
- if (x->bsse[(i << 2) + block_idx] < p->quant_thred[0] >> shift)
- x->skip_txfm[(i << 2) + block_idx] = 1;
- else if (var < p->quant_thred[1] >> shift)
+ // Check if all ac coefficients can be quantized to zero.
+ if (var < p->quant_thred[1] >> shift) {
x->skip_txfm[(i << 2) + block_idx] = 2;
- else
+
+ // Check if dc coefficient can be quantized to zero.
+ if (sse - var < p->quant_thred[0] >> shift)
+ x->skip_txfm[(i << 2) + block_idx] = 1;
+ } else {
x->skip_txfm[(i << 2) + block_idx] = 0;
+ }
}
if (i == 0)
@@ -484,9 +488,15 @@ static void block_rd_txfm(int plane, int block, BLOCK_SIZE plane_bsize,
vp9_xform_quant_dc(x, plane, block, plane_bsize, tx_size);
args->sse = x->bsse[(plane << 2) + (block >> (tx_size << 1))] << 4;
args->dist = args->sse;
- if (!x->plane[plane].eobs[block])
- args->dist = args->sse - ((coeff[0] * coeff[0] -
- (coeff[0] - dqcoeff[0]) * (coeff[0] - dqcoeff[0])) >> 2);
+ if (x->plane[plane].eobs[block]) {
+ int64_t dc_correct = coeff[0] * coeff[0] -
+ (coeff[0] - dqcoeff[0]) * (coeff[0] - dqcoeff[0]);
+
+ if (tx_size != TX_32X32)
+ dc_correct >>= 2;
+
+ args->dist = args->sse - dc_correct;
+ }
} else {
// skip forward transform
x->plane[plane].eobs[block] = 0;