/*
* 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 , 0 x80 }, // 0
{ 3 , 0 x40 }, // 1
{ 3 , 0 x60 }, // 2
{ 5 , 0 x20 }, // 3
{ 5 , 0 x28 }, // 4
{ 5 , 0 x30 }, // 5
{ 5 , 0 x38 }, // 6
{ 7 , 0 x10 }, // 7
{ 7 , 0 x12 }, // 8
{ 7 , 0 x14 }, // 9
{ 7 , 0 x16 }, // 10
{ 7 , 0 x18 }, // 11
{ 7 , 0 x1a }, // 12
{ 7 , 0 x1c }, // 13
{ 7 , 0 x1e }, // 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, 0 x7fffffff);
ASSERT_EQ(wb.bit_offset, 63 u);
EXPECT_EQ(wb.bit_buffer[0 ], 0 x00);
EXPECT_EQ(wb.bit_buffer[1 ], 0 x00);
EXPECT_EQ(wb.bit_buffer[2 ], 0 x00);
EXPECT_EQ(wb.bit_buffer[3 ], 0 x01);
EXPECT_EQ(wb.bit_buffer[4 ], 0 x00);
EXPECT_EQ(wb.bit_buffer[5 ], 0 x00);
EXPECT_EQ(wb.bit_buffer[6 ], 0 x00);
EXPECT_EQ(wb.bit_buffer[7 ], 0 x00);
}
// 2^32 - 2
{
struct aom_write_bit_buffer wb = { dst, 0 };
aom_wb_write_uvlc(&wb, 0 xfffffffe);
ASSERT_EQ(wb.bit_offset, 63 u);
EXPECT_EQ(wb.bit_buffer[0 ], 0 x00);
EXPECT_EQ(wb.bit_buffer[1 ], 0 x00);
EXPECT_EQ(wb.bit_buffer[2 ], 0 x00);
EXPECT_EQ(wb.bit_buffer[3 ], 0 x01);
EXPECT_EQ(wb.bit_buffer[4 ], 0 xff);
EXPECT_EQ(wb.bit_buffer[5 ], 0 xff);
EXPECT_EQ(wb.bit_buffer[6 ], 0 xff);
EXPECT_EQ(wb.bit_buffer[7 ], 0 xfe);
}
}
} // namespace
Messung V0.5 in Prozent C=81 H=91 G=85
¤ Dauer der Verarbeitung: 0.3 Sekunden
¤
*© Formatika GbR, Deutschland