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 956742d7eca9ae5154efd2f92414462acbb9f0f4..9c3620809f5936d9dcde9262721d17a41cfee1df 100644 |
--- a/content/common/gpu/media/omx_video_decode_accelerator.cc |
+++ b/content/common/gpu/media/omx_video_decode_accelerator.cc |
@@ -289,7 +289,8 @@ void OmxVideoDecodeAccelerator::Decode( |
return; |
} |
- RETURN_ON_FAILURE(current_state_change_ == NO_TRANSITION && |
+ RETURN_ON_FAILURE((current_state_change_ == NO_TRANSITION || |
+ current_state_change_ == FLUSHING) && |
(client_state_ == OMX_StateIdle || |
client_state_ == OMX_StateExecuting), |
"Call to Decode() during invalid state or transition: " |
@@ -299,6 +300,19 @@ void OmxVideoDecodeAccelerator::Decode( |
OMX_BUFFERHEADERTYPE* omx_buffer = free_input_buffers_.front(); |
free_input_buffers_.pop(); |
+ if (bitstream_buffer.id() == -1 && bitstream_buffer.size() == 0) { |
+ // Cook up an empty buffer w/ EOS set and feed it to OMX. |
+ omx_buffer->nFilledLen = 0; |
+ omx_buffer->nAllocLen = omx_buffer->nFilledLen; |
+ omx_buffer->nFlags |= OMX_BUFFERFLAG_EOS; |
+ omx_buffer->nTimeStamp = -2; |
+ OMX_ERRORTYPE result = OMX_EmptyThisBuffer(component_handle_, omx_buffer); |
+ RETURN_ON_OMX_FAILURE(result, "OMX_EmptyThisBuffer() failed", |
+ PLATFORM_FAILURE,); |
+ input_buffers_at_component_++; |
+ return; |
+ } |
+ |
// Setup |omx_buffer|. |
scoped_ptr<base::SharedMemory> shm( |
new base::SharedMemory(bitstream_buffer.handle(), true)); |
@@ -364,6 +378,7 @@ void OmxVideoDecodeAccelerator::ReusePictureBuffer(int32 picture_buffer_id) { |
TRACE_EVENT1("Video Decoder", "OVDA::ReusePictureBuffer", |
"Picture id", picture_buffer_id); |
DCHECK_EQ(message_loop_, MessageLoop::current()); |
+ |
RETURN_ON_FAILURE(CanFillBuffer(), "Can't fill buffer", ILLEGAL_STATE,); |
OutputPictureById::iterator it = pictures_.find(picture_buffer_id); |
@@ -385,17 +400,7 @@ void OmxVideoDecodeAccelerator::Flush() { |
DCHECK_EQ(client_state_, OMX_StateExecuting); |
current_state_change_ = FLUSHING; |
- // Cook up an empty buffer w/ EOS set and feed it to OMX. |
- OMX_BUFFERHEADERTYPE* omx_buffer = free_input_buffers_.front(); |
- free_input_buffers_.pop(); |
- omx_buffer->nFilledLen = 0; |
- omx_buffer->nAllocLen = omx_buffer->nFilledLen; |
- omx_buffer->nFlags |= OMX_BUFFERFLAG_EOS; |
- omx_buffer->nTimeStamp = -2; |
- OMX_ERRORTYPE result = OMX_EmptyThisBuffer(component_handle_, omx_buffer); |
- RETURN_ON_OMX_FAILURE(result, "OMX_EmptyThisBuffer() failed", |
- PLATFORM_FAILURE,); |
- input_buffers_at_component_++; |
+ Decode(media::BitstreamBuffer(-1, base::SharedMemoryHandle(), 0)); |
} |
void OmxVideoDecodeAccelerator::OnReachedEOSInFlushing() { |
@@ -535,6 +540,10 @@ void OmxVideoDecodeAccelerator::OnReachedPauseInResetting() { |
void OmxVideoDecodeAccelerator::DecodeQueuedBitstreamBuffers() { |
BitstreamBufferList buffers; |
buffers.swap(queued_bitstream_buffers_); |
+ if (current_state_change_ == DESTROYING || |
+ current_state_change_ == ERRORING) { |
+ return; |
+ } |
for (size_t i = 0; i < buffers.size(); ++i) |
Decode(buffers[i]); |
} |