blob: f75cd9711e25a33fe35d81cf168fd66379a0fecc [file] [log] [blame]
/*
* Copyright (c) 2024, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 3-Clause Clear License
* and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
* License was not distributed with this source code in the LICENSE file, you
* can obtain it at www.aomedia.org/license/software-license/bsd-3-c-c. 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 <filesystem>
#include <string>
#include <vector>
// [internal] Placeholder for get runfiles header.
#include "absl/log/log.h"
#include "absl/status/status_matchers.h"
#include "absl/strings/string_view.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "iamf/cli/encoder_main_lib.h"
#include "iamf/cli/proto/audio_frame.pb.h"
#include "iamf/cli/proto/test_vector_metadata.pb.h"
#include "iamf/cli/proto/user_metadata.pb.h"
#include "iamf/cli/tests/cli_test_utils.h"
namespace iamf_tools {
namespace {
using ::absl_testing::IsOk;
constexpr absl::string_view kIgnoredOutputPath = "";
struct TextprotoTemplateTestCase {
absl::string_view textproto_filename;
std::vector<absl::string_view> wav_filenames;
};
using TextprotoTemplate = ::testing::TestWithParam<TextprotoTemplateTestCase>;
// Validate that the textproto templates will encode successful.
TEST_P(TextprotoTemplate, ValidateTextprotos) {
const TextprotoTemplateTestCase& test_case = GetParam();
// Get the location of test wav files.
static const auto input_wav_dir =
std::filesystem::current_path() / std::string("iamf/cli/testdata");
// Get the textproto to test.
const auto user_metadata_filename =
std::filesystem::current_path() /
std::string("iamf/cli/textproto_templates") /
test_case.textproto_filename;
iamf_tools_cli_proto::UserMetadata user_metadata;
ParseUserMetadataAssertSuccess(user_metadata_filename.string(),
user_metadata);
// Clear `file_name_prefix`; we only care about the status and not the output
// files.
user_metadata.mutable_test_vector_metadata()->clear_file_name_prefix();
LOG(INFO) << "Testing with " << test_case.textproto_filename;
// Replace the wav filenames.
ASSERT_EQ(user_metadata.audio_frame_metadata_size(),
test_case.wav_filenames.size());
for (int i = 0; i < test_case.wav_filenames.size(); ++i) {
user_metadata.mutable_audio_frame_metadata(i)->set_wav_filename(
test_case.wav_filenames[i]);
}
// Call encoder and check that the encoding was successful.
const absl::Status result =
iamf_tools::TestMain(user_metadata, input_wav_dir.string().c_str(),
std::string(kIgnoredOutputPath));
EXPECT_THAT(result, IsOk()) << "File= " << test_case.textproto_filename;
}
INSTANTIATE_TEST_SUITE_P(PcmStereo, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"stereo_pcm24bit.textproto",
std::vector<absl::string_view>{
"sawtooth_10000_stereo_48khz_s24le.wav"}}}));
INSTANTIATE_TEST_SUITE_P(OpusStereo, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"stereo_opus.textproto",
std::vector<absl::string_view>{
"sawtooth_10000_stereo_48khz_s24le.wav"}}}));
INSTANTIATE_TEST_SUITE_P(Pcm5dot1, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"5dot1_pcm24bit.textproto",
std::vector<absl::string_view>{
"Mechanism_5s.wav"}}}));
INSTANTIATE_TEST_SUITE_P(Opus5dot1, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"5dot1_opus.textproto",
std::vector<absl::string_view>{
"Mechanism_5s.wav"}}}));
INSTANTIATE_TEST_SUITE_P(Pcm5dot1dot2, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"5dot1dot2_pcm24bit.textproto",
std::vector<absl::string_view>{
"Mechanism_5s.wav"}}}));
INSTANTIATE_TEST_SUITE_P(Opus5dot1dot2, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"5dot1dot2_opus.textproto",
std::vector<absl::string_view>{
"Mechanism_5s.wav"}}}));
INSTANTIATE_TEST_SUITE_P(Pcm7dot1dot4, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"7dot1dot4_pcm24bit.textproto",
std::vector<absl::string_view>{
"Mechanism_5s.wav"}}}));
INSTANTIATE_TEST_SUITE_P(Opus7dot1dot4, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"7dot1dot4_opus.textproto",
std::vector<absl::string_view>{
"Mechanism_5s.wav"}}}));
INSTANTIATE_TEST_SUITE_P(PcmFoa, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"1OA_pcm24bit.textproto",
std::vector<absl::string_view>{
"sawtooth_10000_foa_48khz.wav"}}}));
INSTANTIATE_TEST_SUITE_P(OpusFoa, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"1OA_opus.textproto",
std::vector<absl::string_view>{
"sawtooth_10000_foa_48khz.wav"}}}));
INSTANTIATE_TEST_SUITE_P(PcmToa, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"3OA_pcm24bit.textproto",
std::vector<absl::string_view>{
"sawtooth_8000_toa_48khz.wav"}}}));
INSTANTIATE_TEST_SUITE_P(OpusToa, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"3OA_opus.textproto",
std::vector<absl::string_view>{
"sawtooth_8000_toa_48khz.wav"}}}));
INSTANTIATE_TEST_SUITE_P(PcmFoaAndStereo, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"1OA_and_stereo_pcm24bit.textproto",
std::vector<absl::string_view>{
"sawtooth_10000_foa_48khz.wav",
"sawtooth_10000_stereo_48khz_s24le.wav"}}}));
INSTANTIATE_TEST_SUITE_P(OpusFoaAndStereo, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"1OA_and_stereo_opus.textproto",
std::vector<absl::string_view>{
"sawtooth_10000_foa_48khz.wav",
"sawtooth_10000_stereo_48khz_s24le.wav"}}}));
INSTANTIATE_TEST_SUITE_P(PcmToaAndStereo, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"3OA_and_stereo_pcm24bit.textproto",
std::vector<absl::string_view>{
"sawtooth_8000_toa_48khz.wav",
"sawtooth_10000_stereo_48khz_s24le.wav"}}}));
INSTANTIATE_TEST_SUITE_P(OpusToaAndStereo, TextprotoTemplate,
testing::ValuesIn<TextprotoTemplateTestCase>(
{{"3OA_and_stereo_opus.textproto",
std::vector<absl::string_view>{
"sawtooth_8000_toa_48khz.wav",
"sawtooth_10000_stereo_48khz_s24le.wav"}}}));
} // namespace
} // namespace iamf_tools