Skip to content

Commit

Permalink
Audio: Support to parse AC-4 box in ISOBMFF
Browse files Browse the repository at this point in the history
Part 2 to resolve issue Issue 1493612: Add Dolby AC-4 codec support

Major reference are:
1. https://ott.dolby.com/OnDelKits/AC-4/Dolby_AC-4_Online_Delivery_Kit_1.5/Documentation/Specs/AC4_DASH/help_files/topics/ac4_in_mpeg_dash_c_signaling_ac4_in_iso.html

2. Annex E: AC-4 bitstream storage in the ISO base media file format in
https://www.etsi.org/deliver/etsi_ts/103100_103199/10319002/01.02.01_60/ts_10319002v010201p.pdf

Bug: 1493612
Change-Id: Ie44c8a42de99077ac55905afd5d8e67e815d986a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4969818
Reviewed-by: Thomas Guilbert <tguilbert@chromium.org>
Commit-Queue: Dale Curtis <dalecurtis@chromium.org>
Reviewed-by: Dale Curtis <dalecurtis@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1226386}
  • Loading branch information
Jiawei Chen authored and Chromium LUCI CQ committed Nov 17, 2023
1 parent df5e5c4 commit 62bc6da
Show file tree
Hide file tree
Showing 20 changed files with 880 additions and 4 deletions.
41 changes: 40 additions & 1 deletion media/filters/stream_parser_factory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ struct CodecInfo {
HISTOGRAM_DTS,
HISTOGRAM_DTSXP2,
HISTOGRAM_DTSE,
HISTOGRAM_MAX = HISTOGRAM_DTSE // Must be equal to largest logged entry.
HISTOGRAM_AC4,
HISTOGRAM_MAX = HISTOGRAM_AC4 // Must be equal to largest logged entry.
};

const char* pattern;
Expand Down Expand Up @@ -223,6 +224,27 @@ static const CodecInfo kEAC3CodecInfo3 = {"mp4a.A6", CodecInfo::AUDIO, nullptr,
CodecInfo::HISTOGRAM_EAC3};
#endif // BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)

#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
// The 'ac-4' is mime codec id for AC4 according to
// http://www.mp4ra.org/codecs.html
// The object types for AC4 in MP4 container is 0xae, so according to RFC 6381
// this corresponds to codec ids 'mp4a.AE'.
// Codec id with lower case oti (mp4a.ae) is supported for backward
// compatibility.
static const CodecInfo kAC4CodecInfo1 = {"ac-4.*", CodecInfo::AUDIO, nullptr,
CodecInfo::HISTOGRAM_AC4};
static const CodecInfo kAC4CodecInfo2 = {"mp4a.ae.*", CodecInfo::AUDIO, nullptr,
CodecInfo::HISTOGRAM_AC4};
static const CodecInfo kAC4CodecInfo3 = {"mp4a.AE.*", CodecInfo::AUDIO, nullptr,
CodecInfo::HISTOGRAM_AC4};
static const CodecInfo kAC4CodecInfo4 = {"ac-4", CodecInfo::AUDIO, nullptr,
CodecInfo::HISTOGRAM_AC4};
static const CodecInfo kAC4CodecInfo5 = {"mp4a.ae", CodecInfo::AUDIO, nullptr,
CodecInfo::HISTOGRAM_AC4};
static const CodecInfo kAC4CodecInfo6 = {"mp4a.AE", CodecInfo::AUDIO, nullptr,
CodecInfo::HISTOGRAM_AC4};
#endif // BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)

#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
// The 'dtsc' and 'dtsx' are mime codec ids for DTS and DTSX according to
// http://mp4ra.org/#/codecs
Expand Down Expand Up @@ -326,6 +348,14 @@ static const CodecInfo* const kAudioMP4Codecs[] = {&kMPEG4FLACCodecInfo,
&kEAC3CodecInfo2,
&kEAC3CodecInfo3,
#endif // BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
&kAC4CodecInfo1,
&kAC4CodecInfo2,
&kAC4CodecInfo3,
&kAC4CodecInfo4,
&kAC4CodecInfo5,
&kAC4CodecInfo6,
#endif // BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
&kDTSCodecInfo1,
&kDTSCodecInfo2,
Expand Down Expand Up @@ -381,6 +411,15 @@ static StreamParser* BuildMP4Parser(base::span<const std::string> codecs,
base::MatchPattern(codec_id, kEAC3CodecInfo3.pattern)) {
audio_object_types.insert(mp4::kEAC3);
#endif // BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
} else if (base::MatchPattern(codec_id, kAC4CodecInfo1.pattern) ||
base::MatchPattern(codec_id, kAC4CodecInfo2.pattern) ||
base::MatchPattern(codec_id, kAC4CodecInfo3.pattern) ||
base::MatchPattern(codec_id, kAC4CodecInfo4.pattern) ||
base::MatchPattern(codec_id, kAC4CodecInfo5.pattern) ||
base::MatchPattern(codec_id, kAC4CodecInfo6.pattern)) {
audio_object_types.insert(mp4::kAC4);
#endif // BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
} else if (base::MatchPattern(codec_id, kDTSCodecInfo1.pattern) ||
base::MatchPattern(codec_id, kDTSCodecInfo2.pattern) ||
Expand Down
11 changes: 11 additions & 0 deletions media/formats/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,13 @@ source_set("formats") {
]
}

if (enable_platform_ac4_audio) {
sources += [
"mp4/ac4.cc",
"mp4/ac4.h",
]
}

if (proprietary_codecs && enable_mse_mpeg2ts_stream_parser) {
deps += [ "//ui/gfx/geometry" ]
sources += [
Expand Down Expand Up @@ -331,6 +338,10 @@ source_set("unit_tests") {
]
}

if (enable_platform_ac4_audio) {
sources += [ "mp4/ac4_unittest.cc" ]
}

if (enable_mse_mpeg2ts_stream_parser) {
sources += [
"mp2t/es_adapter_video_unittest.cc",
Expand Down
Loading

0 comments on commit 62bc6da

Please sign in to comment.