15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/bit_reader.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void SetBit(uint8* buf, size_t size, size_t bit_pos) { 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t byte_pos = bit_pos / 8; 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bit_pos -= byte_pos * 8; 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_LT(byte_pos, size); 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buf[byte_pos] |= (1 << (7 - bit_pos)); 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(BitReaderTest, NormalOperationTest) { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 value8; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64 value64; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0101 0101 1001 1001 repeats 4 times 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 buffer[] = {0x55, 0x99, 0x55, 0x99, 0x55, 0x99, 0x55, 0x99}; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BitReader reader1(buffer, 6); // Initialize with 6 bytes only 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader1.ReadBits(1, &value8)); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value8, 0); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader1.ReadBits(8, &value8)); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value8, 0xab); // 1010 1011 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader1.ReadBits(7, &value64)); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader1.ReadBits(32, &value64)); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value64, 0x55995599u); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(reader1.ReadBits(1, &value8)); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value8 = 0xff; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader1.ReadBits(0, &value8)); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value8, 0); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BitReader reader2(buffer, 8); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader2.ReadBits(64, &value64)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(value64, 0x5599559955995599ull); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(reader2.ReadBits(1, &value8)); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader2.ReadBits(0, &value8)); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(BitReaderTest, ReadBeyondEndTest) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 value8; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8 buffer[] = {0x12}; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BitReader reader1(buffer, sizeof(buffer)); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader1.ReadBits(4, &value8)); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(reader1.ReadBits(5, &value8)); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(reader1.ReadBits(1, &value8)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(reader1.ReadBits(0, &value8)); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(BitReaderTest, SkipBitsTest) { 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8 value8; 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) uint8 buffer[] = { 0x0a, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) BitReader reader1(buffer, sizeof(buffer)); 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(reader1.SkipBits(2)); 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(reader1.ReadBits(3, &value8)); 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(value8, 1); 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(reader1.SkipBits(11)); 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(reader1.ReadBits(8, &value8)); 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(value8, 3); 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(reader1.SkipBits(76)); 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(reader1.ReadBits(4, &value8)); 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(value8, 13); 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(reader1.SkipBits(100)); 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(reader1.SkipBits(0)); 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_FALSE(reader1.SkipBits(1)); 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(BitReaderTest, VariableSkipBitsTest) { 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint8 buffer[256] = {0}; 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The test alternates between ReadBits and SkipBits. 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The first number is the number of bits to read, the second one is the 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // number of bits to skip. The number of bits to read was arbitrarily chosen 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // while the number of bits to skip was chosen so as to cover from small skips 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // to large skips. 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const size_t pattern_read_skip[][2] = { 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 5, 17 }, 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 4, 34 }, 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 0, 44 }, 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 3, 4 }, // Note: aligned read. 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 7, 7 }, // Note: both read&skip cross byte boundary. 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 17, 68 }, 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 7, 102 }, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 9, 204 }, 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 3, 408 } }; 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Set bits to one only for the first and last bit of each read 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // in the pattern. 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t pos = 0; 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t k = 0; k < arraysize(pattern_read_skip); ++k) { 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const size_t read_bit_count = pattern_read_skip[k][0]; 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (read_bit_count > 0) { 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetBit(buffer, sizeof(buffer), pos); 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetBit(buffer, sizeof(buffer), pos + read_bit_count - 1); 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pos += read_bit_count; 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pos += pattern_read_skip[k][1]; 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Run the test. 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BitReader bit_reader(buffer, sizeof(buffer)); 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(bit_reader.bits_available(), static_cast<int>(sizeof(buffer) * 8)); 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t k = 0; k < arraysize(pattern_read_skip); ++k) { 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const size_t read_bit_count = pattern_read_skip[k][0]; 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (read_bit_count > 0) { 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int value; 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(bit_reader.ReadBits(read_bit_count, &value)); 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(value, 1 | (1 << (read_bit_count - 1))); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(bit_reader.SkipBits(pattern_read_skip[k][1])); 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST(BitReaderTest, BitsReadTest) { 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int value; 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool flag; 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8 buffer[] = { 0x0a, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BitReader reader1(buffer, sizeof(buffer)); 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(reader1.bits_available(), 120); 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(reader1.SkipBits(2)); 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(reader1.bits_read(), 2); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(reader1.bits_available(), 118); 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(reader1.ReadBits(3, &value)); 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(reader1.bits_read(), 5); 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(reader1.bits_available(), 115); 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(reader1.ReadFlag(&flag)); 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(reader1.bits_read(), 6); 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(reader1.bits_available(), 114); 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(reader1.SkipBits(76)); 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(reader1.bits_read(), 82); 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(reader1.bits_available(), 38); 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 142