1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2012 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #include <math.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <stdlib.h>
13*fb1b10abSAndroid Build Coastguard Worker #include <string.h>
14*fb1b10abSAndroid Build Coastguard Worker
15*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
16*fb1b10abSAndroid Build Coastguard Worker
17*fb1b10abSAndroid Build Coastguard Worker #include "test/acm_random.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "vpx/vpx_integer.h"
19*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/bitreader.h"
20*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/bitwriter.h"
21*fb1b10abSAndroid Build Coastguard Worker
22*fb1b10abSAndroid Build Coastguard Worker using libvpx_test::ACMRandom;
23*fb1b10abSAndroid Build Coastguard Worker
24*fb1b10abSAndroid Build Coastguard Worker namespace {
25*fb1b10abSAndroid Build Coastguard Worker const int num_tests = 10;
26*fb1b10abSAndroid Build Coastguard Worker } // namespace
27*fb1b10abSAndroid Build Coastguard Worker
TEST(VP9,TestBitIO)28*fb1b10abSAndroid Build Coastguard Worker TEST(VP9, TestBitIO) {
29*fb1b10abSAndroid Build Coastguard Worker ACMRandom rnd(ACMRandom::DeterministicSeed());
30*fb1b10abSAndroid Build Coastguard Worker for (int n = 0; n < num_tests; ++n) {
31*fb1b10abSAndroid Build Coastguard Worker for (int method = 0; method <= 7; ++method) { // we generate various proba
32*fb1b10abSAndroid Build Coastguard Worker const int kBitsToTest = 1000;
33*fb1b10abSAndroid Build Coastguard Worker uint8_t probas[kBitsToTest];
34*fb1b10abSAndroid Build Coastguard Worker
35*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < kBitsToTest; ++i) {
36*fb1b10abSAndroid Build Coastguard Worker const int parity = i & 1;
37*fb1b10abSAndroid Build Coastguard Worker /* clang-format off */
38*fb1b10abSAndroid Build Coastguard Worker probas[i] =
39*fb1b10abSAndroid Build Coastguard Worker (method == 0) ? 0 : (method == 1) ? 255 :
40*fb1b10abSAndroid Build Coastguard Worker (method == 2) ? 128 :
41*fb1b10abSAndroid Build Coastguard Worker (method == 3) ? rnd.Rand8() :
42*fb1b10abSAndroid Build Coastguard Worker (method == 4) ? (parity ? 0 : 255) :
43*fb1b10abSAndroid Build Coastguard Worker // alternate between low and high proba:
44*fb1b10abSAndroid Build Coastguard Worker (method == 5) ? (parity ? rnd(128) : 255 - rnd(128)) :
45*fb1b10abSAndroid Build Coastguard Worker (method == 6) ?
46*fb1b10abSAndroid Build Coastguard Worker (parity ? rnd(64) : 255 - rnd(64)) :
47*fb1b10abSAndroid Build Coastguard Worker (parity ? rnd(32) : 255 - rnd(32));
48*fb1b10abSAndroid Build Coastguard Worker /* clang-format on */
49*fb1b10abSAndroid Build Coastguard Worker }
50*fb1b10abSAndroid Build Coastguard Worker for (int bit_method = 0; bit_method <= 3; ++bit_method) {
51*fb1b10abSAndroid Build Coastguard Worker const int random_seed = 6432;
52*fb1b10abSAndroid Build Coastguard Worker const int kBufferSize = 10000;
53*fb1b10abSAndroid Build Coastguard Worker ACMRandom bit_rnd(random_seed);
54*fb1b10abSAndroid Build Coastguard Worker vpx_writer bw;
55*fb1b10abSAndroid Build Coastguard Worker uint8_t bw_buffer[kBufferSize];
56*fb1b10abSAndroid Build Coastguard Worker vpx_start_encode(&bw, bw_buffer, sizeof(bw_buffer));
57*fb1b10abSAndroid Build Coastguard Worker
58*fb1b10abSAndroid Build Coastguard Worker int bit = (bit_method == 0) ? 0 : (bit_method == 1) ? 1 : 0;
59*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < kBitsToTest; ++i) {
60*fb1b10abSAndroid Build Coastguard Worker if (bit_method == 2) {
61*fb1b10abSAndroid Build Coastguard Worker bit = (i & 1);
62*fb1b10abSAndroid Build Coastguard Worker } else if (bit_method == 3) {
63*fb1b10abSAndroid Build Coastguard Worker bit = bit_rnd(2);
64*fb1b10abSAndroid Build Coastguard Worker }
65*fb1b10abSAndroid Build Coastguard Worker vpx_write(&bw, bit, static_cast<int>(probas[i]));
66*fb1b10abSAndroid Build Coastguard Worker }
67*fb1b10abSAndroid Build Coastguard Worker
68*fb1b10abSAndroid Build Coastguard Worker GTEST_ASSERT_EQ(vpx_stop_encode(&bw), 0);
69*fb1b10abSAndroid Build Coastguard Worker // vpx_reader_fill() may read into uninitialized data that
70*fb1b10abSAndroid Build Coastguard Worker // isn't used meaningfully, but may trigger an MSan warning.
71*fb1b10abSAndroid Build Coastguard Worker memset(bw_buffer + bw.pos, 0, sizeof(BD_VALUE) - 1);
72*fb1b10abSAndroid Build Coastguard Worker
73*fb1b10abSAndroid Build Coastguard Worker // First bit should be zero
74*fb1b10abSAndroid Build Coastguard Worker GTEST_ASSERT_EQ(bw_buffer[0] & 0x80, 0);
75*fb1b10abSAndroid Build Coastguard Worker
76*fb1b10abSAndroid Build Coastguard Worker vpx_reader br;
77*fb1b10abSAndroid Build Coastguard Worker vpx_reader_init(&br, bw_buffer, kBufferSize, nullptr, nullptr);
78*fb1b10abSAndroid Build Coastguard Worker bit_rnd.Reset(random_seed);
79*fb1b10abSAndroid Build Coastguard Worker for (int i = 0; i < kBitsToTest; ++i) {
80*fb1b10abSAndroid Build Coastguard Worker if (bit_method == 2) {
81*fb1b10abSAndroid Build Coastguard Worker bit = (i & 1);
82*fb1b10abSAndroid Build Coastguard Worker } else if (bit_method == 3) {
83*fb1b10abSAndroid Build Coastguard Worker bit = bit_rnd(2);
84*fb1b10abSAndroid Build Coastguard Worker }
85*fb1b10abSAndroid Build Coastguard Worker GTEST_ASSERT_EQ(vpx_read(&br, probas[i]), bit)
86*fb1b10abSAndroid Build Coastguard Worker << "pos: " << i << " / " << kBitsToTest
87*fb1b10abSAndroid Build Coastguard Worker << " bit_method: " << bit_method << " method: " << method;
88*fb1b10abSAndroid Build Coastguard Worker }
89*fb1b10abSAndroid Build Coastguard Worker }
90*fb1b10abSAndroid Build Coastguard Worker }
91*fb1b10abSAndroid Build Coastguard Worker }
92*fb1b10abSAndroid Build Coastguard Worker }
93*fb1b10abSAndroid Build Coastguard Worker
TEST(VP9,TestBitIOBufferSize0)94*fb1b10abSAndroid Build Coastguard Worker TEST(VP9, TestBitIOBufferSize0) {
95*fb1b10abSAndroid Build Coastguard Worker vpx_writer bw;
96*fb1b10abSAndroid Build Coastguard Worker uint8_t bw_buffer[1];
97*fb1b10abSAndroid Build Coastguard Worker vpx_start_encode(&bw, bw_buffer, 0);
98*fb1b10abSAndroid Build Coastguard Worker GTEST_ASSERT_EQ(vpx_stop_encode(&bw), -1);
99*fb1b10abSAndroid Build Coastguard Worker }
100*fb1b10abSAndroid Build Coastguard Worker
TEST(VP9,TestBitIOBufferSize1)101*fb1b10abSAndroid Build Coastguard Worker TEST(VP9, TestBitIOBufferSize1) {
102*fb1b10abSAndroid Build Coastguard Worker vpx_writer bw;
103*fb1b10abSAndroid Build Coastguard Worker uint8_t bw_buffer[1];
104*fb1b10abSAndroid Build Coastguard Worker vpx_start_encode(&bw, bw_buffer, sizeof(bw_buffer));
105*fb1b10abSAndroid Build Coastguard Worker GTEST_ASSERT_EQ(vpx_stop_encode(&bw), -1);
106*fb1b10abSAndroid Build Coastguard Worker }
107*fb1b10abSAndroid Build Coastguard Worker
TEST(VP9,TestBitIOBufferSize2)108*fb1b10abSAndroid Build Coastguard Worker TEST(VP9, TestBitIOBufferSize2) {
109*fb1b10abSAndroid Build Coastguard Worker vpx_writer bw;
110*fb1b10abSAndroid Build Coastguard Worker uint8_t bw_buffer[2];
111*fb1b10abSAndroid Build Coastguard Worker vpx_start_encode(&bw, bw_buffer, sizeof(bw_buffer));
112*fb1b10abSAndroid Build Coastguard Worker GTEST_ASSERT_EQ(vpx_stop_encode(&bw), 0);
113*fb1b10abSAndroid Build Coastguard Worker }
114