diff options
Diffstat (limited to 'chromium/media/formats/dts')
-rw-r--r-- | chromium/media/formats/dts/dts_stream_parser.cc | 2 | ||||
-rw-r--r-- | chromium/media/formats/dts/dts_stream_parser.h | 2 | ||||
-rw-r--r-- | chromium/media/formats/dts/dts_util.cc | 71 | ||||
-rw-r--r-- | chromium/media/formats/dts/dts_util.h | 13 | ||||
-rw-r--r-- | chromium/media/formats/dts/dts_util_fuzzer.cc | 18 | ||||
-rw-r--r-- | chromium/media/formats/dts/dts_util_unittest.cc | 41 |
6 files changed, 141 insertions, 6 deletions
diff --git a/chromium/media/formats/dts/dts_stream_parser.cc b/chromium/media/formats/dts/dts_stream_parser.cc index 5fb5200b26e..108de4dc5fa 100644 --- a/chromium/media/formats/dts/dts_stream_parser.cc +++ b/chromium/media/formats/dts/dts_stream_parser.cc @@ -1,4 +1,4 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. +// 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. diff --git a/chromium/media/formats/dts/dts_stream_parser.h b/chromium/media/formats/dts/dts_stream_parser.h index 4e61da85c76..92bb19f55c5 100644 --- a/chromium/media/formats/dts/dts_stream_parser.h +++ b/chromium/media/formats/dts/dts_stream_parser.h @@ -1,4 +1,4 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. +// 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. diff --git a/chromium/media/formats/dts/dts_util.cc b/chromium/media/formats/dts/dts_util.cc index ac9d0f56d2a..fe05cedf22a 100644 --- a/chromium/media/formats/dts/dts_util.cc +++ b/chromium/media/formats/dts/dts_util.cc @@ -1,11 +1,12 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. +// 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 "media/formats/dts/dts_util.h" #include "base/logging.h" -#include "base/stl_util.h" +#include "base/sys_byteorder.h" +#include "media/base/audio_parameters.h" #include "media/base/bit_reader.h" #include "media/formats/dts/dts_stream_parser.h" @@ -113,6 +114,72 @@ int ParseTotalSampleCount(const uint8_t* data, return total_sample_count; } +namespace { + +constexpr size_t kDTSSamplesPerFrame = 512; +constexpr size_t kDTSXP2SamplesPerFrame = 1024; + +} // namespace + +int WrapDTSWithIEC61937(base::span<const uint8_t> input_data_s, + base::span<uint8_t> output_data_s, + AudioCodec dts_codec_type) { + if (dts_codec_type == AudioCodec::kDTS) { + // IEC 61937 frame for DTS-CA (IEC 61937-5) is defined as + // 2 bytes per sample * 2 channel * 512 samples per frame. + constexpr size_t kDTSFrameSize = 2 * 2 * kDTSSamplesPerFrame; + static constexpr uint8_t kDTSCAHeader[] = {0x72, 0xF8, 0x1F, 0x4E, + 0x0B, 0x00, 0x00, 0x20}; + + // Output bytes: header + data + optional 2-byte alignment + size_t output_bytes = sizeof(kDTSCAHeader) + input_data_s.size(); + if (output_bytes & 1) + output_bytes++; + + // Header + input data must fit in output buffer, limited to one DTS frame + if (input_data_s.size() > kDTSFrameSize - sizeof(kDTSCAHeader) || + output_bytes > output_data_s.size()) { + return 0; + } + + // Copy header to output buffer + memcpy(output_data_s.data(), kDTSCAHeader, sizeof(kDTSCAHeader)); + + // Use 16-bit span for 16-bit byte swap + base::span<const uint16_t> input_16( + reinterpret_cast<const uint16_t*>(input_data_s.data()), + input_data_s.size() / 2); + output_data_s = output_data_s.subspan(sizeof(kDTSCAHeader)); + base::span<uint16_t> output_16( + reinterpret_cast<uint16_t*>(output_data_s.data()), + output_data_s.size() / 2); + + auto output_16_iterator = base::ranges::transform( + input_16.begin(), input_16.end(), output_16.begin(), + [](uint16_t n) -> uint16_t { return base::ByteSwap(n); }); + + // Zero fill the remaining output buffer + std::fill(output_16_iterator, output_16.end(), 0); + + return kDTSFrameSize; + } + if (dts_codec_type == AudioCodec::kDTSXP2) { + NOTIMPLEMENTED(); + } + return 0; +} + +int GetDTSSamplesPerFrame(AudioCodec dts_codec_type) { + switch (dts_codec_type) { + case AudioCodec::kDTS: + return kDTSSamplesPerFrame; + case AudioCodec::kDTSXP2: + return kDTSXP2SamplesPerFrame; + default: + return 0; + } +} + } // namespace dts } // namespace media diff --git a/chromium/media/formats/dts/dts_util.h b/chromium/media/formats/dts/dts_util.h index c917ed2ac82..214720dc201 100644 --- a/chromium/media/formats/dts/dts_util.h +++ b/chromium/media/formats/dts/dts_util.h @@ -1,4 +1,4 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. +// 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. @@ -8,6 +8,7 @@ #include <stddef.h> #include <stdint.h> +#include "base/containers/span.h" #include "media/base/audio_codecs.h" #include "media/base/media_export.h" @@ -21,6 +22,16 @@ MEDIA_EXPORT int ParseTotalSampleCount(const uint8_t* data, size_t size, AudioCodec dts_codec_type); +// Encapsulate a single DTS audio frame with IEC 61937 encapsulation to +// allow IEC 61937 frame to pass through to audio sink (HDMI/SPDIF). +// Return the size of the IEC 61937 frame. +MEDIA_EXPORT int WrapDTSWithIEC61937(base::span<const uint8_t> input_data, + base::span<uint8_t> output_data, + AudioCodec dts_codec_type); + +// Return the number of audio samples per DTS audio frame. +MEDIA_EXPORT int GetDTSSamplesPerFrame(AudioCodec dts_codec_type); + } // namespace dts } // namespace media diff --git a/chromium/media/formats/dts/dts_util_fuzzer.cc b/chromium/media/formats/dts/dts_util_fuzzer.cc new file mode 100644 index 00000000000..6e689bfe0b4 --- /dev/null +++ b/chromium/media/formats/dts/dts_util_fuzzer.cc @@ -0,0 +1,18 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <stddef.h> +#include <stdint.h> + +#include <memory> + +#include "base/check.h" +#include "media/base/media_util.h" +#include "media/formats/dts/dts_util.h" + +// Entry point for LibFuzzer. +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + media::dts::ParseTotalSampleCount(data, size, media::AudioCodec::kDTS); + return 0; +} diff --git a/chromium/media/formats/dts/dts_util_unittest.cc b/chromium/media/formats/dts/dts_util_unittest.cc index 8caedf8261a..f637813aceb 100644 --- a/chromium/media/formats/dts/dts_util_unittest.cc +++ b/chromium/media/formats/dts/dts_util_unittest.cc @@ -1,4 +1,4 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. +// 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. @@ -55,4 +55,43 @@ TEST_F(DTSUtilTest, NormalInputTest) { 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}; + base::span<const uint8_t> input_data; + std::vector<uint8_t> output_data(2048); + + input_data = base::span<const uint8_t>(short_input, 2048 - 7); + EXPECT_EQ(0, media::dts::WrapDTSWithIEC61937(input_data, output_data, + AudioCodec::kDTS)); + + input_data = base::span<const uint8_t>(long_input, 2048 + 3); + 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}; + base::span<const uint8_t> input_data; + std::vector<uint8_t> output_data(2048); + + memcpy(input, payload, 4); + input_data = base::span<const uint8_t>(input, 512); + 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 |