Commit b794fd46 authored by vhiremath@nvidia.com's avatar vhiremath@nvidia.com

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
parent 450b8e16
...@@ -294,7 +294,7 @@ void OmxVideoDecodeAccelerator::AssignPictureBuffer( ...@@ -294,7 +294,7 @@ void OmxVideoDecodeAccelerator::AssignPictureBuffer(
} }
assigned_picture_buffers_.insert( assigned_picture_buffers_.insert(
assigned_picture_buffers_.begin(), assigned_picture_buffers_.end(),
picture_buffers.begin(), picture_buffers.begin(),
picture_buffers.end()); picture_buffers.end());
...@@ -396,6 +396,7 @@ bool OmxVideoDecodeAccelerator::Flush( ...@@ -396,6 +396,7 @@ bool OmxVideoDecodeAccelerator::Flush(
flush_done_callback_ = callback; flush_done_callback_ = callback;
OMX_BUFFERHEADERTYPE* omx_buffer = free_input_buffers_.front(); OMX_BUFFERHEADERTYPE* omx_buffer = free_input_buffers_.front();
free_input_buffers_.pop();
omx_buffer->nFilledLen = 0; omx_buffer->nFilledLen = 0;
omx_buffer->nAllocLen = omx_buffer->nFilledLen; omx_buffer->nAllocLen = omx_buffer->nFilledLen;
omx_buffer->nFlags |= OMX_BUFFERFLAG_EOS; omx_buffer->nFlags |= OMX_BUFFERFLAG_EOS;
...@@ -529,7 +530,6 @@ void OmxVideoDecodeAccelerator::OnPortCommandFlush(OMX_STATETYPE state) { ...@@ -529,7 +530,6 @@ void OmxVideoDecodeAccelerator::OnPortCommandFlush(OMX_STATETYPE state) {
OutputPicture output_picture = output_pictures_[i]; OutputPicture output_picture = output_pictures_[i];
client_->DismissPictureBuffer(output_picture.first); client_->DismissPictureBuffer(output_picture.first);
} }
output_pictures_.clear();
} }
void OmxVideoDecodeAccelerator::OnStateChangeExecutingToIdle( void OmxVideoDecodeAccelerator::OnStateChangeExecutingToIdle(
...@@ -669,7 +669,7 @@ void OmxVideoDecodeAccelerator::FreeInputBuffers() { ...@@ -669,7 +669,7 @@ void OmxVideoDecodeAccelerator::FreeInputBuffers() {
// Calls to OMX to free buffers. // Calls to OMX to free buffers.
OMX_ERRORTYPE result; OMX_ERRORTYPE result;
OMX_BUFFERHEADERTYPE* omx_buffer; OMX_BUFFERHEADERTYPE* omx_buffer;
for (int i = 0; i < input_buffer_count_; ++i) { while (!free_input_buffers_.empty()) {
omx_buffer = free_input_buffers_.front(); omx_buffer = free_input_buffers_.front();
free_input_buffers_.pop(); free_input_buffers_.pop();
result = OMX_FreeBuffer(component_handle_, input_port_, omx_buffer); result = OMX_FreeBuffer(component_handle_, input_port_, omx_buffer);
...@@ -855,6 +855,8 @@ bool OmxVideoDecodeAccelerator::CanFillBuffer() { ...@@ -855,6 +855,8 @@ bool OmxVideoDecodeAccelerator::CanFillBuffer() {
// has not been reached. // has not been reached.
OMX_ERRORTYPE result; OMX_ERRORTYPE result;
OMX_STATETYPE il_state; OMX_STATETYPE il_state;
if (client_state_ == OMX_StateLoaded)
return false;
result = OMX_GetState(component_handle_, &il_state); result = OMX_GetState(component_handle_, &il_state);
if (result != OMX_ErrorNone) { if (result != OMX_ErrorNone) {
LOG(ERROR) << "SendCommand(OMX_CommandPortDisable) failed"; LOG(ERROR) << "SendCommand(OMX_CommandPortDisable) failed";
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment