From: Johann Date: Thu, 27 Jul 2017 21:14:20 +0000 (-0700) Subject: quantize test: add speed comparison X-Git-Tag: v1.7.0~268^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1059b5cc523ceda9ce0217a162007448a0b35967;p=libvpx quantize test: add speed comparison Test some possible scenarios. Change-Id: I1a612e7153b31756be66390ceea55877856d5a33 --- diff --git a/test/vp9_quantize_test.cc b/test/vp9_quantize_test.cc index 20faa8e4c..6d6ec06df 100644 --- a/test/vp9_quantize_test.cc +++ b/test/vp9_quantize_test.cc @@ -25,6 +25,7 @@ #include "vp9/common/vp9_scan.h" #include "vpx/vpx_codec.h" #include "vpx/vpx_integer.h" +#include "vpx_ports/vpx_timer.h" using libvpx_test::ACMRandom; using libvpx_test::Buffer; @@ -349,6 +350,79 @@ TEST_P(VP9Quantize32Test, EOBCheck) { } } } + +TEST_P(VP9QuantizeTest, DISABLED_Speed) { + ACMRandom rnd(ACMRandom::DeterministicSeed()); + Buffer coeff = Buffer(16, 16, 0, 16); + ASSERT_TRUE(coeff.Init()); + DECLARE_ALIGNED(16, int16_t, zbin_ptr[8]); + DECLARE_ALIGNED(16, int16_t, round_ptr[8]); + DECLARE_ALIGNED(16, int16_t, quant_ptr[8]); + DECLARE_ALIGNED(16, int16_t, quant_shift_ptr[8]); + DECLARE_ALIGNED(16, int16_t, dequant_ptr[8]); + Buffer qcoeff = Buffer(16, 16, 0, 32); + ASSERT_TRUE(qcoeff.Init()); + Buffer dqcoeff = Buffer(16, 16, 0, 32); + ASSERT_TRUE(dqcoeff.Init()); + uint16_t eob; + + // TX_4X4, TX_8X8 TX_16X16 + for (TX_SIZE sz = 0; sz < 3; ++sz) { + // skip_block, zbin > coeff, zbin < coeff. + for (int i = 0; i < 3; ++i) { + const int skip_block = i == 0; + // TX_TYPE defines the scan order. That is not relevant to the speed test. + // Pick the first one. + const TX_TYPE tx_type = DCT_DCT; + const scan_order *scan_order = &vp9_scan_orders[sz][tx_type]; + const int count = (4 << sz) * (4 << sz); // 16, 64, 256 + if (i == 0) { + // zbin values are unused when skip_block == 1. + zbin_ptr[0] = zbin_ptr[1] = 0; + coeff.Set(0); + } else if (i == 1) { + // When |coeff values| are less than zbin the results are 0. + zbin_ptr[0] = zbin_ptr[1] = 100; + coeff.Set(&rnd, -99, 99); + } else if (i == 2) { + zbin_ptr[0] = zbin_ptr[1] = 50; + coeff.Set(&rnd, -500, 500); + } + for (int j = 0; j < 2; j++) { + // Chosen by fair dice roll. + round_ptr[j] = 10; + quant_ptr[j] = -10; + quant_shift_ptr[j] = 10; + dequant_ptr[j] = 10; + } + for (int j = 2; j < 8; j++) { + zbin_ptr[j] = zbin_ptr[1]; + round_ptr[j] = round_ptr[1]; + quant_ptr[j] = quant_ptr[1]; + quant_shift_ptr[j] = quant_shift_ptr[1]; + dequant_ptr[j] = dequant_ptr[1]; + } + + vpx_usec_timer timer; + vpx_usec_timer_start(&timer); + for (int j = 0; j < 100000000 / count; ++j) { + quantize_op_(coeff.TopLeftPixel(), count, skip_block, zbin_ptr, + round_ptr, quant_ptr, quant_shift_ptr, + qcoeff.TopLeftPixel(), dqcoeff.TopLeftPixel(), dequant_ptr, + &eob, scan_order->scan, scan_order->iscan); + } + vpx_usec_timer_mark(&timer); + const int elapsed_time = static_cast(vpx_usec_timer_elapsed(&timer)); + if (i == 0) printf("Skip block.\n"); + if (i == 1) printf("Bypass calculations.\n"); + if (i == 2) printf("Full calculations.\n"); + printf("Quantize %dx%d time: %5d ms\n", 4 << sz, 4 << sz, + elapsed_time / 1000); + } + printf("\n"); + } +} + using std::tr1::make_tuple; #if HAVE_SSE2 @@ -413,4 +487,10 @@ INSTANTIATE_TEST_CASE_P(NEON, VP9QuantizeTest, &vpx_quantize_b_c, VPX_BITS_8))); #endif // HAVE_NEON && !CONFIG_VP9_HIGHBITDEPTH + +// Only useful to compare "Speed" test results. +INSTANTIATE_TEST_CASE_P(DISABLED_C, VP9QuantizeTest, + ::testing::Values(make_tuple(&vpx_quantize_b_c, + &vpx_quantize_b_c, + VPX_BITS_8))); } // namespace