1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "media/parsers/vp8_bool_decoder.h"
6 
7 #include <stddef.h>
8 #include <stdint.h>
9 
10 #include <limits>
11 
12 #include "base/macros.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 
15 namespace media {
16 
17 const static size_t NUM_BITS_TO_TEST = 100;
18 
19 namespace {
20 
21 // 100 zeros with probability of 0x80.
22 const uint8_t kDataZerosAndEvenProbabilities[] = {
23     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
24     0x00, 0x00, 0x00};
25 
26 // 100 ones with probability of 0x80.
27 const uint8_t kDataOnesAndEvenProbabilities[] = {
28     0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
29     0xff, 0xf0, 0x20};
30 
31 // [0, 1, 0, 1, ..., 1] with probability [0, 1, 2, 3, ..., 99].
32 const uint8_t kDataParitiesAndIncreasingProbabilities[] = {
33     0x00, 0x02, 0x08, 0x31, 0x8e, 0xca, 0xab, 0xe2, 0xc8, 0x31, 0x12,
34     0xb3, 0x2c, 0x19, 0x90, 0xc6, 0x6a, 0xeb, 0x17, 0x52, 0x30};
35 
36 }  // namespace
37 
38 class Vp8BoolDecoderTest : public ::testing::Test {
39  public:
40   Vp8BoolDecoderTest() = default;
41 
42  protected:
43   // Fixture member, the bool decoder to be tested.
44   Vp8BoolDecoder bd_;
45 
46  private:
47   DISALLOW_COPY_AND_ASSIGN(Vp8BoolDecoderTest);
48 };
49 
50 #define INITIALIZE(data) ASSERT_TRUE(bd_.Initialize(data, sizeof(data)));
51 
TEST_F(Vp8BoolDecoderTest,DecodeBoolsWithZerosAndEvenProbabilities)52 TEST_F(Vp8BoolDecoderTest, DecodeBoolsWithZerosAndEvenProbabilities) {
53   INITIALIZE(kDataZerosAndEvenProbabilities);
54   ASSERT_EQ(0u, bd_.BitOffset());
55   for (size_t i = 0; i < NUM_BITS_TO_TEST; ++i) {
56     bool out = true;
57     ASSERT_TRUE(bd_.ReadBool(&out, 0x80));
58     ASSERT_FALSE(out);
59     ASSERT_EQ(i, bd_.BitOffset());
60   }
61 }
62 
TEST_F(Vp8BoolDecoderTest,DecodeLiteralsWithZerosAndEvenProbabilities)63 TEST_F(Vp8BoolDecoderTest, DecodeLiteralsWithZerosAndEvenProbabilities) {
64   INITIALIZE(kDataZerosAndEvenProbabilities);
65 
66   int value = 1;
67   ASSERT_TRUE(bd_.ReadLiteral(1, &value));
68   ASSERT_EQ(0, value);
69 
70   value = 1;
71   ASSERT_TRUE(bd_.ReadLiteral(32, &value));
72   ASSERT_EQ(0, value);
73 
74   value = 1;
75   ASSERT_TRUE(bd_.ReadLiteralWithSign(1, &value));
76   ASSERT_EQ(0, value);
77 
78   value = 1;
79   ASSERT_TRUE(bd_.ReadLiteralWithSign(31, &value));
80   ASSERT_EQ(0, value);
81 }
82 
TEST_F(Vp8BoolDecoderTest,DecodeBoolsWithOnesAndEvenProbabilities)83 TEST_F(Vp8BoolDecoderTest, DecodeBoolsWithOnesAndEvenProbabilities) {
84   INITIALIZE(kDataOnesAndEvenProbabilities);
85 
86   ASSERT_EQ(0u, bd_.BitOffset());
87   for (size_t i = 0; i < NUM_BITS_TO_TEST; ++i) {
88     bool out = false;
89     ASSERT_TRUE(bd_.ReadBool(&out, 0x80));
90     ASSERT_TRUE(out);
91     ASSERT_EQ(i + 1, bd_.BitOffset());
92   }
93 }
94 
TEST_F(Vp8BoolDecoderTest,DecodeLiteralsWithOnesAndEvenProbabilities)95 TEST_F(Vp8BoolDecoderTest, DecodeLiteralsWithOnesAndEvenProbabilities) {
96   INITIALIZE(kDataOnesAndEvenProbabilities);
97 
98   int value = 0;
99   ASSERT_TRUE(bd_.ReadLiteral(1, &value));
100   EXPECT_EQ(1, value);
101 
102   value = 0;
103   ASSERT_TRUE(bd_.ReadLiteral(31, &value));
104   EXPECT_EQ(0x7FFFFFFF, value);
105 
106   value = 0;
107   ASSERT_TRUE(bd_.ReadLiteralWithSign(1, &value));
108   EXPECT_EQ(-1, value);
109 
110   value = 0;
111   ASSERT_TRUE(bd_.ReadLiteralWithSign(31, &value));
112   EXPECT_EQ(-0x7FFFFFFF, value);
113 }
114 
TEST_F(Vp8BoolDecoderTest,DecodeBoolsWithParitiesAndIncreasingProbabilities)115 TEST_F(Vp8BoolDecoderTest, DecodeBoolsWithParitiesAndIncreasingProbabilities) {
116   INITIALIZE(kDataParitiesAndIncreasingProbabilities);
117 
118   for (size_t i = 0; i < NUM_BITS_TO_TEST; ++i) {
119     bool out = !(i & 1);
120     ASSERT_LE(i, std::numeric_limits<uint8_t>::max());
121     ASSERT_TRUE(bd_.ReadBool(&out, static_cast<uint8_t>(i)));
122     EXPECT_EQ(out, !!(i & 1));
123   }
124 }
125 
126 }  // namespace media
127