Merge "High-bitdepth bugfixes"
diff --git a/test/vp9_lossless_test.cc b/test/vp9_lossless_test.cc
index b3b9c92..67215d3 100644
--- a/test/vp9_lossless_test.cc
+++ b/test/vp9_lossless_test.cc
@@ -19,17 +19,17 @@
const int kMaxPsnr = 100;
-class LosslessTestLarge : public ::libvpx_test::EncoderTest,
+class LosslessTest : public ::libvpx_test::EncoderTest,
public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
protected:
- LosslessTestLarge()
+ LosslessTest()
: EncoderTest(GET_PARAM(0)),
psnr_(kMaxPsnr),
nframes_(0),
encoding_mode_(GET_PARAM(1)) {
}
- virtual ~LosslessTestLarge() {}
+ virtual ~LosslessTest() {}
virtual void SetUp() {
InitializeConfig();
@@ -67,7 +67,7 @@
libvpx_test::TestMode encoding_mode_;
};
-TEST_P(LosslessTestLarge, TestLossLessEncoding) {
+TEST_P(LosslessTest, TestLossLessEncoding) {
const vpx_rational timebase = { 33333333, 1000000000 };
cfg_.g_timebase = timebase;
cfg_.rc_target_bitrate = 2000;
@@ -85,7 +85,7 @@
EXPECT_GE(psnr_lossless, kMaxPsnr);
}
-TEST_P(LosslessTestLarge, TestLossLessEncoding444) {
+TEST_P(LosslessTest, TestLossLessEncoding444) {
libvpx_test::Y4mVideoSource video("rush_hour_444.y4m", 0, 10);
cfg_.g_profile = 1;
@@ -102,7 +102,7 @@
EXPECT_GE(psnr_lossless, kMaxPsnr);
}
-TEST_P(LosslessTestLarge, TestLossLessEncodingCtrl) {
+TEST_P(LosslessTest, TestLossLessEncodingCtrl) {
const vpx_rational timebase = { 33333333, 1000000000 };
cfg_.g_timebase = timebase;
cfg_.rc_target_bitrate = 2000;
@@ -121,5 +121,8 @@
EXPECT_GE(psnr_lossless, kMaxPsnr);
}
-VP9_INSTANTIATE_TEST_CASE(LosslessTestLarge, ALL_TEST_MODES);
+VP9_INSTANTIATE_TEST_CASE(LosslessTest,
+ ::testing::Values(::libvpx_test::kRealTime,
+ ::libvpx_test::kOnePassGood,
+ ::libvpx_test::kTwoPassGood));
} // namespace
diff --git a/vp9/common/vp9_entropymv.h b/vp9/common/vp9_entropymv.h
index e7033e4..75e6861 100644
--- a/vp9/common/vp9_entropymv.h
+++ b/vp9/common/vp9_entropymv.h
@@ -13,7 +13,9 @@
#define VP9_COMMON_VP9_ENTROPYMV_H_
#include "./vpx_config.h"
-#include "vp9/common/vp9_blockd.h"
+
+#include "vp9/common/vp9_mv.h"
+#include "vp9/common/vp9_prob.h"
#ifdef __cplusplus
extern "C" {
diff --git a/vp9/common/vp9_prob.h b/vp9/common/vp9_prob.h
index fa0e36d..bc1511a 100644
--- a/vp9/common/vp9_prob.h
+++ b/vp9/common/vp9_prob.h
@@ -14,7 +14,6 @@
#include "./vpx_config.h"
#include "vpx_ports/mem.h"
-#include "vpx/vpx_integer.h"
#include "vp9/common/vp9_common.h"
diff --git a/vp9/encoder/vp9_block.h b/vp9/encoder/vp9_block.h
index 767bd7f..2cb85e6 100644
--- a/vp9/encoder/vp9_block.h
+++ b/vp9/encoder/vp9_block.h
@@ -13,8 +13,6 @@
#include "vp9/common/vp9_entropymv.h"
#include "vp9/common/vp9_entropy.h"
-#include "vpx_ports/mem.h"
-#include "vp9/common/vp9_onyxc_int.h"
#ifdef __cplusplus
extern "C" {
diff --git a/vp9/encoder/vp9_quantize.c b/vp9/encoder/vp9_quantize.c
index 3d2c409..0aeeef0 100644
--- a/vp9/encoder/vp9_quantize.c
+++ b/vp9/encoder/vp9_quantize.c
@@ -641,13 +641,14 @@
x->plane[0].quant_shift = quants->y_quant_shift[qindex];
x->plane[0].zbin = quants->y_zbin[qindex];
x->plane[0].round = quants->y_round[qindex];
- x->plane[0].quant_thred[0] = cm->y_dequant[qindex][0] *
- cm->y_dequant[qindex][0];
- x->plane[0].quant_thred[1] = cm->y_dequant[qindex][1] *
- cm->y_dequant[qindex][1];
x->plane[0].zbin_extra = (int16_t)((cm->y_dequant[qindex][1] * zbin) >> 7);
xd->plane[0].dequant = cm->y_dequant[qindex];
+ x->plane[0].quant_thred[0] = (x->plane[0].zbin[0] + x->plane[0].zbin_extra) *
+ (x->plane[0].zbin[0] + x->plane[0].zbin_extra);
+ x->plane[0].quant_thred[1] = (x->plane[0].zbin[1] + x->plane[0].zbin_extra) *
+ (x->plane[0].zbin[1] + x->plane[0].zbin_extra);
+
// UV
for (i = 1; i < 3; i++) {
x->plane[i].quant = quants->uv_quant[qindex];
@@ -656,12 +657,15 @@
x->plane[i].quant_shift = quants->uv_quant_shift[qindex];
x->plane[i].zbin = quants->uv_zbin[qindex];
x->plane[i].round = quants->uv_round[qindex];
- x->plane[i].quant_thred[0] = cm->y_dequant[qindex][0] *
- cm->y_dequant[qindex][0];
- x->plane[i].quant_thred[1] = cm->y_dequant[qindex][1] *
- cm->y_dequant[qindex][1];
x->plane[i].zbin_extra = (int16_t)((cm->uv_dequant[qindex][1] * zbin) >> 7);
xd->plane[i].dequant = cm->uv_dequant[qindex];
+
+ x->plane[i].quant_thred[0] =
+ (x->plane[i].zbin[0] + x->plane[i].zbin_extra) *
+ (x->plane[i].zbin[0] + x->plane[i].zbin_extra);
+ x->plane[i].quant_thred[1] =
+ (x->plane[i].zbin[1] + x->plane[i].zbin_extra) *
+ (x->plane[i].zbin[1] + x->plane[i].zbin_extra);
}
x->skip_block = vp9_segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP);
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c
index f52e55c..b14ff08 100644
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -180,7 +180,7 @@
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 @@
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 @@
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;
@@ -2975,6 +2985,13 @@
if (x->pred_mv_sad[ALTREF_FRAME] > (x->pred_mv_sad[GOLDEN_FRAME] << 1))
mode_skip_mask[ALTREF_FRAME] |= INTER_ALL;
+ if (cpi->sf.adaptive_mode_search) {
+ if (cm->show_frame && !cpi->rc.is_src_frame_alt_ref &&
+ cpi->rc.frames_since_golden >= 3)
+ if (x->pred_mv_sad[GOLDEN_FRAME] > (x->pred_mv_sad[LAST_FRAME] << 1))
+ mode_skip_mask[GOLDEN_FRAME] |= INTER_ALL;
+ }
+
if (bsize > cpi->sf.max_intra_bsize) {
ref_frame_skip_mask[0] |= (1 << INTRA_FRAME);
ref_frame_skip_mask[1] |= (1 << INTRA_FRAME);