goto EXIT;
}
- if (pExynosPort->bNeedContigMem == OMX_TRUE) {
+ if ((pVideoEnc->bDRMPlayerMode == OMX_TRUE) &&
+ (nPortIndex == OUTPUT_PORT_INDEX)) {
+ eMemType = SECURE_MEMORY;
+ } else if (pExynosPort->bNeedContigMem == OMX_TRUE) {
eMemType = CONTIG_MEMORY;
} else if ((nPortIndex == INPUT_PORT_INDEX) &&
- (pExynosPort->bufferProcessType & BUFFER_SHARE)) {
+ (pExynosPort->bufferProcessType & BUFFER_SHARE)) {
eMemType = NORMAL_MEMORY;
}
pExynosPort->extendBufferHeader[i].buf_fd[0] = fdTempBuffer;
pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);
INIT_SET_SIZE_VERSION(pTempBufferHdr, OMX_BUFFERHEADERTYPE);
- pTempBufferHdr->pBuffer = pTempBuffer;
+ if (eMemType == SECURE_MEMORY)
+ pTempBufferHdr->pBuffer = fdTempBuffer;
+ else
+ pTempBufferHdr->pBuffer = pTempBuffer;
pTempBufferHdr->nAllocLen = nSizeBytes;
pTempBufferHdr->pAppPrivate = pAppPrivate;
if (nPortIndex == INPUT_PORT_INDEX)
goto EXIT;
}
- if ((pExynosPort->portState != OMX_StateLoaded) &&
- (pExynosPort->portState != OMX_StateInvalid)) {
+ if (((pExynosPort->portState != OMX_StateLoaded) &&
+ (pExynosPort->portState != OMX_StateInvalid)) &&
+ (pExynosPort->portDefinition.bEnabled != OMX_FALSE)) {
(*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent,
pExynosComponent->callbackData,
(OMX_U32)OMX_EventError,
(OMX_U32)OMX_ErrorPortUnpopulated,
nPortIndex, NULL);
+ ret = OMX_ErrorInvalidState;
+ goto EXIT;
}
for (i = 0; i < /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM; i++) {
if (pOMXBufferHdr->pBuffer == pBufferHdr->pBuffer) {
if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) {
- Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pOMXBufferHdr->pBuffer);
+ if ((pVideoEnc->bDRMPlayerMode == OMX_TRUE) &&
+ (nPortIndex == OUTPUT_PORT_INDEX)) {
+ OMX_PTR mapBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc->hSharedMemory, (int)pOMXBufferHdr->pBuffer);
+ Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, mapBuffer);
+ } else {
+ Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pOMXBufferHdr->pBuffer);
+ }
pOMXBufferHdr->pBuffer = NULL;
pBufferHdr->pBuffer = NULL;
} else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) {
if ((pDataBuffer[0] != NULL) &&
(pDataBuffer[0]->dataValid == OMX_TRUE)) {
if (nPortIndex == INPUT_PORT_INDEX)
- Exynos_FlushInputBufferReturn(pOMXComponent, pDataBuffer[0]);
+ Exynos_InputBufferReturn(pOMXComponent, pDataBuffer[0]);
else if (nPortIndex == OUTPUT_PORT_INDEX)
- Exynos_FlushOutputBufferReturn(pOMXComponent, pDataBuffer[0]);
+ Exynos_OutputBufferReturn(pOMXComponent, pDataBuffer[0]);
}
if ((pDataBuffer[1] != NULL) &&
(pDataBuffer[1]->dataValid == OMX_TRUE)) {
if (nPortIndex == INPUT_PORT_INDEX)
- Exynos_FlushInputBufferReturn(pOMXComponent, pDataBuffer[1]);
+ Exynos_InputBufferReturn(pOMXComponent, pDataBuffer[1]);
else if (nPortIndex == OUTPUT_PORT_INDEX)
- Exynos_FlushOutputBufferReturn(pOMXComponent, pDataBuffer[1]);
+ Exynos_OutputBufferReturn(pOMXComponent, pDataBuffer[1]);
}
if (pExynosComponent->bMultiThreadProcess == OMX_TRUE) {
Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
pExynosComponent->getAllDelayBuffer = OMX_FALSE;
pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+ pExynosComponent->bBehaviorEOS = OMX_FALSE;
pExynosComponent->reInputData = OMX_FALSE;
}
}
OMX_ERRORTYPE Exynos_InputBufferReturn(
- OMX_COMPONENTTYPE *pOMXComponent)
+ OMX_COMPONENTTYPE *pOMXComponent,
+ EXYNOS_OMX_DATABUFFER *pDataBuffer)
{
OMX_ERRORTYPE ret = OMX_ErrorNone;
EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
- EXYNOS_OMX_DATABUFFER *pDataBuffer = NULL;
OMX_BUFFERHEADERTYPE *pBufferHdr = NULL;
FunctionIn();
pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
pExynosPort = &(pExynosComponent->pExynosPort[INPUT_PORT_INDEX]);
- if (pExynosPort->bufferProcessType & BUFFER_COPY) {
- pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
- } else if (pExynosPort->bufferProcessType & BUFFER_SHARE) {
- pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
- }
-
if (pDataBuffer != NULL)
pBufferHdr = pDataBuffer->bufferHeader;
if (pBufferHdr != NULL) {
if (pExynosPort->markType.hMarkTargetComponent != NULL) {
- pBufferHdr->hMarkTargetComponent = pExynosPort->markType.hMarkTargetComponent;
- pBufferHdr->pMarkData = pExynosPort->markType.pMarkData;
- pExynosPort->markType.hMarkTargetComponent = NULL;
- pExynosPort->markType.pMarkData = NULL;
- }
-
- if (pBufferHdr->hMarkTargetComponent != NULL) {
- if (pBufferHdr->hMarkTargetComponent == pOMXComponent) {
- pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
- pExynosComponent->callbackData,
- OMX_EventMark,
- 0, 0, pBufferHdr->pMarkData);
- } else {
- pExynosComponent->propagateMarkType.hMarkTargetComponent = pBufferHdr->hMarkTargetComponent;
- pExynosComponent->propagateMarkType.pMarkData = pBufferHdr->pMarkData;
- }
- }
-
- pBufferHdr->nFilledLen = 0;
- pBufferHdr->nOffset = 0;
- Exynos_OMX_InputBufferReturn(pOMXComponent, pBufferHdr);
- }
-
- /* reset dataBuffer */
- Exynos_ResetDataBuffer(pDataBuffer);
-
-EXIT:
- FunctionOut();
-
- return ret;
-}
-
-OMX_ERRORTYPE Exynos_FlushInputBufferReturn(
- OMX_COMPONENTTYPE *pOMXComponent,
- EXYNOS_OMX_DATABUFFER *pDataBuffer)
-{
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
- EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
- OMX_BUFFERHEADERTYPE *pBufferHdr = NULL;
-
- FunctionIn();
-
- if (pOMXComponent == NULL) {
- ret = OMX_ErrorBadParameter;
- goto EXIT;
- }
-
- if (pOMXComponent->pComponentPrivate == NULL) {
- ret = OMX_ErrorBadParameter;
- goto EXIT;
- }
- pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
- pExynosPort = &(pExynosComponent->pExynosPort[INPUT_PORT_INDEX]);
-
- pBufferHdr = pDataBuffer->bufferHeader;
-
- if (pBufferHdr != NULL) {
- if (pExynosPort->markType.hMarkTargetComponent != NULL) {
- pBufferHdr->hMarkTargetComponent = pExynosPort->markType.hMarkTargetComponent;
- pBufferHdr->pMarkData = pExynosPort->markType.pMarkData;
- pExynosPort->markType.hMarkTargetComponent = NULL;
- pExynosPort->markType.pMarkData = NULL;
+ pBufferHdr->hMarkTargetComponent = pExynosPort->markType.hMarkTargetComponent;
+ pBufferHdr->pMarkData = pExynosPort->markType.pMarkData;
+ pExynosPort->markType.hMarkTargetComponent = NULL;
+ pExynosPort->markType.pMarkData = NULL;
}
if (pBufferHdr->hMarkTargetComponent != NULL) {
OMX_EventMark,
0, 0, pBufferHdr->pMarkData);
} else {
- pExynosComponent->propagateMarkType.hMarkTargetComponent = pBufferHdr->hMarkTargetComponent;
- pExynosComponent->propagateMarkType.pMarkData = pBufferHdr->pMarkData;
+ pExynosComponent->propagateMarkType.hMarkTargetComponent = pBufferHdr->hMarkTargetComponent;
+ pExynosComponent->propagateMarkType.pMarkData = pBufferHdr->pMarkData;
}
}
- pBufferHdr->nFilledLen = 0;
- pBufferHdr->nOffset = 0;
+ pBufferHdr->nFilledLen = 0;
+ pBufferHdr->nOffset = 0;
Exynos_OMX_InputBufferReturn(pOMXComponent, pBufferHdr);
}
}
OMX_ERRORTYPE Exynos_OutputBufferReturn(
- OMX_COMPONENTTYPE *pOMXComponent)
+ OMX_COMPONENTTYPE *pOMXComponent,
+ EXYNOS_OMX_DATABUFFER *pDataBuffer)
{
OMX_ERRORTYPE ret = OMX_ErrorNone;
EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
- EXYNOS_OMX_DATABUFFER *pDataBuffer = NULL;
OMX_BUFFERHEADERTYPE *pBufferHdr = NULL;
FunctionIn();
pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
pExynosPort = &(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]);
- pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
- pBufferHdr = pDataBuffer->bufferHeader;
+ if (pDataBuffer != NULL)
+ pBufferHdr = pDataBuffer->bufferHeader;
if (pBufferHdr != NULL) {
pBufferHdr->nFilledLen = pDataBuffer->remainDataLen;
if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
pBufferHdr->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
pBufferHdr->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
- pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
- pExynosComponent->propagateMarkType.pMarkData = NULL;
+ pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
+ pExynosComponent->propagateMarkType.pMarkData = NULL;
}
if ((pBufferHdr->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
- pBufferHdr->nFilledLen = 0;
Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "event OMX_BUFFERFLAG_EOS!!!");
pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
pExynosComponent->callbackData,
return ret;
}
-OMX_ERRORTYPE Exynos_FlushOutputBufferReturn(
- OMX_COMPONENTTYPE *pOMXComponent,
- EXYNOS_OMX_DATABUFFER *pDataBuffer)
-{
- OMX_ERRORTYPE ret = OMX_ErrorNone;
- EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
- OMX_BUFFERHEADERTYPE *pBufferHdr = NULL;
-
- FunctionIn();
-
- if (pOMXComponent == NULL) {
- ret = OMX_ErrorBadParameter;
- goto EXIT;
- }
-
- if (pOMXComponent->pComponentPrivate == NULL) {
- ret = OMX_ErrorBadParameter;
- goto EXIT;
- }
- pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
- pBufferHdr = pDataBuffer->bufferHeader;
-
- if (pBufferHdr != NULL) {
- pBufferHdr->nFilledLen = pDataBuffer->remainDataLen;
- pBufferHdr->nOffset = 0;
- pBufferHdr->nFlags = pDataBuffer->nFlags;
- pBufferHdr->nTimeStamp = pDataBuffer->timeStamp;
-
- if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
- pBufferHdr->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
- pBufferHdr->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
- pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
- pExynosComponent->propagateMarkType.pMarkData = NULL;
- }
-
- if ((pBufferHdr->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
- pBufferHdr->nFilledLen = 0;
- Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "event OMX_BUFFERFLAG_EOS!!!");
- pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
- pExynosComponent->callbackData,
- OMX_EventBufferFlag,
- OUTPUT_PORT_INDEX,
- pBufferHdr->nFlags, NULL);
- }
- Exynos_OMX_OutputBufferReturn(pOMXComponent, pBufferHdr);
- }
-
- /* reset dataBuffer */
- Exynos_ResetDataBuffer(pDataBuffer);
-
-EXIT:
- FunctionOut();
-
- return ret;
-}
-
OMX_ERRORTYPE Exynos_OutputBufferGetQueue(
EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
{
pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
} else if (pExynosPort->bufferProcessType & BUFFER_SHARE) {
pDataBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
+ } else {
+ ret = OMX_ErrorUndefined;
+ goto EXIT;
}
if (pExynosComponent->currentState != OMX_StateExecuting) {
} else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
(!CHECK_PORT_BEING_FLUSHED(pExynosPort))) {
Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
- if ((pDataBuffer != NULL) &&
- (pDataBuffer->dataValid != OMX_TRUE)) {
+ if (pDataBuffer->dataValid != OMX_TRUE) {
pMessage = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
if (pMessage == NULL) {
ret = OMX_ErrorUndefined;
pPortMemType->bNeedContigMem = pExynosPort->bNeedContigMem;
}
break;
+ case OMX_IndexParamVideoIntraRefresh:
+ {
+ OMX_VIDEO_PARAM_INTRAREFRESHTYPE *pIntraRefresh = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)pComponentParameterStructure;
+ OMX_U32 nPortIndex = pIntraRefresh->nPortIndex;
+ EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+
+ ret = Exynos_OMX_Check_SizeVersion(pIntraRefresh, sizeof(OMX_VIDEO_PARAM_INTRAREFRESHTYPE));
+ if (ret != OMX_ErrorNone)
+ goto EXIT;
+
+ if (nPortIndex != OUTPUT_PORT_INDEX) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ }
+
+ pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+ pIntraRefresh->eRefreshMode = pVideoEnc->intraRefresh.eRefreshMode;
+ pIntraRefresh->nAirMBs = pVideoEnc->intraRefresh.nAirMBs;
+ pIntraRefresh->nAirRef = pVideoEnc->intraRefresh.nAirRef;
+ pIntraRefresh->nCirMBs = pVideoEnc->intraRefresh.nCirMBs;
+
+ ret = OMX_ErrorNone;
+ }
+ break;
default:
{
ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, pComponentParameterStructure);
pExynosPort->bNeedContigMem = pPortMemType->bNeedContigMem;
}
break;
+ case OMX_IndexParamVideoIntraRefresh:
+ {
+ OMX_VIDEO_PARAM_INTRAREFRESHTYPE *pIntraRefresh = (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)pComponentParameterStructure;
+ OMX_U32 nPortIndex = pIntraRefresh->nPortIndex;
+ EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+
+ ret = Exynos_OMX_Check_SizeVersion(pIntraRefresh, sizeof(OMX_VIDEO_PARAM_INTRAREFRESHTYPE));
+ if (ret != OMX_ErrorNone)
+ goto EXIT;
+
+ if (nPortIndex != OUTPUT_PORT_INDEX) {
+ ret = OMX_ErrorBadPortIndex;
+ goto EXIT;
+ }
+
+ pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+ if (pIntraRefresh->eRefreshMode == OMX_VIDEO_IntraRefreshCyclic) {
+ pVideoEnc->intraRefresh.eRefreshMode = pIntraRefresh->eRefreshMode;
+ pVideoEnc->intraRefresh.nCirMBs = pIntraRefresh->nCirMBs;
+ Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_VIDEO_IntraRefreshCyclic Enable, nCirMBs: %d",
+ pVideoEnc->intraRefresh.nCirMBs);
+ } else {
+ ret = OMX_ErrorUnsupportedSetting;
+ goto EXIT;
+ }
+
+ ret = OMX_ErrorNone;
+ }
+ break;
default:
{
ret = Exynos_OMX_SetParameter(hComponent, nParamIndex, pComponentParameterStructure);