Index: content/common/gpu/media/omx_video_decode_accelerator.cc |
diff --git a/content/common/gpu/media/omx_video_decode_accelerator.cc b/content/common/gpu/media/omx_video_decode_accelerator.cc |
index de862197752cc2d491d7c388b15a5266ccc374a3..41cdcb0bf9c657a6f2124f7a19d2742c773dff8e 100644 |
--- a/content/common/gpu/media/omx_video_decode_accelerator.cc |
+++ b/content/common/gpu/media/omx_video_decode_accelerator.cc |
@@ -359,6 +359,17 @@ void OmxVideoDecodeAccelerator::ReusePictureBuffer(int32 picture_buffer_id) { |
TRACE_EVENT1("Video Decoder", "OVDA::ReusePictureBuffer", |
"Picture id", picture_buffer_id); |
DCHECK_EQ(message_loop_, MessageLoop::current()); |
+ |
+ // If we are resetting/destroying/erroring, don't bother, as |
+ // OMX_FillThisBuffer will fail anyway. In case we're in the middle of |
+ // closing, this will put the Accelerator in ERRORING mode, which has the |
+ // unwanted side effect of not going through the OMX_FreeBuffers path and |
+ // leaks memory. |
+ if (current_state_change_ == RESETTING || |
+ current_state_change_ == DESTROYING || |
+ current_state_change_ == ERRORING) |
+ return; |
+ |
RETURN_ON_FAILURE(CanFillBuffer(), "Can't fill buffer", ILLEGAL_STATE,); |
OutputPictureById::iterator it = pictures_.find(picture_buffer_id); |
@@ -800,8 +811,7 @@ void OmxVideoDecodeAccelerator::FillBufferDoneTask( |
if (buffer->nFlags & OMX_BUFFERFLAG_EOS) { |
buffer->nFlags &= ~OMX_BUFFERFLAG_EOS; |
OnReachedEOSInFlushing(); |
- if (current_state_change_ != DESTROYING) |
- ReusePictureBuffer(picture_buffer_id); |
+ ReusePictureBuffer(picture_buffer_id); |
return; |
} |