shithub: libvpx

Download patch

ref: 9851486b2f187cb21708afcaaecd4ee3e3c5cd30
parent: 25a36d6b3c6d206ad19d47f9999eb71109f87dea
author: Jim Bankoski <jimbankoski@google.com>
date: Tue May 8 03:29:19 EDT 2012

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

--- /dev/null
+++ b/vp8/encoder/boolcoder_test.cc
@@ -1,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();
+}
--- a/vp8/vp8cx.mk
+++ b/vp8/vp8cx.mk
@@ -87,6 +87,8 @@
 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