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
162c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles#undef LOG_TAG
172c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles#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
2317e995d39771569792c528f3dea559c83f0fc238Andreas Huber#ifndef NO_OPENCORE
242c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles/** determine capabilities of a component before acually using it */
25fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "ti_omx_config_parser.h"
2617e995d39771569792c528f3dea559c83f0fc238Andreas Huber#endif
27fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
28fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** size for the array of allocated components.  Sets the maximum
29fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * number of components that can be allocated at once */
30fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define MAXCOMP (50)
31fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define MAXNAMESIZE (130)
32fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define EMPTY_STRING "\0"
33fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
34fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Determine the number of elements in an array */
35fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define COUNTOF(x) (sizeof(x)/sizeof(x[0]))
36fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
37fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Array to hold the DLL pointers for each allocated component */
38fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void* pModules[MAXCOMP] = {0};
39fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
40fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Array to hold the component handles for each allocated component */
41fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void* pComponents[COUNTOF(pModules)] = {0};
42fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
432c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles/** count will be used as a reference counter for OMX_Init()
442c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    so all changes to count should be mutex protected */
45fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint count = 0;
462c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charlesstatic pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
47fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
48fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint tableCount = 0;
49fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinComponentTable componentTable[MAX_TABLE_SIZE];
50fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar * sRoleArray[60][20];
51fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar compName[60][200];
52fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
53fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar *tComponentName[MAXCOMP][2] = {
54fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /*video and image components */
55b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    //{"OMX.TI.JPEG.decoder", "image_decoder.jpeg" },
562c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    {"OMX.TI.JPEG.Encoder", "image_encoder.jpeg"},
57990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.Video.Decoder", "video_decoder.h263"},
58fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.Video.Decoder", "video_decoder.avc"},
59990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.Video.Decoder", "video_decoder.mpeg2"},
60fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.Video.Decoder", "video_decoder.mpeg4"},
61c5b21bfb410626a503e479a5afa2095902783427Benny Wong    {"OMX.TI.Video.Decoder", "video_decoder.wmv"},
62fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.Video.encoder", "video_encoder.mpeg4"},
63fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.Video.encoder", "video_encoder.h263"},
64fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.Video.encoder", "video_encoder.avc"},
65990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.VPP", "iv_renderer.yuv.overlay"},
66990117074ba37226d82be2f2ebe3739e488f848cJames Dong    //{"OMX.TI.Camera", "camera.yuv"},
67fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
68fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* Speech components */
692c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles/*  {"OMX.TI.G729.encode", NULL},
70fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G729.decode", NULL},
71fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G722.encode", NULL},
72fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G722.decode", NULL},
73fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G711.encode", NULL},
74fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G711.decode", NULL},
75fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G723.encode", NULL},
76fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G723.decode", NULL},
77fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G726.encode", NULL},
78fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.G726.decode", NULL},
79fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {"OMX.TI.GSMFR.encode", NULL},
802c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    {"OMX.TI.GSMFR.decode", NULL},
812c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles*/
82fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
83fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* Audio components */
842eb872487f5d31bc01507d26515208c0f4fedb2d<Benny.Wong@motorola.com>#ifdef BUILD_WITH_TI_AUDIO
852eb872487f5d31bc01507d26515208c0f4fedb2d<Benny.Wong@motorola.com>    {"OMX.TI.MP3.decode", "audio_decoder.mp3"},
86990117074ba37226d82be2f2ebe3739e488f848cJames Dong    {"OMX.TI.AAC.encode", "audio_encoder.aac"},
872eb872487f5d31bc01507d26515208c0f4fedb2d<Benny.Wong@motorola.com>    {"OMX.TI.AAC.decode", "audio_decoder.aac"},
88eaaadaf5ebb5e352e2ed4a12714f5d2363da0dcdJames Dong    {"OMX.TI.WMA.decode", "audio_decoder.wma"},
89b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    {"OMX.TI.WBAMR.decode", "audio_decoder.amrwb"},
90b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    {"OMX.TI.AMR.decode", "audio_decoder.amrnb"},
91b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    {"OMX.TI.AMR.encode", "audio_encoder.amrnb"},
92b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    {"OMX.TI.WBAMR.encode", "audio_encoder.amrwb"},
93eaaadaf5ebb5e352e2ed4a12714f5d2363da0dcdJames Dong#endif
94b65f253fdc60f6208a54911bee793d225f23cdf8James Dong/*  {"OMX.TI.PCM.encode", NULL},
95b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    {"OMX.TI.PCM.decode", NULL},
962c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    {"OMX.TI.RAG.decode", "audio_decoder.ra"},
972c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    {"OMX.TI.IMAADPCM.decode", NULL},
982c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    {"OMX.TI.IMAADPCM.encode", NULL},
992c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles*/
100b65f253fdc60f6208a54911bee793d225f23cdf8James Dong
101fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* terminate the table */
102fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {NULL, NULL},
103fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin};
104fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
105fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
106fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\
107fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_Init()
108fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
109fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description:This method will initialize the OMX Core.  It is the
110fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* responsibility of the application to call OMX_Init to ensure the proper
111fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* set up of core resources.
112fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
113fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
114fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
115fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
116fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
117fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/
118fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_Init()
119fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
120fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE eError = OMX_ErrorNone;
1212c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
1222c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    if(pthread_mutex_lock(&mutex) != 0)
1232c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    {
1242c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        LOGE("%d :: Core: Error in Mutex lock\n",__LINE__);
1252c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        return OMX_ErrorUndefined;
1262c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    }
127fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
128fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    count++;
1292c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    LOGD("init count = %d\n", count);
130fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
131fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (count == 1)
132fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
133fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        eError = TIOMX_BuildComponentTable();
134fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
1352c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
1362c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    if(pthread_mutex_unlock(&mutex) != 0)
1372c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    {
1382c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__);
1392c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        return OMX_ErrorUndefined;
1402c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    }
141fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return eError;
142fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
143fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\
144fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_GetHandle
145fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
146fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will create the handle of the COMPONENTTYPE
147fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* If the component is currently loaded, this method will reutrn the
148fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* hadle of existingcomponent or create a new instance of the component.
149fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* It will call the OMX_ComponentInit function and then the setcallback
150fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* method to initialize the callback functions
151fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Parameters:
152fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[out] pHandle            Handle of the loaded components
153fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] cComponentName     Name of the component to load
154fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pAppData           Used to identify the callbacks of component
155fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pCallBacks         Application callbacks
156fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
157fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorUndefined
158fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorInvalidComponentName
159fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorInvalidComponent
160fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorInsufficientResources
161fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_NOERROR                      Successful
162fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
163fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
164fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
165fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/
166fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
167fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_GetHandle( OMX_HANDLETYPE* pHandle, OMX_STRING cComponentName,
1682c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    OMX_PTR pAppData, OMX_CALLBACKTYPE* pCallBacks)
169fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
170fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    static const char prefix[] = "lib";
171fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    static const char postfix[] = ".so";
172fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE (*pComponentInit)(OMX_HANDLETYPE*);
1732c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    OMX_ERRORTYPE err = OMX_ErrorNone;
174fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_COMPONENTTYPE *componentType;
175b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    const char* pErr = dlerror();
1762c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
1772c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    if(pthread_mutex_lock(&mutex) != 0)
178fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
1792c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        LOGE("%d :: Core: Error in Mutex lock\n",__LINE__);
1802c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        return OMX_ErrorUndefined;
181fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
182fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
183fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if ((NULL == cComponentName) || (NULL == pHandle) || (NULL == pCallBacks)) {
184fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        err = OMX_ErrorBadParameter;
1852c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        goto UNLOCK_MUTEX;
186fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
187fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
188fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* Verify that the name is not too long and could cause a crash.  Notice
189fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin     * that the comparison is a greater than or equals.  This is to make
190fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin     * sure that there is room for the terminating NULL at the end of the
191fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin     * name. */
1922c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    if(strlen(cComponentName) >= MAXNAMESIZE) {
193fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        err = OMX_ErrorInvalidComponentName;
1942c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        goto UNLOCK_MUTEX;
195fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
196fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* Locate the first empty slot for a component.  If no slots
197fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin     * are available, error out */
1982c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    int i = 0;
199fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    for(i=0; i< COUNTOF(pModules); i++) {
200fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if(pModules[i] == NULL) break;
201fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
202fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if(i == COUNTOF(pModules)) {
2032c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        err = OMX_ErrorInsufficientResources;
2042c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        goto UNLOCK_MUTEX;
205fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
206fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
2072c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    int refIndex = 0;
208b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    for (refIndex=0; refIndex < MAX_TABLE_SIZE; refIndex++) {
2092c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        //get the index for the component in the table
2102c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        if (strcmp(componentTable[refIndex].name, cComponentName) == 0) {
2112c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles            LOGD("Found component %s with refCount %d\n",
2122c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                  cComponentName, componentTable[refIndex].refCount);
2132c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
2142c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles            /* check if the component is already loaded */
2152c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles            if (componentTable[refIndex].refCount >= MAX_CONCURRENT_INSTANCES) {
2162c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                err = OMX_ErrorInsufficientResources;
2172c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                LOGE("Max instances of component %s already created.\n", cComponentName);
2182c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                goto UNLOCK_MUTEX;
2192c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles            } else {  // we have not reached the limit yet
2202c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                /* do what was done before need to limit concurrent instances of each component */
2212c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
2222c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                /* load the component and check for an error.  If filename is not an
2232c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                 * absolute path (i.e., it does not  begin with a "/"), then the
2242c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                 * file is searched for in the following locations:
2252c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                 *
2262c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                 *     The LD_LIBRARY_PATH environment variable locations
2272c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                 *     The library cache, /etc/ld.so.cache.
2282c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                 *     /lib
2292c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                 *     /usr/lib
2302c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                 *
2312c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                 * If there is an error, we can't go on, so set the error code and exit */
2322c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
2332c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                /* the lengths are defined herein or have been
2342c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                 * checked already, so strcpy and strcat are
2352c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                 * are safe to use in this context. */
2362c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                char buf[sizeof(prefix) + MAXNAMESIZE + sizeof(postfix)];
2372c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                strcpy(buf, prefix);
2382c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                strcat(buf, cComponentName);
2392c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                strcat(buf, postfix);
2402c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
2412c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                pModules[i] = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL);
2422c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                if( pModules[i] == NULL ) {
2432c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    LOGE("dlopen %s failed because %s\n", buf, dlerror());
2442c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    err = OMX_ErrorComponentNotFound;
2452c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    goto UNLOCK_MUTEX;
2462c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                }
247a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
2482c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                /* Get a function pointer to the "OMX_ComponentInit" function.  If
2492c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                 * there is an error, we can't go on, so set the error code and exit */
2502c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                pComponentInit = dlsym(pModules[i], "OMX_ComponentInit");
251b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                pErr = dlerror();
252b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                if( (pErr != NULL) || (pComponentInit == NULL) ) {
2532c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    LOGE("%d:: dlsym failed for module %p\n", __LINE__, pModules[i]);
2542c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    err = OMX_ErrorInvalidComponent;
2552c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    goto CLEAN_UP;
2562c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                }
257a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
2582c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles               /* We now can access the dll.  So, we need to call the "OMX_ComponentInit"
2592c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                * method to load up the "handle" (which is just a list of functions to
2602c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                * call) and we should be all set.*/
2612c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                *pHandle = malloc(sizeof(OMX_COMPONENTTYPE));
2622c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                if(*pHandle == NULL) {
2632c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    err = OMX_ErrorInsufficientResources;
2642c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    LOGE("%d:: malloc of pHandle* failed\n", __LINE__);
2652c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    goto CLEAN_UP;
2662c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                }
2672c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
2682c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                pComponents[i] = *pHandle;
2692c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                componentType = (OMX_COMPONENTTYPE*) *pHandle;
2702c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                componentType->nSize = sizeof(OMX_COMPONENTTYPE);
2712c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                err = (*pComponentInit)(*pHandle);
2722c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                if (OMX_ErrorNone == err) {
2732c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    err = (componentType->SetCallbacks)(*pHandle, pCallBacks, pAppData);
2742c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    if (err != OMX_ErrorNone) {
2752c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                        LOGE("%d :: Core: SetCallBack failed %d\n",__LINE__, err);
2762c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                        goto CLEAN_UP;
2772c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    }
2782c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    /* finally, OMX_ComponentInit() was successful and
2792c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                       SetCallbacks was successful, we have a valid instance,
2802c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                       so no we increment refCount */
2812c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    componentTable[refIndex].pHandle[componentTable[refIndex].refCount] = *pHandle;
2822c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    componentTable[refIndex].refCount += 1;
2832c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    goto UNLOCK_MUTEX;  // Component is found, and thus we are done
2842c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                }
285b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                else if (err == OMX_ErrorInsufficientResources) {
286b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                        LOGE("%d :: Core: Insufficient Resources for Component %d\n",__LINE__, err);
287b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                        goto CLEAN_UP;
288b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                }
2892c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles            }
2902c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        }
291a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    }
2922c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
2932c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    // If we are here, we have not found the component
2942c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    err = OMX_ErrorComponentNotFound;
2952c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    goto UNLOCK_MUTEX;
2962c0b038ffdf873a942cee5ea78939535f81deaa2Daniel CharlesCLEAN_UP:
297b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    if(*pHandle != NULL)
298b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    /* cover the case where we error out before malloc'd */
299b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    {
300b65f253fdc60f6208a54911bee793d225f23cdf8James Dong        free(*pHandle);
301b65f253fdc60f6208a54911bee793d225f23cdf8James Dong        *pHandle = NULL;
302b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    }
3032c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    pComponents[i] = NULL;
3042c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    dlclose(pModules[i]);
3052c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    pModules[i] = NULL;
3062c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
3072c0b038ffdf873a942cee5ea78939535f81deaa2Daniel CharlesUNLOCK_MUTEX:
3082c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    if(pthread_mutex_unlock(&mutex) != 0)
3098f41d183c7150ced3aef44b5f9a3ae3b7b57ec1cJames Dong    {
3102c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__);
3112c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        err = OMX_ErrorUndefined;
3122c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    }
313fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return (err);
314fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
3152c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
316fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
317fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\
318fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_FreeHandle()
319fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
320fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description:This method will unload the OMX component pointed by
321fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_HANDLETYPE. It is the responsibility of the calling method to ensure that
322fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* the Deinit method of the component has been called prior to unloading component
323fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
324fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Parameters:
325fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] hComponent the component to unload
326fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
327fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
328fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
329fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
330fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
331fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/
332fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_FreeHandle (OMX_HANDLETYPE hComponent)
333fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
334fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
335fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE retVal = OMX_ErrorUndefined;
336fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)hComponent;
337fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
3382c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    if(pthread_mutex_lock(&mutex) != 0)
339fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
3402c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        LOGE("%d :: Core: Error in Mutex lock\n",__LINE__);
3412c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        return OMX_ErrorUndefined;
342fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
343fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
344fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* Locate the component handle in the array of handles */
3452c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    int i = 0;
346fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    for(i=0; i< COUNTOF(pModules); i++) {
347fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if(pComponents[i] == hComponent) break;
348fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
3492c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
350fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if(i == COUNTOF(pModules)) {
3512c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        LOGE("%d :: Core: component %p is not found\n", __LINE__, hComponent);
352fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        retVal = OMX_ErrorBadParameter;
353fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        goto EXIT;
354fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
355fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
356fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    retVal = pHandle->ComponentDeInit(hComponent);
357fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (retVal != OMX_ErrorNone) {
3582c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        LOGE("%d :: ComponentDeInit failed %d\n",__LINE__, retVal);
3592c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        goto EXIT;
360a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly    }
361a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
3622c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    int refIndex = 0, handleIndex = 0;
363b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    for (refIndex=0; refIndex < MAX_TABLE_SIZE; refIndex++) {
3642c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        for (handleIndex=0; handleIndex < componentTable[refIndex].refCount; handleIndex++){
3652c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles            /* get the position for the component in the table */
3662c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles            if (componentTable[refIndex].pHandle[handleIndex] == hComponent){
3672c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                LOGD("Found matching pHandle(%p) at index %d with refCount %d",
3682c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                      hComponent, refIndex, componentTable[refIndex].refCount);
3692c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                if (componentTable[refIndex].refCount) {
3702c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                    componentTable[refIndex].refCount -= 1;
3712c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                }
3722c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                componentTable[refIndex].pHandle[handleIndex] = NULL;
3732c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                dlclose(pModules[i]);
3742c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                pModules[i] = NULL;
3752c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                free(pComponents[i]);
3762c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                pComponents[i] = NULL;
3772c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                retVal = OMX_ErrorNone;
3782c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles                goto EXIT;
3792c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles            }
3802c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        }
3812c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    }
3822c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
3832c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    // If we are here, we have not found the matching component
3842c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    retVal = OMX_ErrorComponentNotFound;
385fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
386fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinEXIT:
387fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* The unload is now complete, so set the error code to pass and exit */
3882c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    if(pthread_mutex_unlock(&mutex) != 0)
389fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
3902c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__);
3912c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        return OMX_ErrorUndefined;
3922c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    }
393fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
394fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return retVal;
395fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
396fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
397fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\
398fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_DeInit()
399fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
400fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description:This method will release the resources of the OMX Core.  It is the
401fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* responsibility of the application to call OMX_DeInit to ensure the clean up of these
402fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* resources.
403fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
404fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
405fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
406fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
407fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
408fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/
409fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_Deinit()
410fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
4112c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    if(pthread_mutex_lock(&mutex) != 0) {
4122c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        LOGE("%d :: Core: Error in Mutex lock\n",__LINE__);
4132c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        return OMX_ErrorUndefined;
4142c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    }
415a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly
4162c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    if (count) {
4172c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        count--;
4182c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    }
4192c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
4202c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    LOGD("deinit count = %d\n", count);
4212c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
4222c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    if(pthread_mutex_unlock(&mutex) != 0) {
4232c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__);
4242c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        return OMX_ErrorUndefined;
425fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
426fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
427fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return OMX_ErrorNone;
428fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
429fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
430fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*************************************************************************
431fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_SetupTunnel()
432fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
433fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: Setup the specified tunnel the two components
434fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
435fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Parameters:
436fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] hOutput     Handle of the component to be accessed
437fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nPortOutput Source port used in the tunnel
438fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] hInput      Component to setup the tunnel with.
439fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nPortInput  Destination port used in the tunnel
440fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
441fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
442fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
443fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
444fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
445fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/
446fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* OMX_SetupTunnel */
447fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE OMX_APIENTRY TIOMX_SetupTunnel(
448fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN  OMX_HANDLETYPE hOutput,
449fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN  OMX_U32 nPortOutput,
450fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN  OMX_HANDLETYPE hInput,
451fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN  OMX_U32 nPortInput)
452fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
453fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE eError = OMX_ErrorNotImplemented;
454fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_COMPONENTTYPE *pCompIn, *pCompOut;
455fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_TUNNELSETUPTYPE oTunnelSetup;
456fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
457fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (hOutput == NULL && hInput == NULL)
458fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        return OMX_ErrorBadParameter;
459fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
460fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    oTunnelSetup.nTunnelFlags = 0;
461fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    oTunnelSetup.eSupplier = OMX_BufferSupplyUnspecified;
462fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
463fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    pCompOut = (OMX_COMPONENTTYPE*)hOutput;
464fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
465fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (hOutput)
466fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
467fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        eError = pCompOut->ComponentTunnelRequest(hOutput, nPortOutput, hInput, nPortInput, &oTunnelSetup);
468fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
469fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
470fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
471fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (eError == OMX_ErrorNone && hInput)
472fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
473fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        pCompIn = (OMX_COMPONENTTYPE*)hInput;
474fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        eError = pCompIn->ComponentTunnelRequest(hInput, nPortInput, hOutput, nPortOutput, &oTunnelSetup);
475fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (eError != OMX_ErrorNone && hOutput)
476fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
477fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* cancel tunnel request on output port since input port failed */
478fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            pCompOut->ComponentTunnelRequest(hOutput, nPortOutput, NULL, 0, NULL);
479fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
480fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
481fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
482fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return eError;
483fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
484fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
485fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*************************************************************************
486fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_ComponentNameEnum()
487fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
488fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will provide the name of the component at the given nIndex
489fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
490fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*Parameters:
491fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[out] cComponentName       The name of the component at nIndex
492fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nNameLength                The length of the component name
493fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nIndex                         The index number of the component
494fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
495fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
496fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
497fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
498fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
499fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/
500fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE OMX_APIENTRY TIOMX_ComponentNameEnum(
501fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_OUT OMX_STRING cComponentName,
502fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN  OMX_U32 nNameLength,
503fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN  OMX_U32 nIndex)
504fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
505fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE eError = OMX_ErrorNone;
506fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
507fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (nIndex >=  tableCount)
508fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
509fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        eError = OMX_ErrorNoMore;
510fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin     }
511fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    else
512fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
513fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        strcpy(cComponentName, componentTable[nIndex].name);
514fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
515fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
516fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return eError;
517fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
518fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
519fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
520fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*************************************************************************
521fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_GetRolesOfComponent()
522fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
523fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will query the component for its supported roles
524fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
525fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*Parameters:
526fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] cComponentName     The name of the component to query
527fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pNumRoles     The number of roles supported by the component
528fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] roles		The roles of the component
529fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
530fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
531fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*                 OMX_ErrorBadParameter		Faliure due to a bad input parameter
532fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
533fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
534fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
535fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/
536fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE TIOMX_GetRolesOfComponent (
537fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN      OMX_STRING cComponentName,
538fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_INOUT   OMX_U32 *pNumRoles,
539fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_OUT     OMX_U8 **roles)
540fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
541fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
542fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE eError = OMX_ErrorNone;
543fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_U32 i = 0;
544fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_U32 j = 0;
545fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_BOOL bFound = OMX_FALSE;
546fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
5472c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    if (cComponentName == NULL || pNumRoles == NULL)
548fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
549a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        if (cComponentName == NULL)
550a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        {
551a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            LOGE("cComponentName is NULL\n");
552a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        }
553a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        if (pNumRoles == NULL)
554a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        {
555a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            LOGE("pNumRoles is NULL\n");
556a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        }
557fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        eError = OMX_ErrorBadParameter;
558b65f253fdc60f6208a54911bee793d225f23cdf8James Dong        goto EXIT;
559fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
560a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    while (i < tableCount)
561b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    {
562b65f253fdc60f6208a54911bee793d225f23cdf8James Dong        if (strcmp(cComponentName, componentTable[i].name) == 0)
563b65f253fdc60f6208a54911bee793d225f23cdf8James Dong        {
564b65f253fdc60f6208a54911bee793d225f23cdf8James Dong            bFound = OMX_TRUE;
565b65f253fdc60f6208a54911bee793d225f23cdf8James Dong            break;
566fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
567b65f253fdc60f6208a54911bee793d225f23cdf8James Dong        i++;
568a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    }
569a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    if (!bFound)
570a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    {
571a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        eError = OMX_ErrorComponentNotFound;
572a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        LOGE("component %s not found\n", cComponentName);
573a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        goto EXIT;
574b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    }
575fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (roles == NULL)
576b65f253fdc60f6208a54911bee793d225f23cdf8James Dong    {
577fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        *pNumRoles = componentTable[i].nRoles;
578fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
579fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    else
580fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
581a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        /* must be second of two calls,
582a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly           pNumRoles is input in this context.
583a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly           If pNumRoles is < actual number of roles
584a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly           than we return an error */
585a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        if (*pNumRoles >= componentTable[i].nRoles)
586a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        {
587b65f253fdc60f6208a54911bee793d225f23cdf8James Dong            for (j = 0; j<componentTable[i].nRoles; j++)
588a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            {
589a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                strcpy((OMX_STRING)roles[j], componentTable[i].pRoleArray[j]);
590a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            }
591a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            *pNumRoles = componentTable[i].nRoles;
592a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        }
593a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        else
594a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        {
595a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            eError = OMX_ErrorBadParameter;
596a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            LOGE("pNumRoles (%d) is less than actual number (%d) of roles \
597a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                   for this component %s\n", *pNumRoles, componentTable[i].nRoles, cComponentName);
598a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        }
599a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    }
600a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    EXIT:
601a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    return eError;
602fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
603fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
604fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*************************************************************************
605fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_GetComponentsOfRole()
606fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
607fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will query the component for its supported roles
608fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
609fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*Parameters:
610fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] role     The role name to query for
611fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pNumComps     The number of components supporting the given role
612fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] compNames      The names of the components supporting the given role
613fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
614fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns:    OMX_NOERROR          Successful
615fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
616fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note
617fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*
618fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/
619b65f253fdc60f6208a54911bee793d225f23cdf8James DongOMX_API OMX_ERRORTYPE TIOMX_GetComponentsOfRole (
620fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_IN      OMX_STRING role,
621fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_INOUT   OMX_U32 *pNumComps,
622fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_INOUT   OMX_U8  **compNames)
623fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
624fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE eError = OMX_ErrorNone;
625fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_U32 i = 0;
626fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_U32 j = 0;
627fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_U32 k = 0;
628a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    OMX_U32 compOfRoleCount = 0;
629fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
6302c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    if (role == NULL || pNumComps == NULL)
631fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
632a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly       if (role == NULL)
633a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly       {
634a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly           LOGE("role is NULL");
635a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly       }
636a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly       if (pNumComps == NULL)
637a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly       {
638a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly           LOGE("pNumComps is NULL\n");
639a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly       }
640fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin       eError = OMX_ErrorBadParameter;
641fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin       goto EXIT;
642fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
643fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
644fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   /* This implies that the componentTable is not filled */
645a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    if (!tableCount)
646fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
647a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        eError = OMX_ErrorUndefined;
648a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        LOGE("Component table is empty. Please reload OMX Core\n");
649fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        goto EXIT;
650fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
651fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
652a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    /* no matter, we always want to know number of matching components
653b65f253fdc60f6208a54911bee793d225f23cdf8James Dong       so this will always run */
654fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    for (i = 0; i < tableCount; i++)
655fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
656b65f253fdc60f6208a54911bee793d225f23cdf8James Dong        for (j = 0; j < componentTable[i].nRoles; j++)
657b65f253fdc60f6208a54911bee793d225f23cdf8James Dong        {
658fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (strcmp(componentTable[i].pRoleArray[j], role) == 0)
659fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
660fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* the first call to this function should only count the number
661b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                   of roles
662a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                */
663a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                compOfRoleCount++;
664a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            }
665a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        }
666a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    }
667a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    if (compOfRoleCount == 0)
668a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    {
669a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        eError = OMX_ErrorComponentNotFound;
670a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        LOGE("Component supporting role %s was not found\n", role);
671a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    }
672a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    if (compNames == NULL)
673a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    {
674a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        /* must be the first of two calls */
675a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        *pNumComps = compOfRoleCount;
676a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    }
677a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    else
678a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly    {
679a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        /* must be the second of two calls */
680a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        if (*pNumComps < compOfRoleCount)
681a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        {
682a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            /* pNumComps is input in this context,
683a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly               it can not be less, this would indicate
684a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly               the array is not large enough
685a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            */
686a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            eError = OMX_ErrorBadParameter;
687a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            LOGE("pNumComps (%d) is less than the actual number (%d) of components \
688a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                  supporting role %s\n", *pNumComps, compOfRoleCount, role);
689a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        }
690a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        else
691a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        {
692a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            k = 0;
693a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            for (i = 0; i < tableCount; i++)
694a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly            {
695b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                for (j = 0; j < componentTable[i].nRoles; j++)
696b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                {
697a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                    if (strcmp(componentTable[i].pRoleArray[j], role) == 0)
698a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                    {
699a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                        /*  the second call compNames can be allocated
700a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                            with the proper size for that number of roles.
701a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                        */
702a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                        compNames[k] = (OMX_U8*)componentTable[i].name;
703a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                        k++;
704a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                        if (k == compOfRoleCount)
705a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                        {
706a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                            /* there are no more components of this role
707a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                               so we can exit here */
708a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                            *pNumComps = k;
709a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                            goto EXIT;
710b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                        }
711a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly                    }
712fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
713fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
714b65f253fdc60f6208a54911bee793d225f23cdf8James Dong        }
715fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
716fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
717fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    EXIT:
718fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return eError;
719fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
720fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
721fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
722fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_BuildComponentTable()
723fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
724fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_ERRORTYPE eError = OMX_ErrorNone;
725fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_CALLBACKTYPE sCallbacks;
726fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    int j = 0;
727fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    int numFiles = 0;
7282c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    int i;
7292c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
7302c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    for (i = 0, numFiles = 0; i < MAXCOMP; i ++) {
7312c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        if (tComponentName[i][0] == NULL) {
7322c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles            break;
7332c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles        }
734b65f253fdc60f6208a54911bee793d225f23cdf8James Dong        if (numFiles <= MAX_TABLE_SIZE){
735b65f253fdc60f6208a54911bee793d225f23cdf8James Dong            for (j = 0; j < numFiles; j ++) {
736b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                if (!strcmp(componentTable[j].name, tComponentName[i][0])) {
737b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                    /* insert the role */
738b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                    if (tComponentName[i][1] != NULL)
739b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                    {
740b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                        componentTable[j].pRoleArray[componentTable[j].nRoles] = tComponentName[i][1];
741b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                        componentTable[j].pHandle[componentTable[j].nRoles] = NULL; //initilize the pHandle element
742b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                        componentTable[j].nRoles ++;
743b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                    }
744b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                    break;
745fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
746fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
747b65f253fdc60f6208a54911bee793d225f23cdf8James Dong            if (j == numFiles) { /* new component */
748b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                if (tComponentName[i][1] != NULL){
749b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                    componentTable[numFiles].pRoleArray[0] = tComponentName[i][1];
750b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                    componentTable[numFiles].nRoles = 1;
751b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                }
752b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                strcpy(compName[numFiles], tComponentName[i][0]);
753b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                componentTable[numFiles].name = compName[numFiles];
754b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                componentTable[numFiles].refCount = 0; //initialize reference counter.
755b65f253fdc60f6208a54911bee793d225f23cdf8James Dong                numFiles ++;
756fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
757fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
758fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
7592c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles    tableCount = numFiles;
760fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (eError != OMX_ErrorNone){
761a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly        LOGE("Could not build Component Table\n");
762fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
7632c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles
764fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return eError;
765fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
766fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
767fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_BOOL TIOMXConfigParserRedirect(
768fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_PTR aInputParameters,
769fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_PTR aOutputParameters)
770fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
771fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
772fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    OMX_BOOL Status = OMX_FALSE;
77317e995d39771569792c528f3dea559c83f0fc238Andreas Huber#ifndef NO_OPENCORE
774fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    Status = TIOMXConfigParser(aInputParameters, aOutputParameters);
77517e995d39771569792c528f3dea559c83f0fc238Andreas Huber#endif
776fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return Status;
777fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
778