summaryrefslogtreecommitdiff
path: root/chromium/media/formats/dts
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/formats/dts')
-rw-r--r--chromium/media/formats/dts/dts_stream_parser.cc2
-rw-r--r--chromium/media/formats/dts/dts_stream_parser.h2
-rw-r--r--chromium/media/formats/dts/dts_util.cc71
-rw-r--r--chromium/media/formats/dts/dts_util.h13
-rw-r--r--chromium/media/formats/dts/dts_util_fuzzer.cc18
-rw-r--r--chromium/media/formats/dts/dts_util_unittest.cc41
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