From 9851486b2f187cb21708afcaaecd4ee3e3c5cd30 Mon Sep 17 00:00:00 2001 From: Jim Bankoski Date: Tue, 8 May 2012 07:29:19 -0700 Subject: vp8e - boolcoder unit test Adds a unit test to the boolcoder that tests encoding and decoding thousands of different bits, with different probabilities in different patterns. Code borrowed from the webp project - and its committers. Change-Id: Icabbb884d57e666496490c961dd29b246144ab3e --- vp8/encoder/boolcoder_test.cc | 129 ++++++++++++++++++++++++++++++++++++++++++ vp8/vp8cx.mk | 2 + 2 files changed, 131 insertions(+) create mode 100644 vp8/encoder/boolcoder_test.cc diff --git a/vp8/encoder/boolcoder_test.cc b/vp8/encoder/boolcoder_test.cc new file mode 100644 index 000000000..9d9462690 --- /dev/null +++ b/vp8/encoder/boolcoder_test.cc @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2012 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +extern "C" +{ +#include "vp8/encoder/boolhuff.h" +#include "vp8/decoder/dboolhuff.h" +} + +#include +#include +#include +#include +#include +#include +#include + +#include "third_party/googletest/src/include/gtest/gtest.h" + +typedef unsigned char uint8_t; + +namespace +{ +const int num_tests = 10; + +class ACMRandom +{ +public: + ACMRandom(int seed) { Reset(seed);} + + void Reset(int seed) { srand(seed); } + + uint8_t Rand8(void) { return (rand() >> 8) & 0xff; } + + int PseudoUniform(int range) { return (rand() >> 8) % range; } + + int operator()(int n) { return PseudoUniform(n); } + + static int DeterministicSeed(void) { return 0xbaba; } +}; +} + +TEST(VP8, TestBitIO) +{ + ACMRandom rnd(ACMRandom::DeterministicSeed()); + for (int n = 0; n < num_tests; ++n) + { + for (int method = 0; method <= 7; ++method) + { // we generate various proba + const int bits_to_test = 1000; + + uint8_t probas[bits_to_test]; + + for (int i = 0; i < bits_to_test; ++i) + { + const int parity = i & 1; + probas[i] = + (method == 0) ? 0 : + (method == 1) ? 255 : + (method == 2) ? 128 : + (method == 3) ? rnd.Rand8() : + (method == 4) ? (parity ? 0 : 255) : + // alternate between low and high proba: + (method == 5) ? (parity ? rnd(128) : 255 - rnd(128)) : + (method == 6) ? + (parity ? rnd(64) : 255 - rnd(64)) : + (parity ? rnd(32) : 255 - rnd(32)); + } + for (int bit_method = 0; bit_method <= 3; ++bit_method) + { + const int random_seed = 6432; + const int buffer_size = 10000; + ACMRandom bit_rnd(random_seed); + BOOL_CODER bw; + uint8_t bw_buffer[buffer_size]; + vp8_start_encode(&bw, bw_buffer, bw_buffer + buffer_size); + + int bit = (bit_method == 0) ? 0 : (bit_method == 1) ? 1 : 0; + for (int i = 0; i < bits_to_test; ++i) + { + if (bit_method == 2) + { + bit = (i & 1); + } + else if (bit_method == 3) + { + bit = bit_rnd(2); + } + vp8_encode_bool(&bw, bit, (int) probas[i]); + } + + vp8_stop_encode(&bw); + + BOOL_DECODER br; + vp8dx_start_decode(&br, bw_buffer, buffer_size); + bit_rnd.Reset(random_seed); + for (int i = 0; i < bits_to_test; ++i) + { + if (bit_method == 2) + { + bit = (i & 1); + } + else if (bit_method == 3) + { + bit = bit_rnd(2); + } + GTEST_ASSERT_EQ(vp8dx_decode_bool(&br, probas[i]), bit) + << "pos: " + << i << " / " << bits_to_test << " bit_method: " + << bit_method << " method: " << method; + } + + } + } + } +} + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/vp8/vp8cx.mk b/vp8/vp8cx.mk index b7f34943b..e2557eb9a 100644 --- a/vp8/vp8cx.mk +++ b/vp8/vp8cx.mk @@ -87,6 +87,8 @@ VP8_CX_SRCS-yes += encoder/temporal_filter.c VP8_CX_SRCS-$(CONFIG_MULTI_RES_ENCODING) += encoder/mr_dissim.c VP8_CX_SRCS-$(CONFIG_MULTI_RES_ENCODING) += encoder/mr_dissim.h +VP8_CX_SRCS-$(CONFIG_UNIT_TESTS) += encoder/boolcoder_test.cc + ifeq ($(CONFIG_REALTIME_ONLY),yes) VP8_CX_SRCS_REMOVE-yes += encoder/firstpass.c VP8_CX_SRCS_REMOVE-yes += encoder/temporal_filter.c -- cgit v1.2.3