summaryrefslogtreecommitdiff
path: root/chromium/media/formats/mp4/mp4_stream_parser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/formats/mp4/mp4_stream_parser.cc')
-rw-r--r--chromium/media/formats/mp4/mp4_stream_parser.cc40
1 files changed, 27 insertions, 13 deletions
diff --git a/chromium/media/formats/mp4/mp4_stream_parser.cc b/chromium/media/formats/mp4/mp4_stream_parser.cc
index fb83b2ebe59..b5f7b3d6651 100644
--- a/chromium/media/formats/mp4/mp4_stream_parser.cc
+++ b/chromium/media/formats/mp4/mp4_stream_parser.cc
@@ -345,15 +345,20 @@ bool MP4StreamParser::ParseMoov(BoxReader* reader) {
return false;
}
- AudioCodec codec = kUnknownAudioCodec;
- AudioCodecProfile profile = AudioCodecProfile::kUnknown;
+ AudioCodec codec = AudioCodec::kUnknown;
ChannelLayout channel_layout = CHANNEL_LAYOUT_NONE;
int sample_per_second = 0;
int codec_delay_in_frames = 0;
base::TimeDelta seek_preroll;
std::vector<uint8_t> extra_data;
+
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
+ AudioCodecProfile profile = AudioCodecProfile::kUnknown;
+ std::vector<uint8_t> aac_extra_data;
+#endif // BUILDFLAG(USE_PROPRIETARY_CODECS)
+
if (audio_format == FOURCC_OPUS) {
- codec = kCodecOpus;
+ codec = AudioCodec::kOpus;
channel_layout = GuessChannelLayout(entry.dops.channel_count);
sample_per_second = entry.dops.sample_rate;
codec_delay_in_frames = entry.dops.codec_delay_in_frames;
@@ -369,14 +374,14 @@ bool MP4StreamParser::ParseMoov(BoxReader* reader) {
return false;
}
- codec = kCodecFLAC;
+ codec = AudioCodec::kFLAC;
channel_layout = GuessChannelLayout(entry.channelcount);
sample_per_second = entry.samplerate;
extra_data = entry.dfla.stream_info;
#if BUILDFLAG(USE_PROPRIETARY_CODECS)
#if BUILDFLAG(ENABLE_PLATFORM_MPEG_H_AUDIO)
} else if (audio_format == FOURCC_MHM1 || audio_format == FOURCC_MHA1) {
- codec = kCodecMpegHAudio;
+ codec = AudioCodec::kMpegHAudio;
channel_layout = CHANNEL_LAYOUT_BITSTREAM;
sample_per_second = entry.samplerate;
extra_data = entry.dfla.stream_info;
@@ -404,20 +409,24 @@ bool MP4StreamParser::ParseMoov(BoxReader* reader) {
// supported MPEG2 AAC varients.
if (ESDescriptor::IsAAC(audio_type)) {
const AAC& aac = entry.esds.aac;
- codec = kCodecAAC;
+ codec = AudioCodec::kAAC;
profile = aac.GetProfile();
channel_layout = aac.GetChannelLayout(has_sbr_);
sample_per_second = aac.GetOutputSamplesPerSecond(has_sbr_);
+ // Set `aac_extra_data` on all platforms but only set `extra_data` on
+ // Android. This is for backward compatibility until we have a better
+ // solution. See crbug.com/1245123 for details.
+ aac_extra_data = aac.codec_specific_data();
#if defined(OS_ANDROID)
extra_data = aac.codec_specific_data();
-#endif
+#endif // defined(OS_ANDROID)
#if BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
} else if (audio_type == kAC3) {
- codec = kCodecAC3;
+ codec = AudioCodec::kAC3;
channel_layout = GuessChannelLayout(entry.channelcount);
sample_per_second = entry.samplerate;
} else if (audio_type == kEAC3) {
- codec = kCodecEAC3;
+ codec = AudioCodec::kEAC3;
channel_layout = GuessChannelLayout(entry.channelcount);
sample_per_second = entry.samplerate;
#endif
@@ -458,13 +467,18 @@ bool MP4StreamParser::ParseMoov(BoxReader* reader) {
if (scheme == EncryptionScheme::kUnencrypted)
return false;
}
+
audio_config.Initialize(codec, sample_format, channel_layout,
sample_per_second, extra_data, scheme,
seek_preroll, codec_delay_in_frames);
- if (codec == kCodecAAC) {
+
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
+ if (codec == AudioCodec::kAAC) {
audio_config.disable_discard_decoder_delay();
audio_config.set_profile(profile);
+ audio_config.set_aac_extra_data(std::move(aac_extra_data));
}
+#endif // BUILDFLAG(USE_PROPRIETARY_CODECS)
DVLOG(1) << "audio_track_id=" << audio_track_id
<< " config=" << audio_config.AsHumanReadableString();
@@ -806,9 +820,9 @@ ParseResult MP4StreamParser::EnqueueSample(BufferQueueMap* buffers) {
std::vector<uint8_t> frame_buf(buf, buf + sample_size);
if (video) {
- if (runs_->video_description().video_codec == kCodecH264 ||
- runs_->video_description().video_codec == kCodecHEVC ||
- runs_->video_description().video_codec == kCodecDolbyVision) {
+ if (runs_->video_description().video_codec == VideoCodec::kH264 ||
+ runs_->video_description().video_codec == VideoCodec::kHEVC ||
+ runs_->video_description().video_codec == VideoCodec::kDolbyVision) {
DCHECK(runs_->video_description().frame_bitstream_converter);
BitstreamConverter::AnalysisResult analysis;
if (!runs_->video_description()