Chromium Code Reviews| 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]; | |
|
DaleCurtis
2014/09/25 01:25:53
uint8 buffer[256](); will zero initialize IIRC. Mi
damienv1
2014/09/25 01:45:51
Done.
| |
| 76 for (size_t k = 0; k < arraysize(buffer); k++) | |
|
DaleCurtis
2014/09/25 01:25:53
I think you can just use sizeof() here, no? Otherw
damienv1
2014/09/25 01:45:51
I don't think I have to use ARRAYSIZE_UNSAFE. Here
DaleCurtis
2014/09/25 01:50:15
Ah, you're right. arraysize() is fine, my mistake
| |
| 77 buffer[k] = 0; | |
| 78 | |
| 79 // The test alternates between ReadBits and SkipBits. | |
|
DaleCurtis
2014/09/25 01:25:53
Add a comment about how the values were chosen (ar
damienv1
2014/09/25 01:45:51
Done.
| |
| 80 // The first number is the number of bits to read, the second one is the | |
| 81 // number of bits to skip. | |
| 82 size_t pattern_read_skip[][2] = { | |
|
DaleCurtis
2014/09/25 01:25:53
const
damienv1
2014/09/25 01:45:51
Done.
| |
| 83 { 5, 17 }, | |
|
wolenetz
2014/09/25 01:33:56
nit: suggest adding (tiny) read+skip within sequen
damienv1
2014/09/25 01:57:47
Done.
| |
| 84 { 4, 34 }, | |
| 85 { 17, 68 }, | |
| 86 { 7, 102 }, | |
| 87 { 9, 204 }, | |
| 88 { 3, 408 } }; | |
| 89 | |
| 90 // Set bits to one only for the first and last bit of each read | |
| 91 // in the pattern. | |
| 92 size_t pos = 0; | |
| 93 for (size_t k = 0; k < arraysize(pattern_read_skip); k++) { | |
|
DaleCurtis
2014/09/25 01:25:53
++k instead all over this test.
DaleCurtis
2014/09/25 01:25:53
Ditto on arraysize.
damienv1
2014/09/25 01:45:51
Done.
damienv1
2014/09/25 01:45:51
I am not sure there is a convention on primitive t
DaleCurtis
2014/09/25 01:50:15
We definitely prefer ++ for all for(). It is in t
damienv1
2014/09/25 01:59:29
From this style guide:
"For simple scalar (non-obj
| |
| 94 SetBit(buffer, arraysize(buffer), pos); | |
|
wolenetz
2014/09/25 01:33:56
nit: skip the setbits if the read is 0?
damienv1
2014/09/25 01:57:47
Done.
| |
| 95 SetBit(buffer, arraysize(buffer), pos + pattern_read_skip[k][0] - 1); | |
| 96 pos += pattern_read_skip[k][0] + pattern_read_skip[k][1]; | |
| 97 } | |
| 98 | |
| 99 // Run the test. | |
| 100 BitReader bit_reader(buffer, sizeof(buffer)); | |
|
wolenetz
2014/09/25 01:33:56
nit: confirm how many bits should be available?
damienv1
2014/09/25 01:57:47
Done.
| |
| 101 for (size_t k = 0; k < arraysize(pattern_read_skip); k++) { | |
| 102 int value; | |
| 103 EXPECT_TRUE(bit_reader.ReadBits(pattern_read_skip[k][0], &value)); | |
| 104 EXPECT_EQ(value, 1 + (1 << (pattern_read_skip[k][0] - 1))); | |
|
wolenetz
2014/09/25 01:33:56
nit: this will fail for read_skip pattern with rea
damienv1
2014/09/25 01:57:47
Good catch. Thanks.
Done.
| |
| 105 EXPECT_TRUE(bit_reader.SkipBits(pattern_read_skip[k][1])); | |
| 106 } | |
| 107 } | |
| 108 | |
| 67 TEST(BitReaderTest, BitsReadTest) { | 109 TEST(BitReaderTest, BitsReadTest) { |
| 68 int value; | 110 int value; |
| 69 bool flag; | 111 bool flag; |
| 70 uint8 buffer[] = { 0x0a, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; | 112 uint8 buffer[] = { 0x0a, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; |
| 71 BitReader reader1(buffer, sizeof(buffer)); | 113 BitReader reader1(buffer, sizeof(buffer)); |
| 72 EXPECT_EQ(reader1.bits_available(), 120); | 114 EXPECT_EQ(reader1.bits_available(), 120); |
| 73 | 115 |
| 74 EXPECT_TRUE(reader1.SkipBits(2)); | 116 EXPECT_TRUE(reader1.SkipBits(2)); |
| 75 EXPECT_EQ(reader1.bits_read(), 2); | 117 EXPECT_EQ(reader1.bits_read(), 2); |
| 76 EXPECT_EQ(reader1.bits_available(), 118); | 118 EXPECT_EQ(reader1.bits_available(), 118); |
| 77 EXPECT_TRUE(reader1.ReadBits(3, &value)); | 119 EXPECT_TRUE(reader1.ReadBits(3, &value)); |
| 78 EXPECT_EQ(reader1.bits_read(), 5); | 120 EXPECT_EQ(reader1.bits_read(), 5); |
| 79 EXPECT_EQ(reader1.bits_available(), 115); | 121 EXPECT_EQ(reader1.bits_available(), 115); |
| 80 EXPECT_TRUE(reader1.ReadFlag(&flag)); | 122 EXPECT_TRUE(reader1.ReadFlag(&flag)); |
| 81 EXPECT_EQ(reader1.bits_read(), 6); | 123 EXPECT_EQ(reader1.bits_read(), 6); |
| 82 EXPECT_EQ(reader1.bits_available(), 114); | 124 EXPECT_EQ(reader1.bits_available(), 114); |
| 83 EXPECT_TRUE(reader1.SkipBits(76)); | 125 EXPECT_TRUE(reader1.SkipBits(76)); |
| 84 EXPECT_EQ(reader1.bits_read(), 82); | 126 EXPECT_EQ(reader1.bits_read(), 82); |
| 85 EXPECT_EQ(reader1.bits_available(), 38); | 127 EXPECT_EQ(reader1.bits_available(), 38); |
| 86 } | 128 } |
| 87 | 129 |
| 88 } // namespace media | 130 } // namespace media |
| OLD | NEW |