summaryrefslogtreecommitdiffstats
path: root/sec_mm/sec_omx/sec_omx_component/video/enc/SEC_OMX_Venc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sec_mm/sec_omx/sec_omx_component/video/enc/SEC_OMX_Venc.c')
-rw-r--r--sec_mm/sec_omx/sec_omx_component/video/enc/SEC_OMX_Venc.c103
1 files changed, 61 insertions, 42 deletions
diff --git a/sec_mm/sec_omx/sec_omx_component/video/enc/SEC_OMX_Venc.c b/sec_mm/sec_omx/sec_omx_component/video/enc/SEC_OMX_Venc.c
index e5bd981..1ee198e 100644
--- a/sec_mm/sec_omx/sec_omx_component/video/enc/SEC_OMX_Venc.c
+++ b/sec_mm/sec_omx/sec_omx_component/video/enc/SEC_OMX_Venc.c
@@ -32,6 +32,7 @@
#include "SEC_OSAL_Event.h"
#include "SEC_OMX_Venc.h"
#include "SEC_OMX_Basecomponent.h"
+#include "SEC_OSAL_Thread.h"
#undef SEC_LOG_TAG
#define SEC_LOG_TAG "SEC_VIDEO_ENC"
@@ -222,7 +223,6 @@ OMX_ERRORTYPE SEC_OMX_AllocateBuffer(
ret = OMX_ErrorInsufficientResources;
goto EXIT;
}
-SEC_OSAL_Log(SEC_LOG_TRACE, "SEC_OMX_AllocateBuffer => port:%d, size:%d", nPortIndex, nSizeBytes);
temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)SEC_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
if (temp_bufferHeader == NULL) {
@@ -478,11 +478,9 @@ OMX_ERRORTYPE SEC_InputBufferGetQueue(SEC_OMX_BASECOMPONENT *pSECComponent)
goto EXIT;
} else {
SEC_OSAL_SemaphoreWait(pSECPort->bufferSemID);
- if (dataBuffer->dataValid != OMX_TRUE)
- {
+ if (dataBuffer->dataValid != OMX_TRUE) {
message = (SEC_OMX_MESSAGE *)SEC_OSAL_Dequeue(&pSECPort->bufferQ);
- if (message == NULL)
- {
+ if (message == NULL) {
ret = OMX_ErrorUndefined;
goto EXIT;
}
@@ -630,7 +628,7 @@ static OMX_ERRORTYPE SEC_BufferReset(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 p
return ret;
}
-static OMX_ERRORTYPE SEC_DataDrop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 portIndex)
+static OMX_ERRORTYPE SEC_DataReset(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 portIndex)
{
OMX_ERRORTYPE ret = OMX_ErrorNone;
SEC_OMX_BASECOMPONENT *pSECComponent = (SEC_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
@@ -639,15 +637,11 @@ static OMX_ERRORTYPE SEC_DataDrop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 port
/* OMX_BUFFERHEADERTYPE *bufferHeader = dataBuffer->bufferHeader; */
SEC_OMX_DATA *processData = &pSECComponent->processData[portIndex];
- if (portIndex == 0) {
- processData->dataLen = 0;
- processData->remainDataLen = 0;
- processData->usedDataLen = 0;
- processData->nFlags = 0;
- processData->timeStamp = 0;
- } else {
- /* TBD */
- }
+ processData->dataLen = 0;
+ processData->remainDataLen = 0;
+ processData->usedDataLen = 0;
+ processData->nFlags = 0;
+ processData->timeStamp = 0;
return ret;
}
@@ -767,10 +761,10 @@ OMX_BOOL SEC_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent)
if (previousFrameEOF == OMX_TRUE) {
inputData->timeStamp = inputUseBuffer->timeStamp;
+ inputData->nFlags = inputUseBuffer->nFlags;
}
if (pSECComponent->bUseFlagEOF == OMX_TRUE) {
- inputData->nFlags = inputUseBuffer->nFlags;
if (pSECComponent->bSaveFlagEOS == OMX_TRUE) {
inputData->nFlags |= OMX_BUFFERFLAG_EOS;
flagEOF = OMX_TRUE;
@@ -782,27 +776,33 @@ OMX_BOOL SEC_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent)
flagEOF = OMX_TRUE;
pSECComponent->bSaveFlagEOS = OMX_FALSE;
} else {
- inputData->nFlags = inputUseBuffer->nFlags & (~OMX_BUFFERFLAG_EOS);
+ inputData->nFlags = (inputUseBuffer->nFlags & (~OMX_BUFFERFLAG_EOS));
}
}
} else {
/*????????????????????????????????? Error ?????????????????????????????????*/
- SEC_DataDrop(pOMXComponent, INPUT_PORT_INDEX);
+ SEC_DataReset(pOMXComponent, INPUT_PORT_INDEX);
+ flagEOF = OMX_FALSE;
}
- if (inputUseBuffer->remainDataLen == 0) {
+ if (inputUseBuffer->remainDataLen == 0)
SEC_InputBufferReturn(pOMXComponent);
- } else {
+ else
inputUseBuffer->dataValid = OMX_TRUE;
- }
}
if (flagEOF == OMX_TRUE) {
+ if (pSECComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
+ pSECComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_TRUE;
+ pSECComponent->checkTimeStamp.startTimeStamp = inputData->timeStamp;
+ pSECComponent->checkTimeStamp.nStartFlags = inputData->nFlags;
+ pSECComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
+ }
+
ret = OMX_TRUE;
} else {
ret = OMX_FALSE;
}
-
return ret;
}
@@ -815,6 +815,25 @@ OMX_BOOL SEC_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent)
OMX_U32 copySize = 0;
if (outputUseBuffer->dataValid == OMX_TRUE) {
+ if (pSECComponent->checkTimeStamp.needCheckStartTimeStamp == OMX_TRUE) {
+ if (pSECComponent->checkTimeStamp.startTimeStamp == outputData->timeStamp){
+ pSECComponent->checkTimeStamp.startTimeStamp = -19761123;
+ pSECComponent->checkTimeStamp.nStartFlags = 0x0;
+ pSECComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
+ pSECComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
+ } else {
+ SEC_DataReset(pOMXComponent, OUTPUT_PORT_INDEX);
+
+ ret = OMX_TRUE;
+ goto EXIT;
+ }
+ } else if (pSECComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
+ SEC_DataReset(pOMXComponent, OUTPUT_PORT_INDEX);
+
+ ret = OMX_TRUE;
+ goto EXIT;
+ }
+
if (outputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) {
copySize = outputData->remainDataLen;
if (copySize > 0)
@@ -830,14 +849,11 @@ OMX_BOOL SEC_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent)
ret = OMX_TRUE;
/* reset outputData */
- outputData->dataLen = 0;
- outputData->remainDataLen = 0;
- outputData->usedDataLen = 0;
- outputData->nFlags = 0;
- outputData->timeStamp = 0;
+ SEC_DataReset(pOMXComponent, OUTPUT_PORT_INDEX);
#ifdef ONE_FRAME_OUTPUT /* only one frame output for Android */
- if (outputUseBuffer->remainDataLen > 0)
+ if ((outputUseBuffer->remainDataLen > 0) ||
+ (outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS))
SEC_OutputBufferReturn(pOMXComponent);
#else
if ((outputUseBuffer->remainDataLen > 0) ||
@@ -872,6 +888,7 @@ OMX_BOOL SEC_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent)
ret = OMX_FALSE;
}
+EXIT:
return ret;
}
@@ -887,8 +904,9 @@ OMX_ERRORTYPE SEC_OMX_BufferProcess(OMX_HANDLETYPE hComponent)
SEC_OMX_DATA *inputData = &pSECComponent->processData[INPUT_PORT_INDEX];
SEC_OMX_DATA *outputData = &pSECComponent->processData[OUTPUT_PORT_INDEX];
OMX_U32 copySize = 0;
- OMX_BOOL remainOutputData = OMX_FALSE;
- OMX_BOOL reencodeInputData = OMX_FALSE;
+
+ pSECComponent->remainOutputData = OMX_FALSE;
+ pSECComponent->reInputData = OMX_FALSE;
FunctionIn();
@@ -916,8 +934,8 @@ OMX_ERRORTYPE SEC_OMX_BufferProcess(OMX_HANDLETYPE hComponent)
break;
}
}
- if (remainOutputData == OMX_FALSE) {
- if (reencodeInputData == OMX_FALSE) {
+ if (pSECComponent->remainOutputData == OMX_FALSE) {
+ if (pSECComponent->reInputData == OMX_FALSE) {
SEC_OSAL_MutexLock(inputUseBuffer->bufferMutex);
if (SEC_Preprocessor_InputData(pOMXComponent) == OMX_FALSE) {
SEC_OSAL_MutexUnlock(inputUseBuffer->bufferMutex);
@@ -928,21 +946,22 @@ OMX_ERRORTYPE SEC_OMX_BufferProcess(OMX_HANDLETYPE hComponent)
SEC_OSAL_MutexUnlock(inputUseBuffer->bufferMutex);
}
+ SEC_OSAL_MutexLock(inputUseBuffer->bufferMutex);
ret = pSECComponent->sec_mfc_bufferProcess(pOMXComponent, inputData, outputData);
- if (ret == OMX_ErrorInputDataEncodeYet) {
- reencodeInputData = OMX_TRUE;
- } else {
- reencodeInputData = OMX_FALSE;
- }
+ SEC_OSAL_MutexUnlock(inputUseBuffer->bufferMutex);
+
+ if (ret == OMX_ErrorInputDataEncodeYet)
+ pSECComponent->reInputData = OMX_TRUE;
+ else
+ pSECComponent->reInputData = OMX_FALSE;
}
SEC_OSAL_MutexLock(outputUseBuffer->bufferMutex);
- if (SEC_Postprocess_OutputData(pOMXComponent) == OMX_FALSE) {
- remainOutputData = OMX_TRUE;
- } else {
- remainOutputData = OMX_FALSE;
- }
+ if (SEC_Postprocess_OutputData(pOMXComponent) == OMX_FALSE)
+ pSECComponent->remainOutputData = OMX_TRUE;
+ else
+ pSECComponent->remainOutputData = OMX_FALSE;
SEC_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
}