Index: media/filters/video_renderer_base.cc |
diff --git a/media/filters/video_renderer_base.cc b/media/filters/video_renderer_base.cc |
index 51c51b03c7a018d1dd8440ccaa580261124e3f8b..83d5294bc8de293a0c4803cb70ce09310d1e1df8 100644 |
--- a/media/filters/video_renderer_base.cc |
+++ b/media/filters/video_renderer_base.cc |
@@ -359,13 +359,28 @@ void VideoRendererBase::PutCurrentFrame(scoped_refptr<VideoFrame> frame) { |
} |
} |
-void VideoRendererBase::FrameReady(scoped_refptr<VideoFrame> frame) { |
+void VideoRendererBase::FrameReady(VideoDecoder::DecoderStatus status, |
+ scoped_refptr<VideoFrame> frame) { |
base::AutoLock auto_lock(lock_); |
DCHECK_NE(state_, kUninitialized); |
CHECK(pending_read_); |
pending_read_ = false; |
+ if (status == VideoDecoder::kDecodeError) { |
+ DCHECK(!frame); |
+ host()->SetError(PIPELINE_ERROR_DECODE); |
+ return; |
+ } |
+ |
+ if (status == VideoDecoder::kDecryptError) { |
+ DCHECK(!frame); |
+ host()->SetError(PIPELINE_ERROR_DECRYPT); |
+ return; |
+ } |
+ |
+ DCHECK_EQ(status, VideoDecoder::kOk); |
+ |
// Already-queued Decoder ReadCB's can fire after various state transitions |
// have happened; in that case just drop those frames immediately. |
if (state_ == kStopped || state_ == kError || state_ == kFlushed || |
@@ -460,8 +475,8 @@ void VideoRendererBase::AttemptRead_Locked() { |
(!ready_frames_.empty() && ready_frames_.back()->IsEndOfStream()) || |
state_ == kFlushingDecoder || |
state_ == kFlushing) { |
- return; |
- } |
+ return; |
+ } |
pending_read_ = true; |
decoder_->Read(base::Bind(&VideoRendererBase::FrameReady, this)); |