| Index: media/filters/ffmpeg_demuxer.cc
|
| diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc
|
| index f3f87ac45ed8b794a934f477a807bf849c15932c..b8665efeb3be30f403f78b14fb22761bd64fc247 100644
|
| --- a/media/filters/ffmpeg_demuxer.cc
|
| +++ b/media/filters/ffmpeg_demuxer.cc
|
| @@ -28,6 +28,8 @@
|
| #include "media/base/media_log.h"
|
| #include "media/base/video_decoder_config.h"
|
| #include "media/ffmpeg/ffmpeg_common.h"
|
| +#include "media/filters/ffmpeg_aac_bitstream_converter.h"
|
| +#include "media/filters/ffmpeg_bitstream_converter.h"
|
| #include "media/filters/ffmpeg_glue.h"
|
| #include "media/filters/ffmpeg_h264_to_annex_b_bitstream_converter.h"
|
| #include "media/filters/webvtt_util.h"
|
| @@ -95,7 +97,6 @@ FFmpegDemuxerStream::FFmpegDemuxerStream(FFmpegDemuxer* demuxer,
|
| last_packet_timestamp_(kNoTimestamp()),
|
| last_packet_duration_(kNoTimestamp()),
|
| video_rotation_(VIDEO_ROTATION_0),
|
| - bitstream_converter_enabled_(false),
|
| fixup_negative_ogg_timestamps_(false) {
|
| DCHECK(demuxer_);
|
|
|
| @@ -148,13 +149,6 @@ FFmpegDemuxerStream::FFmpegDemuxerStream(FFmpegDemuxer* demuxer,
|
| // Calculate the duration.
|
| duration_ = ConvertStreamTimestamp(stream->time_base, stream->duration);
|
|
|
| -#if defined(USE_PROPRIETARY_CODECS)
|
| - if (stream_->codec->codec_id == AV_CODEC_ID_H264) {
|
| - bitstream_converter_.reset(
|
| - new FFmpegH264ToAnnexBBitstreamConverter(stream_->codec));
|
| - }
|
| -#endif
|
| -
|
| if (is_encrypted) {
|
| AVDictionaryEntry* key = av_dict_get(stream->metadata, "enc_key_id", NULL,
|
| 0);
|
| @@ -184,7 +178,7 @@ void FFmpegDemuxerStream::EnqueuePacket(ScopedAVPacket packet) {
|
|
|
| #if defined(USE_PROPRIETARY_CODECS)
|
| // Convert the packet if there is a bitstream filter.
|
| - if (packet->data && bitstream_converter_enabled_ &&
|
| + if (packet->data && bitstream_converter_ &&
|
| !bitstream_converter_->ConvertPacket(packet.get())) {
|
| LOG(ERROR) << "Format conversion failed.";
|
| }
|
| @@ -383,8 +377,8 @@ void FFmpegDemuxerStream::FlushBuffers() {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| DCHECK(read_cb_.is_null()) << "There should be no pending read";
|
|
|
| - // H264 requires that we resend the header after flush.
|
| - // Reset its bitstream for converter to do so.
|
| + // H264 and AAC require that we resend the header after flush.
|
| + // Reset bitstream for converter to do so.
|
| // This is related to chromium issue 140371 (http://crbug.com/140371).
|
| ResetBitstreamConverter();
|
|
|
| @@ -433,8 +427,7 @@ void FFmpegDemuxerStream::EnableBitstreamConverter() {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
|
|
| #if defined(USE_PROPRIETARY_CODECS)
|
| - CHECK(bitstream_converter_.get());
|
| - bitstream_converter_enabled_ = true;
|
| + InitBitstreamConverter();
|
| #else
|
| NOTREACHED() << "Proprietary codecs not enabled.";
|
| #endif
|
| @@ -442,11 +435,20 @@ void FFmpegDemuxerStream::EnableBitstreamConverter() {
|
|
|
| void FFmpegDemuxerStream::ResetBitstreamConverter() {
|
| #if defined(USE_PROPRIETARY_CODECS)
|
| - if (!bitstream_converter_enabled_ || !bitstream_converter_)
|
| - return;
|
| + if (bitstream_converter_)
|
| + InitBitstreamConverter();
|
| +#endif // defined(USE_PROPRIETARY_CODECS)
|
| +}
|
|
|
| - bitstream_converter_.reset(
|
| - new FFmpegH264ToAnnexBBitstreamConverter(stream_->codec));
|
| +void FFmpegDemuxerStream::InitBitstreamConverter() {
|
| +#if defined(USE_PROPRIETARY_CODECS)
|
| + if (stream_->codec->codec_id == AV_CODEC_ID_H264) {
|
| + bitstream_converter_.reset(
|
| + new FFmpegH264ToAnnexBBitstreamConverter(stream_->codec));
|
| + } else if (stream_->codec->codec_id == AV_CODEC_ID_AAC) {
|
| + bitstream_converter_.reset(
|
| + new FFmpegAACBitstreamConverter(stream_->codec));
|
| + }
|
| #endif // defined(USE_PROPRIETARY_CODECS)
|
| }
|
|
|
|
|