diff options
| author | jacqueline <me@jacqueline.id.au> | 2022-12-03 17:50:59 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2022-12-03 17:50:59 +1100 |
| commit | bf6f9cea20692501d92ac9730359e01edc89de70 (patch) | |
| tree | f3d802f9b25fab6576dc3d01049d89aae2ce571a /src/codecs | |
| parent | 16d5d29049c08e21f57f7928ceedf40586a2d294 (diff) | |
| download | tangara-fw-bf6f9cea20692501d92ac9730359e01edc89de70.tar.gz | |
building codec tests!
Diffstat (limited to 'src/codecs')
| -rw-r--r-- | src/codecs/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/codecs/test/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/codecs/test/test.mp3.hpp | 101 | ||||
| -rw-r--r-- | src/codecs/test/test_mad.cpp | 88 |
4 files changed, 194 insertions, 3 deletions
diff --git a/src/codecs/CMakeLists.txt b/src/codecs/CMakeLists.txt index 9677e459..7807dc3e 100644 --- a/src/codecs/CMakeLists.txt +++ b/src/codecs/CMakeLists.txt @@ -1,8 +1,6 @@ idf_component_register( SRCS "codec.cpp" "mad.cpp" INCLUDE_DIRS "include" - REQUIRES "result" "span") + REQUIRES "result" "span" "libmad") -add_dependencies("${COMPONENT_LIB}" libmad) target_compile_options("${COMPONENT_LIB}" PRIVATE ${EXTRA_WARNINGS}) -target_include_directories("${COMPONENT_LIB}" PRIVATE "${LIBMAD_INCLUDE}") diff --git a/src/codecs/test/CMakeLists.txt b/src/codecs/test/CMakeLists.txt new file mode 100644 index 00000000..c058fc22 --- /dev/null +++ b/src/codecs/test/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register( + SRCS "test_mad.cpp" + INCLUDE_DIRS "." + REQUIRES catch2 cmock codecs) diff --git a/src/codecs/test/test.mp3.hpp b/src/codecs/test/test.mp3.hpp new file mode 100644 index 00000000..fcf24af0 --- /dev/null +++ b/src/codecs/test/test.mp3.hpp @@ -0,0 +1,101 @@ +#include <cstdint> + +std::uint8_t test_mp3[] = { + 0xff, 0xfb, 0x90, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x69, 0x6e, + 0x67, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, + 0x7b, 0x00, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, 0xdb, + 0xdb, 0xdb, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x50, 0x4c, 0x41, 0x4d, + 0x45, 0x33, 0x2e, 0x31, 0x30, 0x30, 0x04, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x15, 0x20, 0x24, 0x06, 0xb6, 0x41, 0x00, 0x01, + 0xe0, 0x00, 0x00, 0x04, 0x7b, 0xe4, 0x2f, 0x1b, 0xba, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfb, 0xb0, + 0xc4, 0x00, 0x00, 0x0a, 0x00, 0x03, 0x6b, 0x80, 0x80, 0x00, 0x21, 0xc4, + 0x86, 0x6c, 0x7c, 0xf7, 0xb0, 0x41, 0x05, 0x4f, 0x59, 0x20, 0x0d, 0x53, + 0x58, 0xc1, 0xf0, 0x7c, 0x1f, 0x85, 0xcf, 0x83, 0xe2, 0x70, 0x70, 0x10, + 0x04, 0x01, 0x00, 0x40, 0x1f, 0x07, 0xc1, 0xf0, 0x7c, 0x1c, 0x04, 0x01, + 0x0f, 0xa8, 0x13, 0x07, 0xc1, 0xf0, 0x7c, 0x1f, 0x04, 0x03, 0x00, 0x87, + 0xd0, 0x0f, 0x83, 0xe0, 0xf8, 0x3e, 0x0e, 0x02, 0x01, 0x8f, 0xd2, 0x5c, + 0x1f, 0x07, 0xc3, 0xe0, 0x80, 0x20, 0x08, 0x3b, 0xf1, 0x38, 0x3e, 0x0f, + 0x83, 0x80, 0x80, 0x63, 0xfc, 0x1f, 0x07, 0xc1, 0xf0, 0x40, 0x10, 0x0c, + 0x7f, 0xe8, 0x77, 0x86, 0x56, 0x64, 0x34, 0x52, 0x03, 0x4d, 0x37, 0x14, + 0xc4, 0x18, 0x4d, 0x84, 0xd8, 0x0c, 0xc0, 0x66, 0x00, 0x20, 0x02, 0x04, + 0x81, 0xa8, 0x00, 0x80, 0x08, 0x00, 0x80, 0x50, 0x22, 0x24, 0x98, 0x98, + 0xae, 0x5c, 0xb9, 0x72, 0xe5, 0xcb, 0x82, 0xbe, 0x17, 0x02, 0x82, 0x41, + 0x41, 0x41, 0x41, 0x42, 0x82, 0x82, 0x82, 0x8e, 0x05, 0x05, 0xff, 0xe8, + 0x28, 0x28, 0x28, 0x30, 0x50, 0x50, 0x51, 0x41, 0x5f, 0xff, 0xe0, 0xa0, + 0xa0, 0xa0, 0xa1, 0x41, 0x41, 0x41, 0x47, 0x7f, 0xff, 0xff, 0xf8, 0x28, + 0x30, 0x50, 0x50, 0x50, 0x57, 0xff, 0xff, 0xff, 0xf4, 0x14, 0x28, 0x28, + 0x28, 0x28, 0xaf, 0xff, 0xff, 0xff, 0x82, 0x83, 0x05, 0x05, 0x05, 0x05, + 0x02, 0x8a, 0xff, 0xff, 0xfe, 0x82, 0x85, 0x2a, 0x4c, 0x41, 0x4d, 0x45, + 0x33, 0x2e, 0x31, 0x30, 0x30, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, + 0xfb, 0x10, 0xc4, 0xcd, 0x83, 0xc0, 0x00, 0x01, 0xa4, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x34, 0x80, 0x00, 0x00, 0x04, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa +}; +std::size_t test_mp3_len = 1147; diff --git a/src/codecs/test/test_mad.cpp b/src/codecs/test/test_mad.cpp new file mode 100644 index 00000000..388efa17 --- /dev/null +++ b/src/codecs/test/test_mad.cpp @@ -0,0 +1,88 @@ +#include "mad.hpp" + +#include <cstdint> +#include <algorithm> + +#include "span.hpp" +#include "catch2/catch.hpp" + +#include "test.mp3.hpp" + +void load_mp3(cpp::span<std::byte> dest) { + cpp::span<std::byte> src(reinterpret_cast<std::byte*>(test_mp3), test_mp3_len); + std::copy(src.begin(), src.begin() + dest.size(), dest.begin()); +} + +namespace codecs { + +TEST_CASE("libmad mp3 decoder", "[unit]") { + MadMp3Decoder decoder; + + SECTION("handles only mp3 files") { + REQUIRE(decoder.CanHandleFile("cool.mp3") == true); + REQUIRE(decoder.CanHandleFile("bad.wma") == false); + } + + SECTION("processes streams correctly") { + std::array<std::byte, 256> input; + input.fill(std::byte{0}); + + decoder.ResetForNewStream(); + decoder.SetInput(input); + + SECTION("empty stream fails gracefully") { + auto result = decoder.ProcessNextFrame(); + + REQUIRE(result.has_value()); + REQUIRE(result.value() == true); + } + + SECTION("invalid stream fails") { + input.fill(std::byte{0xFF}); + + auto result = decoder.ProcessNextFrame(); + + REQUIRE(result.has_error()); + REQUIRE(result.error() == ICodec::MALFORMED_DATA); + } + + SECTION("valid stream parses successfully") { + load_mp3(input); + + auto result = decoder.ProcessNextFrame(); + + REQUIRE(result.has_value()); + REQUIRE(result.value() == false); + + SECTION("output samples synthesized") { + std::array<std::byte, 256> output; + output.fill(std::byte{0}); + + auto res = decoder.WriteOutputSamples(output); + + REQUIRE(res.first > 0); + REQUIRE(res.second == false); + + // Just check that some kind of data was written. We don't care + // about what. + REQUIRE(std::to_integer<uint8_t>(output[0]) != 0); + REQUIRE(std::to_integer<uint8_t>(output[1]) != 0); + REQUIRE(std::to_integer<uint8_t>(output[2]) != 0); + REQUIRE(std::to_integer<uint8_t>(output[3]) != 0); + } + + SECTION("output format correct") { + auto format = decoder.GetOutputFormat(); + + // Matches the test data. + REQUIRE(format.num_channels == 2); + REQUIRE(format.sample_rate_hz == 44100); + // Matches libmad output + REQUIRE(format.bits_per_sample == 24); + } + } + + } +} + +} // namespace codecs |
