building codec tests!

This commit is contained in:
jacqueline
2022-12-03 17:50:59 +11:00
parent 16d5d29049
commit bf6f9cea20
78 changed files with 10491 additions and 23029 deletions
+1 -1
View File
@@ -2,6 +2,6 @@ idf_component_register(
SRCS "audio_decoder.cpp" "audio_task.cpp" "chunk.cpp" "fatfs_audio_input.cpp"
"stream_info.cpp" "stream_message.cpp"
INCLUDE_DIRS "include"
REQUIRES "codecs" "drivers" "cbor" "result" "tasks" "span" "psram_allocator")
REQUIRES "codecs" "drivers" "cbor" "result" "tasks" "span")
target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS})
-1
View File
@@ -7,7 +7,6 @@
#include <optional>
#include "cbor.h"
#include "psram_allocator.h"
#include "stream_message.hpp"
+3
View File
@@ -0,0 +1,3 @@
idf_component_register(
SRCS ""
INCLUDE_DIRS "." REQUIRES catch2 cmock audio)
+1 -3
View File
@@ -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}")
+4
View File
@@ -0,0 +1,4 @@
idf_component_register(
SRCS "test_mad.cpp"
INCLUDE_DIRS "."
REQUIRES catch2 cmock codecs)
+101
View File
@@ -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;
+88
View File
@@ -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