OMX_Core.c revision a5a79c7a1090c1c02aa71c847a17dced8e119ddb
1fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* ====================================================================
2fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*             Texas Instruments OMAP(TM) Platform Software
3fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
4fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
5fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Use of this software is controlled by the terms and conditions found
6fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* in the license agreement under which this software has been supplied.
7fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* ==================================================================== */
8fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
9fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <dlfcn.h>   /* For dynamic loading */
10fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <stdio.h>
11fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <string.h>
12fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <stdlib.h>
13fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <pthread.h>
14fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <utils/Log.h>
15fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
16a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly#undef LOG_TAG
17a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly#define LOG_TAG "TIOMX_CORE"
18fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
19fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "OMX_Component.h"
20fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "OMX_Core.h"
21fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "OMX_ComponentRegistry.h"
22fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
23a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly/** determine capabilities of a component before acually using it */
24fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "ti_omx_config_parser.h"
25fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
26fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** size for the array of allocated components.  Sets the maximum
27fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * number of components that can be allocated at once */
28fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define MAXCOMP (50)
29fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define MAXNAMESIZE (130)
30fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define EMPTY_STRING "\0"
31fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
32fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Determine the number of elements in an array */
33fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define COUNTOF(x) (sizeof(x)/sizeof(x[0]))
34fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
35fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Array to hold the DLL pointers for each allocated component */
36fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void* pModules[MAXCOMP] = {0};
37fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
38fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Array to hold the component handles for each allocated component */
39fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void* pComponents[COUNTOF(pModules)] = {0};
40fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
41a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly/** count will be used as a reference counter for OMX_Init()
42a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    so all changes to count should be mutex protected */
43fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint count = 0;
44a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kellystatic pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
45fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
46fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint tableCount = 0;
47fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinComponentTable componentTable[MAX_TABLE_SIZE];
48fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar * sRoleArray[60][20];
49fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar compName[60][200];
50fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
51fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar *tComponentName[MAXCOMP][2] = {
52fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /*video and image components */
53990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.JPEG.decode", "image_decoder.jpeg" },
54990117074ba37226d82be2f2ebe3739e488f848cJames Dong    {"OMX.TI.JPEG.encoder", "image_encoder.jpeg"},
55990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.Video.Decoder", "video_decoder.h263"},
56fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.Video.Decoder", "video_decoder.avc"},
57990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.Video.Decoder", "video_decoder.mpeg2"},
58fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.Video.Decoder", "video_decoder.mpeg4"},
59990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.Video.Decoder", "video_decoder.wmv"},
60fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.Video.encoder", "video_encoder.mpeg4"},
61fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.Video.encoder", "video_encoder.h263"},
62fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.Video.encoder", "video_encoder.avc"},
63990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.VPP", "iv_renderer.yuv.overlay"},
64990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.Camera", "camera.yuv"},
65fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
66fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* Speech components */
67a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly/*  {"OMX.TI.G729.encode", NULL},
68fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G729.decode", NULL},
69fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G722.encode", NULL},
70fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G722.decode", NULL},
71fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G711.encode", NULL},
72fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G711.decode", NULL},
73fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G723.encode", NULL},
74fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G723.decode", NULL},
75fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G726.encode", NULL},
76fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G726.decode", NULL},
77fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.GSMFR.encode", NULL},
78a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    {"OMX.TI.GSMFR.decode", NULL},
79a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly*/
80fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.AMR.encode", "audio_encoder.amrnb"},
81990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.AMR.decode", "audio_decoder.amrnb"},
82fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.WBAMR.encode", "audio_encoder.amrwb"},
83990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.WBAMR.decode", "audio_decoder.amrwb"},
84fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
85fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* Audio components */
86990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.MP3.decode", "audio_decoder.mp3"},
87990117074ba37226d82be2f2ebe3739e488f848cJames Dong    {"OMX.TI.AAC.encode", "audio_encoder.aac"},
88990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.AAC.decode", "audio_decoder.aac"},
89a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly/*  {"OMX.TI.PCM.encode", NULL},
90a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    {"OMX.TI.PCM.decode", NULL},
91990117074ba37226d82be2f2ebe3739e488f848cJames Dong    {"OMX.TI.WMA.decode", "audio_decoder.wma"},
92a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    {"OMX.TI.RAG.decode", "audio_decoder.ra"},
93a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    {"OMX.TI.IMAADPCM.decode", NULL},
94a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    {"OMX.TI.IMAADPCM.encode", NULL},
95a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly*/
96fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
97fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* terminate the table */
98fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {NULL, NULL},
99fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin};
100fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
101fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
102fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\
103fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_Init()
104fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
105fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description:This method will initialize the OMX Core.  It is the
106fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* responsibility of the application to call OMX_Init to ensure the proper
107fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* set up of core resources.
108fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
109fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
110fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
111fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
112fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
113fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/
114fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_Init()
115fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
116fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE eError = OMX_ErrorNone;
117a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
118a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    if(pthread_mutex_lock(&mutex) != 0)
119a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    {
120a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        LOGE("%d :: Core: Error in Mutex lock\n",__LINE__);
121a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        return OMX_ErrorUndefined;
122a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    }
123fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
124fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    count++;
125a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    LOGD("init count = %d\n", count);
126fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
127fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (count == 1)
128fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
129fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        eError = TIOMX_BuildComponentTable();
130fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
131a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
132a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    if(pthread_mutex_unlock(&mutex) != 0)
133a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    {
134a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__);
135a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        return OMX_ErrorUndefined;
136a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    }
137fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return eError;
138fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
139fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\
140fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_GetHandle
141fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
142fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will create the handle of the COMPONENTTYPE
143fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* If the component is currently loaded, this method will reutrn the
144fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* hadle of existingcomponent or create a new instance of the component.
145fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* It will call the OMX_ComponentInit function and then the setcallback
146fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* method to initialize the callback functions
147fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Parameters:
148fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[out] pHandle            Handle of the loaded components
149fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] cComponentName     Name of the component to load
150fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pAppData           Used to identify the callbacks of component
151fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pCallBacks         Application callbacks
152fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
153fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorUndefined
154fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorInvalidComponentName
155fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorInvalidComponent
156fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorInsufficientResources
157fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_NOERROR                      Successful
158fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
159fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
160fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
161fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/
162fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
163fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_GetHandle( OMX_HANDLETYPE* pHandle, OMX_STRING cComponentName,
164a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    OMX_PTR pAppData, OMX_CALLBACKTYPE* pCallBacks)
165fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
166fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    static const char prefix[] = "lib";
167fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    static const char postfix[] = ".so";
168fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE (*pComponentInit)(OMX_HANDLETYPE*);
169a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    OMX_ERRORTYPE err = OMX_ErrorNone;
170fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_COMPONENTTYPE *componentType;
171fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    const char* pErr = dlerror();
172a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
173a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    if(pthread_mutex_lock(&mutex) != 0)
174fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
175a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        LOGE("%d :: Core: Error in Mutex lock\n",__LINE__);
176a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        return OMX_ErrorUndefined;
177fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
178fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
179fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if ((NULL == cComponentName) || (NULL == pHandle) || (NULL == pCallBacks)) {
180fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        err = OMX_ErrorBadParameter;
181a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        goto UNLOCK_MUTEX;
182fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
183fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
184fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* Verify that the name is not too long and could cause a crash.  Notice
185fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin     * that the comparison is a greater than or equals.  This is to make
186fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin     * sure that there is room for the terminating NULL at the end of the
187fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin     * name. */
188a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    if(strlen(cComponentName) >= MAXNAMESIZE) {
189fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        err = OMX_ErrorInvalidComponentName;
190a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        goto UNLOCK_MUTEX;
191fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
192fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* Locate the first empty slot for a component.  If no slots
193fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin     * are available, error out */
194a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    int i = 0;
195fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    for(i=0; i< COUNTOF(pModules); i++) {
196fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if(pModules[i] == NULL) break;
197fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
198fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if(i == COUNTOF(pModules)) {
199a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        err = OMX_ErrorInsufficientResources;
200a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        goto UNLOCK_MUTEX;
201fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
202fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
203a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    int refIndex = 0;
204a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    *pHandle = NULL;
205a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    pComponents[i] = NULL;
206a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    for (refIndex=0; refIndex < MAX_TABLE_SIZE; refIndex++) {
207a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        //get the index for the component in the table
208a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        if (strcmp(componentTable[refIndex].name, cComponentName) == 0) {
209a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            LOGD("Found component %s with refCount %d\n",
210a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                  cComponentName, componentTable[refIndex].refCount);
211a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
212a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            /* check if the component is already loaded */
213a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            if (componentTable[refIndex].refCount >= MAX_CONCURRENT_INSTANCES) {
214a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                err = OMX_ErrorInsufficientResources;
215a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                LOGE("Max instances of component %s already created.\n", cComponentName);
216a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                goto UNLOCK_MUTEX;
217a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            } else {  // we have not reached the limit yet
218a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                /* do what was done before need to limit concurrent instances of each component */
219a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
220a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                /* load the component and check for an error.  If filename is not an
221a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                 * absolute path (i.e., it does not  begin with a "/"), then the
222a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                 * file is searched for in the following locations:
223a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                 *
224a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                 *     The LD_LIBRARY_PATH environment variable locations
225a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                 *     The library cache, /etc/ld.so.cache.
226a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                 *     /lib
227a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                 *     /usr/lib
228a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                 *
229a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                 * If there is an error, we can't go on, so set the error code and exit */
230a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
231a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                /* the lengths are defined herein or have been
232a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                 * checked already, so strcpy and strcat are
233a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                 * are safe to use in this context. */
234a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                char buf[sizeof(prefix) + MAXNAMESIZE + sizeof(postfix)];
235a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                strcpy(buf, prefix);
236a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                strcat(buf, cComponentName);
237a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                strcat(buf, postfix);
238a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
239a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                pModules[i] = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL);
240a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                if( pModules[i] == NULL ) {
241a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    LOGE("dlopen %s failed because %s\n", buf, dlerror());
242a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    err = OMX_ErrorComponentNotFound;
243a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    goto UNLOCK_MUTEX;
244a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                }
245fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
246a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                /* Get a function pointer to the "OMX_ComponentInit" function.  If
247a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                 * there is an error, we can't go on, so set the error code and exit */
248a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                pComponentInit = dlsym(pModules[i], "OMX_ComponentInit");
249a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                if( (pErr != NULL) || (pComponentInit == NULL) ) {
250a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    LOGE("%d:: dlsym failed for module %p\n", __LINE__, pModules[i]);
251a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    err = OMX_ErrorInvalidComponent;
252a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    goto CLEAN_UP;
253a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                }
254fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
255a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly               /* We now can access the dll.  So, we need to call the "OMX_ComponentInit"
256a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                * method to load up the "handle" (which is just a list of functions to
257a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                * call) and we should be all set.*/
258a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                *pHandle = malloc(sizeof(OMX_COMPONENTTYPE));
259a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                if(*pHandle == NULL) {
260a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    err = OMX_ErrorInsufficientResources;
261a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    LOGE("%d:: malloc of pHandle* failed\n", __LINE__);
262a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    goto CLEAN_UP;
263a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                }
264fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
265a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                pComponents[i] = *pHandle;
266a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                componentType = (OMX_COMPONENTTYPE*) *pHandle;
267a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                componentType->nSize = sizeof(OMX_COMPONENTTYPE);
268a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                err = (*pComponentInit)(*pHandle);
269a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                if (OMX_ErrorNone == err) {
270a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    err = (componentType->SetCallbacks)(*pHandle, pCallBacks, pAppData);
271a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    if (err != OMX_ErrorNone) {
272a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                        LOGE("%d :: Core: SetCallBack failed %d\n",__LINE__, err);
273a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                        goto CLEAN_UP;
274a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    }
275a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    /* finally, OMX_ComponentInit() was successful and
276a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                       SetCallbacks was successful, we have a valid instance,
277a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                       so no we increment refCount */
278a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    componentTable[refIndex].pHandle[componentTable[refIndex].refCount] = *pHandle;
279a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    componentTable[refIndex].refCount += 1;
280a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    goto UNLOCK_MUTEX;  // Component is found, and thus we are done
281a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                }
282a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            }
283a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        }
284fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
285a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
286a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    // If we are here, we have not found the component
287a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    err = OMX_ErrorComponentNotFound;
288a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    goto UNLOCK_MUTEX;
289a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
290a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher KellyCLEAN_UP:
291a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    free(*pHandle);
292a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    *pHandle = NULL;
293a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    pComponents[i] = NULL;
294a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    dlclose(pModules[i]);
295a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    pModules[i] = NULL;
296a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
297a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher KellyUNLOCK_MUTEX:
298a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    if(pthread_mutex_unlock(&mutex) != 0)
299fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
300a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__);
301a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        err = OMX_ErrorUndefined;
302a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    }
303fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return (err);
304fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
305a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
306fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
307fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\
308fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_FreeHandle()
309fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
310fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description:This method will unload the OMX component pointed by
311fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_HANDLETYPE. It is the responsibility of the calling method to ensure that
312fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* the Deinit method of the component has been called prior to unloading component
313fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
314fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Parameters:
315fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] hComponent the component to unload
316fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
317fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
318fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
319fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
320fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
321fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/
322fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_FreeHandle (OMX_HANDLETYPE hComponent)
323fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
324fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
325fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE retVal = OMX_ErrorUndefined;
326fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)hComponent;
327fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
328a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    if(pthread_mutex_lock(&mutex) != 0)
329fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
330a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        LOGE("%d :: Core: Error in Mutex lock\n",__LINE__);
331a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        return OMX_ErrorUndefined;
332fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
333fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
334fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* Locate the component handle in the array of handles */
335a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    int i = 0;
336fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    for(i=0; i< COUNTOF(pModules); i++) {
337fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if(pComponents[i] == hComponent) break;
338fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
339a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
340fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if(i == COUNTOF(pModules)) {
341a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        LOGE("%d :: Core: component %p is not found\n", __LINE__, hComponent);
342fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        retVal = OMX_ErrorBadParameter;
343fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        goto EXIT;
344fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
345fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
346fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    retVal = pHandle->ComponentDeInit(hComponent);
347fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (retVal != OMX_ErrorNone) {
348a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        LOGE("%d :: ComponentDeInit failed %d\n",__LINE__, retVal);
349a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        goto EXIT;
350fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
351fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
352a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    int refIndex = 0, handleIndex = 0;
353a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    for (refIndex=0; refIndex < MAX_TABLE_SIZE; refIndex++) {
354a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        for (handleIndex=0; handleIndex < componentTable[refIndex].refCount; handleIndex++){
355a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            /* get the position for the component in the table */
356a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            if (componentTable[refIndex].pHandle[handleIndex] == hComponent){
357a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                LOGD("Found matching pHandle(%p) at index %d with refCount %d",
358a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                      hComponent, refIndex, componentTable[refIndex].refCount);
359a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                if (componentTable[refIndex].refCount) {
360a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    componentTable[refIndex].refCount -= 1;
361a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                }
362a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                componentTable[refIndex].pHandle[handleIndex] = NULL;
363a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                dlclose(pModules[i]);
364a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                pModules[i] = NULL;
365a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                free(pComponents[i]);
366a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                pComponents[i] = NULL;
367a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                retVal = OMX_ErrorNone;
368a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                goto EXIT;
369a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            }
370a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        }
371a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    }
372a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
373a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    // If we are here, we have not found the matching component
374a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    retVal = OMX_ErrorComponentNotFound;
375fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
376fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinEXIT:
377fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* The unload is now complete, so set the error code to pass and exit */
378a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    if(pthread_mutex_unlock(&mutex) != 0)
379fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
380a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__);
381a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        return OMX_ErrorUndefined;
382a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    }
383fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
384fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return retVal;
385fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
386fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
387fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\
388fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_DeInit()
389fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
390fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description:This method will release the resources of the OMX Core.  It is the
391fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* responsibility of the application to call OMX_DeInit to ensure the clean up of these
392fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* resources.
393fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
394fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
395fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
396fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
397fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
398fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/
399fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_Deinit()
400fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
401a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    if(pthread_mutex_lock(&mutex) != 0) {
402a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        LOGE("%d :: Core: Error in Mutex lock\n",__LINE__);
403a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        return OMX_ErrorUndefined;
404a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    }
405fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
406a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    if (count) {
407a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        count--;
408a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    }
409a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
410a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    LOGD("deinit count = %d\n", count);
411a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
412a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    if(pthread_mutex_unlock(&mutex) != 0) {
413a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__);
414a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        return OMX_ErrorUndefined;
415fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
416fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
417fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return OMX_ErrorNone;
418fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
419fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
420fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*************************************************************************
421fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_SetupTunnel()
422fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
423fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: Setup the specified tunnel the two components
424fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
425fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Parameters:
426fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] hOutput     Handle of the component to be accessed
427fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nPortOutput Source port used in the tunnel
428fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] hInput      Component to setup the tunnel with.
429fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nPortInput  Destination port used in the tunnel
430fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
431fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
432fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
433fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
434fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
435fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/
436fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* OMX_SetupTunnel */
437fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE OMX_APIENTRY TIOMX_SetupTunnel(
438fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN  OMX_HANDLETYPE hOutput,
439fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN  OMX_U32 nPortOutput,
440fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN  OMX_HANDLETYPE hInput,
441fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN  OMX_U32 nPortInput)
442fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
443fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE eError = OMX_ErrorNotImplemented;
444fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_COMPONENTTYPE *pCompIn, *pCompOut;
445fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_TUNNELSETUPTYPE oTunnelSetup;
446fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
447fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (hOutput == NULL && hInput == NULL)
448fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        return OMX_ErrorBadParameter;
449fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
450fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    oTunnelSetup.nTunnelFlags = 0;
451fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    oTunnelSetup.eSupplier = OMX_BufferSupplyUnspecified;
452fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
453fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    pCompOut = (OMX_COMPONENTTYPE*)hOutput;
454fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
455fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (hOutput)
456fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
457fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        eError = pCompOut->ComponentTunnelRequest(hOutput, nPortOutput, hInput, nPortInput, &oTunnelSetup);
458fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
459fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
460fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
461fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (eError == OMX_ErrorNone && hInput)
462fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
463fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        pCompIn = (OMX_COMPONENTTYPE*)hInput;
464fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        eError = pCompIn->ComponentTunnelRequest(hInput, nPortInput, hOutput, nPortOutput, &oTunnelSetup);
465fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (eError != OMX_ErrorNone && hOutput)
466fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
467fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* cancel tunnel request on output port since input port failed */
468fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            pCompOut->ComponentTunnelRequest(hOutput, nPortOutput, NULL, 0, NULL);
469fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
470fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
471fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
472fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return eError;
473fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
474fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
475fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*************************************************************************
476fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_ComponentNameEnum()
477fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
478fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will provide the name of the component at the given nIndex
479fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
480fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*Parameters:
481fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[out] cComponentName       The name of the component at nIndex
482fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nNameLength                The length of the component name
483fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nIndex                         The index number of the component
484fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
485fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
486fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
487fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
488fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
489fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/
490fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE OMX_APIENTRY TIOMX_ComponentNameEnum(
491fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_OUT OMX_STRING cComponentName,
492fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN  OMX_U32 nNameLength,
493fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN  OMX_U32 nIndex)
494fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
495fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE eError = OMX_ErrorNone;
496fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
497fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (nIndex >=  tableCount)
498fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
499fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        eError = OMX_ErrorNoMore;
500fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin     }
501fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    else
502fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
503fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        strcpy(cComponentName, componentTable[nIndex].name);
504fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
505fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
506fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return eError;
507fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
508fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
509fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
510fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*************************************************************************
511fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_GetRolesOfComponent()
512fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
513fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will query the component for its supported roles
514fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
515fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*Parameters:
516fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] cComponentName     The name of the component to query
517fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pNumRoles     The number of roles supported by the component
518fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] roles		The roles of the component
519fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
520fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
521fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*                 OMX_ErrorBadParameter		Faliure due to a bad input parameter
522fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
523fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
524fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
525fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/
526fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE TIOMX_GetRolesOfComponent (
527fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN      OMX_STRING cComponentName,
528fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_INOUT   OMX_U32 *pNumRoles,
529fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_OUT     OMX_U8 **roles)
530fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
531fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
532fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE eError = OMX_ErrorNone;
533fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_U32 i = 0;
534fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_U32 j = 0;
535fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_BOOL bFound = OMX_FALSE;
536fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
537a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    if (cComponentName == NULL || pNumRoles == NULL)
538fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
539fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        eError = OMX_ErrorBadParameter;
540fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        goto EXIT;
541fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
542fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
543fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
544fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    while(!bFound && i < tableCount)
545fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
546fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (strcmp(cComponentName, componentTable[i].name) == 0)
547fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
548fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            bFound = OMX_TRUE;
549fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
550fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        else
551fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
552fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            i++;
553fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
554fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
555fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (roles == NULL)
556fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
557fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        *pNumRoles = componentTable[i].nRoles;
558fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        goto EXIT;
559fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
560fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    else
561fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
562fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (bFound && (*pNumRoles == componentTable[i].nRoles))
563fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin       {
564fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin           for (j = 0; j<componentTable[i].nRoles; j++)
565fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin           {
566fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin               strcpy((OMX_STRING)roles[j], componentTable[i].pRoleArray[j]);
567fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin           }
568fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin       }
569fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   }
570fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   EXIT:
571fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   return eError;
572fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
573fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
574fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*************************************************************************
575fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_GetComponentsOfRole()
576fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
577fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will query the component for its supported roles
578fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
579fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*Parameters:
580fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] role     The role name to query for
581fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pNumComps     The number of components supporting the given role
582fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] compNames      The names of the components supporting the given role
583fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
584fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
585fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
586fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
587fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
588fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/
589fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE TIOMX_GetComponentsOfRole (
590fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN      OMX_STRING role,
591fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_INOUT   OMX_U32 *pNumComps,
592fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_INOUT   OMX_U8  **compNames)
593fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
594fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE eError = OMX_ErrorNone;
595fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_U32 i = 0;
596fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_U32 j = 0;
597fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_U32 k = 0;
598fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
599a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    if (role == NULL || pNumComps == NULL)
600fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
601fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin       eError = OMX_ErrorBadParameter;
602fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin       goto EXIT;
603fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
604fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
605fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   /* This implies that the componentTable is not filled */
606fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (componentTable[i].pRoleArray[j] == NULL)
607fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
608fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        eError = OMX_ErrorBadParameter;
609fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        goto EXIT;
610fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
611fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
612fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
613fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    for (i = 0; i < tableCount; i++)
614fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
615fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        for (j = 0; j<componentTable[i].nRoles; j++)
616fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
617fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (strcmp(componentTable[i].pRoleArray[j], role) == 0)
618fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
619fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* the first call to this function should only count the number
620fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    of roles so that for the second call compNames can be allocated
621fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    with the proper size for that number of roles */
622fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (compNames != NULL)
623fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
624fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    compNames[k] = (OMX_U8*)componentTable[i].name;
625fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
626fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                k++;
627fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
628fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
629fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        *pNumComps = k;
630fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
631fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
632fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    EXIT:
633fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return eError;
634fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
635fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
636fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
637fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_BuildComponentTable()
638fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
639fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE eError = OMX_ErrorNone;
640fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_CALLBACKTYPE sCallbacks;
641fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    int j = 0;
642fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    int numFiles = 0;
643a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    int i;
644a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
645fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* set up dummy call backs */
646fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    sCallbacks.EventHandler    = ComponentTable_EventHandler;
647fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    sCallbacks.EmptyBufferDone = ComponentTable_EmptyBufferDone;
648fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    sCallbacks.FillBufferDone  = ComponentTable_FillBufferDone;
649fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
650a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    for (i = 0, numFiles = 0; i < MAXCOMP; i ++) {
651a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        if (tComponentName[i][0] == NULL) {
652a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            break;
653a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        }
654a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        for (j = 0; j < numFiles; j ++) {
655a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            if (!strcmp(componentTable[j].name, tComponentName[i][0])) {
656a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                /* insert the role */
657a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                if (tComponentName[i][1] != NULL)
658fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
659a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    componentTable[j].pRoleArray[componentTable[j].nRoles] = tComponentName[i][1];
660a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    componentTable[j].pHandle[componentTable[j].nRoles] = NULL; //initilize the pHandle element
661a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                    componentTable[j].nRoles ++;
662fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
663a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                break;
664fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
665a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        }
666a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly        if (j == numFiles) { /* new component */
667a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            if (tComponentName[i][1] != NULL){
668a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                componentTable[numFiles].pRoleArray[0] = tComponentName[i][1];
669a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly                componentTable[numFiles].nRoles = 1;
670fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
671a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            strcpy(compName[numFiles], tComponentName[i][0]);
672a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            componentTable[numFiles].name = compName[numFiles];
673a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            componentTable[numFiles].refCount = 0; //initialize reference counter.
674a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly            numFiles ++;
675fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
676fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
677a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    tableCount = numFiles;
678fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (eError != OMX_ErrorNone){
679fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        printf("Error:  Could not build Component Table\n");
680fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
681a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
682fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return eError;
683fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
684fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
685fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE ComponentTable_EventHandler(
686fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        OMX_IN OMX_HANDLETYPE hComponent,
687fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        OMX_IN OMX_PTR pAppData,
688fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        OMX_IN OMX_EVENTTYPE eEvent,
689fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        OMX_IN OMX_U32 nData1,
690fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        OMX_IN OMX_U32 nData2,
691fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        OMX_IN OMX_PTR pEventData)
692fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
693fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return OMX_ErrorNotImplemented;
694fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
695fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
696fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE ComponentTable_EmptyBufferDone(
697fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        OMX_OUT OMX_HANDLETYPE hComponent,
698fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        OMX_OUT OMX_PTR pAppData,
699fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer)
700fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
701fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return OMX_ErrorNotImplemented;
702fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
703fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
704fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE ComponentTable_FillBufferDone(
705fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        OMX_OUT OMX_HANDLETYPE hComponent,
706fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        OMX_OUT OMX_PTR pAppData,
707fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer)
708fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
709fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return OMX_ErrorNotImplemented;
710fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
711fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
712fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_BOOL TIOMXConfigParserRedirect(
713fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_PTR aInputParameters,
714fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_PTR aOutputParameters)
715fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
716fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
717fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_BOOL Status = OMX_FALSE;
718b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin
719fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    Status = TIOMXConfigParser(aInputParameters, aOutputParameters);
720b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin
721fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return Status;
722fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
723