summaryrefslogtreecommitdiff
path: root/omx/base/omx_base_dio_plugin/src/omx_base_dio.c
diff options
context:
space:
mode:
Diffstat (limited to 'omx/base/omx_base_dio_plugin/src/omx_base_dio.c')
-rw-r--r--omx/base/omx_base_dio_plugin/src/omx_base_dio.c311
1 files changed, 311 insertions, 0 deletions
diff --git a/omx/base/omx_base_dio_plugin/src/omx_base_dio.c b/omx/base/omx_base_dio_plugin/src/omx_base_dio.c
new file mode 100644
index 0000000..a97351e
--- /dev/null
+++ b/omx/base/omx_base_dio_plugin/src/omx_base_dio.c
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) Texas Instruments - http://www.ti.com/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_TAG "OMX_BASE_DIO"
+
+#include <string.h>
+#include <omx_base.h>
+
+static OMX_PTR OMXBase_DIO_GetPort(OMX_HANDLETYPE hComponent,
+ OMX_U32 nPortIndex);
+/*
+* OMXBase DIO Init
+*/
+OMX_ERRORTYPE OMXBase_DIO_Init (OMX_HANDLETYPE hComponent,
+ OMX_U32 nPortIndex,
+ OMX_STRING cChannelType,
+ OMX_PTR pCreateParams)
+{
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_DIO_Object *hDIO = NULL;
+ OMXBase_Port *pPort = NULL;
+ OMX_BOOL bFound = OMX_FALSE;
+ OMX_U32 i = 0;
+
+ OMX_COMPONENTTYPE *pComp = (OMX_COMPONENTTYPE *)hComponent;
+ OMXBaseComp *pBaseComp = (OMXBaseComp *)pComp->pComponentPrivate;
+
+ OMX_CHECK(NULL != cChannelType, OMX_ErrorBadParameter);
+
+ pPort = OMXBase_DIO_GetPort(hComponent, nPortIndex);
+ OMX_CHECK(pPort != NULL, OMX_ErrorBadParameter);
+
+ while( NULL != OMX_DIO_Registered[i].cChannelType ) {
+ if( strcmp(cChannelType, OMX_DIO_Registered[i].cChannelType) == 0 ) {
+ bFound = OMX_TRUE;
+ break;
+ }
+ i++;
+ }
+
+ if( bFound ) {
+ hDIO = (OMX_DIO_Object *) OSAL_Malloc(sizeof(OMX_DIO_Object));
+ OMX_CHECK(NULL != hDIO, OMX_ErrorInsufficientResources);
+ OSAL_Memset(hDIO, 0x0, sizeof(OMX_DIO_Object));
+
+ /* Initialize the DIO object depending on the ChannelType */
+ eError = OMX_DIO_Registered[i].pInitialize(hDIO, pCreateParams);
+ OMX_CHECK(OMX_ErrorNone == eError, eError);
+
+ /* Assign DIO handle to port */
+ pPort->hDIO = hDIO;
+ } else {
+ OMX_CHECK(OMX_FALSE, OMX_ErrorUndefined);
+ }
+
+EXIT:
+ return (eError);
+}
+
+/*
+* OMXBase DIO DeInit
+*/
+OMX_ERRORTYPE OMXBase_DIO_Deinit (OMX_HANDLETYPE hComponent,
+ OMX_U32 nPortIndex)
+{
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_DIO_Object *hDIO = NULL;
+ OMXBase_Port *pPort = NULL;
+
+ pPort = OMXBase_DIO_GetPort(hComponent, nPortIndex);
+ OMX_CHECK(pPort != NULL, OMX_ErrorBadParameter);
+
+ hDIO = (OMX_DIO_Object *)pPort->hDIO;
+ OMX_CHECK(hDIO != NULL, OMX_ErrorBadParameter);
+
+ eError = hDIO->deinit(hDIO);
+
+ OSAL_Free(pPort->hDIO);
+ pPort->hDIO = NULL;
+
+EXIT:
+ return (eError);
+}
+
+/*
+* OMXBase DIO Open
+*/
+OMX_ERRORTYPE OMXBase_DIO_Open (OMX_HANDLETYPE hComponent,
+ OMX_U32 nPortIndex,
+ OMX_PTR pOpenParams)
+{
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_DIO_Object *hDIO = NULL;
+ OMXBase_Port *pPort = NULL;
+
+ pPort = OMXBase_DIO_GetPort(hComponent, nPortIndex);
+ OMX_CHECK(pPort != NULL, OMX_ErrorBadParameter);
+
+ hDIO = (OMX_DIO_Object *)pPort->hDIO;
+ OMX_CHECK(hDIO != NULL, OMX_ErrorBadParameter);
+
+ eError = hDIO->open(hDIO, (OMX_DIO_OpenParams *)pOpenParams);
+
+EXIT:
+ if( eError == OMX_ErrorNone ) {
+ hDIO->bOpened = OMX_TRUE;
+ }
+ return (eError);
+}
+
+/*
+* OMX Base DIO close
+*/
+OMX_ERRORTYPE OMXBase_DIO_Close (OMX_HANDLETYPE hComponent,
+ OMX_U32 nPortIndex)
+{
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_DIO_Object *hDIO = NULL;
+ OMXBase_Port *pPort = NULL;
+
+ pPort = OMXBase_DIO_GetPort(hComponent, nPortIndex);
+ OMX_CHECK(pPort != NULL, OMX_ErrorBadParameter);
+
+ hDIO = (OMX_DIO_Object *)pPort->hDIO;
+ OMX_CHECK(hDIO != NULL, OMX_ErrorBadParameter);
+
+ hDIO->bOpened = OMX_FALSE;
+ eError = hDIO->close(hDIO);
+
+EXIT:
+ return (eError);
+}
+
+/*
+* OMX Base DIO Queue
+*/
+OMX_ERRORTYPE OMXBase_DIO_Queue (OMX_HANDLETYPE hComponent,
+ OMX_U32 nPortIndex,
+ OMX_PTR pBuffHeader)
+{
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_DIO_Object *hDIO = NULL;
+ OMXBase_Port *pPort = NULL;
+
+ pPort = OMXBase_DIO_GetPort(hComponent, nPortIndex);
+ OMX_CHECK(pPort != NULL, OMX_ErrorBadParameter);
+
+ hDIO = (OMX_DIO_Object *)pPort->hDIO;
+ OMX_CHECK(hDIO != NULL, OMX_ErrorBadParameter);
+
+ eError = hDIO->queue(hDIO, pBuffHeader);
+
+EXIT:
+ return (eError);
+}
+
+/*
+* OMXBase DIO Dequeue
+*/
+OMX_ERRORTYPE OMXBase_DIO_Dequeue (OMX_HANDLETYPE hComponent,
+ OMX_U32 nPortIndex,
+ OMX_PTR *pBuffHeader)
+{
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_DIO_Object *hDIO = NULL;
+ OMXBase_Port *pPort = NULL;
+
+ pPort = OMXBase_DIO_GetPort(hComponent, nPortIndex);
+ OMX_CHECK(pPort != NULL, OMX_ErrorBadParameter);
+
+ hDIO = (OMX_DIO_Object *)pPort->hDIO;
+ OMX_CHECK(hDIO != NULL, OMX_ErrorBadParameter);
+
+ eError = hDIO->dequeue(hDIO, pBuffHeader);
+
+EXIT:
+ return (eError);
+}
+
+/*
+* OMXBase DIO Send
+*/
+OMX_ERRORTYPE OMXBase_DIO_Send (OMX_HANDLETYPE hComponent,
+ OMX_U32 nPortIndex,
+ OMX_PTR pBuffHeader)
+{
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_DIO_Object *hDIO = NULL;
+ OMXBase_Port *pPort = NULL;
+
+ pPort = OMXBase_DIO_GetPort(hComponent, nPortIndex);
+ OMX_CHECK(pPort != NULL, OMX_ErrorBadParameter);
+
+ hDIO = (OMX_DIO_Object *)pPort->hDIO;
+ OMX_CHECK(hDIO != NULL, OMX_ErrorBadParameter);
+
+ eError = hDIO->send(hDIO, pBuffHeader);
+
+EXIT:
+ return (eError);
+}
+
+/*
+* OMXBase DIO Cancel
+*/
+OMX_ERRORTYPE OMXBase_DIO_Cancel (OMX_HANDLETYPE hComponent,
+ OMX_U32 nPortIndex,
+ OMX_PTR pBuffHeader)
+{
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_DIO_Object *hDIO = NULL;
+ OMXBase_Port *pPort = NULL;
+
+ pPort = OMXBase_DIO_GetPort(hComponent, nPortIndex);
+ OMX_CHECK(pPort != NULL, OMX_ErrorBadParameter);
+
+ hDIO = (OMX_DIO_Object *)pPort->hDIO;
+ OMX_CHECK(hDIO != NULL, OMX_ErrorBadParameter);
+
+ eError = hDIO->cancel(hDIO, pBuffHeader);
+
+EXIT:
+ return (eError);
+}
+
+/*
+* OMXBase DIO Control
+*/
+OMX_ERRORTYPE OMXBase_DIO_Control (OMX_HANDLETYPE hComponent,
+ OMX_U32 nPortIndex,
+ OMX_DIO_CtrlCmdType nCmdType,
+ OMX_PTR pParams)
+{
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_DIO_Object *hDIO = NULL;
+ OMXBase_Port *pPort = NULL;
+
+ pPort = OMXBase_DIO_GetPort(hComponent, nPortIndex);
+ OMX_CHECK(pPort != NULL, OMX_ErrorBadParameter);
+
+ hDIO = (OMX_DIO_Object *)pPort->hDIO;
+ OMX_CHECK(hDIO != NULL, OMX_ErrorBadParameter);
+
+ eError = hDIO->control(hDIO, nCmdType, pParams);
+
+EXIT:
+ return (eError);
+}
+
+/*
+* OMX Base DIO GetCount
+*/
+OMX_ERRORTYPE OMXBase_DIO_GetCount (OMX_HANDLETYPE hComponent,
+ OMX_U32 nPortIndex,
+ OMX_U32 *pCount)
+{
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_DIO_Object *hDIO = NULL;
+ OMXBase_Port *pPort = NULL;
+
+ /*Resetting count to 0 initially*/
+ *pCount = 0;
+ pPort = OMXBase_DIO_GetPort(hComponent, nPortIndex);
+ OMX_CHECK(pPort != NULL, OMX_ErrorBadParameter);
+
+ hDIO = (OMX_DIO_Object *)pPort->hDIO;
+ OMX_CHECK(hDIO != NULL, OMX_ErrorBadParameter);
+
+ eError = hDIO->getcount(hDIO, pCount);
+
+EXIT:
+ return (eError);
+}
+
+
+/*
+* OMX Base DIO GetPort from the PortIndex
+*/
+static OMX_PTR OMXBase_DIO_GetPort(OMX_HANDLETYPE hComponent, OMX_U32 nPortIndex)
+{
+ OMX_COMPONENTTYPE *pComp = (OMX_COMPONENTTYPE *)hComponent;
+ OMXBaseComp *pBaseComp = (OMXBaseComp *)pComp->pComponentPrivate;
+ OMXBase_Port *pPort = NULL;
+ OMX_U32 nStartPortNumber = 0;
+
+ nStartPortNumber = pBaseComp->nMinStartPortIndex;
+ if( pBaseComp->pPorts == NULL ) {
+ pPort = NULL;
+ goto EXIT;
+ }
+ pPort = (OMXBase_Port *)pBaseComp->pPorts[nPortIndex - nStartPortNumber];
+
+EXIT:
+ return (pPort);
+}
+
+
+
+