aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhao Liang <leo.zhao@intel.com>2013-12-05 15:16:13 +0800
committerPatrick Tjin <pattjin@google.com>2014-07-21 22:03:42 -0700
commita081918af785d476df2da1342eabe245eab468d0 (patch)
tree74e7f51285e6b2e5bf059a7bb24a41d79a78ee87
parent78c1837ebe200a58aebed8bad480064da909d6ff (diff)
downloadwrs_omxil_core-a081918af785d476df2da1342eabe245eab468d0.tar.gz
Change omx core mechanism to allow encoder working more time
BZ: 150664 for encoder case, if either bufferq or retainedbufferq is not empty core will schedule encoder working, and inport buffer may be null if only retainedbufferq has frame. Change-Id: Id347f3843d806c41176dec49f543963204603e29 Signed-off-by: Zhao Liang <leo.zhao@intel.com>
-rw-r--r--base/inc/portbase.h2
-rw-r--r--base/src/componentbase.cpp12
-rw-r--r--base/src/portbase.cpp57
3 files changed, 60 insertions, 11 deletions
diff --git a/base/inc/portbase.h b/base/inc/portbase.h
index 03527ef..01cc20c 100644
--- a/base/inc/portbase.h
+++ b/base/inc/portbase.h
@@ -92,6 +92,7 @@ public:
OMX_ERRORTYPE PushThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
OMX_BUFFERHEADERTYPE *PopBuffer(void);
OMX_U32 BufferQueueLength(void);
+ OMX_U32 RetainedBufferQueueLength(void);
/* Empty/FillBufferDone */
OMX_ERRORTYPE ReturnThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer);
@@ -106,6 +107,7 @@ public:
* accumulated buffers to omx-il clients.
*/
void ReturnAllRetainedBuffers(void);
+ void ReturnOneRetainedBuffer(void);
/* flush all buffers not under processing */
OMX_ERRORTYPE FlushPort(void);
diff --git a/base/src/componentbase.cpp b/base/src/componentbase.cpp
index 55836d1..d2e57f3 100644
--- a/base/src/componentbase.cpp
+++ b/base/src/componentbase.cpp
@@ -1817,9 +1817,13 @@ void ComponentBase::Work(void)
}
if (ret == OMX_ErrorNone) {
- PostProcessBuffers(buffers, &retain[0]);
+ if (!working_role || (strncmp((char*)working_role, "video_encoder", 13) != 0))
+ PostProcessBuffers(buffers, &retain[0]);
for (i = 0; i < nr_ports; i++) {
+ if (*buffers[i] == NULL)
+ continue;
+
if(retain[i] == BUFFER_RETAIN_GETAGAIN) {
ports[i]->RetainThisBuffer(*buffers[i], false);
}
@@ -1861,8 +1865,10 @@ bool ComponentBase::IsAllBufferAvailable(void)
for (i = 0; i < nr_ports; i++) {
OMX_U32 length = 0;
- if (ports[i]->IsEnabled())
- length = ports[i]->BufferQueueLength();
+ if (ports[i]->IsEnabled()) {
+ length += ports[i]->BufferQueueLength();
+ length += ports[i]->RetainedBufferQueueLength();
+ }
if (length)
nr_avail++;
diff --git a/base/src/portbase.cpp b/base/src/portbase.cpp
index 8c19318..3b44833 100644
--- a/base/src/portbase.cpp
+++ b/base/src/portbase.cpp
@@ -608,7 +608,7 @@ OMX_BUFFERHEADERTYPE *PortBase::PopBuffer(void)
buffer = (OMX_BUFFERHEADERTYPE *)queue_pop_head(&bufferq);
pthread_mutex_unlock(&bufferq_lock);
- LOGV_IF(buffer != NULL, "%s(): %s:%s:PortIndex %lu:pBuffer %p:\n",
+ LOGV_IF((buffer != NULL || RetainedBufferQueueLength() > 0), "%s(): %s:%s:PortIndex %lu:pBuffer %p:\n",
__FUNCTION__, cbase->GetName(), cbase->GetWorkingRole(),
portdefinition.nPortIndex, buffer);
@@ -626,6 +626,17 @@ OMX_U32 PortBase::BufferQueueLength(void)
return length;
}
+OMX_U32 PortBase::RetainedBufferQueueLength(void)
+{
+ OMX_U32 length;
+
+ pthread_mutex_lock(&retainedbufferq_lock);
+ length = queue_length(&retainedbufferq);
+ pthread_mutex_unlock(&retainedbufferq_lock);
+
+ return length;
+}
+
OMX_ERRORTYPE PortBase::ReturnThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer)
{
OMX_DIRTYPE direction = portdefinition.eDir;
@@ -746,13 +757,16 @@ OMX_ERRORTYPE PortBase::RetainThisBuffer(OMX_BUFFERHEADERTYPE *pBuffer,
/* push at tail of retainedbufferq */
if (accumulate == true) {
- /* do not accumulate a buffer set EOS flag */
- if (pBuffer->nFlags & OMX_BUFFERFLAG_EOS) {
- LOGE("%s(): %s:%s:PortIndex %lu:pBuffer %p: exit failure, "
- "cannot accumulate EOS buffer\n", __FUNCTION__,
- cbase->GetName(), cbase->GetWorkingRole(),
- portdefinition.nPortIndex, pBuffer);
- return OMX_ErrorBadParameter;
+
+ if (cbase->GetWorkingRole() == NULL || (strncmp((char*)cbase->GetWorkingRole(), "video_encoder", 13) != 0)) {
+ /* do not accumulate a buffer set EOS flag if not video encoder*/
+ if (pBuffer->nFlags & OMX_BUFFERFLAG_EOS) {
+ LOGE("%s(): %s:%s:PortIndex %lu:pBuffer %p: exit failure, "
+ "cannot accumulate EOS buffer\n", __FUNCTION__,
+ cbase->GetName(), cbase->GetWorkingRole(),
+ portdefinition.nPortIndex, pBuffer);
+ return OMX_ErrorBadParameter;
+ }
}
pthread_mutex_lock(&retainedbufferq_lock);
@@ -824,6 +838,33 @@ void PortBase::ReturnAllRetainedBuffers(void)
portdefinition.nPortIndex, i);
}
+void PortBase::ReturnOneRetainedBuffer(void)
+{
+ OMX_BUFFERHEADERTYPE *buffer;
+ OMX_ERRORTYPE ret;
+
+ pthread_mutex_lock(&retainedbufferq_lock);
+
+ buffer = (OMX_BUFFERHEADERTYPE *)queue_pop_head(&retainedbufferq);
+
+ if (buffer) {
+ LOGV("%s(): %s:%s:PortIndex %lu: returns a retained buffer "
+ "(%p:%d/%d)\n", __FUNCTION__, cbase->GetName(),
+ cbase->GetWorkingRole(), portdefinition.nPortIndex,
+ buffer, i++, queue_length(&retainedbufferq));
+
+ ret = ReturnThisBuffer(buffer);
+ if (ret != OMX_ErrorNone)
+ LOGE("%s(): %s:%s:PortIndex %lu: failed (ret : 0x%x08x)\n",
+ __FUNCTION__,
+ cbase->GetName(), cbase->GetWorkingRole(),
+ portdefinition.nPortIndex, ret);
+ }
+
+ pthread_mutex_unlock(&retainedbufferq_lock);
+
+}
+
/* SendCommand:Flush/PortEnable/Disable */
/* must be held ComponentBase::ports_block */
OMX_ERRORTYPE PortBase::FlushPort(void)