summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Bankoski <jimbankoski@google.com>2012-05-09 15:41:23 -0700
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2012-05-09 15:41:23 -0700
commitc7ca3808322e4ff6a26d2184137c1dfa94f97024 (patch)
tree0e6e4fe64ea3ef23ac4bd2f17ad30c72a0a50cf6
parentf86993f195ec0a82464fe25922e3857bc68b2ee5 (diff)
parent9851486b2f187cb21708afcaaecd4ee3e3c5cd30 (diff)
downloadlibvpx-c7ca3808322e4ff6a26d2184137c1dfa94f97024.tar
libvpx-c7ca3808322e4ff6a26d2184137c1dfa94f97024.tar.gz
libvpx-c7ca3808322e4ff6a26d2184137c1dfa94f97024.tar.bz2
libvpx-c7ca3808322e4ff6a26d2184137c1dfa94f97024.zip
Merge "vp8e - boolcoder unit test"
-rw-r--r--vp8/encoder/boolcoder_test.cc129
-rw-r--r--vp8/vp8cx.mk2
2 files changed, 131 insertions, 0 deletions
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 <math.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#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