Index: media/filters/ffmpeg_video_decoder.cc |
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc |
index 8131d07c075ea86f643f7196cb589eeef5e3d216..0911d51e8bccbf770fe15f9c463550758d794175 100644 |
--- a/media/filters/ffmpeg_video_decoder.cc |
+++ b/media/filters/ffmpeg_video_decoder.cc |
@@ -15,7 +15,6 @@ |
#include "base/strings/string_number_conversions.h" |
#include "media/base/bind_to_loop.h" |
#include "media/base/decoder_buffer.h" |
-#include "media/base/demuxer_stream.h" |
#include "media/base/limits.h" |
#include "media/base/media_switches.h" |
#include "media/base/pipeline.h" |
@@ -61,8 +60,7 @@ FFmpegVideoDecoder::FFmpegVideoDecoder( |
weak_factory_(this), |
state_(kUninitialized), |
codec_context_(NULL), |
- av_frame_(NULL), |
- demuxer_stream_(NULL) { |
+ av_frame_(NULL) { |
} |
int FFmpegVideoDecoder::GetVideoBuffer(AVCodecContext* codec_context, |
@@ -88,7 +86,7 @@ int FFmpegVideoDecoder::GetVideoBuffer(AVCodecContext* codec_context, |
codec_context->sample_aspect_ratio.num, |
codec_context->sample_aspect_ratio.den); |
} else { |
- natural_size = demuxer_stream_->video_decoder_config().natural_size(); |
+ natural_size = config_.natural_size(); |
} |
if (!VideoFrame::IsValidConfig(format, size, gfx::Rect(size), natural_size)) |
@@ -131,22 +129,22 @@ static void ReleaseVideoBufferImpl(AVCodecContext* s, AVFrame* frame) { |
frame->opaque = NULL; |
} |
-void FFmpegVideoDecoder::Initialize(DemuxerStream* stream, |
+void FFmpegVideoDecoder::Initialize(const VideoDecoderConfig& config, |
const PipelineStatusCB& status_cb, |
const StatisticsCB& statistics_cb) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
- DCHECK(stream); |
DCHECK(read_cb_.is_null()); |
DCHECK(reset_cb_.is_null()); |
+ DCHECK(!config.is_encrypted()); |
FFmpegGlue::InitializeFFmpeg(); |
weak_this_ = weak_factory_.GetWeakPtr(); |
- demuxer_stream_ = stream; |
+ config_ = config; |
statistics_cb_ = statistics_cb; |
PipelineStatusCB initialize_cb = BindToCurrentLoop(status_cb); |
- if (!ConfigureDecoder()) { |
+ if (!config.IsValidConfig() || !ConfigureDecoder()) { |
initialize_cb.Run(DECODER_ERROR_NOT_SUPPORTED); |
return; |
} |
@@ -156,7 +154,8 @@ void FFmpegVideoDecoder::Initialize(DemuxerStream* stream, |
initialize_cb.Run(PIPELINE_OK); |
} |
-void FFmpegVideoDecoder::Read(const ReadCB& read_cb) { |
+void FFmpegVideoDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer, |
+ const ReadCB& read_cb) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
DCHECK(!read_cb.is_null()); |
CHECK_NE(state_, kUninitialized); |
@@ -174,7 +173,7 @@ void FFmpegVideoDecoder::Read(const ReadCB& read_cb) { |
return; |
} |
- ReadFromDemuxerStream(); |
+ DecodeBuffer(buffer); |
} |
void FFmpegVideoDecoder::Reset(const base::Closure& closure) { |
@@ -221,45 +220,6 @@ FFmpegVideoDecoder::~FFmpegVideoDecoder() { |
DCHECK(!av_frame_); |
} |
-void FFmpegVideoDecoder::ReadFromDemuxerStream() { |
- DCHECK_NE(state_, kUninitialized); |
- DCHECK_NE(state_, kDecodeFinished); |
- DCHECK_NE(state_, kError); |
- DCHECK(!read_cb_.is_null()); |
- |
- demuxer_stream_->Read(base::Bind( |
- &FFmpegVideoDecoder::BufferReady, weak_this_)); |
-} |
- |
-void FFmpegVideoDecoder::BufferReady( |
- DemuxerStream::Status status, |
- const scoped_refptr<DecoderBuffer>& buffer) { |
- DCHECK(message_loop_->BelongsToCurrentThread()); |
- DCHECK_NE(state_, kDecodeFinished); |
- DCHECK_NE(state_, kError); |
- DCHECK_EQ(status != DemuxerStream::kOk, !buffer.get()) << status; |
- |
- if (state_ == kUninitialized) |
- return; |
- |
- DCHECK(!read_cb_.is_null()); |
- |
- if (!reset_cb_.is_null()) { |
- base::ResetAndReturn(&read_cb_).Run(kOk, NULL); |
- DoReset(); |
- return; |
- } |
- |
- if (status == DemuxerStream::kAborted) { |
- base::ResetAndReturn(&read_cb_).Run(kOk, NULL); |
- return; |
- } |
- |
- // VideoFrameStream ensures no kConfigChanged is passed to VideoDecoders. |
- DCHECK_EQ(status, DemuxerStream::kOk) << status; |
- DecodeBuffer(buffer); |
-} |
- |
void FFmpegVideoDecoder::DecodeBuffer( |
const scoped_refptr<DecoderBuffer>& buffer) { |
DCHECK(message_loop_->BelongsToCurrentThread()); |
@@ -268,7 +228,7 @@ void FFmpegVideoDecoder::DecodeBuffer( |
DCHECK_NE(state_, kError); |
DCHECK(reset_cb_.is_null()); |
DCHECK(!read_cb_.is_null()); |
- DCHECK(buffer.get()); |
+ DCHECK(buffer); |
// During decode, because reads are issued asynchronously, it is possible to |
// receive multiple end of stream buffers since each read is acked. When the |
@@ -304,7 +264,7 @@ void FFmpegVideoDecoder::DecodeBuffer( |
} |
scoped_refptr<VideoFrame> video_frame; |
- if (!Decode(buffer, &video_frame)) { |
+ if (!FFmpegDecode(buffer, &video_frame)) { |
state_ = kError; |
base::ResetAndReturn(&read_cb_).Run(kDecodeError, NULL); |
return; |
@@ -325,14 +285,14 @@ void FFmpegVideoDecoder::DecodeBuffer( |
return; |
} |
- ReadFromDemuxerStream(); |
+ base::ResetAndReturn(&read_cb_).Run(kNotEnoughData, NULL); |
return; |
} |
base::ResetAndReturn(&read_cb_).Run(kOk, video_frame); |
} |
-bool FFmpegVideoDecoder::Decode( |
+bool FFmpegVideoDecoder::FFmpegDecode( |
const scoped_refptr<DecoderBuffer>& buffer, |
scoped_refptr<VideoFrame>* video_frame) { |
DCHECK(video_frame); |
@@ -417,24 +377,12 @@ void FFmpegVideoDecoder::ReleaseFFmpegResources() { |
} |
bool FFmpegVideoDecoder::ConfigureDecoder() { |
- const VideoDecoderConfig& config = demuxer_stream_->video_decoder_config(); |
- |
- if (!config.IsValidConfig()) { |
- DLOG(ERROR) << "Invalid video stream - " << config.AsHumanReadableString(); |
- return false; |
- } |
- |
- if (config.is_encrypted()) { |
- DLOG(ERROR) << "Encrypted video stream not supported."; |
- return false; |
- } |
- |
// Release existing decoder resources if necessary. |
ReleaseFFmpegResources(); |
// Initialize AVCodecContext structure. |
codec_context_ = avcodec_alloc_context3(NULL); |
- VideoDecoderConfigToAVCodecContext(config, codec_context_); |
+ VideoDecoderConfigToAVCodecContext(config_, codec_context_); |
// Enable motion vector search (potentially slow), strong deblocking filter |
// for damaged macroblocks, and set our error detection sensitivity. |