/* * 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 #include #include // [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 wav_filenames; }; using TextprotoTemplate = ::testing::TestWithParam; // 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( {{"stereo_pcm24bit.textproto", std::vector{ "sawtooth_10000_stereo_48khz_s24le.wav"}}})); INSTANTIATE_TEST_SUITE_P(OpusStereo, TextprotoTemplate, testing::ValuesIn( {{"stereo_opus.textproto", std::vector{ "sawtooth_10000_stereo_48khz_s24le.wav"}}})); INSTANTIATE_TEST_SUITE_P(Pcm5dot1, TextprotoTemplate, testing::ValuesIn( {{"5dot1_pcm24bit.textproto", std::vector{ "Mechanism_5s.wav"}}})); INSTANTIATE_TEST_SUITE_P(Opus5dot1, TextprotoTemplate, testing::ValuesIn( {{"5dot1_opus.textproto", std::vector{ "Mechanism_5s.wav"}}})); INSTANTIATE_TEST_SUITE_P(Pcm5dot1dot2, TextprotoTemplate, testing::ValuesIn( {{"5dot1dot2_pcm24bit.textproto", std::vector{ "Mechanism_5s.wav"}}})); INSTANTIATE_TEST_SUITE_P(Opus5dot1dot2, TextprotoTemplate, testing::ValuesIn( {{"5dot1dot2_opus.textproto", std::vector{ "Mechanism_5s.wav"}}})); INSTANTIATE_TEST_SUITE_P(Pcm7dot1dot4, TextprotoTemplate, testing::ValuesIn( {{"7dot1dot4_pcm24bit.textproto", std::vector{ "Mechanism_5s.wav"}}})); INSTANTIATE_TEST_SUITE_P(Opus7dot1dot4, TextprotoTemplate, testing::ValuesIn( {{"7dot1dot4_opus.textproto", std::vector{ "Mechanism_5s.wav"}}})); INSTANTIATE_TEST_SUITE_P(PcmFoa, TextprotoTemplate, testing::ValuesIn( {{"1OA_pcm24bit.textproto", std::vector{ "sawtooth_10000_foa_48khz.wav"}}})); INSTANTIATE_TEST_SUITE_P(OpusFoa, TextprotoTemplate, testing::ValuesIn( {{"1OA_opus.textproto", std::vector{ "sawtooth_10000_foa_48khz.wav"}}})); INSTANTIATE_TEST_SUITE_P(PcmToa, TextprotoTemplate, testing::ValuesIn( {{"3OA_pcm24bit.textproto", std::vector{ "sawtooth_8000_toa_48khz.wav"}}})); INSTANTIATE_TEST_SUITE_P(OpusToa, TextprotoTemplate, testing::ValuesIn( {{"3OA_opus.textproto", std::vector{ "sawtooth_8000_toa_48khz.wav"}}})); INSTANTIATE_TEST_SUITE_P(PcmFoaAndStereo, TextprotoTemplate, testing::ValuesIn( {{"1OA_and_stereo_pcm24bit.textproto", std::vector{ "sawtooth_10000_foa_48khz.wav", "sawtooth_10000_stereo_48khz_s24le.wav"}}})); INSTANTIATE_TEST_SUITE_P(OpusFoaAndStereo, TextprotoTemplate, testing::ValuesIn( {{"1OA_and_stereo_opus.textproto", std::vector{ "sawtooth_10000_foa_48khz.wav", "sawtooth_10000_stereo_48khz_s24le.wav"}}})); INSTANTIATE_TEST_SUITE_P(PcmToaAndStereo, TextprotoTemplate, testing::ValuesIn( {{"3OA_and_stereo_pcm24bit.textproto", std::vector{ "sawtooth_8000_toa_48khz.wav", "sawtooth_10000_stereo_48khz_s24le.wav"}}})); INSTANTIATE_TEST_SUITE_P(OpusToaAndStereo, TextprotoTemplate, testing::ValuesIn( {{"3OA_and_stereo_opus.textproto", std::vector{ "sawtooth_8000_toa_48khz.wav", "sawtooth_10000_stereo_48khz_s24le.wav"}}})); } // namespace } // namespace iamf_tools