Index: media/filters/ffmpeg_video_decoder.cc |
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc |
index f05fa3f98e36b743b761173552a35f7a85c8defa..ff44bf8a70c6cca00dc561e181d98736767bcabe 100644 |
--- a/media/filters/ffmpeg_video_decoder.cc |
+++ b/media/filters/ffmpeg_video_decoder.cc |
@@ -207,6 +207,11 @@ void FFmpegVideoDecoder::Stop(const base::Closure& closure) { |
return; |
} |
+ if (state_ == kUninitialized) { |
+ closure.Run(); |
+ return; |
+ } |
+ |
if (decryptor_) |
decryptor_->CancelDecrypt(); |
@@ -226,7 +231,9 @@ void FFmpegVideoDecoder::DoStop() { |
} |
FFmpegVideoDecoder::~FFmpegVideoDecoder() { |
- ReleaseFFmpegResources(); |
+ DCHECK_EQ(kUninitialized, state_); |
+ DCHECK(!codec_context_); |
+ DCHECK(!av_frame_); |
} |
void FFmpegVideoDecoder::DoRead(const ReadCB& read_cb) { |
@@ -528,11 +535,10 @@ bool FFmpegVideoDecoder::ConfigureDecoder() { |
codec_context_->release_buffer = ReleaseVideoBufferImpl; |
AVCodec* codec = avcodec_find_decoder(codec_context_->codec_id); |
- if (!codec) |
- return false; |
- |
- if (avcodec_open2(codec_context_, codec, NULL) < 0) |
+ if (!codec || avcodec_open2(codec_context_, codec, NULL) < 0) { |
+ ReleaseFFmpegResources(); |
return false; |
+ } |
av_frame_ = avcodec_alloc_frame(); |
return true; |