blob: 5474e82ade71584c69331bc44ede7d2d482043e1 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/media/audio/lib/format2/sample_converter.h"
#include <limits>
#include <vector>
#include <gtest/gtest.h>
namespace media_audio {
namespace {
TEST(SampleConverterTest, Unsigned8) {
const std::vector<uint8_t> unsigned8_samples = {0x00, 0x40, 0x80, 0xE0};
const std::vector<float> float_samples = {-1.0f, -0.5f, 0.0f, 0.75f};
for (int i = 0; i < static_cast<int>(unsigned8_samples.size()); ++i) {
const uint8_t unsigned8_sample = unsigned8_samples[i];
const float float_sample = float_samples[i];
EXPECT_EQ(SampleConverter<uint8_t>::FromFloat(float_sample), unsigned8_sample);
EXPECT_FLOAT_EQ(SampleConverter<uint8_t>::ToFloat(unsigned8_sample), float_sample);
// Back and forth conversions.
EXPECT_EQ(
SampleConverter<uint8_t>::FromFloat(SampleConverter<uint8_t>::ToFloat(unsigned8_sample)),
unsigned8_sample);
EXPECT_FLOAT_EQ(
SampleConverter<uint8_t>::ToFloat(SampleConverter<uint8_t>::FromFloat(float_sample)),
float_sample);
}
// Should be normalized.
EXPECT_EQ(SampleConverter<uint8_t>::FromFloat(5.5f), 0xFF);
EXPECT_EQ(SampleConverter<uint8_t>::FromFloat(-1.1f), 0x00);
EXPECT_LT(SampleConverter<uint8_t>::ToFloat(0xFF), 1.0f);
EXPECT_GT(SampleConverter<uint8_t>::ToFloat(0xFF), 0.99f);
}
TEST(SampleConverterTest, Signed16) {
const std::vector<int16_t> signed16_samples = {kMinInt16, -0x4000, 0, 0x6000};
const std::vector<float> float_samples = {-1.0f, -0.5f, 0.0f, 0.75f};
for (int i = 0; i < static_cast<int>(signed16_samples.size()); ++i) {
const int16_t signed16_sample = signed16_samples[i];
const float float_sample = float_samples[i];
EXPECT_EQ(SampleConverter<int16_t>::FromFloat(float_sample), signed16_sample);
EXPECT_FLOAT_EQ(SampleConverter<int16_t>::ToFloat(signed16_sample), float_sample);
// Back and forth conversions.
EXPECT_EQ(
SampleConverter<int16_t>::FromFloat(SampleConverter<int16_t>::ToFloat(signed16_sample)),
signed16_sample);
EXPECT_FLOAT_EQ(
SampleConverter<int16_t>::ToFloat(SampleConverter<int16_t>::FromFloat(float_sample)),
float_sample);
}
// Should be normalized.
EXPECT_EQ(SampleConverter<int16_t>::FromFloat(5.5f), kMaxInt16);
EXPECT_EQ(SampleConverter<int16_t>::FromFloat(-1.1f), kMinInt16);
EXPECT_LT(SampleConverter<int16_t>::ToFloat(kMaxInt16), 1.0f);
EXPECT_GT(SampleConverter<int16_t>::ToFloat(kMaxInt16), 0.9999f);
}
TEST(SampleConverterTest, Signed24In32) {
const std::vector<int32_t> signed24in32_samples = {kMinInt24In32, -0x40000000, 0, 0x60000000};
const std::vector<float> float_samples = {-1.0f, -0.5f, 0.0f, 0.75f};
for (int i = 0; i < static_cast<int>(signed24in32_samples.size()); ++i) {
const int32_t signed24in32_sample = signed24in32_samples[i];
const float float_sample = float_samples[i];
EXPECT_EQ(SampleConverter<int32_t>::FromFloat(float_sample), signed24in32_sample);
EXPECT_FLOAT_EQ(SampleConverter<int32_t>::ToFloat(signed24in32_sample), float_sample);
// Back and forth conversions.
EXPECT_EQ(
SampleConverter<int32_t>::FromFloat(SampleConverter<int32_t>::ToFloat(signed24in32_sample)),
signed24in32_sample);
EXPECT_FLOAT_EQ(
SampleConverter<int32_t>::ToFloat(SampleConverter<int32_t>::FromFloat(float_sample)),
float_sample);
}
// Should be normalized.
EXPECT_EQ(SampleConverter<int32_t>::FromFloat(5.5f), kMaxInt24In32);
EXPECT_EQ(SampleConverter<int32_t>::FromFloat(-1.1f), kMinInt24In32);
EXPECT_LT(SampleConverter<int32_t>::ToFloat(kMaxInt24In32), 1.0f);
EXPECT_GT(SampleConverter<int32_t>::ToFloat(kMaxInt24In32), 0.999999f);
}
TEST(SampleConverterTest, Float) {
const std::vector<float> samples = {-1.0f, -0.5f, 0.0f, 0.75f, 1.0f};
for (const float sample : samples) {
EXPECT_FLOAT_EQ(SampleConverter<float>::FromFloat(sample), sample);
EXPECT_FLOAT_EQ(SampleConverter<float>::ToFloat(sample), sample);
// Back and forth conversions.
EXPECT_FLOAT_EQ(SampleConverter<float>::FromFloat(SampleConverter<float>::ToFloat(sample)),
sample);
EXPECT_FLOAT_EQ(SampleConverter<float>::ToFloat(SampleConverter<float>::FromFloat(sample)),
sample);
}
// Should be normalized.
EXPECT_FLOAT_EQ(SampleConverter<float>::FromFloat(5.5f), 1.0f);
EXPECT_FLOAT_EQ(SampleConverter<float>::FromFloat(-1.1f), -1.0f);
EXPECT_FLOAT_EQ(SampleConverter<float>::ToFloat(5.5f), 5.5f);
EXPECT_FLOAT_EQ(SampleConverter<float>::ToFloat(-1.1f), -1.1f);
}
} // namespace
} // namespace media_audio