| Index: media/filters/omx_video_decode_engine.cc
|
| diff --git a/media/filters/omx_video_decode_engine.cc b/media/filters/omx_video_decode_engine.cc
|
| index 4d56f56c70ba89fae7874c91699e8f9c749b84fb..b07e4db467e4b60a91752a5e657c8f576dedf8a1 100644
|
| --- a/media/filters/omx_video_decode_engine.cc
|
| +++ b/media/filters/omx_video_decode_engine.cc
|
| @@ -62,7 +62,8 @@ OmxVideoDecodeEngine::OmxVideoDecodeEngine()
|
| }
|
|
|
| OmxVideoDecodeEngine::~OmxVideoDecodeEngine() {
|
| - DCHECK_EQ(client_state_, kClientNotInitialized);
|
| + DCHECK(client_state_ == kClientNotInitialized ||
|
| + client_state_ == kClientStopped);
|
| DCHECK_EQ(il_state_, kIlNone);
|
| DCHECK_EQ(0u, input_buffers_.size());
|
| DCHECK_EQ(0u, output_buffers_.size());
|
| @@ -168,6 +169,7 @@ VideoDecodeEngine::State OmxVideoDecodeEngine::state() const {
|
| return kNormal;
|
| break;
|
| case kClientStopping:
|
| + case kClientStopped:
|
| return kStopped;
|
| break;
|
| case kClientError:
|
| @@ -521,10 +523,16 @@ void OmxVideoDecodeEngine::DoneSetStateExecuting(OMX_STATETYPE state) {
|
| // and outside allocator.
|
| void OmxVideoDecodeEngine::FillThisBuffer(
|
| scoped_refptr<VideoFrame> video_frame) {
|
| +
|
| // TODO(wjia): merge buffer recycling for EGLImage and system memory path.
|
| if (!video_frame.get() || VideoFrame::TYPE_EGL_IMAGE != video_frame->type())
|
| return;
|
|
|
| + if (!CanAcceptOutput()) {
|
| + fill_this_buffer_callback_->Run(video_frame);
|
| + return;
|
| + }
|
| +
|
| OMX_BUFFERHEADERTYPE* omx_buffer = FindOmxBuffer(video_frame);
|
| if (omx_buffer) {
|
| if (kClientRunning == client_state_) {
|
| @@ -734,7 +742,10 @@ void OmxVideoDecodeEngine::DeinitFromLoaded(OMX_STATETYPE state) {
|
| component_handle_ = NULL;
|
| }
|
| il_state_ = expected_il_state_ = kIlNone;
|
| - client_state_ = kClientNotInitialized;
|
| +
|
| + // kClientStopped is different from kClientNotInitialized. The former can't
|
| + // accept output buffers, while the latter can.
|
| + client_state_ = kClientStopped;
|
|
|
| OMX_Deinit();
|
|
|
| @@ -851,6 +862,7 @@ void OmxVideoDecodeEngine::FreeOutputBuffers() {
|
| }
|
| }
|
| output_frames_.clear();
|
| + output_frames_allocated_ = false;
|
| } else {
|
| for (size_t i = 0; i < output_buffers_.size(); ++i)
|
| OMX_FreeBuffer(component_handle_, output_port_, output_buffers_[i]);
|
| @@ -917,14 +929,17 @@ bool OmxVideoDecodeEngine::CanFillBuffer() {
|
|
|
| bool OmxVideoDecodeEngine::CanAcceptInput() {
|
| // We can't take input buffer when in error state.
|
| - return (client_state_ != kClientError &&
|
| - !input_queue_has_eos_ &&
|
| - kClientStopping != client_state_);
|
| + return (kClientError != client_state_ &&
|
| + kClientStopping != client_state_ &&
|
| + kClientStopped != client_state_ &&
|
| + !input_queue_has_eos_);
|
| }
|
|
|
| bool OmxVideoDecodeEngine::CanAcceptOutput() {
|
| - // TODO(hclam): Reject when in stopped state.
|
| - return client_state_ != kClientError && output_port_state_ == kPortEnabled;
|
| + return (kClientError != client_state_ &&
|
| + kClientStopping != client_state_ &&
|
| + kClientStopped != client_state_ &&
|
| + output_port_state_ == kPortEnabled);
|
| }
|
|
|
| // TODO(wjia): There are several things need to be done here:
|
|
|