h264_bitstream_buffer_unittest.cc 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright 2014 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. #include <stdint.h>
  5. #include "base/bits.h"
  6. #include "media/filters/h264_bitstream_buffer.h"
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. namespace media {
  9. namespace {
  10. const uint64_t kTestPattern = 0xfedcba0987654321;
  11. uint64_t GetDataFromBuffer(const uint8_t* ptr, uint64_t num_bits) {
  12. uint64_t got = 0;
  13. while (num_bits > 8) {
  14. got |= (*ptr & 0xff);
  15. num_bits -= 8;
  16. got <<= (num_bits > 8 ? 8 : num_bits);
  17. ptr++;
  18. }
  19. if (num_bits > 0) {
  20. uint64_t temp = (*ptr & 0xff);
  21. temp >>= (8 - num_bits);
  22. got |= temp;
  23. }
  24. return got;
  25. }
  26. }
  27. class H264BitstreamBufferAppendBitsTest
  28. : public ::testing::TestWithParam<uint64_t> {};
  29. // TODO(posciak): More tests!
  30. TEST_P(H264BitstreamBufferAppendBitsTest, AppendAndVerifyBits) {
  31. auto b = base::MakeRefCounted<H264BitstreamBuffer>();
  32. uint64_t num_bits = GetParam();
  33. // TODO(posciak): Tests for >64 bits.
  34. ASSERT_LE(num_bits, 64u);
  35. uint64_t num_bytes = base::bits::AlignUp(num_bits, uint64_t{8}) / 8;
  36. b->AppendBits(num_bits, kTestPattern);
  37. b->FlushReg();
  38. EXPECT_EQ(b->BytesInBuffer(), num_bytes);
  39. const uint8_t* ptr = b->data();
  40. uint64_t got = GetDataFromBuffer(ptr, num_bits);
  41. uint64_t expected = kTestPattern;
  42. if (num_bits < 64)
  43. expected &= ((1ull << num_bits) - 1);
  44. EXPECT_EQ(got, expected) << std::hex << "0x" << got << " vs 0x" << expected;
  45. }
  46. TEST_F(H264BitstreamBufferAppendBitsTest, VerifyFlushAndBitsInBuffer) {
  47. auto b = base::MakeRefCounted<H264BitstreamBuffer>();
  48. uint64_t num_bits = 20;
  49. uint64_t num_bytes = base::bits::AlignUp(num_bits, uint64_t{8}) / 8;
  50. b->AppendBits(num_bits, kTestPattern);
  51. b->Flush();
  52. EXPECT_EQ(b->BytesInBuffer(), num_bytes);
  53. EXPECT_EQ(b->BitsInBuffer(), num_bits);
  54. const uint8_t* ptr = b->data();
  55. uint64_t got = GetDataFromBuffer(ptr, num_bits);
  56. uint64_t expected = kTestPattern;
  57. expected &= ((1ull << num_bits) - 1);
  58. EXPECT_EQ(got, expected) << std::hex << "0x" << got << " vs 0x" << expected;
  59. }
  60. INSTANTIATE_TEST_SUITE_P(AppendNumBits,
  61. H264BitstreamBufferAppendBitsTest,
  62. ::testing::Range(static_cast<uint64_t>(1),
  63. static_cast<uint64_t>(65)));
  64. } // namespace media