1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
26eec4d1ea65df853450a6e158718981cba900bf6Shashank MittalCopyright (c) 2009, The Linux Foundation. All rights reserved.
3826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRedistribution and use in source and binary forms, with or without
5826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevmodification, are permitted provided that the following conditions are met:
6826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Redistributions of source code must retain the above copyright
7826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      notice, this list of conditions and the following disclaimer.
8826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Redistributions in binary form must reproduce the above copyright
9826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      notice, this list of conditions and the following disclaimer in the
10826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      documentation and/or other materials provided with the distribution.
116eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal    * Neither the name of The Linux Foundation nor
12826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      the names of its contributors may be used to endorse or promote
13826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      products derived from this software without specific prior written
14826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      permission.
15826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev--------------------------------------------------------------------------*/
28826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*============================================================================
29826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                            O p e n M A X   w r a p p e r s
30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                             O p e n  M A X   C o r e
31826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
32826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  This module contains the implementation of the OpenMAX core.
33826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
34826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev*//*========================================================================*/
35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
36826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//////////////////////////////////////////////////////////////////////////////
37826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//                             Include Files
38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//////////////////////////////////////////////////////////////////////////////
39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
40826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <dlfcn.h>           // dynamic library
41826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/types.h>
42826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <sys/stat.h>
43826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <unistd.h>
44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <string.h>
45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <stdio.h>
46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <pthread.h>
47826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
48826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "qc_omx_core.h"
49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "omx_core_cmp.h"
50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
51826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevextern omx_core_cb_type core[];
52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevextern const unsigned int SIZE_OF_CORE;
53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic pthread_mutex_t lock_core = PTHREAD_MUTEX_INITIALIZER;
54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  omx_core_load_cmp_library
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Loads up the libary name mentioned in the argument
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Constructor for creating component instances.
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic create_qc_omx_component
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevomx_core_load_cmp_library(char *libname, void **handle_ptr)
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  create_qc_omx_component fn_ptr = NULL;
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(handle_ptr)
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("Dynamically Loading the library : %s\n",libname);
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *handle_ptr = dlopen(libname,RTLD_NOW);
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(*handle_ptr)
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      fn_ptr = dlsym(*handle_ptr, "get_omx_component_factory_fn");
79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(fn_ptr == NULL)
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("Error: Library %s incompatible as QCOM OMX component loader - %s\n",
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  libname, dlerror());
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        *handle_ptr = NULL;
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("Error: Couldn't load %s: %s\n",libname,dlerror());
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return fn_ptr;
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_Init
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
99826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
100826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  This is the first function called by the application.
101826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  There is nothing to do here since components shall be loaded
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  whenever the get handle method is called.
103826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
104826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
105826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
106826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
107826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
108826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
109826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
110826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_APIENTRY
111826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_Init()
112826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
113826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("OMXCORE API - OMX_Init \n");
114826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* Nothing to do here ; shared objects shall be loaded at the get handle method */
115826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
116826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
117826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
118826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
119826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
120826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  get_cmp_index
121826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
122826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
123826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Obtains the  index associated with the name.
124826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
125826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
126826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
127826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
128826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
129826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Error None.
130826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
131826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int get_cmp_index(char *cmp_name)
132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc = -1,i=0;
134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("before get_cmp_index **********%d\n", rc);
135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< (int)SIZE_OF_CORE; i++)
137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev   DEBUG_PRINT("get_cmp_index: cmp_name = %s , core[i].name = %s ,count = %d \n",cmp_name,core[i].name,i);
139826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
140826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!strcmp(cmp_name, core[i].name))
141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        rc = i;
143826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
144826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
145826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
146826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("returning index %d\n", rc);
147826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return rc;
148826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
149826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
150826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
151826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  clear_cmp_handle
153826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
154826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
155826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Clears the component handle from the component table.
156826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
157826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
158826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
159826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
160826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
161826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
162826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
163826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic void clear_cmp_handle(OMX_HANDLETYPE inst)
164826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
165826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i = 0,j=0;
166826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
167826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(NULL == inst)
168826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return;
169826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
170826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< SIZE_OF_CORE; i++)
171826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
172826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(j=0; j< OMX_COMP_MAX_INST; j++)
173826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
174826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(inst == core[i].inst[j])
175826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
176826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        core[i].inst[j] = NULL;
177826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return;
178826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
179826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
180826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
181826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return;
182826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
183826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
184826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
185826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  is_cmp_handle_exists
186826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
187826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
188826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Check if the component handle already exists or not.
189826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
190826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
191826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
192826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
193826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
194826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  index pointer if the handle exists
195826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  negative value otherwise
196826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
197826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int is_cmp_handle_exists(OMX_HANDLETYPE inst)
198826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
199826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i=0,j=0;
200826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc = -1;
201826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
202826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(NULL == inst)
203826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev     return rc;
204826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
205826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&lock_core);
206826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< SIZE_OF_CORE; i++)
207826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
208826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(j=0; j< OMX_COMP_MAX_INST; j++)
209826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
210826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(inst == core[i].inst[j])
211826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
212826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        rc = i;
213826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        goto finish;
214826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
215826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
216826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
217826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevfinish:
218826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&lock_core);
219826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return rc;
220826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
221826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
222826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
223826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
224826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  get_comp_handle_index
225826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
226826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
227826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Gets the index to store the next handle for specified component name.
228826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
229826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
230826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  cmp_name : Component Name
231826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
232826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
233826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Index of next handle to be stored
234826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
235826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int get_comp_handle_index(char *cmp_name)
236826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
237826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i=0,j=0;
238826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc = -1;
239826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< SIZE_OF_CORE; i++)
240826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
241826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!strcmp(cmp_name, core[i].name))
242826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
243826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(j=0; j< OMX_COMP_MAX_INST; j++)
244826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
245826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(NULL == core[i].inst[j])
246826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
247826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          rc = j;
248826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT("free handle slot exists %d\n", rc);
249826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return rc;
250826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
251826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
252826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
253826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
254826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
255826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return rc;
256826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
257826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
258826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
259826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
260826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  check_lib_unload
261826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
262826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
263826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Check if any component instance is using the library
264826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
265826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
266826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  index: Component Index in core array.
267826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
268826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
269826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  1: Library Unused and can be unloaded.
270826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  0:  Library used and shouldnt be unloaded.
271826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
272826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int check_lib_unload(int index)
273826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
274826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i=0;
275826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc = 1;
276826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
277826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< OMX_COMP_MAX_INST; i++)
278826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
279826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(core[index].inst[i])
280826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
281826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      rc = 0;
282826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("Library Used \n");
283826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
284826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
285826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
286826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return rc;
287826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
288826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
289826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
290826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  is_cmp_already_exists
291826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
292826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
293826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Check if the component already exists or not. Used in the
294826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  management of component handles.
295826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
296826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
297826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
298826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
299826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
300826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Error None.
301826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
302826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic int is_cmp_already_exists(char *cmp_name)
303826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
304826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i    =0,j=0;
305826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int rc = -1;
306826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< SIZE_OF_CORE; i++)
307826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
308826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!strcmp(cmp_name, core[i].name))
309826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
310826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(j=0; j< OMX_COMP_MAX_INST; j++)
311826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
312826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(core[i].inst[j])
313826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
314826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          rc = i;
315826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT("Component exists %d\n", rc);
316826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return rc;
317826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
318826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
319826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      break;
320826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
321826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
322826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return rc;
323826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
324826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
325826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
326826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
327826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  get_cmp_handle
328826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
329826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
330826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Get component handle.
331826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
332826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
333826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
334826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
335826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
336826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Error None.
337826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
338826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* get_cmp_handle(char *cmp_name)
339826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
340826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i    =0,j=0;
341826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
342826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("get_cmp_handle \n");
343826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  for(i=0; i< SIZE_OF_CORE; i++)
344826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
345826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!strcmp(cmp_name, core[i].name))
346826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
347826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(j=0; j< OMX_COMP_MAX_INST; j++)
348826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
349826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(core[i].inst[j])
350826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
351826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT("get_cmp_handle match\n");
352826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return core[i].inst[j];
353826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
354826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
355826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
356826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
357826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("get_cmp_handle returning NULL \n");
358826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return NULL;
359826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
360826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
361826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
362826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
363826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_DeInit
364826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
365826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
366826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DeInitialize all the the relevant OMX components.
367826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
368826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
369826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
370826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
371826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
372826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Error None.
373826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
374826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_APIENTRY
375826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_Deinit()
376826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
377826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
378826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
379826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
380826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
381826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
382826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_GetHandle
383826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
384826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
385826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Constructs requested component. Relevant library is loaded if needed.
386826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
387826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
388826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
389826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
390826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
391826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Error None  if everything goes fine.
392826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
393826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
394826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev OMX_API OMX_ERRORTYPE OMX_APIENTRY
395826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_GetHandle(OMX_OUT OMX_HANDLETYPE*     handle,
396826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_IN OMX_STRING    componentName,
397826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_IN OMX_PTR             appData,
398826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              OMX_IN OMX_CALLBACKTYPE* callBacks)
399826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
400826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE  eRet = OMX_ErrorNone;
401826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int cmp_index = -1;
402826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int hnd_index = -1;
403826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
404826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("OMXCORE API :  Get Handle %x %s %x\n",(unsigned) handle,
405826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                     componentName,
406826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                     (unsigned) appData);
407826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_lock(&lock_core);
408826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(handle)
409826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
410826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    struct stat sd;
411826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
412826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *handle = NULL;
413826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
414826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    cmp_index = get_cmp_index(componentName);
415826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
416826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(cmp_index >= 0)
417826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
418826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       DEBUG_PRINT("getting fn pointer\n");
419826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
420826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      // dynamically load the so
421826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      core[cmp_index].fn_ptr =
422826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        omx_core_load_cmp_library(core[cmp_index].so_lib_name,
423826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  &core[cmp_index].so_lib_handle);
424826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
425826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(core[cmp_index].fn_ptr)
426826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
427826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Construct the component requested
428826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        // Function returns the opaque handle
429826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        void* pThis = (*(core[cmp_index].fn_ptr))();
430826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(pThis)
431826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
432826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          void *hComp = NULL;
433826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          hComp = qc_omx_create_component_wrapper((OMX_PTR)pThis);
434826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if((eRet = qc_omx_component_init(hComp, core[cmp_index].name)) !=
435826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                           OMX_ErrorNone)
436826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
437826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT("Component not created succesfully\n");
438826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              pthread_mutex_unlock(&lock_core);
439826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              return eRet;
440826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
441826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
442826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          qc_omx_component_set_callbacks(hComp,callBacks,appData);
443826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          hnd_index = get_comp_handle_index(componentName);
444826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(hnd_index >= 0)
445826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
446826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            core[cmp_index].inst[hnd_index]= *handle = (OMX_HANDLETYPE) hComp;
447826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
448826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          else
449826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
450826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            DEBUG_PRINT("OMX_GetHandle:NO free slot available to store Component Handle\n");
451826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            pthread_mutex_unlock(&lock_core);
452826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            return OMX_ErrorInsufficientResources;
453826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
454826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT("Component %x Successfully created\n",(unsigned)*handle);
455826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
456826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        else
457826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
458826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorInsufficientResources;
459826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          DEBUG_PRINT("Component Creation failed\n");
460826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
461826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
462826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
463826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
464826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        eRet = OMX_ErrorNotImplemented;
465826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        DEBUG_PRINT("library couldnt return create instance fn\n");
466826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
467826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
468826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
469826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
470826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
471826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      eRet = OMX_ErrorNotImplemented;
472826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      DEBUG_PRINT("ERROR: Already another instance active  ;rejecting \n");
473826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
474826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
475826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
476826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
477826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet =  OMX_ErrorBadParameter;
478826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("\n OMX_GetHandle: NULL handle \n");
479826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
480826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  pthread_mutex_unlock(&lock_core);
481826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
482826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
483826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
484826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
485826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_FreeHandle
486826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
487826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
488826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Destructs the component handles.
489826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
490826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
491826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
492826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
493826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
494826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Error None.
495826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
496826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_APIENTRY
497826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_FreeHandle(OMX_IN OMX_HANDLETYPE hComp)
498826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
499826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
500826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  int err = 0, i = 0;
501826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("OMXCORE API :  Free Handle %x\n",(unsigned) hComp);
502826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
503826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  // 0. Check that we have an active instance
504826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if((i=is_cmp_handle_exists(hComp)) >=0)
505826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
506826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    // 1. Delete the component
507826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if ((eRet = qc_omx_component_deinit(hComp)) == OMX_ErrorNone)
508826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
509826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        pthread_mutex_lock(&lock_core);
510826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        /* Unload component library */
511826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if( (i < SIZE_OF_CORE) && core[i].so_lib_handle)
512826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
513826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           if(check_lib_unload(i))
514826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           {
515826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              DEBUG_PRINT_ERROR(" Unloading the dynamic library for %s\n",
516826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                  core[i].name);
517826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              err = dlclose(core[i].so_lib_handle);
518826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              if(err)
519826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              {
520826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  DEBUG_PRINT_ERROR("Error %d in dlclose of lib %s\n",
521826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                     err,core[i].name);
522826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
523826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              core[i].so_lib_handle = NULL;
524826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           }
525826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
526826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    clear_cmp_handle(hComp);
527826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    pthread_mutex_unlock(&lock_core);
528826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
529826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else
530826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
531826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT(" OMX_FreeHandle failed on %x\n",(unsigned) hComp);
532826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return eRet;
533826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
534826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
535826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
536826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
537826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT_ERROR("OMXCORE Warning: Free Handle called with no active instances\n");
538826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
539826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNone;
540826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
541826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
542826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
543826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_SetupTunnel
544826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
545826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
546826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Not Implemented.
547826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
548826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
549826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
550826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
551826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
552826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
553826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
554826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_APIENTRY
555826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_SetupTunnel(OMX_IN OMX_HANDLETYPE outputComponent,
556826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                OMX_IN OMX_U32             outputPort,
557826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                OMX_IN OMX_HANDLETYPE  inputComponent,
558826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                OMX_IN OMX_U32              inputPort)
559826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
560826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* Not supported right now */
561826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("OMXCORE API: OMX_SetupTunnel Not implemented \n");
562826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNotImplemented;
563826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
564826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
565826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
566826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_GetContentPipe
567826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
568826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
569826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Not Implemented.
570826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
571826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
572826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
573826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
574826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
575826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
576826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
577826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_API OMX_ERRORTYPE
578826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_GetContentPipe(OMX_OUT OMX_HANDLETYPE* pipe,
579826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                   OMX_IN OMX_STRING        uri)
580826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
581826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* Not supported right now */
582826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("OMXCORE API: OMX_GetContentPipe Not implemented \n");
583826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return OMX_ErrorNotImplemented;
584826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
585826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
586826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
587826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
588826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_GetComponentNameEnum
589826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
590826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
591826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns the component name associated with the index.
592826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
593826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
594826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
595826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
596826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
597826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
598826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
599826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_APIENTRY
600826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_ComponentNameEnum(OMX_OUT OMX_STRING componentName,
601826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      OMX_IN  OMX_U32          nameLen,
602826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                      OMX_IN  OMX_U32            index)
603826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
604826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
605826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("OMXCORE API - OMX_ComponentNameEnum %x %d %d\n",(unsigned) componentName
606826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                              ,(unsigned)nameLen
607826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                                                              ,(unsigned)index);
608826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(index < SIZE_OF_CORE)
609826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
610826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    #ifdef _ANDROID_
611826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strlcpy(componentName, core[index].name,nameLen);
612826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    #else
613826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    strncpy(componentName, core[index].name,nameLen);
614826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    #endif
615826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
616826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
617826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
618826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorNoMore;
619826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
620826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
621826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
622826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
623826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
624826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
625826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_GetComponentsOfRole
626826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
627826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
628826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns the component name which can fulfill the roles passed in the
629826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  argument.
630826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
631826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
632826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
633826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
634826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
635826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
636826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
637826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_API OMX_ERRORTYPE
638826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_GetComponentsOfRole(OMX_IN OMX_STRING      role,
639826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_INOUT OMX_U32* numComps,
640826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_INOUT OMX_U8** compNames)
641826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
642826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
643826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i,j,namecount=0;
644826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
645826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  printf(" Inside OMX_GetComponentsOfRole \n");
646826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
647826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /*If CompNames is NULL then return*/
648826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (compNames == NULL)
649826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
650826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (numComps == NULL)
651826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
652826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          eRet = OMX_ErrorBadParameter;
653826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
654826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
655826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
656826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *numComps          = 0;
657826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (i=0; i<SIZE_OF_CORE;i++)
658826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
659826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(j=0; j<OMX_CORE_MAX_CMP_ROLES && core[i].roles[j] ; j++)
660826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
661826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!strcmp(role,core[i].roles[j]))
662826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
663826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                  (*numComps)++;
664826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              }
665826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            }
666826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
667826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
668826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return eRet;
669826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
670826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
671826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(numComps)
672826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
673826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      namecount = *numComps;
674826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
675826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (namecount == 0)
676826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
677826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          return OMX_ErrorBadParameter;
678826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
679826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
680826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *numComps          = 0;
681826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
682826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for (i=0; i<SIZE_OF_CORE;i++)
683826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
684826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      for(j=0; j<OMX_CORE_MAX_CMP_ROLES && core[i].roles[j] ; j++)
685826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
686826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        if(!strcmp(role,core[i].roles[j]))
687826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
688826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            #ifdef _ANDROID_
689826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            strlcpy((char *)compNames[*numComps],core[i].name, OMX_MAX_STRINGNAME_SIZE);
690826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            #else
691826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            strncpy((char *)compNames[*numComps],core[i].name, OMX_MAX_STRINGNAME_SIZE);
692826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            #endif
693826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (*numComps)++;
694826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
695826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
696826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
697826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (*numComps == namecount)
698826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
699826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          break;
700826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
701826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
702826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
703826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
704826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
705826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadParameter;
706826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
707826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
708826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  printf(" Leaving OMX_GetComponentsOfRole \n");
709826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
710826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
711826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/* ======================================================================
712826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevFUNCTION
713826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_GetRolesOfComponent
714826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
715826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDESCRIPTION
716826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  Returns the primary role of the components supported.
717826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
718826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPARAMETERS
719826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None
720826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
721826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRETURN VALUE
722826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  None.
723826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev========================================================================== */
724826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_API OMX_ERRORTYPE
725826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_GetRolesOfComponent(OMX_IN OMX_STRING compName,
726826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_INOUT OMX_U32* numRoles,
727826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                        OMX_OUT OMX_U8** roles)
728826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
729826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  /* Not supported right now */
730826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  OMX_ERRORTYPE eRet = OMX_ErrorNone;
731826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  unsigned i,j,numofroles = 0;;
732826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  DEBUG_PRINT("GetRolesOfComponent %s\n",compName);
733826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
734826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if (roles == NULL)
735826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
736826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if (numRoles == NULL)
737826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
738826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         eRet = OMX_ErrorBadParameter;
739826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
740826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      else
741826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
742826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         *numRoles = 0;
743826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         for(i=0; i< SIZE_OF_CORE; i++)
744826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         {
745826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           if(!strcmp(compName,core[i].name))
746826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           {
747826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             for(j=0; (j<OMX_CORE_MAX_CMP_ROLES) && core[i].roles[j];j++)
748826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             {
749826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev                (*numRoles)++;
750826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             }
751826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev             break;
752826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev           }
753826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev         }
754826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
755826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
756826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      return eRet;
757826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
758826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
759826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  if(numRoles)
760826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
761826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (*numRoles == 0)
762826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
763826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return OMX_ErrorBadParameter;
764826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
765826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
766826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    numofroles = *numRoles;
767826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    *numRoles = 0;
768826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    for(i=0; i< SIZE_OF_CORE; i++)
769826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
770826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      if(!strcmp(compName,core[i].name))
771826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      {
772826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        for(j=0; (j<OMX_CORE_MAX_CMP_ROLES) && core[i].roles[j];j++)
773826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        {
774826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if(roles && roles[*numRoles])
775826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
776826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            #ifdef _ANDROID_
777826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            strlcpy((char *)roles[*numRoles],core[i].roles[j],OMX_MAX_STRINGNAME_SIZE);
778826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            #else
779826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            strncpy((char *)roles[*numRoles],core[i].roles[j],OMX_MAX_STRINGNAME_SIZE);
780826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            #endif
781826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
782826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          (*numRoles)++;
783826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          if (numofroles == *numRoles)
784826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          {
785826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev              break;
786826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev          }
787826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        }
788826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        break;
789826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      }
790826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
791826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
792826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  else
793826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  {
794826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DEBUG_PRINT("ERROR: Both Roles and numRoles Invalid\n");
795826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    eRet = OMX_ErrorBadParameter;
796826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  }
797826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev  return eRet;
798826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
799826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
800826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMX_API OMX_BOOL
801826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOMXConfigParser(
802826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_PTR aInputParameters,
803826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_PTR aOutputParameters)
804826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev{
805826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMX_BOOL Status = OMX_TRUE;
806826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    VideoOMXConfigParserOutputs *aOmxOutputParameters;
807826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    OMXConfigParserInputs *aOmxInputParameters;
808826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    aOmxOutputParameters = (VideoOMXConfigParserOutputs *)aOutputParameters;
809826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    aOmxInputParameters = (OMXConfigParserInputs *)aInputParameters;
810826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
811826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    aOmxOutputParameters->width = 176; //setting width to QCIF
812826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    aOmxOutputParameters->height = 144; //setting height to QCIF
813826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
814826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //TODO
815826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //Qcom component do not use the level/profile from IL client .They are parsing the first buffer
816826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //sent in ETB so for now setting the defalut values . Going farward we can call
817826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    //QC parser here.
818826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (0 == strcmp(aOmxInputParameters->cComponentRole, (OMX_STRING)"video_decoder.avc"))
819826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
820826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       aOmxOutputParameters->profile = 66; //minimum supported h264 profile - setting to baseline profile
821826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       aOmxOutputParameters->level = 0;  // minimum supported h264 level
822826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
823826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    else if ((0 == strcmp(aOmxInputParameters->cComponentRole, (OMX_STRING)"video_decoder.mpeg4")) || (0 == strcmp(aOmxInputParameters ->cComponentRole, (OMX_STRING)"video_decoder.h263")))
824826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    {
825826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       aOmxOutputParameters->profile = 8; //minimum supported h263/mpeg4 profile
826826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev       aOmxOutputParameters->level = 0; // minimum supported h263/mpeg4 level
827826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
828826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
829826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return Status;
830826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
831