blob: 7c1535b01502ca611d0f7a958ae88fb412dc7df2 [file] [log] [blame]
/*
* Copyright (c) 2018, 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 <stdint.h>
#include "aom/aom_integer.h"
#include "gtest/gtest.h"
namespace {
const uint32_t kSizeTestNumValues = 6;
const uint32_t kSizeTestExpectedSizes[kSizeTestNumValues] = {
1, 1, 2, 3, 4, 5
};
const uint32_t kSizeTestInputs[kSizeTestNumValues] = {
0, 0x7f, 0x3fff, 0x1fffff, 0xffffff, 0x10000000
};
} // namespace
TEST(AomLeb128, DecodeTest) {
const size_t num_leb128_bytes = 3;
const uint8_t leb128_bytes[num_leb128_bytes] = { 0xE5, 0x8E, 0x26 };
const uint32_t expected_value = 0x98765; // 624485
uint32_t value = 0;
aom_uleb_decode(&leb128_bytes[0], num_leb128_bytes, &value);
ASSERT_EQ(expected_value, value);
}
TEST(AomLeb128, EncodeTest) {
const uint32_t test_value = 0x98765; // 624485
const uint32_t expected_value = 0x00E58E26;
const size_t kWriteBufferSize = 4;
uint8_t write_buffer[kWriteBufferSize] = { 0 };
size_t bytes_written = 0;
ASSERT_EQ(aom_uleb_encode(test_value, kWriteBufferSize, &write_buffer[0],
&bytes_written),
0);
ASSERT_EQ(bytes_written, 3u);
uint32_t encoded_value = 0;
for (size_t i = 0; i < bytes_written; ++i) {
const int shift = (int)(bytes_written - 1 - i) * 8;
encoded_value |= write_buffer[i] << shift;
}
ASSERT_EQ(expected_value, encoded_value);
}
TEST(AomLeb128, EncDecTest) {
const uint32_t value = 0x98765; // 624485
const size_t kWriteBufferSize = 4;
uint8_t write_buffer[kWriteBufferSize] = { 0 };
size_t bytes_written = 0;
ASSERT_EQ(aom_uleb_encode(value, kWriteBufferSize, &write_buffer[0],
&bytes_written),
0);
ASSERT_EQ(bytes_written, 3u);
uint32_t decoded_value = 0;
aom_uleb_decode(&write_buffer[0], bytes_written, &decoded_value);
ASSERT_EQ(value, decoded_value);
}
TEST(AomLeb128, FixedSizeEncodeTest) {
const uint32_t test_value = 0x0;
const uint32_t expected_value = 0x00808080;
const size_t kWriteBufferSize = 4;
uint8_t write_buffer[kWriteBufferSize] = { 0 };
size_t bytes_written = 0;
ASSERT_EQ(0, aom_uleb_encode_fixed_size(test_value, kWriteBufferSize,
kWriteBufferSize, &write_buffer[0],
&bytes_written));
ASSERT_EQ(kWriteBufferSize, bytes_written);
uint32_t encoded_value = 0;
for (size_t i = 0; i < bytes_written; ++i) {
const int shift = (int)(bytes_written - 1 - i) * 8;
encoded_value |= write_buffer[i] << shift;
}
ASSERT_EQ(expected_value, encoded_value);
}
TEST(AomLeb128, FixedSizeEncDecTest) {
const uint32_t value = 0x1;
const size_t kWriteBufferSize = 4;
uint8_t write_buffer[kWriteBufferSize] = { 0 };
size_t bytes_written = 0;
ASSERT_EQ(
aom_uleb_encode_fixed_size(value, kWriteBufferSize, kWriteBufferSize,
&write_buffer[0], &bytes_written),
0);
ASSERT_EQ(bytes_written, 4u);
uint32_t decoded_value = 0;
aom_uleb_decode(&write_buffer[0], bytes_written, &decoded_value);
ASSERT_EQ(value, decoded_value);
}
TEST(AomLeb128, SizeTest) {
for (size_t i = 0; i < kSizeTestNumValues; ++i) {
ASSERT_EQ(kSizeTestExpectedSizes[i],
aom_uleb_size_in_bytes(kSizeTestInputs[i]));
}
}
TEST(AomLeb128, FailTest) {
const size_t kWriteBufferSize = 4;
const uint32_t kValidTestValue = 1;
uint8_t write_buffer[kWriteBufferSize] = { 0 };
size_t coded_size = 0;
ASSERT_EQ(
aom_uleb_encode(kValidTestValue, kWriteBufferSize, NULL, &coded_size),
-1);
ASSERT_EQ(aom_uleb_encode(kValidTestValue, kWriteBufferSize, &write_buffer[0],
NULL),
-1);
const uint32_t kValueOutOfRange = 0xFFFFFFFF;
ASSERT_EQ(aom_uleb_encode(kValueOutOfRange, kWriteBufferSize,
&write_buffer[0], &coded_size),
-1);
const size_t kPadSizeOutOfRange = 5;
ASSERT_EQ(aom_uleb_encode_fixed_size(kValidTestValue, kWriteBufferSize,
kPadSizeOutOfRange, &write_buffer[0],
&coded_size),
-1);
}