1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*
2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (c) 2010, Texas Instruments Incorporated
3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * All rights reserved.
4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Redistribution and use in source and binary forms, with or without
6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * modification, are permitted provided that the following conditions
7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * are met:
8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * *  Redistributions of source code must retain the above copyright
10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *    notice, this list of conditions and the following disclaimer.
11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * *  Redistributions in binary form must reproduce the above copyright
13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *    notice, this list of conditions and the following disclaimer in the
14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *    documentation and/or other materials provided with the distribution.
15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * *  Neither the name of Texas Instruments Incorporated nor the names of
17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *    its contributors may be used to endorse or promote products derived
18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *    from this software without specific prior written permission.
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <dlfcn.h>		/* For dynamic loading */
34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <stdio.h>
35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <string.h>
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <stdlib.h>
37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <pthread.h>
38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* #include "OMX_RegLib.h" */
41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "OMX_Component.h"
42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "OMX_Core.h"
43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "OMX_ComponentRegistry.h"
44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "timm_osal_types.h"
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "timm_osal_error.h"
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "timm_osal_trace.h"
48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "timm_osal_mutex.h"
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
502a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#ifdef CHECK_SECURE_STATE
512a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#include <sys/ioctl.h>
522a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#include <errno.h>
532a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#include <fcntl.h>
542a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#endif
552a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal
56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** size for the array of allocated components.  Sets the maximum
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * number of components that can be allocated at once */
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MAXCOMP (50)
59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MAXNAMESIZE (128)
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define EMPTY_STRING "\0"
61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** Determine the number of elements in an array */
63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define COUNTOF(x) (sizeof(x)/sizeof(x[0]))
64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** Array to hold the DLL pointers for each allocated component */
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void *pModules[MAXCOMP] = { 0 };
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** Array to hold the component handles for each allocated component */
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void *pComponents[COUNTOF(pModules)] = { 0 };
70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* count for call OMX_Init() */
72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint count = 0;
73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpthread_mutex_t mutex;
74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevTIMM_OSAL_PTR pCoreInitMutex = NULL;
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint tableCount = 0;
77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevComponentTable componentTable[MAX_TABLE_SIZE];
78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar *sRoleArray[60][20];
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar compName[60][200];
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar *tComponentName[MAXCOMP][MAX_ROLES] = {
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /*video and image components */
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {"OMX.TI.DUCATI1.VIDEO.DECODER", "video_decoder.mpeg4",
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        "video_decoder.avc",
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        "video_decoder.h263",
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        "video_decoder.wmv",
88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        "video_decoder.vp6",
89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        "video_decoder.vp7", NULL},
9049f42f954f02c39aa4d25520a4caa3f0b459aa40Sarthak Aggarwal    {"OMX.TI.DUCATI1.VIDEO.DECODER.secure", "video_decoder.mpeg4",
9149f42f954f02c39aa4d25520a4caa3f0b459aa40Sarthak Aggarwal        "video_decoder.avc",
9249f42f954f02c39aa4d25520a4caa3f0b459aa40Sarthak Aggarwal        "video_decoder.h263", NULL},
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {"OMX.TI.DUCATI1.VIDEO.H264D",  "video_decoder.avc", NULL},
94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {"OMX.TI.DUCATI1.VIDEO.H264E",  "video_encoder.avc", NULL},
95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {"OMX.TI.DUCATI1.VIDEO.MPEG4D", "video_decoder.mpeg4", NULL},
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {"OMX.TI.DUCATI1.VIDEO.MPEG4E", "video_encoder.mpeg4",
97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                    "video_encoder.h263",NULL},
98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {"OMX.TI.DUCATI1.VIDEO.VP6D",   "video_decoder.vp6", NULL},
99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {"OMX.TI.DUCATI1.VIDEO.VP7D",   "video_decoder.vp7", NULL},
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {"OMX.TI.DUCATI1.IMAGE.JPEGD",  "jpeg_decoder.jpeg", NULL},
101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {"OMX.TI.DUCATI1.VIDEO.CAMERA",  "camera.omx", NULL},
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /* terminate the table */
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {NULL, NULL},
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//AD
107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevextern OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE hComponent);
108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CORE_assert  CORE_paramCheck
110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CORE_require CORE_paramCheck
111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CORE_ensure  CORE_paramCheck
112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CORE_paramCheck(C, V, S) do {\
114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!(C)) { eError = V;\
115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    TIMM_OSAL_Error("failed check: " #C);\
116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    TIMM_OSAL_Error(" - returning error: " #V);\
117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(S) TIMM_OSAL_Error(" - %s", S);\
118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    goto EXIT; }\
119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    } while(0)
120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************Public*Routine******************************\
122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_Init()
123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description:This method will initialize the OMX Core.  It is the
125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* responsibility of the application to call OMX_Init to ensure the proper
126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* set up of core resources.
127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns:    OMX_NOERROR          Successful
129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note
131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev\**************************************************************************/
133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE OMX_Init()
134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_ERRORTYPE eError = OMX_ErrorNone;
136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	TIMM_OSAL_ERRORTYPE eOsalError = TIMM_OSAL_ERR_NONE;
137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	eOsalError = TIMM_OSAL_MutexObtain(pCoreInitMutex, TIMM_OSAL_SUSPEND);
139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_assert(eOsalError == TIMM_OSAL_ERR_NONE,
140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    OMX_ErrorInsufficientResources, "Mutex lock failed");
141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	count++;
143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (count == 1)
145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		pthread_mutex_init(&mutex, NULL);
147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		eError = OMX_BuildComponentTable();
148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	eOsalError = TIMM_OSAL_MutexRelease(pCoreInitMutex);
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_assert(eOsalError == TIMM_OSAL_ERR_NONE,
152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    OMX_ErrorInsufficientResources, "Mutex release failed");
153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      EXIT:
154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return eError;
155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************Public*Routine******************************\
158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_GetHandle
159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description: This method will create the handle of the COMPONENTTYPE
161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* If the component is currently loaded, this method will reutrn the
162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* hadle of existingcomponent or create a new instance of the component.
163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* It will call the OMX_ComponentInit function and then the setcallback
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* method to initialize the callback functions
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Parameters:
166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[out] pHandle            Handle of the loaded components
167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] cComponentName     Name of the component to load
168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] pAppData           Used to identify the callbacks of component
169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] pCallBacks         Application callbacks
170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @retval OMX_ErrorUndefined
172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @retval OMX_ErrorInvalidComponentName
173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @retval OMX_ErrorInvalidComponent
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @retval OMX_ErrorInsufficientResources
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @retval OMX_NOERROR                      Successful
176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev\**************************************************************************/
180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE OMX_GetHandle(OMX_HANDLETYPE * pHandle,
182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_STRING cComponentName, OMX_PTR pAppData,
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CALLBACKTYPE * pCallBacks)
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	static const char prefix[] = "lib";
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	static const char postfix[] = ".so";
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_ERRORTYPE(*pComponentInit) (OMX_HANDLETYPE *);
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_ERRORTYPE eError = OMX_ErrorNone;
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_COMPONENTTYPE *componentType;
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	int i;
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	char buf[sizeof(prefix) + MAXNAMESIZE + sizeof(postfix)];
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	const char *pErr = dlerror();
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	char *dlError = NULL;
1942a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#ifdef CHECK_SECURE_STATE
1952a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        int secure_misc_drv_fd,ret;
1962a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        OMX_U8 mode, enable=1;
1972a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#endif
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (pthread_mutex_lock(&mutex) != 0)
199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		TIMM_OSAL_Error("Core: Error in Mutex lock");
201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(NULL != cComponentName, OMX_ErrorBadParameter, NULL);
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(NULL != pHandle, OMX_ErrorBadParameter, NULL);
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(NULL != pCallBacks, OMX_ErrorBadParameter, NULL);
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(count > 0, OMX_ErrorUndefined,
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    "OMX_GetHandle called without calling OMX_Init first");
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/* Verify that the name is not too long and could cause a crash.  Notice
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 * that the comparison is a greater than or equals.  This is to make
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 * sure that there is room for the terminating NULL at the end of the
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 * name. */
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(strlen(cComponentName) < MAXNAMESIZE,
214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    OMX_ErrorInvalidComponentName, NULL);
215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/* Locate the first empty slot for a component.  If no slots
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 * are available, error out */
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	for (i = 0; i < COUNTOF(pModules); i++)
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		if (pModules[i] == NULL)
221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			break;
222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_assert(i != COUNTOF(pModules), OMX_ErrorInsufficientResources,
224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    NULL);
225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/* load the component and check for an error.  If filename is not an
227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 * absolute path (i.e., it does not  begin with a "/"), then the
228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 * file is searched for in the following locations:
229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 *
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 *     The LD_LIBRARY_PATH environment variable locations
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 *     The library cache, /etc/ld.so.cache.
232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 *     /lib
233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 *     /usr/lib
234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 *
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 * If there is an error, we can't go on, so set the error code and exit */
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	strcpy(buf, prefix);	/* the lengths are defined herein or have been */
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	strcat(buf, cComponentName);	/* checked already, so strcpy and strcat are  */
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	strcat(buf, postfix);	/* are safe to use in this context. */
2393cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal
2402a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#ifdef CHECK_SECURE_STATE
2412a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        //Dont return errors from misc driver to the user if any.
2422a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        //Since this affects all usecases, secure and non-secure.
2432a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        //Do log the errors though.
2442a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        secure_misc_drv_fd = open("/dev/rproc_user", O_SYNC | O_RDONLY);
2452a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	if (secure_misc_drv_fd < 0)
2462a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	{
2472a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal		TIMM_OSAL_Error("Can't open misc driver device 0x%x\n", errno);
2482a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	}
2492a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal
2502a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	ret = read(secure_misc_drv_fd, &mode, sizeof(mode));
2512a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	if (ret < 0)
2523cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	{
2532a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal		TIMM_OSAL_Error("Can't read from the misc driver");
2543cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal	}
2552a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        if(mode == enable && strstr(cComponentName,"secure") == NULL)
2562a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	{
2572a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal		TIMM_OSAL_Error("non-secure component not supported in secure mode");
2582a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal		eError = OMX_ErrorComponentNotFound;
2592a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	}
2602a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	ret = close(secure_misc_drv_fd);
2612a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	if (ret < 0)
2622a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	{
2632a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal		TIMM_OSAL_Error("Can't close the misc driver");
2642a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal	}
2652a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        //Dont allow non-secure usecases if we are in secure state.
2662a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        //Else some of the memory regions will be unexpected firewalled.
2672a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        //This provides a clean exit in case we are in secure mode.
2682a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        if(eError == OMX_ErrorComponentNotFound)
2692a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        {
2702a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal                goto EXIT;
2712a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal        }
2722a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#endif
2732a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal
274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//#if 0
275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	pModules[i] = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL);
276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (pModules[i] == NULL)
277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		dlError = dlerror();
279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		TIMM_OSAL_Error("Failed because %s", dlError);
280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		eError = OMX_ErrorComponentNotFound;
281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		goto EXIT;
282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/* Get a function pointer to the "OMX_ComponentInit" function.  If
285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 * there is an error, we can't go on, so set the error code and exit */
286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	pComponentInit = dlsym(pModules[i], "OMX_ComponentInit");
287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	pErr = dlerror();
288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_assert(((pErr == NULL) && (pComponentInit != NULL)),
289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    OMX_ErrorInvalidComponent, NULL);
290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//#endif
291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/* We now can access the dll.  So, we need to call the "OMX_ComponentInit"
293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 * method to load up the "handle" (which is just a list of functions to
294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 * call) and we should be all set.*/
295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	*pHandle = malloc(sizeof(OMX_COMPONENTTYPE));
296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_assert((*pHandle != NULL), OMX_ErrorInsufficientResources,
297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    "Malloc of pHandle* failed");
298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	pComponents[i] = *pHandle;
300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	componentType = (OMX_COMPONENTTYPE *) * pHandle;
301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	componentType->nSize = sizeof(OMX_COMPONENTTYPE);
302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	componentType->nVersion.s.nVersionMajor = 1;
304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	componentType->nVersion.s.nVersionMinor = 1;
305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	componentType->nVersion.s.nRevision = 0;
306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	componentType->nVersion.s.nStep = 0;
307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	eError = (*pComponentInit) (*pHandle);
309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//eError = OMX_ComponentInit(*pHandle);
310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (OMX_ErrorNone == eError)
311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		eError =
313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		    (componentType->SetCallbacks) (*pHandle, pCallBacks,
314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		    pAppData);
315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		CORE_assert(eError == OMX_ErrorNone, eError,
316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		    "Core: Error returned from component SetCallBack");
317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	} else
318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		/* when the component fails to initialize, release the
320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		   component handle structure */
321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		free(*pHandle);
322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		/* mark the component handle as NULL to prevent the caller from
323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		   actually trying to access the component with it, should they
324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		   ignore the return code */
325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		*pHandle = NULL;
326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		pComponents[i] = NULL;
327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		dlclose(pModules[i]);
328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		goto EXIT;
329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	eError = OMX_ErrorNone;
331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      EXIT:
332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (pthread_mutex_unlock(&mutex) != 0)
333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		TIMM_OSAL_Error("Core: Error in Mutex unlock");
335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return (eError);
337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************Public*Routine******************************\
341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_FreeHandle()
342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description:This method will unload the OMX component pointed by
344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_HANDLETYPE. It is the responsibility of the calling method to ensure that
345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* the Deinit method of the component has been called prior to unloading component
346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Parameters:
348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] hComponent the component to unload
349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns:    OMX_NOERROR          Successful
351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note
353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev\**************************************************************************/
355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE OMX_FreeHandle(OMX_HANDLETYPE hComponent)
356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_ERRORTYPE eError = OMX_ErrorUndefined;
359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *) hComponent;
360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	int i;
361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (pthread_mutex_lock(&mutex) != 0)
363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		TIMM_OSAL_Error("Core: Error in Mutex lock");
365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(pHandle != NULL, OMX_ErrorBadParameter, NULL);
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(count > 0, OMX_ErrorUndefined,
369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    "OMX_FreeHandle called without calling OMX_Init first");
370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/* Locate the component handle in the array of handles */
372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	for (i = 0; i < COUNTOF(pModules); i++)
373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		if (pComponents[i] == hComponent)
375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			break;
376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_assert(i != COUNTOF(pModules), OMX_ErrorBadParameter, NULL);
379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	eError = pHandle->ComponentDeInit(hComponent);
381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (eError != OMX_ErrorNone)
382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		TIMM_OSAL_Error("Error From ComponentDeInit..");
384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/* release the component and the component handle */
387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	dlclose(pModules[i]);
388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	pModules[i] = NULL;
389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	free(pComponents[i]);
390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	pComponents[i] = NULL;
392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	eError = OMX_ErrorNone;
393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      EXIT:
395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/* The unload is now complete, so set the error code to pass and exit */
396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (pthread_mutex_unlock(&mutex) != 0)
397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		TIMM_OSAL_Error("Core: Error in Mutex unlock");
399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return eError;
402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************Public*Routine******************************\
405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_DeInit()
406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description:This method will release the resources of the OMX Core.  It is the
408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* responsibility of the application to call OMX_DeInit to ensure the clean up of these
409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* resources.
410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns:    OMX_NOERROR          Successful
412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note
414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev\**************************************************************************/
416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE OMX_Deinit()
417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_ERRORTYPE eError = OMX_ErrorNone;
419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	TIMM_OSAL_ERRORTYPE eOsalError = TIMM_OSAL_ERR_NONE;
420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	eOsalError = TIMM_OSAL_MutexObtain(pCoreInitMutex, TIMM_OSAL_SUSPEND);
422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (eOsalError != TIMM_OSAL_ERR_NONE)
423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		TIMM_OSAL_Error("Mutex lock failed");
425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/*Returning error none because of OMX spec limitation on error codes that
427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	   can be returned by OMX_Deinit */
428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_assert(count > 0, OMX_ErrorNone,
429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    "OMX_Deinit being called without a corresponding OMX_Init");
430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	count--;
431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (pthread_mutex_lock(&mutex) != 0)
433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		TIMM_OSAL_Error("Core: Error in Mutex lock");
434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (count == 0)
436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		if (pthread_mutex_unlock(&mutex) != 0)
438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			TIMM_OSAL_Error("Core: Error in Mutex unlock");
439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		if (pthread_mutex_destroy(&mutex) != 0)
440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		{
441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			/*printf("%d :: Core: Error in Mutex destroy\n",__LINE__); */
442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		}
443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	} else
444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		if (pthread_mutex_unlock(&mutex) != 0)
446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			TIMM_OSAL_Error("Core: Error in Mutex unlock");
447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      EXIT:
450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	eOsalError = TIMM_OSAL_MutexRelease(pCoreInitMutex);
451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (eOsalError != TIMM_OSAL_ERR_NONE)
452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		TIMM_OSAL_Error("Mutex release failed");
454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return eError;
456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*************************************************************************
459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_SetupTunnel()
460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description: Setup the specified tunnel the two components
462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Parameters:
464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] hOutput     Handle of the component to be accessed
465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] nPortOutput Source port used in the tunnel
466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] hInput      Component to setup the tunnel with.
467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] nPortInput  Destination port used in the tunnel
468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns:    OMX_NOERROR          Successful
470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note
472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev**************************************************************************/
474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* OMX_SetupTunnel */
475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_SetupTunnel(OMX_IN OMX_HANDLETYPE
476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    hOutput, OMX_IN OMX_U32 nPortOutput, OMX_IN OMX_HANDLETYPE hInput,
477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_IN OMX_U32 nPortInput)
478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_ERRORTYPE eError = OMX_ErrorNotImplemented;
480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_COMPONENTTYPE *pCompIn, *pCompOut;
481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_TUNNELSETUPTYPE oTunnelSetup;
482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (hOutput == NULL && hInput == NULL)
484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		return OMX_ErrorBadParameter;
485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	oTunnelSetup.nTunnelFlags = 0;
487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	oTunnelSetup.eSupplier = OMX_BufferSupplyUnspecified;
488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	pCompOut = (OMX_COMPONENTTYPE *) hOutput;
490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (hOutput)
492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		eError =
494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		    pCompOut->ComponentTunnelRequest(hOutput, nPortOutput,
495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		    hInput, nPortInput, &oTunnelSetup);
496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (eError == OMX_ErrorNone && hInput)
500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		pCompIn = (OMX_COMPONENTTYPE *) hInput;
502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		eError =
503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		    pCompIn->ComponentTunnelRequest(hInput, nPortInput,
504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		    hOutput, nPortOutput, &oTunnelSetup);
505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		if (eError != OMX_ErrorNone && hOutput)
506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		{
507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			/* cancel tunnel request on output port since input port failed */
508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			pCompOut->ComponentTunnelRequest(hOutput, nPortOutput,
509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			    NULL, 0, NULL);
510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		}
511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return eError;
514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*************************************************************************
517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_ComponentNameEnum()
518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description: This method will provide the name of the component at the given nIndex
520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*Parameters:
522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[out] cComponentName       The name of the component at nIndex
523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] nNameLength                The length of the component name
524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] nIndex                         The index number of the component
525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns:    OMX_NOERROR          Successful
527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note
529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev**************************************************************************/
531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum(OMX_OUT OMX_STRING
532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cComponentName, OMX_IN OMX_U32 nNameLength, OMX_IN OMX_U32 nIndex)
533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_ERRORTYPE eError = OMX_ErrorNone;
535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(cComponentName != NULL, OMX_ErrorBadParameter, NULL);
537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(count > 0, OMX_ErrorUndefined,
538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    "OMX_GetHandle called without calling OMX_Init first");
539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (nIndex >= tableCount)
541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		eError = OMX_ErrorNoMore;
543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	} else
544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		strcpy(cComponentName, componentTable[nIndex].name);
546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      EXIT:
548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return eError;
549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*************************************************************************
553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_GetRolesOfComponent()
554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description: This method will query the component for its supported roles
556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*Parameters:
558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] cComponentName     The name of the component to query
559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] pNumRoles     The number of roles supported by the component
560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] roles		The roles of the component
561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns:    OMX_NOERROR          Successful
563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*                 OMX_ErrorBadParameter		Faliure due to a bad input parameter
564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note
566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev**************************************************************************/
568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent(OMX_IN OMX_STRING
569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    cComponentName, OMX_INOUT OMX_U32 * pNumRoles, OMX_OUT OMX_U8 ** roles)
570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_ERRORTYPE eError = OMX_ErrorNone;
573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_U32 i = 0;
574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_U32 j = 0;
575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_BOOL bFound = OMX_FALSE;
576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(cComponentName != NULL, OMX_ErrorBadParameter, NULL);
578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(pNumRoles != NULL, OMX_ErrorBadParameter, NULL);
579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(strlen(cComponentName) < MAXNAMESIZE,
580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    OMX_ErrorInvalidComponentName, NULL);
581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(count > 0, OMX_ErrorUndefined,
582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    "OMX_GetHandle called without calling OMX_Init first");
583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	while (!bFound && i < tableCount)
585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		if (strcmp(cComponentName, componentTable[i].name) == 0)
587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		{
588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			bFound = OMX_TRUE;
589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		} else
590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		{
591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			i++;
592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		}
593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (roles == NULL)
595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		*pNumRoles = componentTable[i].nRoles;
597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		goto EXIT;
598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	} else
599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		if (bFound && (*pNumRoles == componentTable[i].nRoles))
601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		{
602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			for (j = 0; j < componentTable[i].nRoles; j++)
603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			{
604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				strcpy((OMX_STRING) roles[j],
605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				    componentTable[i].pRoleArray[j]);
606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			}
607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		}
608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      EXIT:
610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return eError;
611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*************************************************************************
614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_GetComponentsOfRole()
615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description: This method will query the component for its supported roles
617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*Parameters:
619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] role     The role name to query for
620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] pNumComps     The number of components supporting the given role
621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] compNames      The names of the components supporting the given role
622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns:    OMX_NOERROR          Successful
624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note
626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev**************************************************************************/
628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_GetComponentsOfRole(OMX_IN OMX_STRING role,
629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_INOUT OMX_U32 * pNumComps, OMX_INOUT OMX_U8 ** compNames)
630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_ERRORTYPE eError = OMX_ErrorNone;
632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_U32 i = 0;
633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_U32 j = 0;
634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_U32 k = 0;
635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(role != NULL, OMX_ErrorBadParameter, NULL);
637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(pNumComps != NULL, OMX_ErrorBadParameter, NULL);
638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_require(count > 0, OMX_ErrorUndefined,
639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    "OMX_GetHandle called without calling OMX_Init first");
640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/* This implies that the componentTable is not filled */
642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_assert(componentTable[i].pRoleArray[j] != NULL,
643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    OMX_ErrorBadParameter, NULL);
644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	for (i = 0; i < tableCount; i++)
646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		for (j = 0; j < componentTable[i].nRoles; j++)
648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		{
649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			if (strcmp(componentTable[i].pRoleArray[j],
650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				role) == 0)
651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			{
652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				/* the first call to this function should only count the number
653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				   of roles so that for the second call compNames can be allocated
654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				   with the proper size for that number of roles */
655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				if (compNames != NULL)
656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				{
657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					strncpy((OMX_STRING) (compNames[k]),
658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					    (OMX_STRING) componentTable[i].
659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					    name, MAXNAMESIZE);
660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				}
661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				k++;
662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			}
663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		}
664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		*pNumComps = k;
665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      EXIT:
668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return eError;
669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/***************************************
673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevPRINT TABLE FOR DEBUGGING PURPOSES ONLY
674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev***************************************/
675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_PrintComponentTable()
677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_ERRORTYPE eError = OMX_ErrorNone;
679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	int i = 0;
680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	int j = 0;
681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	TIMM_OSAL_Info
683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    ("--------Component Table:: %d Components found-------------",
684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    tableCount);
685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	for (i = 0; i < tableCount; i++)
687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		TIMM_OSAL_Info("%i:: %s", i, componentTable[i].name);
689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		for (j = 0; j < componentTable[i].nRoles; j++)
690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		{
691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			TIMM_OSAL_Info("        %s",
692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			    componentTable[i].pRoleArray[j]);
693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		}
694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	TIMM_OSAL_Info
697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    ("-----------------End Component Table ------------------");
698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return eError;
700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE OMX_BuildComponentTable()
705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_ERRORTYPE eError = OMX_ErrorNone;
707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_CALLBACKTYPE sCallbacks;
708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifndef STATIC_TABLE
709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_HANDLETYPE hComp = 0;
710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_U8 cRole[MAXNAMESIZE];
711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_STRING tempName = NULL;
712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	OMX_STRING temp = NULL;
713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	static OMX_STRING namePrefix = "OMX";
714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	static OMX_STRING filePrefix = "libOMX.";
715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	static OMX_STRING suffix = ".so";
716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	int j = 0;
718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	int numFiles = 0;
719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	int i, k;
720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	int componentfound = 0;
721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/* set up dummy call backs */
723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	sCallbacks.EventHandler = ComponentTable_EventHandler;
724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	sCallbacks.EmptyBufferDone = ComponentTable_EmptyBufferDone;
725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	sCallbacks.FillBufferDone = ComponentTable_FillBufferDone;
726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifndef STATIC_TABLE
728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/* allocate the name table */
729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/*
730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	   compName = (OMX_STRING *) malloc(MAX_TABLE_SIZE * sizeof(OMX_STRING));
731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	   sRoleArray = (OMX_STRING**) malloc(MAX_TABLE_SIZE * sizeof(OMX_STRING));
732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	 */
733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	/* scan the target/lib directory and create a list of files in the directory */
735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	numFiles = scandir(libdir, &namelist, 0, 0);
736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	tableCount = 0;
737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	while (numFiles--)
738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		/*  check if the file is an OMX component */
740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		if (strncmp(namelist[numFiles]->d_name, filePrefix,
741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			strlen(filePrefix)) == 0)
742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		{
743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			/* if the file is an OMX component, trim the prefix and suffix */
745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			tempName = (OMX_STRING) malloc(sizeof(namelist[numFiles]->d_name) + 1);	/* adding one ensures */
746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			memset(tempName, 0x00, sizeof(namelist[numFiles]->d_name) + 1);	/*  that a null terminator will */
747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			/*  always be present */
748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			/* copy only the name without the suffix */
749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			strncpy(tempName, namelist[numFiles]->d_name,
750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			    strlen(namelist[numFiles]->d_name) -
751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			    strlen(suffix));
752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			/* set a pointer to be after the lib prefix, i.e the beginning of the component name */
753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			temp = strstr(tempName, namePrefix);
754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			/* then copy the component name to the table */
756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			/*
757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			   compName[tableCount]= (OMX_STRING) malloc(MAXNAMESIZE);
758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			 */
759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			strncpy(compName[tableCount], temp, strlen(temp) + 1);
760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			componentTable[tableCount].name =
761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			    compName[tableCount];
762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			/* get the handle for the component and query for the roles of each component */
764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			eError =
765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			    OMX_GetHandle(&hComp,
766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			    componentTable[tableCount].name, 0x0,
767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			    &sCallbacks);
768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			if (eError == OMX_ErrorNone)
769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			{
770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				j = 0;
771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				while (eError != OMX_ErrorNoMore)
772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				{
773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					eError =
774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					    ((OMX_COMPONENTTYPE *) hComp)->
775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					    ComponentRoleEnum(hComp, cRole,
776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					    j++);
777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					if (eError == OMX_ErrorNotImplemented)
778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					{
779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						j = 1;
780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						break;
781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					}
782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				}
783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				nRoles = j - 1;
784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				componentTable[tableCount].nRoles = nRoles;
785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				/* sRoleArray[tableCount] = (OMX_STRING *) malloc(nRoles * sizeof(OMX_STRING)); */
786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				if (nRoles > 0)
787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				{
788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					/* sRoleArray[tableCount] = (OMX_STRING *) malloc(nRoles * sizeof(OMX_STRING)); */
789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					for (j = 0; j < nRoles; j++)
790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					{
791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						sRoleArray[tableCount][j] =
792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						    (OMX_STRING)
793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						    malloc(sizeof(OMX_U8) *
794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						    MAXNAMESIZE);
795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						((OMX_COMPONENTTYPE *)
796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						    hComp)->
797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						    ComponentRoleEnum(hComp,
798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						    (OMX_U8 *)
799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						    sRoleArray[tableCount][j],
800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						    j);
801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						componentTable[tableCount].
802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						    pRoleArray[j] =
803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev						    sRoleArray[tableCount][j];
804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					}
805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				} else
806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				{
807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					/* sRoleArray[tableCount] = (OMX_STRING *) malloc(sizeof(OMX_STRING));    */
808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					sRoleArray[tableCount][j] =
809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					    (OMX_STRING) malloc(sizeof(OMX_U8)
810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					    * MAXNAMESIZE);
811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					strcpy(sRoleArray[tableCount][j],
812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					    EMPTY_STRING);
813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					componentTable[tableCount].
814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					    pRoleArray[j] =
815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					    sRoleArray[tableCount][j];
816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				}
817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			}
818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			if (hComp)
819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			{
820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				/* free the component handle */
821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				eError = OMX_FreeHandle(hComp);
822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				if (eError != OMX_ErrorNone)
823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				{
824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev					goto EXIT;
825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				}
826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			}
827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			/* increment the table counter index only if above was successful */
828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			tableCount++;
829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			if (tempName != NULL)
830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			{
831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				free(tempName);
832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			}
833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		}
835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	for (i = 0, numFiles = 0; i < MAXCOMP; i++)
840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		if (tComponentName[i][0] == NULL)
842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		{
843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			break;
844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		}
845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		for (j = 0; j < numFiles; j++)
847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		{
848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			if (!strcmp(componentTable[j].name,
849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				tComponentName[i][0]))
850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			{
851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				componentfound = 1;
852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				break;
853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			}
854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		}
855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		if (componentfound == 1)
856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		{
857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			continue;
858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		}
859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		if (j == numFiles)
861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		{		/* new component */
862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			k = 1;
863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			while (tComponentName[i][k] != NULL)
864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			{
865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				componentTable[numFiles].pRoleArray[k - 1] =
866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				    tComponentName[i][k];
867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev				k++;
868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			}
869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			componentTable[numFiles].nRoles = k - 1;
870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			strcpy(compName[numFiles], tComponentName[i][0]);
871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			componentTable[numFiles].name = compName[numFiles];
872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev			numFiles++;
873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		}
874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	tableCount = numFiles;
876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	CORE_assert(eError == OMX_ErrorNone, eError,
878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	    "Could not build Component Table");
879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      EXIT:
880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return eError;
881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE ComponentTable_EventHandler(OMX_IN OMX_HANDLETYPE hComponent,
884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_IN OMX_PTR pAppData,
885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_IN OMX_EVENTTYPE eEvent,
886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, OMX_IN OMX_PTR pEventData)
887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return OMX_ErrorNotImplemented;
889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE ComponentTable_EmptyBufferDone(OMX_OUT OMX_HANDLETYPE
892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    hComponent, OMX_OUT OMX_PTR pAppData,
893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_OUT OMX_BUFFERHEADERTYPE * pBuffer)
894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return OMX_ErrorNotImplemented;
896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE ComponentTable_FillBufferDone(OMX_OUT OMX_HANDLETYPE hComponent,
899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_OUT OMX_PTR pAppData, OMX_OUT OMX_BUFFERHEADERTYPE * pBuffer)
900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	return OMX_ErrorNotImplemented;
902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*===============================================================*/
907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** @fn Core_Setup : This function is called when the the OMX Core library is
908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *                  loaded. It creates a mutex, which is used during OMX_Init()
909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*===============================================================*/
911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid __attribute__ ((constructor)) Core_Setup(void)
912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	eError = TIMM_OSAL_MutexCreate(&pCoreInitMutex);
916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (eError != TIMM_OSAL_ERR_NONE)
917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		TIMM_OSAL_Error("Creation of default mutex failed");
919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*===============================================================*/
925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** @fn Core_Destroy : This function is called when the the OMX Core library is
926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *                    unloaded. It destroys the mutex which was created by
927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *                    Core_Setup().
928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*===============================================================*/
931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid __attribute__ ((destructor)) Core_Destroy(void)
932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE;
934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	eError = TIMM_OSAL_MutexDelete(pCoreInitMutex);
936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (eError != TIMM_OSAL_ERR_NONE)
937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	{
938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev		TIMM_OSAL_Error("Destruction of default mutex failed");
939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	}
940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
941