diff options
author | Zhao Liang <leo.zhao@intel.com> | 2013-12-05 15:16:13 +0800 |
---|---|---|
committer | Patrick Tjin <pattjin@google.com> | 2014-07-21 22:03:42 -0700 |
commit | a081918af785d476df2da1342eabe245eab468d0 (patch) | |
tree | 74e7f51285e6b2e5bf059a7bb24a41d79a78ee87 /base | |
parent | 78c1837ebe200a58aebed8bad480064da909d6ff (diff) | |
download | wrs_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>
Diffstat (limited to 'base')
-rw-r--r-- | base/inc/portbase.h | 2 | ||||
-rw-r--r-- | base/src/componentbase.cpp | 12 | ||||
-rw-r--r-- | base/src/portbase.cpp | 57 |
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) |