diff options
Diffstat (limited to 'chromium/media/formats/mp4/mp4_stream_parser.cc')
-rw-r--r-- | chromium/media/formats/mp4/mp4_stream_parser.cc | 40 |
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() |