| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <stdint.h> |
| |
| #include <string> |
| |
| #include "base/files/memory_mapped_file.h" |
| #include "base/logging.h" |
| #include "media/base/mock_media_log.h" |
| #include "media/base/test_data_util.h" |
| #include "media/formats/dts/dts_util.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| using ::testing::AllOf; |
| using ::testing::HasSubstr; |
| using ::testing::InSequence; |
| using ::testing::StrictMock; |
| |
| namespace media { |
| |
| class DTSUtilTest : public testing::Test { |
| public: |
| DTSUtilTest() = default; |
| |
| StrictMock<MockMediaLog> media_log_; |
| }; |
| |
| TEST_F(DTSUtilTest, NoInputTest) { |
| constexpr uint8_t* data = nullptr; |
| EXPECT_EQ(0, media::dts::ParseTotalSampleCount(data, 0, AudioCodec::kDTS)); |
| EXPECT_EQ(0, media::dts::ParseTotalSampleCount(data, 0, AudioCodec::kDTSE)); |
| EXPECT_EQ(0, media::dts::ParseTotalSampleCount(data, 0, AudioCodec::kDTSXP2)); |
| } |
| |
| TEST_F(DTSUtilTest, IncompleteInputTestDTS) { |
| base::FilePath file_path = GetTestDataFilePath("dts.bin"); |
| base::MemoryMappedFile stream; |
| ASSERT_TRUE(stream.Initialize(file_path)) |
| << "Couldn't open stream file: " << file_path.MaybeAsASCII(); |
| |
| const uint8_t* data = stream.data(); |
| EXPECT_EQ(0, media::dts::ParseTotalSampleCount(data, stream.length() - 1, |
| AudioCodec::kDTS)); |
| } |
| |
| TEST_F(DTSUtilTest, IncompleteInputTestDTSXP2) { |
| base::FilePath file_path = GetTestDataFilePath("dtsx.bin"); |
| base::MemoryMappedFile stream; |
| ASSERT_TRUE(stream.Initialize(file_path)) |
| << "Couldn't open stream file: " << file_path.MaybeAsASCII(); |
| |
| const uint8_t* data = stream.data(); |
| EXPECT_EQ(0, media::dts::ParseTotalSampleCount(data, stream.length() - 1, |
| AudioCodec::kDTSXP2)); |
| } |
| |
| TEST_F(DTSUtilTest, NormalInputTestDTS) { |
| base::FilePath file_path = GetTestDataFilePath("dts.bin"); |
| base::MemoryMappedFile stream; |
| ASSERT_TRUE(stream.Initialize(file_path)) |
| << "Couldn't open stream file: " << file_path.MaybeAsASCII(); |
| const uint8_t* data = stream.data(); |
| int total = media::dts::ParseTotalSampleCount(data, stream.length(), |
| AudioCodec::kDTS); |
| EXPECT_EQ(total, 512); |
| } |
| |
| TEST_F(DTSUtilTest, GetDTSSamplesPerFrameTest) { |
| EXPECT_EQ(512, media::dts::GetDTSSamplesPerFrame(AudioCodec::kDTS)); |
| EXPECT_EQ(1024, media::dts::GetDTSSamplesPerFrame(AudioCodec::kDTSXP2)); |
| } |
| |
| TEST_F(DTSUtilTest, WrapDTSWithIEC61937IncorrectInputTest) { |
| constexpr uint8_t short_input[2048 - 7] = {0}; |
| constexpr uint8_t long_input[2048 + 3] = {0}; |
| std::vector<uint8_t> input_data; |
| std::vector<uint8_t> output_data(2048); |
| |
| input_data = |
| std::vector<uint8_t>(short_input, short_input + sizeof(short_input)); |
| EXPECT_EQ(0, media::dts::WrapDTSWithIEC61937(input_data, output_data, |
| AudioCodec::kDTS)); |
| |
| input_data = |
| std::vector<uint8_t>(long_input, long_input + sizeof(long_input)); |
| EXPECT_EQ(0, media::dts::WrapDTSWithIEC61937(input_data, output_data, |
| AudioCodec::kDTS)); |
| } |
| |
| TEST_F(DTSUtilTest, WrapDTSWithIEC61937NormalInputTest) { |
| constexpr uint8_t header[8] = {0x72, 0xF8, 0x1F, 0x4E, |
| 0x0B, 0x00, 0x00, 0x20}; |
| constexpr uint8_t payload[4] = {1, 2, 3, 4}; |
| constexpr uint8_t swapped_payload[4] = {2, 1, 4, 3}; |
| uint8_t input[512] = {0}; |
| uint8_t output[2048] = {0}; |
| std::vector<uint8_t> output_data(2048); |
| |
| memcpy(input, payload, 4); |
| std::vector<uint8_t> input_data(input, input + sizeof(input)); |
| EXPECT_EQ(2048, media::dts::WrapDTSWithIEC61937(input_data, output_data, |
| AudioCodec::kDTS)); |
| memcpy(output, header, 8); |
| memcpy(output + 8, swapped_payload, 4); |
| EXPECT_EQ(0, memcmp(output, output_data.data(), 2048)); |
| } |
| |
| } // namespace media |