| /* | 
 |  * Copyright (c) 2025, Alliance for Open Media. All rights reserved. | 
 |  * | 
 |  * This source code is subject to the terms of the BSD 2 Clause License and | 
 |  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License | 
 |  * was not distributed with this source code in the LICENSE file, you can | 
 |  * obtain it at www.aomedia.org/license/software. If the Alliance for Open | 
 |  * Media Patent License 1.0 was not distributed with this source code in the | 
 |  * PATENTS file, you can obtain it at www.aomedia.org/license/patent. | 
 |  */ | 
 |  | 
 | #include <cstdint> | 
 |  | 
 | #include "gtest/gtest.h" | 
 |  | 
 | #include "aom_dsp/bitwriter_buffer.h" | 
 |  | 
 | namespace { | 
 |  | 
 | // Test the examples in Table 25 in ITU-T H.274 (V3) (09/2023) and a few more. | 
 | // | 
 | // Bit string    codeNum | 
 | //     1            0 | 
 | //    010           1 | 
 | //    011           2 | 
 | //   00100          3 | 
 | //   00101          4 | 
 | //   00110          5 | 
 | //   00111          6 | 
 | //  0001000         7 | 
 | //  0001001         8 | 
 | //  0001010         9 | 
 | //  0001011        10 | 
 | //  0001100        11 | 
 | //  0001101        12 | 
 | //  0001110        13 | 
 | //  0001111        14 | 
 | TEST(BitwriterBufferTest, UvlcOneByte) { | 
 |   static constexpr struct { | 
 |     uint32_t bit_offset; | 
 |     uint8_t byte; | 
 |   } kExpected[] = { | 
 |     { 1, 0x80 },  // 0 | 
 |     { 3, 0x40 },  // 1 | 
 |     { 3, 0x60 },  // 2 | 
 |     { 5, 0x20 },  // 3 | 
 |     { 5, 0x28 },  // 4 | 
 |     { 5, 0x30 },  // 5 | 
 |     { 5, 0x38 },  // 6 | 
 |     { 7, 0x10 },  // 7 | 
 |     { 7, 0x12 },  // 8 | 
 |     { 7, 0x14 },  // 9 | 
 |     { 7, 0x16 },  // 10 | 
 |     { 7, 0x18 },  // 11 | 
 |     { 7, 0x1a },  // 12 | 
 |     { 7, 0x1c },  // 13 | 
 |     { 7, 0x1e },  // 14 | 
 |   }; | 
 |   uint8_t dst[1]; | 
 |  | 
 |   for (int i = 0; i < 15; i++) { | 
 |     struct aom_write_bit_buffer wb = { dst, 0 }; | 
 |     aom_wb_write_uvlc(&wb, i); | 
 |     ASSERT_EQ(wb.bit_offset, kExpected[i].bit_offset); | 
 |     EXPECT_EQ(wb.bit_buffer[0], kExpected[i].byte); | 
 |   } | 
 | } | 
 |  | 
 | // Tests two values with the maximum number (31) of leading zero bits. | 
 | TEST(BitwriterBufferTest, Uvlc31LeadingZeros) { | 
 |   uint8_t dst[8]; | 
 |  | 
 |   // 2^31 - 1 | 
 |   { | 
 |     struct aom_write_bit_buffer wb = { dst, 0 }; | 
 |     aom_wb_write_uvlc(&wb, 0x7fffffff); | 
 |     ASSERT_EQ(wb.bit_offset, 63u); | 
 |     EXPECT_EQ(wb.bit_buffer[0], 0x00); | 
 |     EXPECT_EQ(wb.bit_buffer[1], 0x00); | 
 |     EXPECT_EQ(wb.bit_buffer[2], 0x00); | 
 |     EXPECT_EQ(wb.bit_buffer[3], 0x01); | 
 |     EXPECT_EQ(wb.bit_buffer[4], 0x00); | 
 |     EXPECT_EQ(wb.bit_buffer[5], 0x00); | 
 |     EXPECT_EQ(wb.bit_buffer[6], 0x00); | 
 |     EXPECT_EQ(wb.bit_buffer[7], 0x00); | 
 |   } | 
 |  | 
 |   // 2^32 - 2 | 
 |   { | 
 |     struct aom_write_bit_buffer wb = { dst, 0 }; | 
 |     aom_wb_write_uvlc(&wb, 0xfffffffe); | 
 |     ASSERT_EQ(wb.bit_offset, 63u); | 
 |     EXPECT_EQ(wb.bit_buffer[0], 0x00); | 
 |     EXPECT_EQ(wb.bit_buffer[1], 0x00); | 
 |     EXPECT_EQ(wb.bit_buffer[2], 0x00); | 
 |     EXPECT_EQ(wb.bit_buffer[3], 0x01); | 
 |     EXPECT_EQ(wb.bit_buffer[4], 0xff); | 
 |     EXPECT_EQ(wb.bit_buffer[5], 0xff); | 
 |     EXPECT_EQ(wb.bit_buffer[6], 0xff); | 
 |     EXPECT_EQ(wb.bit_buffer[7], 0xfe); | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace |