#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"
last_packet_timestamp_(kNoTimestamp()),
last_packet_duration_(kNoTimestamp()),
video_rotation_(VIDEO_ROTATION_0),
- bitstream_converter_enabled_(false),
fixup_negative_ogg_timestamps_(false) {
DCHECK(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);
return;
encryption_key_id_.assign(enc_key_id);
- demuxer_->FireNeedKey(kWebMEncryptInitDataType, enc_key_id);
+ demuxer_->FireNeedKey(kWebMInitDataType, enc_key_id);
}
}
#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.";
}
void FFmpegDemuxerStream::FlushBuffers() {
DCHECK(task_runner_->BelongsToCurrentThread());
DCHECK(read_cb_.is_null()) << "There should be no pending read";
+
+ // 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();
+
buffer_queue_.Clear();
end_of_stream_ = false;
last_packet_timestamp_ = kNoTimestamp();
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
}
+void FFmpegDemuxerStream::ResetBitstreamConverter() {
+#if defined(USE_PROPRIETARY_CODECS)
+ if (bitstream_converter_)
+ InitBitstreamConverter();
+#endif // defined(USE_PROPRIETARY_CODECS)
+}
+
+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)
+}
+
bool FFmpegDemuxerStream::SupportsConfigChanges() { return false; }
AudioDecoderConfig FFmpegDemuxerStream::audio_decoder_config() {