OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/base/bit_reader.h" | 5 #include "media/base/bit_reader.h" |
6 | 6 |
7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
8 | 8 |
9 namespace media { | 9 namespace media { |
10 | 10 |
| 11 static void SetBit(uint8* buf, size_t size, size_t bit_pos) { |
| 12 size_t byte_pos = bit_pos / 8; |
| 13 bit_pos -= byte_pos * 8; |
| 14 DCHECK_LT(byte_pos, size); |
| 15 buf[byte_pos] |= (1 << (7 - bit_pos)); |
| 16 } |
| 17 |
11 TEST(BitReaderTest, NormalOperationTest) { | 18 TEST(BitReaderTest, NormalOperationTest) { |
12 uint8 value8; | 19 uint8 value8; |
13 uint64 value64; | 20 uint64 value64; |
14 // 0101 0101 1001 1001 repeats 4 times | 21 // 0101 0101 1001 1001 repeats 4 times |
15 uint8 buffer[] = {0x55, 0x99, 0x55, 0x99, 0x55, 0x99, 0x55, 0x99}; | 22 uint8 buffer[] = {0x55, 0x99, 0x55, 0x99, 0x55, 0x99, 0x55, 0x99}; |
16 BitReader reader1(buffer, 6); // Initialize with 6 bytes only | 23 BitReader reader1(buffer, 6); // Initialize with 6 bytes only |
17 | 24 |
18 EXPECT_TRUE(reader1.ReadBits(1, &value8)); | 25 EXPECT_TRUE(reader1.ReadBits(1, &value8)); |
19 EXPECT_EQ(value8, 0); | 26 EXPECT_EQ(value8, 0); |
20 EXPECT_TRUE(reader1.ReadBits(8, &value8)); | 27 EXPECT_TRUE(reader1.ReadBits(8, &value8)); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 EXPECT_TRUE(reader1.ReadBits(8, &value8)); | 64 EXPECT_TRUE(reader1.ReadBits(8, &value8)); |
58 EXPECT_EQ(value8, 3); | 65 EXPECT_EQ(value8, 3); |
59 EXPECT_TRUE(reader1.SkipBits(76)); | 66 EXPECT_TRUE(reader1.SkipBits(76)); |
60 EXPECT_TRUE(reader1.ReadBits(4, &value8)); | 67 EXPECT_TRUE(reader1.ReadBits(4, &value8)); |
61 EXPECT_EQ(value8, 13); | 68 EXPECT_EQ(value8, 13); |
62 EXPECT_FALSE(reader1.SkipBits(100)); | 69 EXPECT_FALSE(reader1.SkipBits(100)); |
63 EXPECT_TRUE(reader1.SkipBits(0)); | 70 EXPECT_TRUE(reader1.SkipBits(0)); |
64 EXPECT_FALSE(reader1.SkipBits(1)); | 71 EXPECT_FALSE(reader1.SkipBits(1)); |
65 } | 72 } |
66 | 73 |
| 74 TEST(BitReaderTest, VariableSkipBitsTest) { |
| 75 uint8 buffer[256] = {0}; |
| 76 |
| 77 // The test alternates between ReadBits and SkipBits. |
| 78 // The first number is the number of bits to read, the second one is the |
| 79 // number of bits to skip. The number of bits to read was arbitrarily chosen |
| 80 // while the number of bits to skip was chosen so as to cover from small skips |
| 81 // to large skips. |
| 82 const size_t pattern_read_skip[][2] = { |
| 83 { 5, 17 }, |
| 84 { 4, 34 }, |
| 85 { 0, 44 }, |
| 86 { 3, 4 }, // Note: aligned read. |
| 87 { 7, 7 }, // Note: both read&skip cross byte boundary. |
| 88 { 17, 68 }, |
| 89 { 7, 102 }, |
| 90 { 9, 204 }, |
| 91 { 3, 408 } }; |
| 92 |
| 93 // Set bits to one only for the first and last bit of each read |
| 94 // in the pattern. |
| 95 size_t pos = 0; |
| 96 for (size_t k = 0; k < arraysize(pattern_read_skip); ++k) { |
| 97 const size_t read_bit_count = pattern_read_skip[k][0]; |
| 98 if (read_bit_count > 0) { |
| 99 SetBit(buffer, sizeof(buffer), pos); |
| 100 SetBit(buffer, sizeof(buffer), pos + read_bit_count - 1); |
| 101 pos += read_bit_count; |
| 102 } |
| 103 pos += pattern_read_skip[k][1]; |
| 104 } |
| 105 |
| 106 // Run the test. |
| 107 BitReader bit_reader(buffer, sizeof(buffer)); |
| 108 EXPECT_EQ(bit_reader.bits_available(), static_cast<int>(sizeof(buffer) * 8)); |
| 109 for (size_t k = 0; k < arraysize(pattern_read_skip); ++k) { |
| 110 const size_t read_bit_count = pattern_read_skip[k][0]; |
| 111 if (read_bit_count > 0) { |
| 112 int value; |
| 113 EXPECT_TRUE(bit_reader.ReadBits(read_bit_count, &value)); |
| 114 EXPECT_EQ(value, 1 | (1 << (read_bit_count - 1))); |
| 115 } |
| 116 EXPECT_TRUE(bit_reader.SkipBits(pattern_read_skip[k][1])); |
| 117 } |
| 118 } |
| 119 |
67 TEST(BitReaderTest, BitsReadTest) { | 120 TEST(BitReaderTest, BitsReadTest) { |
68 int value; | 121 int value; |
69 bool flag; | 122 bool flag; |
70 uint8 buffer[] = { 0x0a, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; | 123 uint8 buffer[] = { 0x0a, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; |
71 BitReader reader1(buffer, sizeof(buffer)); | 124 BitReader reader1(buffer, sizeof(buffer)); |
72 EXPECT_EQ(reader1.bits_available(), 120); | 125 EXPECT_EQ(reader1.bits_available(), 120); |
73 | 126 |
74 EXPECT_TRUE(reader1.SkipBits(2)); | 127 EXPECT_TRUE(reader1.SkipBits(2)); |
75 EXPECT_EQ(reader1.bits_read(), 2); | 128 EXPECT_EQ(reader1.bits_read(), 2); |
76 EXPECT_EQ(reader1.bits_available(), 118); | 129 EXPECT_EQ(reader1.bits_available(), 118); |
77 EXPECT_TRUE(reader1.ReadBits(3, &value)); | 130 EXPECT_TRUE(reader1.ReadBits(3, &value)); |
78 EXPECT_EQ(reader1.bits_read(), 5); | 131 EXPECT_EQ(reader1.bits_read(), 5); |
79 EXPECT_EQ(reader1.bits_available(), 115); | 132 EXPECT_EQ(reader1.bits_available(), 115); |
80 EXPECT_TRUE(reader1.ReadFlag(&flag)); | 133 EXPECT_TRUE(reader1.ReadFlag(&flag)); |
81 EXPECT_EQ(reader1.bits_read(), 6); | 134 EXPECT_EQ(reader1.bits_read(), 6); |
82 EXPECT_EQ(reader1.bits_available(), 114); | 135 EXPECT_EQ(reader1.bits_available(), 114); |
83 EXPECT_TRUE(reader1.SkipBits(76)); | 136 EXPECT_TRUE(reader1.SkipBits(76)); |
84 EXPECT_EQ(reader1.bits_read(), 82); | 137 EXPECT_EQ(reader1.bits_read(), 82); |
85 EXPECT_EQ(reader1.bits_available(), 38); | 138 EXPECT_EQ(reader1.bits_available(), 38); |
86 } | 139 } |
87 | 140 |
88 } // namespace media | 141 } // namespace media |
OLD | NEW |