diff options
author | vhiremath@nvidia.com <vhiremath@nvidia.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-23 05:49:50 +0000 |
---|---|---|
committer | vhiremath@nvidia.com <vhiremath@nvidia.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-23 05:49:50 +0000 |
commit | b794fd465e53005a6dd5b6ec60839ec916e4b4ff (patch) | |
tree | e6d55089ea65a250b04b9f24811da7f3c23eb092 /content | |
parent | 450b8e16963619110fbde467df9757e807217156 (diff) | |
download | chromium_src-b794fd465e53005a6dd5b6ec60839ec916e4b4ff.zip chromium_src-b794fd465e53005a6dd5b6ec60839ec916e4b4ff.tar.gz chromium_src-b794fd465e53005a6dd5b6ec60839ec916e4b4ff.tar.bz2 |
Fix the EOS hang and jerkiness in playback.
- output_picture_ should be cleared only after
freeing the output buffers.
- pop out free_input_buffers_ in Flush. This was missing
and creates failure during FreeInputBuffers()
- new picture_buffers to be pushed back into
assigned_picture_buffers_.
Otherwise display gets wrong texture
These changes will fix the hang at EOS.
BUG=none
TEST=gpu_video_tests
Review URL: http://codereview.chromium.org/7017006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86254 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/gpu/omx_video_decode_accelerator.cc | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/content/gpu/omx_video_decode_accelerator.cc b/content/gpu/omx_video_decode_accelerator.cc index 2213c49..32f8eec 100644 --- a/content/gpu/omx_video_decode_accelerator.cc +++ b/content/gpu/omx_video_decode_accelerator.cc @@ -294,7 +294,7 @@ void OmxVideoDecodeAccelerator::AssignPictureBuffer( } assigned_picture_buffers_.insert( - assigned_picture_buffers_.begin(), + assigned_picture_buffers_.end(), picture_buffers.begin(), picture_buffers.end()); @@ -396,6 +396,7 @@ bool OmxVideoDecodeAccelerator::Flush( flush_done_callback_ = callback; 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; @@ -529,7 +530,6 @@ void OmxVideoDecodeAccelerator::OnPortCommandFlush(OMX_STATETYPE state) { OutputPicture output_picture = output_pictures_[i]; client_->DismissPictureBuffer(output_picture.first); } - output_pictures_.clear(); } void OmxVideoDecodeAccelerator::OnStateChangeExecutingToIdle( @@ -669,7 +669,7 @@ void OmxVideoDecodeAccelerator::FreeInputBuffers() { // Calls to OMX to free buffers. OMX_ERRORTYPE result; OMX_BUFFERHEADERTYPE* omx_buffer; - for (int i = 0; i < input_buffer_count_; ++i) { + while (!free_input_buffers_.empty()) { omx_buffer = free_input_buffers_.front(); free_input_buffers_.pop(); result = OMX_FreeBuffer(component_handle_, input_port_, omx_buffer); @@ -855,6 +855,8 @@ bool OmxVideoDecodeAccelerator::CanFillBuffer() { // has not been reached. OMX_ERRORTYPE result; OMX_STATETYPE il_state; + if (client_state_ == OMX_StateLoaded) + return false; result = OMX_GetState(component_handle_, &il_state); if (result != OMX_ErrorNone) { LOG(ERROR) << "SendCommand(OMX_CommandPortDisable) failed"; |