summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorvhiremath@nvidia.com <vhiremath@nvidia.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-23 05:49:50 +0000
committervhiremath@nvidia.com <vhiremath@nvidia.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-23 05:49:50 +0000
commitb794fd465e53005a6dd5b6ec60839ec916e4b4ff (patch)
treee6d55089ea65a250b04b9f24811da7f3c23eb092 /content
parent450b8e16963619110fbde467df9757e807217156 (diff)
downloadchromium_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.cc8
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";